在Verilog中将ASCII字符分配给线路

Kev*_*eer 4 string ascii verilog system-verilog

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

reg [8*14:1] string_value;  

initial 
    string_value = "Hello, World!";
Run Code Online (Sandbox Code Playgroud)

然后,我可以使用此字符串执行操作,例如$display在测试台中使用它来显示它.

当我将它闪存到我的FPGA时,我没有成功地在模块中做同样的事情:

reg [8*14:1] string_value;  

always @(reset) 
begin
    string_value = "Hello, World!";
    // Do stuff with string value
Run Code Online (Sandbox Code Playgroud)

即使分配单个值也不起作用:

reg [8:1] char_value;  

always @(reset) 
begin
    char_value = "A";
    if (char_value == 8'h41)
        // Do stuff!
Run Code Online (Sandbox Code Playgroud)

我想将8位总线上的各个字符移到LCD屏幕上进行显示.

如何在Verilog中使用字符串?

Ste*_*hen 7

您可以将字符串分配给寄存器类型.任何说不然的人都是错的.你可能想让你的寄存器0'正常工作.我已经在真正的FPGA中完成了这项工作.

  • 要清楚.verilog编译器将"A"转换为8'h41,将"AB"转换为16'h4142,将"ABC"转换为24'h434241.不要因为认为FPGA必须"支持"这一点而使自己变得更加复杂.所有这一切都是编译器将它从一个漂亮的人类可读格式转换为数字. (7认同)

小智 5

定义一个字节数组,然后将ASCII分配给每个数组元素:

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] = "!";
Run Code Online (Sandbox Code Playgroud)

现在,您可以在其中包含带有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;
Run Code Online (Sandbox Code Playgroud)

通过适当的索引检查和控制应该可以正常工作。


Enz*_*Chi -3

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";
Run Code Online (Sandbox Code Playgroud)

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