SoC進(jìn)階 - AHB master設(shè)計(jì)
前兩篇進(jìn)階文章主要講述了AHB slave的核心內(nèi)容,這篇來(lái)講AHB lite master的設(shè)計(jì)。
AHB master主要用于一下三個(gè)方面:
1.計(jì)算模塊和crossbar的溝通橋梁,例如加速器模塊。
2.crossbar或者bridge的AHB master口,例如noc或者ahb matrix的ahb master口。
3.DMA模塊的AHB master口,用于讀取source數(shù)據(jù),并發(fā)送到target地址。
AHB master在整個(gè)SOC領(lǐng)域可以起到敲門(mén)磚的作用,掌握了它,對(duì)后續(xù)掌握其他模塊的設(shè)計(jì)非常有幫助。
1、輸入輸出接口
在設(shè)計(jì)某個(gè)模塊時(shí),首先需要理清它有哪些輸入輸出,從而對(duì)設(shè)計(jì)進(jìn)行一個(gè)整體了解。由于本文的讀寫(xiě)模塊設(shè)計(jì)屬于比較基礎(chǔ)的AHB傳輸,不涉及突發(fā)傳輸、鎖定傳輸和從機(jī)的分塊傳輸。本設(shè)計(jì)的輸入有:hclk_i、irst_n、hgrant_i、hrdata_i、hready_i,輸出有:hwdata_o、htrans_o、hwrite_o、haddr_o、hbusreq_o。
2、狀態(tài)機(jī)設(shè)計(jì)
狀態(tài)機(jī)的設(shè)計(jì)比較重要,本設(shè)計(jì)的主狀態(tài)機(jī)是:空閑狀態(tài)、讀狀態(tài)、寫(xiě)狀態(tài),從狀態(tài)機(jī)分為讀狀態(tài)機(jī)(rd_fsm_r)和寫(xiě)狀態(tài)機(jī)(wr_fsm_r),讀狀態(tài)機(jī)和寫(xiě)狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)移圖如圖所示。
狀態(tài)機(jī)
根據(jù)AHB總線地址段和數(shù)據(jù)段的特性,可將其分為:空閑狀態(tài)、請(qǐng)求總線狀態(tài)、地址段狀態(tài)、讀/寫(xiě)數(shù)據(jù)狀態(tài)和讀/寫(xiě)最后一個(gè)字節(jié)狀態(tài)。注意:在狀態(tài)機(jī)中,何時(shí)有效很重要,從圖中可以看出,各狀態(tài)的觸發(fā)條件都有hready_i信號(hào)(由于hready_i信號(hào)是一直在變化的,可能前一個(gè)狀態(tài)hready_i信號(hào)為高,但后一個(gè)狀態(tài)會(huì)變低,不能使用軟件思維去思考。),其次,何時(shí)開(kāi)始讀/寫(xiě)數(shù)據(jù),何時(shí)數(shù)據(jù)讀/寫(xiě)完成,這都是由計(jì)數(shù)器計(jì)數(shù)來(lái)決定的。
3、設(shè)計(jì)時(shí)序圖
讀寫(xiě)過(guò)程比較類(lèi)似,時(shí)序圖如圖所示:
讀寫(xiě)時(shí)序圖
從圖中可以看出,地址與數(shù)據(jù)并非在同一周期(AHB總線的特性)。當(dāng)前周期的地址,存儲(chǔ)的數(shù)據(jù)在下一周期才會(huì)出現(xiàn)。這種地址和數(shù)據(jù)交疊出現(xiàn)使總線能進(jìn)行高性能操作的同時(shí),給從機(jī)也提供了足夠的時(shí)間來(lái)響應(yīng)傳輸。
4、基本代碼
狀態(tài)機(jī)邏輯:
至此,本文基于AHB總線的master讀寫(xiě)設(shè)計(jì)就完成了。這是我很早之前設(shè)計(jì)的代碼了,可能存在一些小問(wèn)題。
總結(jié)
為什么AHB master的學(xué)習(xí),這么重要呢?
就是因?yàn)樗淖饔?,初?之外,還有設(shè)計(jì)它所使用的基礎(chǔ)知識(shí)。如下圖:
AXI master場(chǎng)景1
我們接受的數(shù)據(jù)來(lái)自運(yùn)算單元,它給我們的內(nèi)容有,讀寫(xiě)使能(doorbell),讀寫(xiě)控制,包括burst類(lèi)型,數(shù)據(jù)size,地址valid,以及握手信號(hào)。我們需要對(duì)這些數(shù)據(jù)進(jìn)行采樣,設(shè)計(jì)狀態(tài)機(jī)來(lái)保證AXI的時(shí)序,如果兩個(gè)模塊時(shí)鐘不一樣,我們還要進(jìn)行異步處理。
這是我在內(nèi)網(wǎng)很久之前練習(xí)的小設(shè)計(jì)。
基于FIFO的AHB LITE架構(gòu)圖
FIFO和axi master
設(shè)計(jì)思路
我們正常設(shè)計(jì)AHB master時(shí),因?yàn)橐С謆urst傳輸,所以數(shù)據(jù)是要緩存到同步FIFO中的,我們常用的設(shè)計(jì)思路如下:
-FIFO滿(mǎn)時(shí)發(fā)起AHB burst 寫(xiě),將FIFO清空。FIFO空時(shí)發(fā)起AHB burst讀,填滿(mǎn)FIFO。
-FIFO深度=burst length。
-FIFO寬度=AHB數(shù)據(jù)寬度。
-地址幀wr_req作為FIFO rd_en,讀取FIFO數(shù)據(jù),轉(zhuǎn)化為hwdata。
-數(shù)據(jù)幀將rd_vld作為we_en,將讀取的hrdata寫(xiě)到FIFO。
代碼在下面圖中,有點(diǎn)不清晰,諒解,和之前的代碼相比,優(yōu)化了狀態(tài)機(jī),狀態(tài)機(jī)太多可讀性較差。
要點(diǎn)補(bǔ)充
只要設(shè)計(jì)的AXI master支持burst傳輸,前面一定有一個(gè)FIFO緩存數(shù)據(jù)。真正項(xiàng)目中,不一定時(shí)空滿(mǎn)時(shí)才發(fā)起AHB讀寫(xiě),一定會(huì)有預(yù)警信號(hào)。
并且真正設(shè)計(jì)時(shí)一定是兩個(gè)FIFO,我這里只是圖省事用了一個(gè)。
AXI master設(shè)計(jì)時(shí),難點(diǎn)是除了數(shù)據(jù)需要緩存,commands也需要緩存。