RGB值操纵未按预期工作(Verilog)

RGB值操纵未按预期工作(Verilog),verilog,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]

我正在为一个实体编写代码,该实体接受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
模块RGBAVG(
输入时钟,
输入rst\n,
输入[9:0]iVGA_R,
输入[9:0]iVGA_G,
输入[9:0]iVGA_B,
输出寄存器[9:0]oVGA_R,
输出寄存器[9:0]oVGA_G,
输出寄存器[9:0]oVGA_B
);
平均整数;
整数计数;
整数和;
初始开始
计数=0;
总和=0;
平均值=0;
结束
始终@(posedge clk或negedge rst_n)开始
如果(!rst_n)开始//重置
总和=0;
计数=0;

oVGA_R当你说“编译”时,你是指针对特定目标进行合成吗?您是在尝试模拟它,还是将其加载到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
子句,这样它就不会在异步重置时尝试写入新的寄存器值。我怀疑这与你的错误有关。我猜,你可能也想在重置时重置计数和总和

我采纳了您的建议,将代码移到else子句中,并将count和sum更改为reg类型的变量。目前,我只是编译代码,而不是将其加载到我的FPGA上。哦,我还忘了一些重置代码。谢谢你指出这一点!抱歉,无法从您的评论中判断,这解决了问题吗?如果没有,我建议您将更新的代码编辑到问题中。
integer X
reg signed[31:0]X
@Adam12相同-谢谢您的澄清,我不确定。我确实看到了我在EDABoard上找到的这张便条,它声称来自verilog 2001规范,上面说:“整数代表的是不被视为硬件寄存器的数量”,所以我不确定它是否被阻止。我的代码可以编译,但不能按预期工作。我想把640x480像素的RGB值取出来,求平均值,然后用这个平均值填充整个屏幕。然而,当我上传上面的代码时,我的屏幕是黑色的。有人能帮我吗?你需要写一个测试台来模拟你的设计。在模拟工作之前,不要在硬件上尝试它。