2013-03-01 28 views
-2

我在verilog模塊中遇到了麻煩,這是一個非常大的CMOS攝像頭圖像代碼的一小部分。模塊需要clk並重置爲輸入和吐出從行同步,場同步,PIXCLK和像素data.The碼圖像中讀取並保存到內存中,然後做AA一堆若是喜歡else語句:Verilog代碼來計算輸入圖像幀中的行數和列數

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

+0

我假設使用文件實用程序僅用於測試平臺的目的,並且DUT(主模塊)將被給予x和y分辨率。 – Morgan 2013-03-01 19:49:09

回答

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]; 

否則在訪問不同地址什麼的相同數據的風險超出範圍。