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