【问题标题】:Correct arithmetic(cycle) shift in verilog在verilog中正确的算术(循环)移位
【发布时间】:2015-05-21 03:47:33
【问题描述】:

我是 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 

【问题讨论】:

    标签: math verilog cycle shift intel-fpga


    【解决方案1】:

    &lt;&lt;&lt;&gt;&gt;&gt; 是带符号的移位运算符 - 即 0xF0 &gt;&gt;&gt; 1 = 0xF80xF0 &gt;&gt; 1 = 0x78。右移会有不同的表现,但&lt;&lt;&lt; 将与&lt;&lt; 相同。

    要进行循环右移,请改用tempred &lt;= {tempred[0],tempred[11:1]};

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-02
      • 1970-01-01
      • 2022-10-08
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      相关资源
      最近更新 更多