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 = (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 回答