【问题标题】:Parameterizing an incomplete case statement in Verilog在 Verilog 中参数化不完整的 case 语句
【发布时间】:2016-05-27 21:11:39
【问题描述】:

我正在尝试参数化我编写的一些代码。下面的非参数化版本是为 WIDTH = 4 编写的。我有一个 reg digits 循环为零。根据这个零的位置,我想从我的数组SS 中向segments 输出一个特定的向量(我在别处为其赋值)。

reg [6:0] SS [3:0];    

always @(posedge clk)
    if (reset) digits <= 4'b1110;
    else       digits <= { digits[2:0], digits[3] };

always @(*)
    if (reset) segments <= ~7'h0;
    else case(~digits)
        4'b1    : segments[6:0] <= ~SS[0];
        4'b10   : segments[6:0] <= ~SS[1];
        4'b100  : segments[6:0] <= ~SS[2];
        4'b1000 : segments[6:0] <= ~SS[3];
        default : segments[6:0] <=  7'h0;
    endcase

如何为不同宽度的digits 参数化此case 语句?我尝试使用 for 循环而不是这样的 case 语句:

for (genvar i = 0; i < WIDTH; i = i+1) begin
    if (~digits[i]) segments[6:0] <= ~SS[i];
end

但它不会合成,因为它说 segments 有多个驱动程序,如果我以不同的方式(如下所示)它说 digits 不是恒定的,因此它无法合成:

for (genvar i = 0; i < WIDTH; i = i+1) begin
    if (~digits == (1 << i)) segments[6:0] <= ~SS[i];
end

我该怎么做?我曾考虑采用~digits 的日志基数2 并在循环中检查它是否等于i,但我不确定如何在硬件中做到这一点。有没有更好的办法?

【问题讨论】:

  • SS 的声明是什么?可以上传完整代码吗?
  • @PrakashDarji 我更新了它
  • 还告诉段的声明?
  • 您的generate 和engenerate 在哪里?在生成中,awalys 块或assign 语句用于为segments 赋值。

标签: verilog


【解决方案1】:

您可以进行循环并利用“最后一次分配获胜”。见下文。我在这里使用了一些 SystemVerilog 语法,但你可以不用它。

PARAMETER SS_SIZE = 4
logic [6:0] SS [SS_SIZE];
logic [SS_SIZE-1:0] digits;

always_ff @(posedge clk or posedge reset)
    if (reset) digits <= {{(SS_SIZE-1){1'b1}},1'b0};
    else       digits <= { digits[SS_SIZEE-2:0], digits[SS_SIZE-1] };

always_comb begin
    segments = '0;
    for(int i=0; i<SS_SIZE; i++) begin
       if(digits[i]==1'b0) begin
          segments = ~SS[i];
       end
    end
 end

我会更进一步,将移位寄存器替换为二进制计数器:

PARAMETER SS_SIZE = 4
logic [6:0] SS [SS_SIZE];
logic [$clog2(SS_SIZE)-1:0] count;

always_ff @(posedge clk or posedge reset)
    if (reset) count <= '0;
    else if(count == (SS_SIZE-1)) count <= '0
    else       count <= count+1;

assign segments = ~SS[count];

【讨论】:

  • 感谢这工作!我之前将for 循环放在generate 和endgenerate 之间。您是否认为您可以阐明将其放在那里与不放在那里之间的硬件有什么不同?你能解释一下“最后的任务获胜”吗?
  • 您可以在循环中多次驱动某物,只要最后一个任务是您要坚持的任务。综合工具足够聪明,可以为此计算出最少的硬件。我的答案和使用生成块的答案可能没有任何区别。
猜你喜欢
  • 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
相关资源
最近更新 更多