我一直在调查这个问题,但是搜索似乎没有任何结果。它可能太简单,无法描述,但我在这里,抓我的头…任何帮助都将不胜感激。
发布于 2019-12-01 21:11:42
Verilog知道“字符串”。
单个ASCII字符需要8位。因此,要存储8个字符,您需要64位:
wire [63:0] string8;
assign string8 = "12345678";
这里有一些陷阱:
RHS没有字符串结尾字符(像C null-character)
因此,字符串87:0将保持8h'38。(“8”)。要遍历必须使用的字符串,必须使用:string[ index +: 8];
assign string8 = "ABCD"; // MS bit63:32 are zero
wire [7:0] string5 [0:4]; assign string5 = "Wrong";
发布于 2019-12-02 11:53:54
你可能被对字符的误解所误导了。在硬件中没有角色这回事。只有几组比特或代码。唯一能将二进制码转换成字符的就是你的终端。它以某种方式解释代码,并形成字母供你使用。因此,'c‘中的所有printfs
和verilog中的$display
只将代码发送到终端(或文件)。
把字符转换成代码的就是你的键盘,你也可以用它在程序中打字。然后编译器解释你的程序。Verilog (以及'c')编译器将双引号中的字符串(您键入的)直接表示为一组字节。Verilog,以及'c‘对这样的字符串使用ascii-8编码,这意味着'a’的代码是十进制97,'b‘是98,...每个字符都是8位宽,带引号的字符串形成了ascii代码的字节级联。
因此,在回答您的问题时,您可以使用%s修饰符通过$display (或其他)函数将ascii代码发送到终端,从而将ascii代码转换为字符。
所以,举个例子:
module A;
reg[8*5-1:0] hello;
reg[8*3 - 1: 0] bye;
initial begin
hello = "hello"; // 5 bytes of characters
bye = {8'd98, 8'd121, 8'd101}; // 3 bytes 'b' 'y' 'e'
$display("hello=%s bye=%s", hello, bye);
end
endmodule
https://stackoverflow.com/questions/59125591
复制相似问题