操作我有一个Verilog代码中有如下一行:“<<”用Verilog
parameter ADDR_WIDTH = 8 ;
parameter RAM_DEPTH = 1 << ADDR_WIDTH;
这里什么都将存储在RAM_DEPTH
和什么是<<
运营商在这里做。
操作我有一个Verilog代码中有如下一行:“<<”用Verilog
parameter ADDR_WIDTH = 8 ;
parameter RAM_DEPTH = 1 << ADDR_WIDTH;
这里什么都将存储在RAM_DEPTH
和什么是<<
运营商在这里做。
<<
是一个二进制移位,将1移到左边的8个位置。
4'b0001 << 1 => 4'b0010
>>
是一个二进制右移,将0加到MSB。
>>>
是一个带符号的移位,如果左输入被签名,它将保持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
谢谢.. :),也感谢分享'>>>'操作符的概念.. :) –
>>>操作符只在移位操作数被签名时才保留MSB。如果移位的操作数是无符号的,就像在你的例子中那样,>>>操作符就像>>操作符一样插入零。 – 2013-07-17 10:57:12
@JoeHass,谢谢。更新了答案。 – Morgan
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
。
这在IEEE标准1800年至2012年 – toolic
[IEEE标准1800年至2012年(http://standards.ieee.org是记录/getieee/1800/download/1800-2012.pdf)现在免费。 – Morgan