私は次のような行がある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
左オペランドが署名されていることを示す 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
1 << ADDR_WIDTHは、1 が 8 ビット左にシフトされ、 の値として割り当てられることを意味しますRAM_DEPTH。
また、1 << ADDR_WIDTH2^ADDR_WIDTH も意味します。
が与えられた場合ADDR_WIDTH = 8、それ2^8 = 256はの値になりますRAM_DEPTH
<<他の多くの言語と同様に、左シフト演算子です。
ここでRAM_DEPTHは、 またはと同等1の によって左シフトされます。8 bits2^8256