我是Verilog的新手,如果有人可以帮我解决这个错误,我会非常感激:
output reg [0:image_width][image_height:0] result
....
integer i, j, imageX, imageY, x, y, kernelX, kernelY;
....
@(negedge ACLK)
for(x = 0; x < image_width; x++) begin
for(y = 0; y < image_height; y++)
begin
//multiply every value of the filter with corresponding image pixel
for(kernelX = 0; kernelX < kernel_width; kernelX++) begin
for(kernelY = 0; kernelY < kernel_height; kernelY++)
begin
imageX = (x - kernel_width / 2 + kernelX + image_width) % image_width;
imageY = (y - kernel_height / 2 + kernelY + image_height) % image_height;
// ignore input samples which are out of bound
if( imageY >= 0 && imageY < image_height && imageX >= 0 && imageX < image_width )
//ERROR HERE!!!
result[x][y] += image[imageX][imageY] * kernel[kernelX][kernelY];
end
end
end
end
end
我得到的错误是:
错误:常量表达式中不允许引用wire或reg('x')。
错误:数组索引表达式必须在此处保持不变。
错误:常量表达式中不允许引用wire或reg('imageX') 错误:数组索引表达式必须在此处保持不变 错误:常量表达式中不允许引用wire或reg('kernelX') 错误:数组索引表达式必须在这里保持不变。
有人可以告诉我我做错了什么吗?谢谢!
答案 0 :(得分:1)
这一行是问题所在:
result[x][y] += image[imageX][imageY] * kernel[kernelX][kernelY];
仅对常量表达式允许索引到数组中。不允许在向量索引中使用变量。请记住,您正在使用HDL:您在硬件中指示物理连接。在索引中有一个变量意味着能够动态重新连接电路。 This SO question有一些粗略的解决方法可能对您有用。但是,您应该尝试重构算法,以避免首先使用变量索引。
顺便说一下,您应该使用non-blocking assignments而不是目前的阻止作业。您的代码位于时钟模块中,因此应避免阻塞组合逻辑:
imageX <= (x - kernel_width / 2 + kernelX + image_width) % image_width;
imageY <= (y - kernel_height / 2 + kernelY + image_height) % image_height;
// ignore input samples which are out of bound
if( imageY >= 0 && imageY < image_height && imageX >= 0 && imageX < image_width )
result[x][y] <= result[x][y] + image[imageX][imageY] * kernel[kernelX][kernelY];
答案 1 :(得分:0)
@(negedge ACLK);
^
我很确定分号不属于那里。如上所述,for
循环都在always
块之外。
此外,您的image
数组目前每个像素只有一位。这是故意的吗?无论是否,我建议您重新考虑这种架构;在单个时钟周期内过滤任何大尺寸的图像并不能很好地合成。