紀(jì)振平,王 航
(沈陽理工大學(xué) 自動(dòng)化與電氣工程學(xué)院,沈陽 110159)
現(xiàn)場(chǎng)總線是由電氣及自動(dòng)化領(lǐng)域發(fā)展而來的一種數(shù)據(jù)總線,其主要目的是為了解決工業(yè)領(lǐng)域的儀器儀表、控制器、執(zhí)行部件等設(shè)備間的數(shù)字通信以及這些控制器和控制系統(tǒng)之間的信息傳遞的問題。在眾多現(xiàn)場(chǎng)總線中德國 Bosch 公司推出的CAN(Controller Area Network)總線以其實(shí)時(shí)性強(qiáng)、可靠性高、功能完善、成本合理等突出優(yōu)點(diǎn),被越來越廣泛地應(yīng)用于自動(dòng)化領(lǐng)域中[1]。
FPGA(Field-Programmable Gate Array),即現(xiàn)場(chǎng)可編程門陣列,是在PAL、GAL、CPLD等可編程器件的基礎(chǔ)上進(jìn)一步發(fā)展的產(chǎn)物,是作為專用集成電路(ASIC)領(lǐng)域中的一種半定制電路而出現(xiàn)的,既解決了定制電路的不足,又克服了原有可編程器件門電路數(shù)有限的缺點(diǎn)[2]。在電子計(jì)算機(jī)斷層掃描的成像過程中,由于系統(tǒng)中有大量的模擬、數(shù)字信號(hào)需要處理,傳統(tǒng)單片機(jī)的引腳數(shù)量遠(yuǎn)遠(yuǎn)不夠,能處理的電平信號(hào)種類單一且片上外設(shè)部分功能冗余。所以通常采用FPGA作為電子計(jì)算機(jī)斷層掃描設(shè)備的硬件功能控制器。
傳統(tǒng)FPGA_CAN總線通信節(jié)點(diǎn)模式為 FPGA+SJA1000+PCA82C250。在該模式下的CAN通信節(jié)點(diǎn)中,F(xiàn)PGA輸出的信號(hào)經(jīng)電平轉(zhuǎn)化為5V標(biāo)準(zhǔn)驅(qū)動(dòng)SJA1000,SJA1000則根據(jù)輸入信號(hào)的時(shí)序關(guān)系從總線AD獲取或發(fā)送數(shù)據(jù)。從FPGA獲取的數(shù)據(jù)經(jīng)過處理后,組成標(biāo)準(zhǔn)格式的數(shù)據(jù)幀通過驅(qū)動(dòng)器PCA82C250發(fā)送到傳輸線CANH和CANL上的CAN總線通信模式[3]。本文所設(shè)計(jì)的CAN總線控制器是基于FPGA設(shè)計(jì)一個(gè)集成在其內(nèi)部的CAN總線控制器,相較于傳統(tǒng)的FPGA-CAN通信節(jié)點(diǎn),具有減少了硬件電路設(shè)計(jì),節(jié)約成本,使用更加靈活,專用性與集成度更高等特點(diǎn)。
CAN總線協(xié)議的報(bào)文種類分為五種,分別是數(shù)據(jù)幀、遙控幀、錯(cuò)誤幀、過載幀、幀間隔,其中最為核心的是數(shù)據(jù)幀。數(shù)據(jù)幀由 7 個(gè)位場(chǎng)構(gòu)成,包括幀起始、仲裁場(chǎng)、控制場(chǎng)、數(shù)據(jù)場(chǎng)、CRC 場(chǎng)、應(yīng)答場(chǎng)、幀結(jié)尾[4]。
CAN總線協(xié)議的報(bào)文由各個(gè)數(shù)據(jù)位組成,CAN總線協(xié)議把每一個(gè)數(shù)據(jù)位的時(shí)序拆解成四部分。每個(gè)數(shù)據(jù)位均包括同步段(SS段),傳播時(shí)間段(PTS段),相位緩沖1段(PBS1段),相位緩沖2段(PBS2段)。CAN協(xié)議中定義了時(shí)間份額Tq,其長度是系統(tǒng)工作時(shí)鐘tSCL的倍數(shù)[4]。在1個(gè)數(shù)據(jù)位中,同步段為1個(gè)時(shí)間份額,傳播段可設(shè)置為1~8個(gè)時(shí)間份額,相位緩沖段1可設(shè)為1~8個(gè)時(shí)間份額,信息處理時(shí)間小于或等于2個(gè)時(shí)間份額,相位緩沖段2為相位緩沖段1和信息處理時(shí)間的最大值。1個(gè)位時(shí)間總的可以包括 8~25個(gè)時(shí)間份額[5]。
為增強(qiáng)CAN總線節(jié)點(diǎn)的通信性能,并減少對(duì)FPGA片上資源的占用。本文從優(yōu)化控制器結(jié)構(gòu)和采用時(shí)序邏輯進(jìn)行功能模塊設(shè)計(jì)兩方面入手,建立了性能優(yōu)于以往的CAN總線控制器模塊。
在設(shè)計(jì)過程中,采用EDA設(shè)計(jì)的經(jīng)典設(shè)計(jì)思路,即自頂向底設(shè)計(jì),自底向頂實(shí)現(xiàn)。其設(shè)計(jì)過程如圖1所示。
圖1 CAN控制器的設(shè)計(jì)過程
在傳統(tǒng)CAN總線控制器的設(shè)計(jì)中,各個(gè)功能模塊間不存在例化關(guān)系,而是共同例化于頂層模塊。在這種結(jié)構(gòu)下,寄存器處理模塊(REG)對(duì)位流處理器模塊(BSP)和位時(shí)序控制模塊(BTL)的配置參數(shù)需要先傳遞到頂層模塊,再由頂層模塊傳遞至子模塊;而由位流處理器模塊接收到的信息也由相反的順序送回到寄存器處理模塊。因此,對(duì)于片上資源的占用和時(shí)序的延遲都有一定的影響。
本文采用了新型的控制器結(jié)構(gòu),用于取代傳統(tǒng)設(shè)計(jì)結(jié)構(gòu)。在該結(jié)構(gòu)下,寄存器處理模塊(REG)可直接對(duì)位流處理器模塊(BSP)和位時(shí)序控制模塊(BTL)進(jìn)行參數(shù)配置和收發(fā)信息的交互,減少片上資源的占用和時(shí)序的延遲。兩種結(jié)構(gòu)的對(duì)比如圖2所示。
時(shí)序邏輯電路是數(shù)字邏輯電路的重要組成部分,主要由存儲(chǔ)電路和組合邏輯電路兩部分組成。
圖2 CAN總線控制器的設(shè)計(jì)結(jié)構(gòu)的對(duì)比
時(shí)序邏輯電路在任何一個(gè)時(shí)刻的輸出狀態(tài)由當(dāng)時(shí)的輸入信號(hào)和電路原來的狀態(tài)共同決定,而其的狀態(tài)主要是由存儲(chǔ)電路來記憶和表示的。同時(shí)時(shí)序邏輯電路在結(jié)構(gòu)以及功能上的特殊性,相較其他種類的數(shù)字邏輯電路而言,往往具有難度大、電路復(fù)雜并且應(yīng)用范圍廣的特點(diǎn)[6]。
在傳統(tǒng)的CAN總線控制器設(shè)計(jì)中,大量的位時(shí)序切換信號(hào)設(shè)計(jì)使用了組合邏輯設(shè)計(jì)。在新型的CAN總線控制器設(shè)計(jì)中,則改為使用時(shí)序邏輯設(shè)計(jì)。將傳統(tǒng)CAN總線控制器位時(shí)序切換信號(hào)所采用的組合邏輯放入寄存器內(nèi),并添加時(shí)鐘信號(hào)變?yōu)闀r(shí)序邏輯。使得整個(gè)控制器都在同一時(shí)鐘的控制下,降低了組合邏輯中存在競爭冒險(xiǎn)的可能性,提高了CAN總線節(jié)點(diǎn)的穩(wěn)定性。信號(hào)采用組合邏輯設(shè)計(jì)的程序如下。
assing hard_sync=(rx_idle | rx_inter)&(~rx)& sampled_bit &(~hard_sync_blocked)
信號(hào)采用時(shí)序邏輯設(shè)計(jì)的程序如下所示。
assign @(posedge sys_clk_i,negedge rst_n_i)begin
if(!rst_n_i)
hard_sync <=1’b0;
else if((rx_idle | rx_inter)&(~rx)& sampled_bit &(~hard_sync_blocked)
hard_sync <=1’b1;
else
hard_sync <=1’b0;
end
2.2.1 REG模塊設(shè)計(jì)
REG模塊作為寄存器處理模塊,負(fù)責(zé)對(duì)CAN_controller寄存器的配置信息進(jìn)行存儲(chǔ),包括各個(gè)待接收發(fā)送數(shù)據(jù)的寄存器,驗(yàn)收代碼寄存器,驗(yàn)收屏蔽寄存器,總線定時(shí)器。
REG模塊在對(duì)一個(gè)寄存器賦值的過程中,通過8位輸入端口write_in,寫入16位二進(jìn)制數(shù),分別代表8位地址與8位數(shù)據(jù)。在地址輸入時(shí),將ale信號(hào)拉高,完成后拉低ale信號(hào),從而對(duì)地址鎖存。而后拉低wr信號(hào)輸入數(shù)據(jù),既可對(duì)地址所對(duì)應(yīng)的寄存器賦值。
REG模塊在讀取一個(gè)寄存器的過程中,通過8位輸入端口write_in,輸入表示地址的8位二進(jìn)制數(shù)。在地址輸入時(shí),將ale信號(hào)拉高,完成后拉低ale信號(hào),從而對(duì)地址鎖存。而后拉低rd信號(hào),即可通過8位輸出端口readback得到寄存器內(nèi)數(shù)據(jù)。
2.2.2 BTL模塊設(shè)計(jì)
BTL模塊作為CAN總線控制器的位時(shí)序控制模塊,負(fù)責(zé)檢測(cè)CAN總線狀態(tài)和處理與總線有關(guān)的位時(shí)序,并根據(jù)波特率寄存器中的設(shè)置值向位流處理器(BSP)提供采樣點(diǎn)與采樣值,提供發(fā)送標(biāo)志位。該模塊在總線上進(jìn)行檢測(cè),當(dāng)出現(xiàn)幀起始信號(hào)進(jìn)行硬同步,并在接收數(shù)據(jù)的過程中,每一個(gè)下降沿都進(jìn)行重同步檢測(cè),以REG模塊提供的可編程時(shí)間段PBS1段和PBS2段補(bǔ)償傳播延遲時(shí)間,以保證節(jié)點(diǎn)的數(shù)據(jù)連續(xù)性。
BTL模塊包含基于位時(shí)序邏輯設(shè)計(jì)的狀態(tài)機(jī),在CAN時(shí)序邏輯中,同步段SS,傳播時(shí)間段PTS、第一相位相位緩沖段PBS1、第二相位緩沖段PBS2等四段共同構(gòu)成一個(gè)數(shù)據(jù)位。
位時(shí)序狀態(tài)機(jī)是有限狀態(tài)機(jī)(FSM),共包含三個(gè)狀態(tài),分別是:包含SS段的SYNC狀態(tài);包含PTS段與PBS1段的SEG1狀態(tài);包含PBS2段的SEG2狀態(tài)。
當(dāng)發(fā)生接收時(shí),輸入信號(hào)rx應(yīng)在狀態(tài)機(jī)中的完整經(jīng)過一整個(gè)狀態(tài),才能被判定為接收到一個(gè)完整數(shù)據(jù)位。
三個(gè)狀態(tài)間轉(zhuǎn)換的關(guān)系如圖3所示。
圖3 BTL模塊內(nèi)位時(shí)序狀態(tài)機(jī)
在接收過程中,采樣點(diǎn)位于發(fā)生在SEG1狀態(tài)與SEG2狀態(tài)之間;在發(fā)送過程中,發(fā)送點(diǎn)位于SEG2狀態(tài)與SYNC狀態(tài)之間。
2.2.3 BSP模塊設(shè)計(jì)
BSP模塊作為CAN總線控制器的位流處理器模塊,主要負(fù)責(zé)CAN總線節(jié)點(diǎn)的數(shù)據(jù)流發(fā)送接收,它還在CAN總線上執(zhí)行錯(cuò)誤檢測(cè)、總線應(yīng)答、位填充、CRC校驗(yàn)和驗(yàn)收濾波等功能。
BSP模塊包含基于CAN總線數(shù)據(jù)流邏輯設(shè)計(jì)的接收狀態(tài)機(jī)和發(fā)送狀態(tài)機(jī),二者皆為有限狀態(tài)機(jī)(FSM)。通過對(duì)總線狀態(tài)的判斷和上層命令的識(shí)別,分別執(zhí)行對(duì)CAN總線數(shù)據(jù)流的接收與發(fā)送。接收與發(fā)送期間的狀態(tài)機(jī)流程如圖4所示。
圖4 接收與發(fā)送期間的狀態(tài)機(jī)流程
在接收狀態(tài)中,共包含rx_inte(幀間隔)、rx_idle(總線空閑)、rx_id(幀ID段)、rx_rtr(幀rtr位)、rx_ide(幀IDE位)、rx_r0(幀r0位)、rx_dlc(幀DLC段)、rx_data(幀數(shù)據(jù)場(chǎng))、rx_crc(幀CRC段)、rx_crc_lim(幀CRC界定符)、rx_ack(幀應(yīng)答)、rx_ack_lim(幀應(yīng)答界定符)、rx_eof(幀結(jié)尾)等13個(gè)狀態(tài)。
在發(fā)送狀態(tài)中,共包含tx_idle(發(fā)送總線空閑)、tx_arb_control(發(fā)送幀控制場(chǎng))、tx_data(發(fā)送幀數(shù)據(jù))、tx_crc(發(fā)送幀CRC)、tx_end(發(fā)送幀結(jié)尾)等5個(gè)狀態(tài)。
BSP模塊中包含作為篩選器的ACR,AMR模塊。在CAN總線控制器處于接收狀態(tài)時(shí),會(huì)將接收到的數(shù)據(jù)流中仲裁段(ID號(hào))的高8位,與CAN總線控制器中驗(yàn)收代碼寄存器(ACR),驗(yàn)收屏蔽寄存器(AMR)的設(shè)定值進(jìn)行計(jì)算。若ACR[7∶0]與ID號(hào)的高八位進(jìn)行“與”運(yùn)算的結(jié)果,再和AMR[7∶0]進(jìn)行”或”運(yùn)算的最終值為8’b1111_1111,則該條信息可以被節(jié)點(diǎn)所接收。
BSP模塊中還包括用于檢查CAN總線發(fā)生位錯(cuò)誤,填充錯(cuò)誤,格式錯(cuò)誤,CRC錯(cuò)誤與應(yīng)答錯(cuò)誤等五種錯(cuò)誤的錯(cuò)誤處理模塊(ERR),若出現(xiàn)錯(cuò)誤數(shù)量大于127個(gè)時(shí),CAN總線將斷開與總線的連接,并將標(biāo)志位置為“1”提示使用人員。
選取ID號(hào)為0x250的CAN標(biāo)準(zhǔn)幀做發(fā)送測(cè)試,該段信息長度為8byte,波特率為1M。當(dāng)控制器通過TX引腳向總線發(fā)送信息時(shí),同在總線上的RX引腳能捕捉到每一個(gè)由TX引腳發(fā)出的信號(hào),在CRC界定符發(fā)送完畢時(shí),RX引腳捕捉到一個(gè)不由TX引腳發(fā)出的顯性電平,表示總線上已有節(jié)點(diǎn)對(duì)該段信息進(jìn)行了接收。
選取ID號(hào)為0x110的CAN標(biāo)準(zhǔn)幀做接收測(cè)試,該測(cè)試段的信息長度和波特率均與發(fā)送測(cè)試信息段相同。當(dāng)控制器通過RX引腳接收到總線數(shù)據(jù)時(shí),在CRC界定符接收完畢時(shí),若驗(yàn)證CRC無誤,且接收過程中未發(fā)生錯(cuò)誤,則TX引腳將向總線發(fā)送一個(gè)顯性電平,表示本節(jié)點(diǎn)已正確接收。利用邏輯分析儀對(duì)CAN總線邏輯電平的監(jiān)測(cè)結(jié)果如圖5所示。
圖5 CAN總線控制器處于接收與發(fā)送的狀態(tài)
3.2.1 FPGA的占用資源比較
在生成供FPGA使用的比特流文件后,對(duì)比傳統(tǒng)CAN總線控制器與新型CAN總線控制器對(duì)FPGA的資源占用情況如圖6所示。
圖6 FPGA內(nèi)部資源占用的比較
由圖6可見,即使采用時(shí)序邏輯設(shè)計(jì)增加了部分寄存器資源的占用,但新型CAN總線控制器的總體資源占用仍要小于傳統(tǒng)的CAN總線控制器。
3.2.2 CAN總線節(jié)點(diǎn)的通信性能比較
本文通過將兩個(gè)燒入了CAN總線控制器比特流文件的FPGA與CAN總線分析儀掛載于同一波特率為1M的閉環(huán)CAN總線進(jìn)行測(cè)試。在實(shí)驗(yàn)過程中A機(jī)向總線發(fā)送由隨機(jī)數(shù)據(jù)構(gòu)成的數(shù)據(jù)包,B機(jī)接收數(shù)據(jù)包并解包校驗(yàn),待通過校驗(yàn)后,B機(jī)重新將數(shù)據(jù)包發(fā)回CAN總線。并通過上位機(jī)軟件與CAN總線分析儀對(duì)當(dāng)前CAN總線上的數(shù)據(jù)包進(jìn)行監(jiān)控。
雙機(jī)通信測(cè)試結(jié)果如圖7所示,在測(cè)試過程中分別對(duì)傳統(tǒng)CAN總線控制器與新型CAN總線控制器傳輸了10000個(gè)CAN數(shù)據(jù)包,其中傳統(tǒng)CAN總線控制器正確傳輸9993個(gè)數(shù)據(jù)包,錯(cuò)誤傳輸7個(gè)數(shù)據(jù)包;新型CAN總線控制器正確傳輸9997個(gè)數(shù)據(jù)包,錯(cuò)誤傳輸3個(gè)數(shù)據(jù)包。由測(cè)試結(jié)果可見,新型CAN總線控制器的穩(wěn)定性要優(yōu)于傳統(tǒng)CAN總線控制器。
圖7 CAN總線控制器雙機(jī)通信傳輸測(cè)試
本文對(duì)基于FPGA的CAN總線控制器,通過采用時(shí)序邏輯設(shè)計(jì)與新型結(jié)構(gòu)進(jìn)行優(yōu)化。經(jīng)過測(cè)試結(jié)果表明,該設(shè)計(jì)可以實(shí)現(xiàn)CAN總線節(jié)點(diǎn)的通信功能,并降低了FPGA內(nèi)部資源的占用。綜合通信效果,占用資源和使用成本等多方面進(jìn)行比較,使用本設(shè)計(jì)進(jìn)行數(shù)字電路的設(shè)計(jì)要優(yōu)于使用CAN總線控制器的集成電路進(jìn)行的設(shè)計(jì)。