RGB值操作无法按预期工作(Verilog)

时间:2012-11-30 04:58:30

标签: verilog

我正在为一个实体编写代码,该实体接收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

然而,当我上传代码时,我得到的只是黑屏。我做错了什么?

1 个答案:

答案 0 :(得分:1)

当你说'编译'时,你的意思是为特定目标合成吗?您是在尝试模拟这个,还是将其加载到FPGA上?

我不能确切地说出这个错误意味着什么,尽管我可能会提出一些可能会让它消失的建议。

你的逻辑对我来说有些奇怪,可能无法合成。你有一个异步重置你的always块,你说的是:

  

任何时候我断言这个异步复位,增加count和sum的值

这种结构在典型的硬件中并不存在,你的异步复位应该只做一件事,那就是重置所有触发器的状态。因此,我建议移动所有这些:

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

进入else子句,以便它不会尝试在异步复位时写入新的寄存器值。我怀疑这与你的错误有关。你可能想要在重置时重置计数和总和,这是我的猜测。