【发布时间】:2013-07-17 04:43:06
【问题描述】:
我有一个verilog代码,其中有一行如下:
parameter ADDR_WIDTH = 8 ;
parameter RAM_DEPTH = 1 << ADDR_WIDTH;
RAM_DEPTH 中将存储什么,<< 运算符在此处做什么。
【问题讨论】:
我有一个verilog代码,其中有一行如下:
parameter ADDR_WIDTH = 8 ;
parameter RAM_DEPTH = 1 << ADDR_WIDTH;
RAM_DEPTH 中将存储什么,<< 运算符在此处做什么。
【问题讨论】:
<<是二进制移位,将1左移8位。
4'b0001 << 1 => 4'b0010
>> 是在 MSB 上加 0 的二进制右移。>>> 是在左输入有符号时保持 MSB 值的有符号移位。
4'sb1011 >> 1 => 0101
4'sb1011 >>> 1 => 1101
表示左操作数有符号的三种方式:
module shift;
logic [3:0] test1 = 4'b1000;
logic signed [3:0] test2 = 4'b1000;
initial begin
$display("%b", $signed(test1) >>> 1 ); //Explicitly set as signed
$display("%b", test2 >>> 1 ); //Declared as signed type
$display("%b", 4'sb1000 >>> 1 ); //Signed constant
$finish;
end
endmodule
【讨论】:
$signed(test1) >>> 1 不适合我。 Xilinx ISE 与 ISim。
Syntax error near "signed". 和 logic is an unknown type。 ISim 似乎无法识别这些关键字。
1 << ADDR_WIDTH 表示 1 将向左移动 8 位并将分配为 RAM_DEPTH 的值。
另外,1 << ADDR_WIDTH也表示2^ADDR_WIDTH。
给定ADDR_WIDTH = 8,然后是2^8 = 256,这将是RAM_DEPTH的值
【讨论】:
<< 是左移运算符,就像在许多其他语言中一样。
这里的RAM_DEPTH 将被1 左移8 bits,相当于2^8 或256。
【讨论】: