【发布时间】: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