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





