我正在为累积直方图方法开发一个 verilog 代码,用于中值过滤器。 它使用嵌套的 for 循环,即第二个 for 循环的输入取决于第一个 for 循环的输出。 问题就在这里。第二个 for 循环不接受该输入。请帮忙。代码是
module median(a, b,k,n,h);
input [4:0] a;
output [255:0] b;
output k,n,h;
reg [255:0] b;
reg [255:0]k,n,h;
always @(a) begin
for (n=0;n < 256;n=n+1)
b[n]=0;
for (n=0;n<=4;n=n+1) begin
b[a[n]]=b[a[n]]+1;
h=a[n]+1;
for ( k = h;k <=255;k = k+1) begin
b[k]=b[k]+1;
end
end
for (n=0;n<=255 ;n=n+1) begin
if(b[n]==3)begin
$display ("the median is %d",n);
end
end
end
endmodule
只看这段代码:
for (n=0;n<=4;n=n+1) begin
b[a[n]]=b[a[n]]+1;
n 是 256 位,但对于这个循环,只能从 0 到 4。
这会从 a(5 位)中选择一个值,因此我们选择 a 的位 0 到 4。
每个选择 a 都是包含 0 或 1 的 1 位,因此我们在 for 循环的每次迭代中选择并递增 b[0] 或 b[1]。
然而,b 也是 256 位,所以 b[0] 和b[1] 也是 1 位值,当递增时,它们将在 1 和 0 之间切换。
我猜上述行为不是故意的,你实际上想使用向量:
reg [255:0] b [0:4) ;
上面的 b 有 5 个可选位置,每个位置保存一个 256 位整数。这意味着 b[0] 将是一个 256 位整数,而不是当前示例的 1 位整数。