Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 在Verilog中将ASCII字符分配给导线_String_Ascii_Verilog_System Verilog - Fatal编程技术网

String 在Verilog中将ASCII字符分配给导线

String 在Verilog中将ASCII字符分配给导线,string,ascii,verilog,system-verilog,String,Ascii,Verilog,System Verilog,我知道您可以在Verilog测试台中声明字符串,如下所示: reg [8*14:1] string_value; initial string_value = "Hello, World!"; 然后我可以用这个字符串做一些事情,比如在测试台上使用$display来显示它 当我将模块闪存到我的FPGA时,我没有成功地在模块中执行相同的操作: reg [8*14:1] string_value; always @(reset) begin string_value

我知道您可以在Verilog测试台中声明字符串,如下所示:

reg [8*14:1] string_value;  

initial 
    string_value = "Hello, World!";
然后我可以用这个字符串做一些事情,比如在测试台上使用
$display
来显示它

当我将模块闪存到我的FPGA时,我没有成功地在模块中执行相同的操作:

reg [8*14:1] string_value;  

always @(reset) 
begin
    string_value = "Hello, World!";
    // Do stuff with string value
即使指定单个值也不起作用:

reg [8:1] char_value;  

always @(reset) 
begin
    char_value = "A";
    if (char_value == 8'h41)
        // Do stuff!
我想将8位总线上的单个字符转移到LCD屏幕上进行显示


如何在Verilog中使用字符串?

字符串似乎在我的模块中工作:

module tb;

reg [8:1] char_value;

initial begin
    char_value = "A";
    $display("%h", char_value);
    if (char_value == 8'h41) begin
        $display("match");
    end else begin
        $display("no match");
    end
end

endmodule

/*

Prints out:

41
match

*/
什么不适合你


字符串
数据类型于2005年引入SystemVerilog标准(参考IEEE 1800-2005或1800-2009)。

SystemVerilog应支持规范中提到的字符串分配:

For example, to store the 12-character string "Hello world\n" requires a variable 8x12, or 96 bits wide. 
     bit [8*12:1] stringvar = "Hello world\n";

不确定旧的verilog是否支持它。

您可以为寄存器类型分配字符串。任何不这样说的人都是错的。您可能希望使您的寄存器以0为基础,以使其正常工作。我已经在真正的FPGA中实现了这一点,而且它很有效。

这对我来说很有效:

    reg [8*16:1] line1data = "Hello, World!   ";

在模拟和Spartan-3E FPGA上定义字节数组,然后将ASCII分配给每个数组元素:

output [8*14:1]string_value1;  
reg [8*14:1]string_value1;

always @ (posedge BIWEn)

if (BIWEn==1'b1 ||BIREn==1'b1)
    begin:START_STATE_WRITE
        psW=idleW;  //psW is Present State Write
        string_value1= "IDLE";
    end

![test bench] (c:\pictures)
wire [7:0] foo [0:11];
assign foo[0]  = "H";
assign foo[1]  = "e";
assign foo[2]  = "l";
assign foo[3]  = "l";
assign foo[4]  = "o";
assign foo[5]  = " ";
assign foo[6]  = "W";
assign foo[7]  = "o";
assign foo[8]  = "r";
assign foo[9]  = "l";
assign foo[10] = "d";
assign foo[11] = "!";
现在,您有了一个包含ASCII值的常量,可以索引到该常量中

reg [7:0] data_out;
reg       data_out_valid;
reg [3:0] some_index;
:
// pushing data onto a bus
data_out       <= foo[some_index];
data_out_valid <= 1'd1;
some_index     <= some_index + 4'd1;
reg[7:0]数据输出;
注册数据输出有效;
reg[3:0]某些_索引;
:
//将数据推送到总线上

数据输出你是想合成这个吗?@Adam12-是的,我想在连接到FPGA开发板的LCD屏幕上打印文本。由于您和toolic都不清楚这一点,我将对问题进行更具体的编辑:我想通过移位寄存器将这些8位字符值分配给模块的输出。到底什么不起作用?你得到一个合成错误,或是文本根本没有显示在液晶显示器上?我试图分配ASCII值到一个8位总线;我没有
$display
。对于模拟,可以使用字符串或$display。但是如果您正在为FPGA设计一些代码。我认为目前合成工具不支持字符串类型。Xilinx现在甚至不支持systemverilog。verilog编译器将把“A”翻译成8'h41,“AB”翻译成16'h4142,“ABC”翻译成24'h434241。不要试图认为FPGA必须“支持”这种方式,从而使事情变得更加复杂。所发生的一切就是编译器将它从一种良好的人类可读格式转换成一个数字。是的,字符串值只是常量。尽管合成工具可能允许也可能不允许寄存器具有非零初始化/重置值,这取决于所使用的技术。最近的X/A工具在重置/编程后直接从常量初始化移位寄存器没有问题。这个答案完全不正确。Verilog确实支持字符常量,并且肯定没有任何东西阻止用户将十六进制值分配给寄存器!刚刚在ISE(Virtex-6)上测试过,效果很好。