在Verilog中为电线分配ASCII字符

6

我知道在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中使用字符串?


4
你尝试合成这个吗? - user597225
@Adam12 - 是的,我正在尝试在连接到我的FPGA开发板的LCD屏幕上打印文本。由于这对你和toolic来说都不太清楚,我将编辑问题以更具体地说明:我想通过移位寄存器将这些8位字符值分配给我的模块输出。 - Kevin Vermeer
1
具体是什么出了问题?您是否遇到综合错误,还是LCD上根本没有显示文本? - mkrieger1
6个回答

9
你可以将字符串赋值给寄存器类型。否则,那些声称不行的人是错误的。你可能希望将寄存器从0开始编号才能使其正常工作。我在真实的FPGA中这样做了,它确实有效。

8
为了明确一点,Verilog编译器将把"A"转换成8'h41,"AB"转换成16'h4142,"ABC"转换成24'h434241。不要让自己陷入认为FPGA必须以某种方式“支持”这个的复杂情况中。所有发生的只是编译器将其从易于人类阅读的格式转换为数字。 - Stephen
1
是的,字符串值只是常量。尽管综合工具可能允许寄存器具有非零初始化/复位值,这取决于所使用的技术。最近的X/A工具可以直接从重置/编程的常量初始化移位寄存器,没有问题。 - shuckc

7

定义一个字节数组,然后为每个数组元素分配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] = "!";

现在您有了一个包含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;

使用适当的索引检查和控制,这应该可以工作。


3
这对我有效:
    reg [8*16:1] line1data = "Hello, World!   ";

在模拟和Spartan-3E FPGA上都是如此


刚在ISE(Virtex-6)上测试过,运行得非常好。 - Rodrigo Strauss

0

这里是一个演示,展示了模块中字符串的工作方式:

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

打印输出:

41
match

在2005年的SystemVerilog标准中引入了string数据类型(参见IEEE 1800-2005或1800-2009)。


我正在尝试将ASCII值分配给8位总线; 我没有$display - Kevin Vermeer
对于模拟,您可以使用字符串或$display。但是,如果您正在为FPGA设计某些代码。我认为目前的综合工具不支持字符串类型。甚至从Xilinx他们现在也不支持systemverilog。 - Enze Chi

0
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)

-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";

不确定旧版的Verilog是否支持它。


1
这个答案完全错误。Verilog确实支持字符常量,并且绝对没有任何阻止用户将十六进制值分配给寄存器的限制! - user149341

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接