宋 燦
(安徽理工大學 安徽 淮南 232001)
與純粹的算法仿真不同,實現(xiàn)性的仿真不僅需要確定算法的正確性和性能,還需要生成實時語言硬件代碼RTL。通常這種實現(xiàn)過程并不是直接通過手工編寫的方式來實現(xiàn)算法的硬件代碼,而是建立在部分算法仿真的基礎(chǔ)之上。首先,在Matlab中搭建Simulink仿真模塊。然后,進行數(shù)據(jù)定點化,確認無誤之后可以通過HDL coder來生成硬件代碼。然而生成的這些代碼未必直接能在硬件平臺上運行,那怕只是仿真編譯都未必可以通過,這時候我們就需要后續(xù)的一系列手段來保證硬件代碼生成后可以在硬件平臺上順利運行。通常我們以一個5步流水的方式來生成最后可在硬件上運行的代碼。整個過程的流程圖如圖1所示。
圖1 基于Cycle True準則的RTL代碼實現(xiàn)的流程圖
為了更好地介紹硬件代碼的實現(xiàn)過程,首先介紹一下在這個過程中需要使用到的仿真環(huán)境。整個流程中我們使用到的仿真環(huán)境主要有MATLAB是矩陣實驗室(Matrix Laboratory)、Quartus II:由Altera公司針對自家生產(chǎn)的硬件所設(shè)計的綜合性PLD開發(fā)軟件、Mentor公司的ModelSim:一款HDL語言仿真軟件,業(yè)界唯一的單內(nèi)核支持VHDL和Verilog混合仿真的仿真器。
這是所有理論設(shè)計的第一步驗證,通過Matlab-simulink搭建系統(tǒng)模型,并在仿真運行后觀察系統(tǒng)關(guān)鍵位置的數(shù)據(jù)是否符合理論標準,以及確定整個算法的性能。之后的步驟不再影響或考慮性能因素,只涉及正確性問題。其中需要說明的是,理論驗證一開始需要先搭建一個行為級的算法實現(xiàn),每個模塊直接由Simulink提供,這一步基本上就已經(jīng)確定了算法本身的性能。但是這一步所實現(xiàn)的算法,僅僅是性能驗證而已無法用來生成硬件代碼。這一步得到的結(jié)果我們稱之為x版或行為級模塊。接下來需要通過最基本的邏輯電路來搭建一個可實現(xiàn)級的算法模塊。這一步得到的結(jié)果我們稱之為q版。以O(shè)FDM解調(diào)使用到的FFT模塊為例,圖2給出了FFT算法的Simulink實現(xiàn)以及仿真方法。
接下來,我們將x版和q版中同等位置的數(shù)據(jù)作差,如果得到的差為0則說明得到的結(jié)果相同,若結(jié)果不同結(jié)果應(yīng)為±1,則說明出現(xiàn)了錯誤。對這個結(jié)果取絕對之后再循環(huán)累加來統(tǒng)計出先錯誤的次數(shù)。通常情況下我們要求累加結(jié)果一直為0。之后的每一步算法或代碼實現(xiàn)后都要類似的與原始的x版進行比較。
圖2 帶有512點FFT的OFDM仿真
定點化:在實際硬件中信號僅可傳遞2進制數(shù),因此需要一個將各輸入輸出節(jié)點及線路上的數(shù)據(jù)類型轉(zhuǎn)化為2進制定點數(shù)表示。除此之外既然是定點數(shù)據(jù),那么的長度也是該步驟需要考慮的問題。在對數(shù)據(jù)精度某個特定的要求情形下確定各個節(jié)點的長度,防止某些節(jié)點出現(xiàn)數(shù)據(jù)溢出,或必要時截斷某些數(shù)據(jù),這些步驟決定了定點化是一個工作量比較大的仿真環(huán)節(jié)。以一個無符號二進制整形數(shù)據(jù)為例,1位2進制數(shù)類型設(shè)為Boolean。十進制整數(shù)先換算成二進制 (比如144先2進制表示為10010000)從而確定其寬度為8位,因此設(shè)定類型uint8即無符號8位2進制數(shù)。值得注意的是某些電路節(jié)點的數(shù)據(jù)寬度是可變的,例如在一些反饋回路中 輸出和輸入的位寬不同 (比如循環(huán)累加器)并且輸出信號可能再次成為輸入信號,按照原有既定的輸入寬度在累加到一定次數(shù)后即可能溢出。因此輸入的寬度要和累加器輸出最大寬度保持一致。對于有符號數(shù)或小數(shù)的則要確定小數(shù),比如對于一個整數(shù)部分為3位小數(shù)部分為11位的一個有符號小數(shù),則需要將數(shù)據(jù)類型選擇為sfix(14,11),其中14表示總共的二進制數(shù)的位數(shù)為14,其中小數(shù)占據(jù)11位。因此我們需要將輸出數(shù)據(jù)類型Output data type(如果可能的話還包括輸入數(shù)據(jù)類型Input data type)由繼承內(nèi)部規(guī)則Inherit via internal rule改為進過計算后得出的類型。定點化所生成的模塊版本成為e版。仿真運行正確后,可以使用Matlab內(nèi)建工具生成HDL代碼,為后面的HIL仿真和最后的硬件仿真做準備工作。在我們實際應(yīng)用中生成的是Verilog HDL代碼。圖3給出了HDL代碼的生成工具。
圖3 HDL代碼生成界面
協(xié)同仿真Co-simulation是一種用到了2個或多個仿真環(huán)境的仿真方法。可以認為是軟件仿真向硬件仿真的過渡。這里需要Simulink和Modelsim協(xié)同完成。Modelsim和Simulink分別調(diào)用了各自的庫文件。其中Modelsim的庫文件很多來自于Altera,因此和硬件庫相關(guān)。而Simulink的庫幾乎都來自于Matlab,更貼近我們最原始的算法版本。因此可以認為這一步是由到HDL代碼生成到硬件回路仿真(HIL)的過渡。驗證生成的代碼是否可綜合。實際操作中可以用新建的cosimulation模塊替換原有的e版模塊。
這一步稱為硬件回路仿真:Hardware in the loop(HIL),是一種硬件級的仿真。我們采用的是DSP builder與QuartusII聯(lián)調(diào)方式,因此也是一種協(xié)同仿真。DSP builder是Altera提供的一個基于Simulink的仿真組件。HIL模塊示意圖如圖4所示。
圖4 HIL模塊
HIL被證明是一種有效的解決方法。該技術(shù)能確保在開發(fā)周期早期就完成嵌入式軟件的測試。到系統(tǒng)整合階段開始時,嵌入式軟件測試就要比傳統(tǒng)方法做得更徹底更全面。這樣可以及早地發(fā)現(xiàn)問題,因此降低了解決問題的成本。HIL仍然是一種協(xié)同仿真,只是這次不同的是用到了FPGA硬件。驗證編譯器將HDL代碼綜合成硬件代碼并驗證是否正確。需要注意的是如果這一步可能會出現(xiàn)一些問題,而不同的問題反應(yīng)了前面不同的地方存在著問題。硬件代碼在編譯綜合時消耗了過長時間或無法綜合說明原有代碼生成工具可能存在問題,因此需要進行檢查代碼并手工修改。
在以上各步驟均驗證正確或符合性能指標之后即可進行硬件系統(tǒng)搭建。值得注意的是上一個步驟使用到的硬件并非完整的系統(tǒng),通常只是用到了一個FPGA處理器,并不包含其他元器件。而這一步則是要對制作好的硬件pcb板在算法或功能上進行全面調(diào)試。因此除了要測試算法以外,還要對外設(shè)驅(qū)動,控制程序等做全面測試。
在實際的工程應(yīng)用中由于工作量大,細節(jié)繁瑣,那么仿真過程中如果出現(xiàn)問題在普通的機制下往往會出現(xiàn)有錯無從查找原因的尷尬局面。基于Cycle True準則的仿真和RTL代碼生成的方法很好的保證了每個環(huán)節(jié)的正確性或可糾錯性。一旦在當前步驟發(fā)現(xiàn)錯誤,可以很快的根據(jù)Cycle True準則在相關(guān)的環(huán)節(jié)中尋找錯誤。因此極大的提高了工作效率和可靠性。
[1]應(yīng)啟衍,鄭君里.Matlab綜合實驗[M].北京:高等教育出版社,2008.
[2]岡薩雷斯.數(shù)字圖像處理Matlab版[M].電子工業(yè)出版社,2005,9.
[3]Alan V.Oppenheim&John R.Buck.Discrete-Time Signal Processing[M].西安交通大學出版社,2001,9.
[4]桑吉特·米特拉.數(shù)字信號處理:基于計算機的方法[M].電子工業(yè)出版社,2011,9.