0

RGB 値を取り込んで平均化し、変更されたデータを出力するエンティティのコードを書いています。

私のコードは次のようになります。

module RGBAVG (
   input            clk,
   input            rst_n,
   input      [9:0] iVGA_R,
   input      [9:0] iVGA_G,
   input      [9:0] iVGA_B,
   output reg [9:0] oVGA_R,
   output reg [9:0] oVGA_G,
   output reg [9:0] oVGA_B
 );

 integer avg;
 integer count;
 integer sum;
 initial begin
     count = 0;
     sum = 0;
     avg = 0; 
end

always@(posedge clk or negedge rst_n) begin

  if (!rst_n) begin //reset
     sum = 0;
     count = 0;
     oVGA_R <= {10{1'b0}};
     oVGA_G <= {10{1'b0}};
     oVGA_B <= {10{1'b0}};
   end
   else begin //get RGB values from pixel, prepare for next avg evaluation
     count = (count + 1)%307200; //640*480 = 307200
     sum = sum + (iVGA_R + iVGA_G + iVGA_B)/3;
     if (count == 0) begin
        avg = sum/307200; //update avg
        sum = 0;
        end

 oVGA_R <= avg;
 oVGA_G <= avg;
 oVGA_B <= avg;
   end
 end

 endmodule

ただし、コードをアップロードすると、黒い画面しか表示されません。私は何を間違っていますか?

4

1 に答える 1

1

「コンパイル」とは、特定のターゲット用に合成することを意味しますか?これをシミュレートしようとしていますか、それともFPGAにロードしようとしていますか?

そのエラーが何を意味するのか正確には言えませんが、それをなくすための提案をするかもしれません。

あなたの論理は私には少し奇妙で、おそらく合成できません。あなたはalwaysブロックに非同期リセットを持っています、そしてあなたはそれを言っています:

この非同期リセットをアサートするときはいつでも、countとsumの値をインクリメントします

この種の構成は、通常のハードウェアには実際には存在しません。非同期リセットは、すべてのフロップの状態をリセットするという1つのことだけを実行する必要があります。したがって、これをすべて移動することをお勧めします。

count = (count + 1)%307200;
sum = sum + (iVGA_R + iVGA_G + iVGA_B)/3;
if (count == 0) begin
    avg = sum/307200;
    sum = 0;
end

else非同期リセット時に新しいレジスタ値を書き込もうとしないように、句に挿入します。これはあなたのエラーと関係があるのではないかと思います。おそらく、リセット時にカウントと合計もリセットしたいと思うでしょう、私の推測です。

于 2012-11-30T06:31:19.993 に答える