摘要:本文以workbench 為平臺,vxworks 為操作系統(tǒng),chipscope 為分析工具,介紹了完整的ARINC429 協(xié)議和422協(xié)議的FPGA 硬件調(diào)試,通過硬件調(diào)試發(fā)現(xiàn)modelsim 仿真所不能發(fā)現(xiàn)的問題并分析問題解決問題,從而完成多路機載總線收發(fā)器的設計與實現(xiàn)。
在航空電子綜合化系統(tǒng)中,快速、有效的數(shù)據(jù)傳輸對整個航空電子系統(tǒng)的性能有很大的影響,因此數(shù)據(jù)總線被稱為現(xiàn)代航空電子系統(tǒng)的骨架,利用FPGA 技術(shù)設計集成多路ARINC429[1] 和422[4] 通道的通信芯片,可以有效的提高數(shù)據(jù)通信模塊的處理能力和集成度,降低成本,本文以verilog 語言為基礎, 通過ISE 編程,modelsim 仿真, 仿真無誤后綜合實現(xiàn),用impact 將bit 文件燒寫到FPGA 中,進行硬件調(diào)試,并用chipscope 進行分析,為了更加方便的進行調(diào)試,以workbench 為平臺建立驅(qū)動。關(guān)于429 協(xié)議和422 協(xié)議已經(jīng)非常成熟,因此本文主要從硬件調(diào)試的角度介紹多路機載總線收發(fā)器的實現(xiàn)。
1 FPGA 邏輯設計原理
很多情況下,我們需要一塊板子既具有429[2-3] 功能又具有422 數(shù)據(jù)傳輸功能,因此我們將429 邏輯和422 邏輯[6] 建立在一個模塊下,分別給429 邏輯和422 邏輯分配不同的地址空間,通過不同的地址空間控制429 和422 協(xié)議的片選信號,同時LOCALBUS 數(shù)據(jù)是雙向數(shù)據(jù),429 和422 數(shù)據(jù)是單向數(shù)據(jù),因此需要加一個雙向緩沖器,實現(xiàn)單向數(shù)據(jù)和雙向數(shù)據(jù)之間的轉(zhuǎn)換。協(xié)議部分已經(jīng)非常成熟,在此不做贅述。
2 原型驗證板驗證
2.1 原型驗證板原理
我們所用的電路板名稱為:MFD-GPM1018。設計原理如圖1:CPU 控制FPGA 數(shù)據(jù)的寫入和讀出,F(xiàn)PGA 通過429 或者422 接收到的數(shù)據(jù)按照相應的協(xié)議轉(zhuǎn)換之后由cpu 讀出,cpu 通過Localbus 提供FPGA 要發(fā)送的數(shù)據(jù)并配置寄存器。
CPU 讀出來的數(shù)據(jù)通過LBC-1-AD00——07 到鎖存器把地址和數(shù)據(jù)按一定的控制規(guī)則轉(zhuǎn)換為單獨的地址信號和數(shù)據(jù)信號。LBC-1-AD00——07 表示某時刻是地址信號某時刻是數(shù)據(jù)信號。ROM 存儲cpu 運行過程中的中間數(shù)據(jù)程。H1-8445 電平轉(zhuǎn)換,將429 數(shù)據(jù)電平由bus 總線所要求的電平轉(zhuǎn)
換為FPGA 需要的3.3V。ASP105885-01 是連接器將429、422 數(shù)據(jù)連接到GPM 調(diào)試版上,進行硬件調(diào)試。MAX3362 將串行數(shù)據(jù)轉(zhuǎn)換為差分的形式。M25P16-AVMN6T 是FPGA 的配置芯片,通過JTAG 接口將bit 文件加載到FPGA 中這樣配置之后,下次上電之后就可以直接將bit 文件load 到FPGA 中而不需重新加載。
2.2 硬件調(diào)試過程
在Workbench 開發(fā)平臺vxworks[3] 操作系統(tǒng)下,首先連接串口網(wǎng)口從調(diào)試板到PC 機,新建超級終端,選擇通信速率為115200,其他都為默認值,網(wǎng)口下載操作系統(tǒng)到cpu 中,串口用來控制cpu,串口網(wǎng)口連接好后,連接JTAG 接口,(JTAG連接線連USB 下載線連到PC 機),電源電壓設置為28V,然后上電,通過調(diào)試板上的電壓轉(zhuǎn)換器轉(zhuǎn)換為5V 供FPGA 板子使用,上電之后通過IMPACT 下載.bit 文件到FPGA 中,這種配置類型斷電即丟失,下次上電后需要重新下載,同時打開超級終端,建立串口連接,此時vxworks 操作系統(tǒng)將會自動啟動,在此操作系統(tǒng)下輸入一些命令控制cpu,常用的就是讀(d)和寫(m)命令,并且打開chipscope,來進行調(diào)試。
為了充分驗證邏輯功能的正確性:我們分別進行內(nèi)回環(huán)測試,也就是在邏輯內(nèi)部實現(xiàn)自收自發(fā),然后進行外回環(huán)測試,將板子上發(fā)送接口與接收接口連接起來,實現(xiàn)回環(huán)收發(fā),測試都無誤后進行外部測試,對429 協(xié)議采用429 的仿真卡進行測試,對422 協(xié)議采用串口調(diào)試工具進行測試。
2.2.1 429 測試
429 的仿真卡發(fā)送429 差分數(shù)據(jù),通過FPGA 接收,判斷接收到的數(shù)據(jù)是否是發(fā)送的數(shù)據(jù),以此來檢測接收邏輯的正確性。
429 仿真卡BUStools /ARINC v3.20 仿真驗證:
1)TX setup : 設置發(fā)送通道,波特率、奇偶校驗
2)DEFINE :ADD new message 添加發(fā)送通道,我們需要TXD1、TXD2,設置發(fā)送數(shù)據(jù)參數(shù):data——BIN 設置32—9位數(shù)據(jù),前8 位數(shù)據(jù)通過Label 設置,Label 是一個233 數(shù)據(jù)類型,2 指的是2 位,比如設置為256,則為10101110, 映射到發(fā)送的數(shù)據(jù)為0111 0101,即為0x75,最高位為奇偶校驗位,在發(fā)送過程中自動產(chǎn)生。
3) 設置完成后,點擊run,停止發(fā)送的話點擊stop。
通過超級終端讀出接收到的數(shù)據(jù)與發(fā)送的數(shù)據(jù)一致,測試正確。
2.2.2 通過串口調(diào)試工具進行422 測試
422 的發(fā)送端口和接收端口通過232 連到PC 機上,PC機通過串口調(diào)試工具發(fā)送一串數(shù)據(jù),經(jīng)過232 轉(zhuǎn)422 接收這些數(shù)據(jù),接收到的數(shù)據(jù)在超級終端中打印,檢測接收是否正確,類似的,調(diào)用驅(qū)動422 發(fā)送一串數(shù)據(jù),通過232 到PC 機通過串口調(diào)試工具看到發(fā)送出來的數(shù)據(jù),檢測發(fā)送的數(shù)據(jù)是否正確。調(diào)試過程中比較關(guān)鍵的一點就是發(fā)送和接收端口波特率要設置一致。
如圖2 所示,波特率設置為115 200,奇校驗,數(shù)據(jù)位8 位,停止位1 位,422 發(fā)送數(shù)據(jù),發(fā)送出來的數(shù)據(jù)經(jīng)232 顯示到PC 機串口接收窗口中,如下圖接收框顯示數(shù)據(jù)。
如圖2 所示,通過串口調(diào)試工具,手動發(fā)送數(shù)據(jù)1、2、3、4、5、6、7、8、9、10,經(jīng)232 轉(zhuǎn)422 轉(zhuǎn)換為422 數(shù)據(jù)形式,再經(jīng)fpga 處理。則在超級終端上顯示出接收到的422 數(shù)據(jù)個數(shù)以及數(shù)據(jù)。
2.2.3 驅(qū)動程序
驅(qū)動相當于用戶與底層FPGA 邏輯的一個接口,里面包含一些初始化函數(shù)、發(fā)送函數(shù)、接收函數(shù),初始化包括配置寄存器,波特率配置,通道選擇,奇偶校驗設置等,最后根據(jù)需求直接寫一個測試函數(shù),那么在硬件測試時先通過workbench[5] 進行調(diào)試,調(diào)試無誤后,通過wftp 下載到cpu 中,然后通過超級終端直接調(diào)用測試函數(shù)即可,就不需要之前手動單步通過寫、讀操作來進行配置和測試了。
429 與422 通過檢測狀態(tài)位來控制發(fā)送接收的驅(qū)動測試流程如圖3 所示。在上述測試過程中,發(fā)送一個數(shù)據(jù)則接收一個數(shù)據(jù),僅僅檢測到了接收與發(fā)送功能上的正確性??紤]到在應用過程中,并非發(fā)送一個數(shù)據(jù)接收完再發(fā)送一個數(shù)據(jù),比如發(fā)送若干個數(shù)據(jù)之后,此時才開始進行接收,那么在這種情況下,接收fifo 緩存中將存在若干個數(shù)據(jù),因此引入fifo的data_count 計數(shù),表示此時緩沖中儲存有多少個數(shù)據(jù),然后依次把這些數(shù)據(jù)給讀出來,這種情況下,也存在溢出的可能性,因此引出溢出狀態(tài)位。
改進后引入fifo 計數(shù)和溢出狀態(tài)檢測的驅(qū)動測試流程如圖4 所示。
3 調(diào)試過程中遇到的關(guān)鍵問題及分析
調(diào)用驅(qū)動對422 進行外回環(huán)測試0 通道發(fā)0 通道收1 通道發(fā)1 通道收,這時出現(xiàn)問題:當發(fā)送多個數(shù)據(jù)接收多個數(shù)據(jù),或者多次測試時會出現(xiàn)接收數(shù)據(jù)錯誤或者未接收到數(shù)據(jù)的現(xiàn)象,但是通過超級終端單步測試確是是正確的。用chipscope[7] 抓信號,發(fā)現(xiàn)接收數(shù)據(jù)時,會出現(xiàn)接收完數(shù)據(jù)后,fifo 非空的狀態(tài),正常應是空狀態(tài),這樣就把之前的數(shù)據(jù)再次接收了一遍,抓到的錯誤如圖5,其中test 是我們?yōu)榱藴y試方便加的一個參數(shù)用來檢測DAT 變化,因為DAT 是雙向數(shù)據(jù)無法抓到。
分析原因是由于發(fā)送的數(shù)據(jù)被接收后,再次發(fā)送數(shù)據(jù)前檢測狀態(tài)位未來得及告便,導致錯誤,于是在檢測狀態(tài)位后面加延遲taskdelay(1),測試正確,但是與之而來的問題是這樣大大影響了波特率,因為1 代表1/60ms,而波特率是ns 級的,于是用一個讀寄存器操作來代替這個延遲,讀一個寄存器狀態(tài)需要的時間大約為us 級,具有一定的延時但性能又優(yōu)于taskdelay,并且讀寄存器也不會影響其他的正常功能,至此以為問題解決了。但是后來為了完善功能,在邏輯中添加count,修改驅(qū)動進行測試,發(fā)現(xiàn)打印到超級終端上的fifo 計數(shù)不正確,發(fā)送一個數(shù)計數(shù)卻是31,繼續(xù)發(fā)送一個逐個計數(shù)為61,91…. 用chipscope 抓信號發(fā)現(xiàn)在tf_push 有效時(tf_push 控制發(fā)送fifo 的寫信號),同一數(shù)據(jù)輸入到fifo 了31 次,根據(jù)邏輯tf_push 在寫信號有效以及地址是發(fā)送緩沖地址且此時是正常工作狀態(tài)時就有效,那么根據(jù)chipscope 抓到的,發(fā)現(xiàn)在一個地址有效,寫信號有效的周期內(nèi),tf_push 持續(xù)有效,持續(xù)計數(shù)就說明此時有效了多個時鐘周期,每個時鐘周期數(shù)據(jù)寫入到發(fā)送fifo 中一次,但是我們期望的是寫信號有效地址有效一個周期內(nèi),數(shù)據(jù)只寫入一次,因此我們修改邏輯,使tf_push 有效的周期縮短為一個時鐘周期,同時根據(jù)這個問題,也判斷了之前接收數(shù)據(jù)總出錯,出現(xiàn)一個數(shù)據(jù)接收兩次的現(xiàn)象,需要加適當?shù)难訒r才不會出錯的原因正是如此。 明白這些之后,我們又把驅(qū)動中檢測狀態(tài)位與接收之間的延時去掉,再次測試,這次果如預期的一樣不再出錯,至此才找到了根本原因。對于這個問題Modelsim 是發(fā)現(xiàn)不了的,因為Modelsim 仿真時輸入激勵比如寫信號wr_n 有效設置的就是一個時鐘周期,因此chipscope 能夠發(fā)現(xiàn)modelsim 發(fā)現(xiàn)不了的
問題,這也就是硬件調(diào)試的功效。
修改前tf_push 如圖6所示。
修改后的tf_push,持續(xù)一個時鐘周期,如圖7 所示。
針對這個問題,我們總結(jié)寫底層邏輯時控制讀信號和寫信號使其持續(xù)時間為一個時鐘周期是非常有必要的,可以有效避免數(shù)據(jù)重復讀入和寫出。
4 結(jié)束語
文中以FPGA 為基礎,主要介紹了多路422 協(xié)議429 協(xié)議總線完整的FPGA 硬件調(diào)試,涉及硬件原理 、調(diào)試過程、調(diào)試中用到的工具、驅(qū)動程序以及對調(diào)試過程中遇到問題的分析方法,經(jīng)過這一系列的調(diào)試無誤,此部分將可以接受檢驗,實現(xiàn)穩(wěn)定的數(shù)據(jù)通訊功能。最后將邏輯固話到FPGA 中,上電自啟動,自此我們完成了完善的多路機載總線收發(fā)器的設計和實現(xiàn)。
評論
查看更多