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

时间:2012-01-27 01:56:44

标签: 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 = "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中的字符串?

6 个答案:

答案 0 :(得分:5)

您可以将字符串分配给寄存器类型。任何说不然的人都是错的。你可能想让你的寄存器0'正常工作。我在真正的FPGA中做到了这一点并且有效。

答案 1 :(得分:4)

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

适当的索引检查和控制应该有效。

答案 2 :(得分:1)

这对我有用:

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

仿真和Spartan-3E FPGA

答案 3 :(得分: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

/*

Prints out:

41
match

*/

什么对你不起作用?

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

答案 4 :(得分: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)

答案 5 :(得分:-6)

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是否支持它。