2013-07-17 116 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