在verilog中每个周期可以移位超过1位吗?

时间:2016-03-18 17:52:03

标签: verilog cycle shift

我不确定是否需要超过1个周期,如果我需要考虑需要超过1个周期才能完成的轮班。如果有可能一次移位1位以上,那么移位1位需要与移位多位相同的延迟/门限时间吗?

1 个答案:

答案 0 :(得分:1)

如果你的意思是组合移位,那么固定移位根本不需要逻辑:它只是布线的一些变化。如果你想要一个变量移位,那么你可以使用这些Verilog运算符:<<(逻辑左移),>>(逻辑右移)或>>>(算术右移)。您的合成器应为这些运算符合成一个组合电路。尺寸和因此延迟将取决于所需的最大移位和要移位的字的长度。该延迟是否超过一个时钟周期取决于您的时钟频率。除非你有一个非常快的时钟或一个非常长的最大移位,否则延迟可能很容易小于一个时钟周期。

以下是Verilog的组合左移:

module ones_shift #(log2_width=2) (input [(2**log2_width)-1:0] A,  input [log2_width:0] SHIFT, output [(2**log2_width)-1:0] As);

  assign As = A << SHIFT;

endmodule

http://www.edaplayground.com/x/24P8

移位器将A输入移动SHIFT输入所代表的位数,以提供As输出。

如果你的意思是移位寄存器(是一个时序电路),那么你每个时钟周期就会有一个移位。

这是Verilog中的移位寄存器:

module SHIFT_REG #(SIZE = 16) (input LOAD, SHIFT, CLOCK, RESET, [SIZE-1:0] A, output reg [SIZE-1:0] As);

  always @(posedge CLOCK or posedge RESET)
    if (RESET)
      As <= {SIZE{1'b0}};
    else
      if (LOAD)
        As <= A;
      else
        if (SHIFT)
          As <= {As[SIZE-2:0],1'b0};

endmodule

http://www.edaplayground.com/x/2bAW

如果LOAD输入为高,则A输入将加载到移位寄存器中。如果SHIFT输入为高电平,则寄存器向左移位(每CLOCK个周期一位)。 As输出是移位寄存器的并行输出。 RESET输入为高电平有效。