吳志勇,劉繼平,郭元興
(中國電子科技集團(tuán)公司第三十研究所,四川 成都 610041)
在嵌入式系統(tǒng)中,CPU與外設(shè)交互數(shù)據(jù)主要有3種方式:查詢、中斷和DMA。查詢方式是由CPU周期性地執(zhí)行查詢指令來讀取外設(shè)的狀態(tài)寄存器,根據(jù)設(shè)備的狀態(tài)來交互數(shù)據(jù)。這種方式效率低下,當(dāng)CPU連接的外設(shè)數(shù)量較多時,外設(shè)的數(shù)據(jù)無法得到實時處理。中斷和DMA方式克服了查詢方式的缺點(diǎn),提高了CPU的效率和數(shù)據(jù)處理的實時性。其中,DMA方式同樣需要使用中斷機(jī)制來實現(xiàn)。
然而,CPU的中斷資源有限。當(dāng)系統(tǒng)中連接CPU的外設(shè)數(shù)量多于CPU的中斷管腳數(shù)量時,需要采取某種方式將多個外設(shè)的中斷信號進(jìn)行復(fù)用。采用Intel 8259A等芯片可以實現(xiàn)中斷信號的復(fù)用,但在使用前需要CPU對其進(jìn)行配置。然而,將32路中斷信號復(fù)用成1路中斷信號需要使用5片8259A芯片級聯(lián),占用了較大的PCB板面積,也增加了系統(tǒng)設(shè)計的復(fù)雜性[1-2]。
此外,部分CPU在進(jìn)入中斷服務(wù)程序后或處于中斷屏蔽狀態(tài)時,無法通過中斷管腳繼續(xù)接收外設(shè)給入的中斷信號,有可能導(dǎo)致數(shù)據(jù)的丟失。
因此,設(shè)計一種適用于多外設(shè)系統(tǒng),能夠?qū)⒍嗦分袛嘈盘枏?fù)用且不受CPU中斷狀態(tài)影響的中斷控制器具有較高的實用價值。本文利用FPGA具有的研制周期短、設(shè)計成本低、設(shè)計靈活性高等特點(diǎn),設(shè)計了一種基于FPGA的中斷控制器。
中斷是指CPU在執(zhí)行當(dāng)前程序的過程中,當(dāng)出現(xiàn)某些異常事件或某種外部請求時,CPU暫時停止執(zhí)行當(dāng)前程序,轉(zhuǎn)去執(zhí)行外設(shè)的服務(wù)程序。當(dāng)外設(shè)的服務(wù)程序執(zhí)行完畢后,再返回被暫停執(zhí)行的程序處繼續(xù)執(zhí)行。CPU對中斷響應(yīng)的流程如圖1所示[3]。
圖1 CPU對中斷響應(yīng)的流程
CPU一般至少有一個中斷信號輸入管腳,在每條指令的最后一個機(jī)器周期對中斷管腳的輸入信號進(jìn)行采樣,并對中斷做出響應(yīng)。根據(jù)不同的觸發(fā)方式,中斷可以分為電平觸發(fā)中斷和邊沿觸發(fā)中斷。電平觸發(fā)方式用一段持續(xù)的高電平或低電平表示中斷請求,要求中斷請求信號要有足夠長的保持時間,要保持到當(dāng)前指令的最后一個機(jī)器周期,以確保CPU采樣時中斷請求有效。邊沿觸發(fā)方式是以一個信號的上跳沿或下跳沿表示中斷請求,CPU對這個中斷請求進(jìn)行鎖存。
中斷控制器的作用是在有多個中斷源的系統(tǒng)中,可同時接受多個外部的中斷請求,進(jìn)行一定判別后,選中當(dāng)前優(yōu)先級最高的中斷請求送至CPU的中斷輸入端。當(dāng)CPU響應(yīng)中斷并進(jìn)入中斷處理程序后,該控制器仍負(fù)責(zé)對外部中斷的管理[4]。
本文采用Verilog HDL語言,設(shè)計了一種能夠?qū)?2路中斷信號復(fù)用成1路中斷信號的控制器,其系統(tǒng)結(jié)構(gòu)如圖2所示。
圖2 中斷控制器的系統(tǒng)結(jié)構(gòu)
中斷控制器主要包含了中斷信號計數(shù)模塊、中斷信號產(chǎn)生模塊和中斷信號清除模塊。INT_i[31:0]為32路外設(shè)產(chǎn)生的中斷信號,其中INT_i[0]的優(yōu)先級最高,INT_i[31]的優(yōu)先級最低??刂破鬏敵龅闹袛嘈盘朓NT_o接CPU的中斷管腳,CPU通過mask信號來設(shè)置當(dāng)前中斷管腳是否處于中斷屏蔽狀態(tài)。如果CPU當(dāng)前處于中斷屏蔽狀態(tài),INT_o將不會輸出有效中斷信號。CPU接收到INT_o中斷信號后,在中斷服務(wù)程序中需要讀取flag[4:0]標(biāo)志,以確定當(dāng)前中斷的中斷源。CPU在執(zhí)行完畢中斷服務(wù)程序后,需通過clear信號清除當(dāng)前中斷。中斷控制器能夠根據(jù)flag[4:0]的值來自動確定需要清除的中斷源。
中斷信號計數(shù)模塊主要由32個相同的計數(shù)器構(gòu)成,將中斷信號INT_i進(jìn)行同步處理后輸入給計數(shù)器。計數(shù)器在有中斷信號INT輸入時執(zhí)行加計數(shù),在清除中斷信號decrease到來時執(zhí)行減計數(shù),從而實現(xiàn)對當(dāng)前中斷信號有效個數(shù)的鎖存。當(dāng)有效中斷信號個數(shù)大于0時,通過valid信號輸出高電平,其流程如圖3所示。
圖3 中斷信號計數(shù)器流程
中斷信號產(chǎn)生模塊首先判斷mask信號是否有效,如果有效,表示CPU當(dāng)前正處于中斷屏蔽狀態(tài),此時中斷信號產(chǎn)生模塊不應(yīng)該輸出中斷信號INT_o給CPU。當(dāng)mask信號無效時,進(jìn)一步判斷計數(shù)器模塊的輸出值valid[31:0]是否有效。只要valid[31:0]中的某個比特有效,說明有中斷源需要處理,中斷信號產(chǎn)生模塊則輸出中斷信號INT_o到CPU的中斷管腳,同時對valid[31:0]信號中有效位的優(yōu)先級進(jìn)行判決,將優(yōu)先級最高的輸入中斷信號INT_i對應(yīng)的編碼輸出到flag[4:0]總線上,以便CPU獲取當(dāng)前中斷信號對應(yīng)的中斷源。中斷信號產(chǎn)生模塊在中斷清除信號clear有效后回到初始狀態(tài),其流程如圖4所示。
圖4 中斷信號產(chǎn)生模塊流程
CPU在跳出中斷服務(wù)程序前需要通過clear信號清除當(dāng)前中斷,否則中斷信號產(chǎn)生模塊將一直處于等待clear信號有效的狀態(tài),無法進(jìn)行下一個中斷源的處理。同時,中斷信號計數(shù)模塊也需要clear的有效信號進(jìn)行減計數(shù),以確保在當(dāng)前中斷源處理完畢后,中斷計數(shù)模塊中鎖存的值始終為尚未處理的中斷源個數(shù)。中斷信號清除模塊通過讀取flag[4:0]的值來獲取當(dāng)前優(yōu)先級最高的中斷源,并產(chǎn)生相應(yīng)的脈沖信號給中斷計數(shù)模塊,其流程如圖5所示。
圖5 中斷信號清除模塊流程
本文在Xilinx的XC6SLX150T-3FGG676I FPGA上驗證設(shè)計的中斷控制器。在FPGA中,例化了32個模塊。這些模塊作為CPU的外設(shè)通過EMIF總線與CPU進(jìn)行數(shù)據(jù)交互。模塊產(chǎn)生的數(shù)據(jù)存儲于各自內(nèi)部的FIFO中,每產(chǎn)生一幀數(shù)據(jù),會給出一個中斷信號通知CPU讀取。只要各外設(shè)模塊產(chǎn)生的中斷信號不丟失,CPU就能夠正確讀取這些外設(shè)模塊產(chǎn)生的數(shù)據(jù)幀。多外設(shè)系統(tǒng)應(yīng)用的框圖如圖6所示。
在圖6的多外設(shè)系統(tǒng)應(yīng)用中,32個外設(shè)模塊產(chǎn)生的中斷信號通過中斷控制器復(fù)用成1路中斷信號輸出給CPU。它僅占用CPU的1個中斷輸入管腳,其余信號均占用的是資源相對較豐富的GPIO。當(dāng)CPU正在中斷服務(wù)程序中處理某個外設(shè)模塊的數(shù)據(jù)幀或者CPU正處于中斷屏蔽狀態(tài)時,中斷控制器能夠繼續(xù)接收外設(shè)模塊產(chǎn)生的中斷信號,然后計數(shù)并鎖存這些中斷信號,避免了由于中斷信號的丟失而導(dǎo)致數(shù)據(jù)幀的丟失,使得這些外設(shè)模塊能夠并發(fā)工作,提高了CPU和外設(shè)的工作效率。
經(jīng)過驗證,CPU能夠正確接收FPGA中32個外設(shè)模塊并發(fā)產(chǎn)生的數(shù)據(jù)幀,說明中斷控制器能夠正確工作,達(dá)到了預(yù)期效果。
圖6 多外設(shè)系統(tǒng)應(yīng)用
針對多外設(shè)系統(tǒng)的中斷復(fù)用問題,本文設(shè)計了一種能夠?qū)?2路中斷信號復(fù)用成1路中斷信號的中斷控制器,并在實際項目中進(jìn)行了應(yīng)用驗證,其具有如下特點(diǎn):
(1)上電后可直接使用,無需CPU對該中斷控制器進(jìn)行配置;
(2)使用CPU的1個中斷輸入管腳及若干個GPIO,就能夠?qū)崿F(xiàn)對多個外設(shè)中斷信號的響應(yīng),減少了對CPU中斷資源的占用;
(3)具備中斷信號鎖存功能,當(dāng)CPU進(jìn)入中斷服務(wù)程序中或正處于中斷屏蔽狀態(tài)時,中斷控制器能夠繼續(xù)接收外設(shè)的中斷信號并記錄這些中斷信號的個數(shù),待CPU能夠接收中斷信號后,將鎖存的中斷信號繼續(xù)發(fā)送給CPU,避免了外設(shè)中斷信號的丟失;
(4)采用Verilog硬件描述語言設(shè)計,當(dāng)需要復(fù)用更多路數(shù)的外設(shè)中斷信號時,僅需修改少量的代碼就可實現(xiàn),同時可將該中斷控制器封裝成IP核移植到多個FPGA平臺上,具有良好的推廣應(yīng)用價值。