verilog 中的正确算术(循环)移位
Correct arithmetic(cycle) shift in verilog
我是 verilog 的新手,被困在一个奇怪的时刻。我正在尝试做一个循环的 LED 闪烁(从左到右的绿灯和从右到左的红灯)。我有 12 个 LED,正在将我的程序与 clock(CLK)
同步。
我想为此使用算术移位,但由于某些原因 <<<
和 >>>
表现得像 <<
和 >>
,所以移位不是循环的。为什么会这样?我做错了什么吗?
我把整个代码放在一起以备不时之需,它很短:
module test1(
input CLK,
output [11:0] MLED
);
reg [11:0] tmp;
reg [11:0] tmpred;
reg [11:0] tmpgreen;
assign MLED = tmp;
reg [1:0] COUNTER;
wire [1:0] COUNTER_WIRE;
assign COUNTER_WIRE=COUNTER;
wire LOG;
assign LOG=(COUNTER_WIRE==2'd3) ? 1'b1 : 1'b0;
initial
begin
tmp<=12'b100000000001;
tmpred<=12'b000000000001;
tmpgreen<=12'b100000000000;
COUNTER<=0;
end
always@(posedge CLK)
begin
if (LOG)
begin
tmpred <= $signed(tmpred) <<< 2;
tmpgreen <= $signed(tmpgreen) >>> 2;
tmp <= tmpred | tmpgreen;
end
COUNTER <= COUNTER + 1'b1;
end
endmodule
<<<
和 >>>
是带符号的移位运算符 - 即 0xF0 >>> 1 = 0xF8
与 0xF0 >> 1 = 0x78
。右移的行为会有所不同,但 <<<
与 <<
相同。
要进行循环右移,请改用 tempred <= {tempred[0],tempred[11:1]};
。
我是 verilog 的新手,被困在一个奇怪的时刻。我正在尝试做一个循环的 LED 闪烁(从左到右的绿灯和从右到左的红灯)。我有 12 个 LED,正在将我的程序与 clock(CLK)
同步。
我想为此使用算术移位,但由于某些原因 <<<
和 >>>
表现得像 <<
和 >>
,所以移位不是循环的。为什么会这样?我做错了什么吗?
我把整个代码放在一起以备不时之需,它很短:
module test1(
input CLK,
output [11:0] MLED
);
reg [11:0] tmp;
reg [11:0] tmpred;
reg [11:0] tmpgreen;
assign MLED = tmp;
reg [1:0] COUNTER;
wire [1:0] COUNTER_WIRE;
assign COUNTER_WIRE=COUNTER;
wire LOG;
assign LOG=(COUNTER_WIRE==2'd3) ? 1'b1 : 1'b0;
initial
begin
tmp<=12'b100000000001;
tmpred<=12'b000000000001;
tmpgreen<=12'b100000000000;
COUNTER<=0;
end
always@(posedge CLK)
begin
if (LOG)
begin
tmpred <= $signed(tmpred) <<< 2;
tmpgreen <= $signed(tmpgreen) >>> 2;
tmp <= tmpred | tmpgreen;
end
COUNTER <= COUNTER + 1'b1;
end
endmodule
<<<
和 >>>
是带符号的移位运算符 - 即 0xF0 >>> 1 = 0xF8
与 0xF0 >> 1 = 0x78
。右移的行为会有所不同,但 <<<
与 <<
相同。
要进行循环右移,请改用 tempred <= {tempred[0],tempred[11:1]};
。