web-dev-qa-db-ja.com

verilogの '<<'演算子

次のような行があるverilogコードがあります。

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

ここでは、RAM_DEPTHに何が格納され、<<演算子がここで何を行うかについて説明します。

5
biren.K

<<はバイナリシフトで、1を左に8桁シフトします。

4'b0001 << 1 => 4'b0010

>>は、MSBに0を追加するバイナリ右シフトです。
>>>は、左入力が符号付きの場合にMSBの値を維持する符号付きシフトです。

4'sb1011 >>  1 => 0101
4'sb1011 >>> 1 => 1101

左のオペランドが符号付きであることを示す3つの方法:

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
18
Morgan

1 << ADDR_WIDTHは、1が8ビット左にシフトされ、RAM_DEPTHの値として割り当てられることを意味します。

また、1 << ADDR_WIDTHは2 ^ ADDR_WIDTHも意味します。

ADDR_WIDTH = 8の場合、2^8 = 256を指定すると、それがRAM_DEPTHの値になります

6
e19293001

<<は、他の多くの言語と同様に、左シフト演算子です。

ここでRAM_DEPTH1によって8 bitsに左シフトされます。これは2^8または256と同等です。

3
dwikle