-2

我在使用 Verilog 模块时遇到问题,它是一个非常大的 CMOS 相机图像代码的一小部分。该模块将 clk 和 reset 作为输入并吐出 hsync、vsync、pixclk 和像素数据。代码读取图像和将其保存到内存中,然后执行一堆 if else 语句,例如:

if (row_count<NUM_ROWS-1) && (col_count< NUM_COLS) 
begin 
 vsync <=1; 
 hsync <=1 ;
 pixe_data <= mem[row_count*NUM_ROWS+col_count];
end
else if
 ......

到目前为止,图像尺寸是使用 NUM_COLS 和 NUM_ROWS 硬编码的,但我正在尝试更改它,以便代码即时计算传入图像的行和列。我曾尝试使用 $fscanf、$fgets、$Sscanf 等,但我没有得到正确的结果。事实上我根本没有得到任何结果。我的模拟卡住了,或者它说它的内存不足或 fd 是一个空文件描述符.此外,当我将 NUM_ROWS 和 NUM_COLS 转换为变量时,我收到一条错误消息,指出常量操作的操作数非法。

如果有人可以让我对解决此问题的不同方法有所了解,我将不胜感激。

如果这里的信息不充分或不清楚,我提前道歉。

谢谢SK

4

1 回答 1

1

约束操作的非法操作数可能是由于mem. 尺寸必须是常数,例如,reg [DATA_SIZE-1:0] mem [ROW_MAX*COL_MAX-1:0];您需要确定要处理的最大图像尺寸。如果最大尺寸不是2**N,那么您将需要实施一些保护措施,例如发出错误信号而不处理任何内容、截断图像或其他内容。

我不确定如何在不编写自定义 PLI 的情况下找到未知图像尺寸的行和列。$fscanf可以读取图像数据,您很可能希望将其"%u"用于格式组件。如果图像在文件本身中包含有关其尺寸的信息,那么您可以使用$fscanf或提取信息$fread


其他注意事项,来自您的原始代码片段:

pixe_data <= mem[row_count*NUM_ROWS+col_count];

应该:

pixe_data <= mem[row_count*NUM_COLS+col_count];

否则存在从不同地址访问相同数据或超出范围的风险。

于 2013-03-02T01:01:47.667 回答