惠為君
摘要:SOC內(nèi)部總線用于連接其內(nèi)部的各個部件,實現(xiàn)主控部件與從屬部件等的數(shù)據(jù)傳輸,是SOC設計必不可少的關(guān)鍵部件。本文分析了SOC總線特性、結(jié)構(gòu),對系統(tǒng)進行了模塊劃分。在設計了仲裁協(xié)議的基礎(chǔ)上,基于quartus平臺,verilogHDL語言實現(xiàn)了各模塊的設計。Modelsim仿真和FPGA下載驗證表明,設計是有效的。
關(guān)鍵詞:總線;Verilog HDL;Modelsim;FPGA
中圖分類號:TN91? ? 文獻標識碼: A
文章編號:1009-3044(2021)14-0206-02
總線是SOC系統(tǒng)中CPU與內(nèi)存、IO設備之間的共享通道。內(nèi)部總線的設計往往決定了芯片的性能、時延及芯片的復雜度。SOC內(nèi)部總線一般具有數(shù)據(jù)傳送并行、連接部件多、全雙工通信的特點。
連接總線的部件分為主控部件和從屬部件。主控部件向總線申請,總線經(jīng)過仲裁,批準了該主控部件的使用權(quán),同時向從屬部件發(fā)出片選信號,在此基礎(chǔ)上,主控部件與從屬部件通過總線實現(xiàn)數(shù)據(jù)傳輸。
1信號定義
主控部件、總線、從屬部件通信的信號定義如圖1所示。
主控部件和從屬部件掛在總線上,通過總線進行通信,二者不直接有引腳連接。從圖1可以看出,主控部件和從屬部件通過總線實現(xiàn)全雙工并行通信,讀寫分開,提高了效率。
總線可以掛接若干主控部件和從屬部件。每個主控部件定義了7種引腳,引腳名稱、寬度等定義如表1所示。
從屬部件定義了5種引腳,引腳名稱、寬度等定義如表2所示。
2 總體設計
從功能上劃分,總線結(jié)構(gòu)分為四個部分,如圖2所示。為簡單計,主控部件和從屬部件都取三個。
按照功能劃分,總線結(jié)構(gòu)分為如下四個部分。
1)主控數(shù)據(jù)選擇器:根據(jù)仲裁結(jié)果,選擇一個主控部件。
2)總線仲裁器:根據(jù)總裁機制,選擇一個主控部件擁有總線使用權(quán)。
3)地址譯碼器:主控部件輸出從屬部件地址,譯碼器根據(jù)地址生成從屬部件的片選信號。
4)從屬數(shù)據(jù)選擇器:根據(jù)片選信號,選擇一個從屬部件。
3 模塊設計
總線仲裁器決定和一個主控部件通信的從屬部件。主控部件向仲裁器發(fā)出請求信號(req),仲裁器根據(jù)仲裁機制,發(fā)出有效的批準信號(grt),授予一個主控部件總線使用權(quán)。
三個主控部件沒有優(yōu)先級,隨機向總線申請使用權(quán)。仲裁器采用輪詢作為仲裁機制,按照請求的先后順序確定總線使用權(quán)。仲裁器是一種周期動作的模塊電路,使用狀態(tài)機來設計。對應主控部件數(shù),設計三個狀態(tài)。
1)狀態(tài)0:0號主控部件取得總線使用權(quán)。
2)狀態(tài)1:1號主控部件取得總線使用權(quán)。
3)狀態(tài)2:2號主控部件取得總線使用權(quán)。
在狀態(tài)0時,也就是0號主控部件使用總線的時候,主控部件請求被批準的順序為0號1號2號。依次類推,狀態(tài)1時,批準順序為1號 2號 0號,狀態(tài)2時,批準順序為2號0號1號。 其狀態(tài)轉(zhuǎn)換圖如圖2所示。Req0、Req1和Req2為三個主控部件向總線申請使用權(quán)信號,其值為1時,表示申請使用權(quán),為0時,表示撤銷申請使用權(quán)。
復位及默認狀態(tài)時,系統(tǒng)的狀態(tài)取狀態(tài)0。
3.1 主控數(shù)據(jù)選擇器
接受一個主控部件的Addr、Rw、Addr_s、Wr_data信號。其中,Addr信號發(fā)給從屬地址譯碼器,其余信號發(fā)給從屬部件。
4 模塊實現(xiàn)及仿真
基于Verilog HDl實現(xiàn)各模塊。模塊的文件名,如表3所示。
4.1 總線仲裁器
實現(xiàn)仲裁控制的部分核心代碼如下:
case(owner)
2'b00 : begin
if(req0 == 1'b1) owner = 2'b00;
else if(req1 == 1'b1) owner = 2'b01;
else if(req2==1'b1) owner = 2'b10; end
2'b01 : begin
if(req1 == 1'b1) owner = 2'b01;
else if(req2 == 1'b1) owner = 2'b10;
else if(req0 == 1'b1) owner = 2'b00; end
2'b10 : begin
if(req2 == 1'b1) owner = 2'b10;
else if(req0 == 1'b1) owner = 2'b00;
else if(req1 == 1'b1) owner = 2'b01; end
default: owner = 2'b00;
模塊用一個摩爾狀態(tài)機來實現(xiàn),按照仲裁器狀態(tài)圖實現(xiàn)狀態(tài)機代碼。寄存器owner存儲輪詢狀態(tài),在時鐘的觸發(fā)下,不同的狀態(tài)授權(quán)不同的主控模塊取得總線使用權(quán)。
4.2 總線頂層模塊
實現(xiàn)了各模塊之后,按照圖2總線結(jié)構(gòu)圖,實例化個模塊,完成總線設計。 實例化模塊部分代碼如下:
bus_arbiter u2(.clk(clk),.reset(reset),.req0(req0),.req1(req1),.req2(req2),.grant0(tgrant0),.grant1(tgrant1),.grant2(tgrant2));
bus_slave_addr_dec u3(.slave_addr(tslave_addr),.cs0(tcs0),.cs1(tcs1),.cs2(tcs2)) ;
模塊實現(xiàn)的symbol如圖4所示。輸入部分只顯示了一個主控部件信號,其余信號可以類推。
4.3 總線模塊仿真
基于modelsim對頂層模塊bus進行了仿真。仿真結(jié)果如圖5所示,可以看出,主控部件和從屬部件的數(shù)目都取三個,總線輸出mdata和sdata的讀取是正確的。
5結(jié)束語
對SOC內(nèi)部總線的特征進行了分析,在此基礎(chǔ)上,按照不同的功能進行了模塊劃分。劃分的四個模塊分別是總線仲裁器、主控部件數(shù)據(jù)選擇器、從屬部件數(shù)據(jù)選擇器、從屬部件地址譯碼器。在分析了仲裁協(xié)議的基礎(chǔ)上,利用狀態(tài)機技術(shù)完成了仲裁器設計。完成了四個模塊設計以后,利用模塊實例化方法實現(xiàn)了頂層模塊設計。為了試驗方便,本設計采用了較少的主控部件和從屬部件數(shù)目,在這一方面,設計還可以改善。
【通聯(lián)編輯:梁書】