我正在为一个实体编写代码,该实体接收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
然而,当我上传代码时,我得到的只是黑屏。我做错了什么?
答案 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
子句,以便它不会尝试在异步复位时写入新的寄存器值。我怀疑这与你的错误有关。你可能想要在重置时重置计数和总和,这是我的猜测。