在Quartus II中快速更新FPGA片上存儲器初始值的一種方法


最近在調試中遇到了這樣一個問題:一組參數預先存儲在FPGA的片上存儲器內;在系統運行過程中部分參數會被讀出,修改後寫回;爲了調試,需要經常變換參數的初始化值。

    實現存儲器中數值的初始化比較容易,在生成RAM模塊時指定一個初始化文件(.hex或.mif)即可。

    實現部分參數的動態修改也容易,設計一個狀態機在需要的時候寫入該RAM即可。

    爲了調試,更新初始化數值就難了些,可供選擇的方法有這樣幾種:

1. 採用In-system Memory Content Editor,通過Import File的方式把修改後的初始化文件更新到RAM中。

2. 採用Virtual JTAG定製一個RAM寫入接口,連接到雙端口RAM的一個空閒端口用於調試,雙端口RAM的另一個端口用作正常使用。

3. 修改初始化文件,把初始化文件更新到編程文件中,通過重新下載更新到RAM中。

    第一種方法原理上沒有任何問題,在MegaWizard Plug-in Manager中選擇Allow In-system Memory Content Editor...即可。但是,在實際應用中,只有單端口ROM可以採用該方法;單端口RAM採用該方法可以生成代碼,但是不能正確編譯,總是報出一些奇怪的錯誤;此外。雙端口的ROM和RAM都不支持In-system Memory Content Editor。

    第二種方法在本質上與第一種方法相同,在實際應用中也能正確編譯,唯一的缺點是需要對Virtual JTAG有較深入的認識,需要手工編寫一些代碼,還要編寫TCL腳本。

    第三種方法可以不修改代碼,也不需要執行全編譯,只要在Quartus II集成開發環境中執行兩個簡單的操作即可。下面就是具體的步驟:

1. Processing -〉Update Memory Initialization File

2. Processing -〉Start -〉Start Assembler

    上述操作執行完畢,把Assembler生成的編程文件下載到FPGA中,修改後的初始化文件就更新到片上存儲器中了。

    該方法的原理是,在Update Memory Initialization File過程中,只更新db文件夾中與RAM初始化內容相關的文件,其餘文件不更新,所以不需要執行全編譯;更新後執行Assembler,把新的初始化內容更新到編程文件中去。該方法類似於軟件編譯過程中的部分編譯和重新鏈接。

    該方法只適用於靜態更新RAM內容,如果需要對RAM進行動態調試,還是用第二種方法才行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章