2012-01-27 295 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; 

通過適當的索引檢查和控制應該工作。