Math verilog中正确的算术(循环)移位

Math verilog中正确的算术(循环)移位,math,verilog,cycle,shift,intel-fpga,Math,Verilog,Cycle,Shift,Intel Fpga,我是verilog的新手,我被一个奇怪的时刻困住了。我试着做一个循环LED闪烁(绿灯从左到右,红灯从右到左)。我有12个LED,正在将我的程序与时钟(CLK)同步 我本想使用算术移位,但由于某种原因,移位的行为类似于,因此移位不是循环的。为什么会这样?我做错什么了吗 我把整个代码放在这里只是为了以防万一,它非常简短: module test1( input CLK, output [11:0] MLED ); reg [11:0] tmp; reg [11:0] tmpred; r

我是verilog的新手,我被一个奇怪的时刻困住了。我试着做一个循环LED闪烁(绿灯从左到右,红灯从右到左)。我有12个LED,正在将我的程序与
时钟(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 
模块测试1(
输入时钟,
输出[11:0]最大似然
); 
reg[11:0]tmp;
reg[11:0]tmpred;
reg[11:0]tmpgreen;
分配MLED=tmp;
reg[1:0]计数器;
导线[1:0]计数器导线;
分配计数器\导线=计数器;
线规;
分配日志=(计数器线==2'd3)?1'b1:1'b0;
首字母
开始
tmp
是有符号的移位运算符-即
0xF0>>1=0xF8
vs
0xF0>>1=0x78
。右移将不同,但