【问题标题】:Variable shift register in verilogVerilog中的可变移位寄存器
【发布时间】:2012-08-13 08:54:16
【问题描述】:

我想设计一个可变移位寄存器来右移如下:

module sr(N,int,out);

  input [2:0] N;
  input [7:0] in;
  output [7:0] out;

  assign out={N'b0,input[7,N]}

endmodule

但是,不幸的是,verilog 不允许这种写法。 N 应该是常数。 关于如何从输入中获取移位迭代的任何想法?

【问题讨论】:

  • 我认为这是不允许的,因为随着参数变大,它会导致所需逻辑量呈指数级增长。您需要这个用于一般情况,还是只用于那个特定的小例子?对于 3 位 N,只需编写一个 switch 语句就很容易了。
  • @Tim - 仅仅因为逻辑很大,并不意味着它不应该被允许:)
  • 如果我理解正确,你想要一个桶形移位器:stackoverflow.com/questions/7543592/verilog-barrel-shifter
  • 您的原始代码有语法错误 (input[7,0]) 以及一堆不匹配的名称。请参阅我的答案以进行更正。
  • 是的,这是一个虚拟代码,只是为了展示概念。

标签: verilog


【解决方案1】:

Verilog 有一个右移运算符,因此您可以简单地编写:

assign out = in >> N;

多余的位会自动用零填充。

【讨论】:

  • 是的,这是正确的,但这种移位的执行时间是:assign out={[N'b0,in[7:N]} 的两倍。但这里 N 应该是常数
【解决方案2】:

如果inout 的大小真的固定为8 位,这里有一种简单的方法:

module sr(N, in, out);

  input  [2:0] N;
  input  [7:0] in;
  output [7:0] out;

  assign out = (N == 7) ? {7'b0, in[7:7]} : 
               (N == 6) ? {6'b0, in[7:6]} : 
               (N == 5) ? {5'b0, in[7:5]} : 
               (N == 4) ? {4'b0, in[7:4]} : 
               (N == 3) ? {3'b0, in[7:3]} : 
               (N == 2) ? {2'b0, in[7:2]} : 
               (N == 1) ? {1'b0, in[7:1]} : 
                                 in[7:0];

endmodule

这也可以使用 always 块内的 case 语句进行编码,如下所示:

  reg [7:0] out_reg;
  assign out = out_reg;

  always @(N or in) begin
    case (N)
      7 : out_reg <= {7'b0, in[7:7]};
      6 : out_reg <= {6'b0, in[7:6]};
      5 : out_reg <= {5'b0, in[7:5]};
      4 : out_reg <= {4'b0, in[7:4]};
      3 : out_reg <= {3'b0, in[7:3]};
      2 : out_reg <= {2'b0, in[7:2]};
      1 : out_reg <= {1'b0, in[7:1]};
      0 : out_reg <=        in[7:0];
    endcase
  end

如果您不想写出所有值,可以使用for 循环。我不是合成工具如何处理这个问题的专家,但是这个(或类似的东西)应该可以合成。

  always @(N or in) begin
    for (i = 0; i < 8; i = i + 1) begin
      if (i+N < 8) begin
        out_reg[i] <= in[i+N];
      end else begin
        out_reg[i] <= 1'b0;
      end
    end
  end

使用循环对其进行编码的一个优点是它不太容易出现剪切粘贴拼写错误。

更重要的是,如果您想让模块支持输入和输出的通用位宽,您可以在模块上使用 parameter 并为分配使用类似的循环。

【讨论】:

  • tanx dwikle,我喜欢第一个代码。我至少有 9 个输入和 9 个 N。这意味着拥挤的代码。但似乎没有其他选择
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多