2012-01-27 296 views
1

我明白,你可以在Verilog的测试台来声明一个String如下:分配ASCII字符线以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

你想综合这个吗? – 2012-01-27 03:35:38

+0

所以“否”的意思是“是” – 2012-01-29 00:44:49

+0

@ Adam12 - 是的,我试图在连接到我的FPGA开发板的LCD屏幕上打印文本。由于这对于你和工具都不是很清楚,所以我会编辑更具体的问题:我想通过移位寄存器将这些8位字符值分配给模块的输出。 – 2012-01-29 02:56:24

回答

-5

我认为FPGA不支持字符串类型。所以你不能将“A”分配给reg类型。你不能直接分配8'h41。

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

+0

我正在尝试将ASCII值分配给8位总线;我没有'$ display'。 – 2012-01-27 22:27:20

+0

对于仿真,您可以使用字符串或$显示。但是如果你正在为FPGA设计一些代码。我认为目前综合工具不支持字符串类型。从Xilinx他们现在甚至不支持systemverilog。 – 2012-02-08 10:07:43

4

您可以为一个寄存器类型分配一个字符串。任何说不然的人都是错的。你可能想让你的寄存器0为基础,以使其正常工作。我已经在真正的FPGA中做到了这一点,并且工作正常。

+6

要清楚。Verilog编译器将“A”转换为8'h41,“AB”转换为16'h4142,“ABC”转换为24'h434241。不要让它变得更加复杂,试图认为FPGA必须“支持”这个方法。所发生的只是编译器将它从一个很好的人类可读格式转换成一个数字。 – Stephen 2012-09-13 11:01:11

+1

是的字符串值只是常量。虽然综合工具可能允许或不允许寄存器具有非零的初始化/复位值,这取决于所使用的技术。最近的X/A工具没有问题,从常量中直接移出复位/编程来初始化移位寄存器。 – shuckc 2013-07-02 16:38:30

1

这适用于我:

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

无论是在模拟和上一个的Spartan-3E FPGA

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

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

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