2016-02-27 107 views
1

我正在開發一個verilog代碼累積直方圖方法,用於中值濾波器。它使用嵌套for循環,第二個循環的輸入取決於循環的第一個輸出。問題在於此。第二個for循環不接受該輸入。請幫忙。 代碼是在verilog中嵌套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 
+0

這是一個組合循環,對於模擬器將在0時間內執行,但你有'n'循環計數器作爲輸出,在模擬中,它總是看起來像最大值。我會建議寫入一個鐘控過程並花費多個時鐘週期來計算結果。 – Morgan

回答

0

只看這部分代碼:

for (n=0;n<=4;n=n+1) begin 
    b[a[n]]=b[a[n]]+1; 

n爲256位,但是對於這個循環只從0到4。
這從選擇一個值(5位),所以我們選擇位0到位4。

a的每個選擇都是1位,包含0或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位整數。

+0

謝謝,那工作。 –