2013-07-17 77 views
4

操作我有一个Verilog代码中有如下一行:“<<”用Verilog

parameter ADDR_WIDTH = 8 ; 
parameter RAM_DEPTH = 1 << ADDR_WIDTH; 

这里什么都将存储在RAM_DEPTH和什么是<<运营商在这里做。

+2

这在IEEE标准1800年至2012年 – toolic

+5

[IEEE标准1800年至2012年(http://standards.ieee.org是记录/getieee/1800/download/1800-2012.pdf)现在免费。 – Morgan

回答

14

<<是一个二进制移位,将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 
+0

谢谢.. :),也感谢分享'>>>'操作符的概念.. :) –

+2

>>>操作符只在移位操作数被签名时才保留MSB。如果移位的操作数是无符号的,就像在你的例子中那样,>>>操作符就像>>操作符一样插入零。 – 2013-07-17 10:57:12

+0

@JoeHass,谢谢。更新了答案。 – Morgan

4

1 << ADDR_WIDTH意味着1将向左移位8位,并将被指定为RAM_DEPTH的值。

另外,1 << ADDR_WIDTH也意味着2^ADDR_WIDTH。

鉴于ADDR_WIDTH = 8,然后2^8 = 256那将是RAM_DEPTH

3

<<值左移位运算符,因为它在许多其他语言。

这里RAM_DEPTH将是1左移8 bits,这相当于2^8256