0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

AMBA總線中APB slave設(shè)計(jì)介紹

jf_GctfwYN7 ? 來源:芯時(shí)代青年 ? 2024-01-13 10:15 ? 次閱讀

上篇文章給大家介紹了APB協(xié)議相關(guān)的知識(shí)點(diǎn),本篇文章通過一個(gè)實(shí)際的APB slave的設(shè)計(jì)幫助大家鞏固對(duì)APB的掌握。

APB slave設(shè)計(jì)Spec

7245d8f6-b136-11ee-8b88-92fbcf53809c.jpg

其框圖如上圖所示,這里提一嘴,大家在做數(shù)字IC設(shè)計(jì)的時(shí)候,都應(yīng)該像這樣規(guī)劃好各個(gè)模塊的連接關(guān)系,確定好以后再寫代碼。該模塊是一個(gè)基于APB協(xié)議完成寄存器配置或讀取的設(shè)計(jì)實(shí)例。設(shè)計(jì)相對(duì)比較簡單,但不失為一個(gè)很好的學(xué)習(xí)資料。

上面APB相關(guān)的信號(hào)都介紹過,這里不再重復(fù)介紹,其中的ECOREVNUM的意思是ECO revision number,如果沒有用到ARM的ECO的話,將該信號(hào)固定為全0即可。

右邊這個(gè)slave_reg實(shí)際上就對(duì)應(yīng)我們自己設(shè)計(jì)的IP的寄存器配置部分。這一部分的接口是native interface,也就是沒有考慮通用性的原生接口。想要通過APB總線對(duì)其進(jìn)行配置,就需要通過slave_interface這個(gè)模塊進(jìn)行協(xié)議轉(zhuǎn)換,進(jìn)而完成APB協(xié)議的傳輸。我們經(jīng)常能夠看到的apb2reg模塊,實(shí)際上也是做了這件事。該APB slave有以下的特點(diǎn):

  • 不支持反壓
  • 不支持錯(cuò)誤傳輸
  • 支持4個(gè)RW類型的寄存器
  • 支持12個(gè)RO類型寄存器
  • 支持字節(jié)選通信號(hào)

APB slave設(shè)計(jì)代碼

apb_slave_interface代碼

下面是slave_interface的關(guān)鍵代碼邏輯。我們對(duì)其進(jìn)行分析:
  • 首先由于不支持反壓和錯(cuò)誤傳輸,因此將pready固定為1,pslverr固定為0。
  • APB傳輸進(jìn)來的paddr可以直接賦給addr,作為讀寫的地址。
  • read_en需要在psel為1且pwrite為0的時(shí)候拉高。這實(shí)際上是希望在整個(gè)讀傳輸過程中都讓read_en信號(hào)有效。讀者可能就想問了,讀應(yīng)該對(duì)應(yīng)著兩個(gè)階段嗎?不需要判斷嗎?實(shí)際上讀的話,master那邊自己控制好就行了,對(duì)于slave而言完全可以在第一拍和第二拍都把rdata提供好,這個(gè)是沒有關(guān)系的。
  • write_en則對(duì)應(yīng)著setup phase,實(shí)際上在這個(gè)場(chǎng)景中修改write_en的邏輯讓該信號(hào)對(duì)應(yīng)著access phase也是可以的,其它的信號(hào)直接賦值就可以,應(yīng)該很好理解。
// APB interface
assign pready = 1'b1; //always ready. Can be customized to support waitstate if required.
assign pslverr = 1'b0; //always OKAY. Can be customized to support error response if required.


// register read and write signal
assign addr = paddr;
assign read_en = psel & (~pwrite); // assert for whole apb read transfer
assign write_en = psel & (~penable) & pwrite; // assert for 1st cycle of write transfer
// It is also possible to change the design to perform the write in the 2nd
// APB cycle. E.g.
// assign write_en = psel & penable & pwrite;
// However, if the design generate waitstate, this expression will result
// in write_en being asserted for multiple cycles.
assign byte_strobe = pstrb;
assign wdata = pwdata;
assign prdata = rdata;

apb_slave_reg代碼

其關(guān)鍵邏輯如下所示,我們對(duì)其進(jìn)行分析:
  • 首先由于分為RW寄存器和RO寄存器。這里確定寫地址是否在規(guī)定區(qū)間,同時(shí)寫使能是否有效,以及byte_strobe信號(hào),來決定要不要寫,寫哪個(gè)字節(jié)。
  • 讀的話就比較簡單了,當(dāng)讀使能有效,根據(jù)地址信號(hào)決定rdata。實(shí)際上這就是個(gè)MUX選擇邏輯。根據(jù)read_en加地址從多個(gè)寄存器的Q端選出某一個(gè)來。
// Address decoding for write operations
assign wr_sel[0] = ((addr[(ADDRWIDTH-1):2]==10'b0000000000)&(write_en)) ? 1'b1: 1'b0;
assign wr_sel[1] = ((addr[(ADDRWIDTH-1):2]==10'b0000000001)&(write_en)) ? 1'b1: 1'b0;
assign wr_sel[2] = ((addr[(ADDRWIDTH-1):2]==10'b0000000010)&(write_en)) ? 1'b1: 1'b0;
assign wr_sel[3] = ((addr[(ADDRWIDTH-1):2]==10'b0000000011)&(write_en)) ? 1'b1: 1'b0;
// register write, byte enable
// Data register: data0
always @(posedge pclk or negedge presetn)
begin
if (~presetn)
begin
data0 <= {32{1'b0}}; // Reset data 0 to 0x00000000
end
else if (wr_sel[0])
begin
if (byte_strobe[0])
data0[ 7: 0] <= wdata[ 7: 0];
if (byte_strobe[1])
data0[15: 8] <= wdata[15: 8];
if (byte_strobe[2])
data0[23:16] <= wdata[23:16];
if (byte_strobe[3])
data0[31:24] <= wdata[31:24];
end
end

// register read

always @ (read_en or addr or data0 or data1 or data2 or data3 or ecorevnum)
begin
case (read_en)
1'b1:
begin
if (addr[11:4] == 8'h00) begin
case(addr[3:2])
2'b00: rdata = data0;
2'b01: rdata = data1;
2'b10: rdata = data2;
2'b11: rdata = data3;
default: rdata = {32{1'bx}};
endcase
end
else if (addr[11:6] == 6'h3F) begin
case(addr[5:2])
// Peripheral IDs and Component IDs.
// AHB example slave has part number of 818
4'b0100: rdata = ARM_CMSDK_APB4_EG_SLAVE_PID4; // 0xFD0 : PID 4
4'b0101: rdata = ARM_CMSDK_APB4_EG_SLAVE_PID5; // 0xFD4 : PID 5
4'b0110: rdata = ARM_CMSDK_APB4_EG_SLAVE_PID6; // 0xFD8 : PID 6
4'b0111: rdata = ARM_CMSDK_APB4_EG_SLAVE_PID7; // 0xFDC : PID 7
4'b1000: rdata = ARM_CMSDK_APB4_EG_SLAVE_PID0; // 0xFE0 : PID 0 APB Example slave part number[7:0]
4'b1001: rdata = ARM_CMSDK_APB4_EG_SLAVE_PID1; // 0xFE4 : PID 1 [7:4] jep106_id_3_0. [3:0] part number [11:8]
4'b1010: rdata = ARM_CMSDK_APB4_EG_SLAVE_PID2; // 0xFE8 : PID 2 [7:4] revision, [3] jedec_used. [2:0] jep106_id_6_4
4'b1011: rdata ={ARM_CMSDK_APB4_EG_SLAVE_PID3[31:8], ecorevnum[3:0], 4'h0};
// 0xFEC : PID 3 [7:4] ECO rev number, [3:0] modification number
4'b1100: rdata = ARM_CMSDK_APB4_EG_SLAVE_CID0; // 0xFF0 : CID 0
4'b1101: rdata = ARM_CMSDK_APB4_EG_SLAVE_CID1; // 0xFF4 : CID 1 PrimeCell class
4'b1110: rdata = ARM_CMSDK_APB4_EG_SLAVE_CID2; // 0xFF8 : CID 2
4'b1111: rdata = ARM_CMSDK_APB4_EG_SLAVE_CID3; // 0xFFC : CID 3
// Note : Customer changing the design should modify
// - jep106 value (www.jedec.org)
// - part number (customer define)
// - Optional revision and modification number (e.g. rXpY)
4'b0000, 4'b0001,4'b0010,4'b0011: rdata = {32'h00000000}; // default
default: rdata = {32{1'bx}}; // x propagation
endcase
end
else begin
rdata = {32'h00000000}; // default
end
end
1'b0:
begin
rdata = {32{1'b0}};
end
default:
begin
rdata = {32{1'bx}};
end
endcase
end

APB slave mux設(shè)計(jì)

這里再給大家介紹一下APB slave mux的概念,如下圖所示,基于APB slave mux我們可以快速地將多個(gè)apb slave連接在上面。在實(shí)際的設(shè)計(jì)當(dāng)中都是采用這樣的方式,連接多個(gè)slave的。一般我們管這種模塊叫做interconnect,顧名思義,將不同的模塊連接起來。而APB的interconnect只能連接一個(gè)master,因此繼續(xù)管他叫interconnect感覺差了點(diǎn)意思。所以一般就叫它slave mux了。

72607f3a-b136-11ee-8b88-92fbcf53809c.jpg7271b426-b136-11ee-8b88-92fbcf53809c.jpg其邏輯框圖如上圖所示,非常的簡單啊。就是一個(gè)master和多個(gè)slave,通過這個(gè)額外的DECODE4bit進(jìn)行16選1。其關(guān)鍵代碼如下所示
  • 根據(jù)PSEL是否有效以及DECODE4BIT的值,完成16選1,PSEL0~PSEL15有一個(gè)或者0個(gè)拉高。
  • PREADYm默認(rèn)為1,當(dāng)PSEL為1的時(shí)候,根據(jù)譯碼結(jié)果選擇相應(yīng)的PREADY信號(hào)(當(dāng)端口沒有使能的時(shí)候en[x] == 0, 對(duì)應(yīng)的PREADYx信號(hào)不會(huì)被選擇)。
  • PSLVERR和PRDATA,選中誰就取誰的。
assign PSEL0 = PSEL & dec[ 0] & en[ 0];
assign PSEL1 = PSEL & dec[ 1] & en[ 1];
assign PSEL2 = PSEL & dec[ 2] & en[ 2];
//省略3~15
assign PREADY = ~PSEL |
( dec[ 0] & (PREADY0 | ~en[ 0]) ) |
( dec[ 1] & (PREADY1 | ~en[ 1]) ) |
( dec[ 2] & (PREADY2 | ~en[ 2]) ) |
//省略3~15
assign PSLVERR = ( PSEL0 & PSLVERR0 ) |
( PSEL1 & PSLVERR1 ) |
( PSEL2 & PSLVERR2 ) |
//省略3~15
assign PRDATA = ( {32{PSEL0 }} & PRDATA0 ) |
( {32{PSEL1 }} & PRDATA1 ) |
( {32{PSEL2 }} & PRDATA2 ) |
//省略3~15

這套代碼的缺點(diǎn)或者說優(yōu)點(diǎn)是,它是用組合邏輯做的,邏輯非常的簡單。實(shí)際上就是多選1,一般來說APB的時(shí)鐘頻率很低,所以增加了一定的組合邏輯級(jí)數(shù)也不會(huì)出現(xiàn)時(shí)鐘違例。這樣做還可以節(jié)省一個(gè)時(shí)鐘周期,大家也可以用時(shí)序邏輯去做,思路是類似的。還有一個(gè)問題就是這個(gè)模塊沒有PENABLE信號(hào),這個(gè)其實(shí)挺致命,大家可以手動(dòng)加上,跟PSEL的邏輯基本是一模一樣的,非常簡單。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5294

    瀏覽量

    119816
  • AMBA總線
    +關(guān)注

    關(guān)注

    0

    文章

    35

    瀏覽量

    9524

原文標(biāo)題:深入理解AMBA總線 — APB slave設(shè)計(jì)

文章出處:【微信號(hào):IC修真院,微信公眾號(hào):IC修真院】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    什么是APB協(xié)議/總線?APB總線入門

    上一篇文章簡單講解了什么是AMBA總線,簡單來說,AMBA總線是一系列協(xié)議。定義了適用于不同場(chǎng)景的總線家族。今天我們就來將
    的頭像 發(fā)表于 01-02 11:37 ?3214次閱讀
    什么是<b class='flag-5'>APB</b>協(xié)議/<b class='flag-5'>總線</b>?<b class='flag-5'>APB</b><b class='flag-5'>總線</b>入門

    ARM總線協(xié)議AMBAAHB、APB的區(qū)別與聯(lián)系

    , ASB, APB);Qchannel文章目錄1 AMBA總線2 AHB2.1 一個(gè)典型的基于AHB的微控制器2.2 AHB總線互聯(lián)結(jié)構(gòu):中心選擇器連接master與
    發(fā)表于 02-09 07:46

    AMBAAPB、AHB簡介

    STM32菜鳥學(xué)習(xí)手冊(cè)——1、AMBAAPB、AHB簡介芯片上總線標(biāo)準(zhǔn)種類繁多,而由ARM公司推出的AMBA片上總線受到了廣大IP開發(fā)商和
    發(fā)表于 02-17 07:18

    AMBA AHB總線APB總線資料合集

    使用的是 SystemVerilog 描述。2、AMBA APB總線信號(hào)接口介紹前面分析了AHB總線協(xié)議。接下來分析
    發(fā)表于 04-07 10:03

    分享一個(gè)APB slave的verilog實(shí)例

    APBAMBA相對(duì)比較簡單的接口協(xié)議。采用這種簡單的協(xié)議,你可以輕松地將自定義外設(shè)掛在AMBA總線上。許多
    發(fā)表于 04-07 10:10

    AMBAAPB總線協(xié)議詳解

    1、漫談AMBA總線-APB首先考慮一下以下的場(chǎng)景:概念1: 主機(jī)(Master)訂單的發(fā)起只能由水果店發(fā)起,所以水果店在這條水果運(yùn)輸總線里面運(yùn)輸水果占有主動(dòng)地位。類比:在
    發(fā)表于 06-07 16:14

    基于AMBA APB總線NandFlash控制器的設(shè)計(jì)

    介紹了基于AMBA APB總線NandFlash控制器的設(shè)計(jì),首先簡單介紹了NandFlash的一些特點(diǎn),然后詳細(xì)
    發(fā)表于 11-03 15:22 ?54次下載

    基于AMBA總線介紹?

    3.0:增加了AXI協(xié)議(了解);AMBA4.0:ACE協(xié)議(了解) 本文主要介紹AMBA2.0 (Advanced Microcontroller Bus Architecture,先進(jìn)微控制
    的頭像 發(fā)表于 05-19 14:22 ?2066次閱讀
    基于<b class='flag-5'>AMBA</b><b class='flag-5'>總線</b><b class='flag-5'>介紹</b>?

    淺述AMBA-APB總線

    1 APB介紹 高級(jí)外設(shè)總線APB) 是高級(jí)微控制器總線架構(gòu) (AMBA) 協(xié)議系列的一部分
    的頭像 發(fā)表于 07-23 10:04 ?2217次閱讀
    淺述<b class='flag-5'>AMBA-APB</b><b class='flag-5'>總線</b>

    介紹AMBA2.0總線

    3.0:增加了AXI協(xié)議(了解);AMBA4.0:ACE協(xié)議(了解) 本文主要介紹AMBA2.0 (Advanced Microcontroller Bus Architecture,先進(jìn)微控制
    的頭像 發(fā)表于 09-06 09:53 ?3092次閱讀
    <b class='flag-5'>介紹</b><b class='flag-5'>AMBA</b>2.0<b class='flag-5'>總線</b>

    數(shù)字IC驗(yàn)證:ARM總線協(xié)議AMBAAHB、APB的簡介、區(qū)別與聯(lián)系

    , ASB, APB);Qchannel文章目錄1 AMBA總線2 AHB2.1 一個(gè)典型的基于AHB的微控制器2.2 AHB總線互聯(lián)結(jié)構(gòu):中心選擇器連接master與
    發(fā)表于 12-05 15:36 ?16次下載
    數(shù)字IC驗(yàn)證:ARM<b class='flag-5'>總線</b>協(xié)議<b class='flag-5'>AMBA</b><b class='flag-5'>中</b>AHB、<b class='flag-5'>APB</b>的簡介、區(qū)別與聯(lián)系

    AMBA總線那些事之APB

    之前老李問過大家想看哪方面的知識(shí),有不少同學(xué)提議老李寫寫總線,特別是AMBA總線,所以老李決定從這期開始開始一個(gè)AMBA總線
    的頭像 發(fā)表于 05-04 14:53 ?2371次閱讀
    <b class='flag-5'>AMBA</b><b class='flag-5'>總線</b>那些事之<b class='flag-5'>APB</b>

    AMBA總線apb簡介

    APB(Advanced Peripheral Bus),外圍總線的意思。該總線協(xié)議是ARM公司提出的AMBA總線結(jié)構(gòu)之一,幾乎已成為一種標(biāo)
    發(fā)表于 06-05 15:10 ?1787次閱讀
    <b class='flag-5'>AMBA</b><b class='flag-5'>總線</b>—<b class='flag-5'>apb</b>簡介

    關(guān)于AMBA APB總線的知識(shí)點(diǎn)介紹

    AMBA APB總線可以用在低帶寬和不需要高性能的外設(shè)上(即低速且低頻率的外設(shè));可以將APB視作AHB的二級(jí)總線;   ·低功耗(
    發(fā)表于 11-29 15:19 ?1083次閱讀
    關(guān)于<b class='flag-5'>AMBA</b> <b class='flag-5'>APB</b><b class='flag-5'>總線</b>的知識(shí)點(diǎn)<b class='flag-5'>介紹</b>

    AMBA總線APB interconnect的介紹

    之前的兩篇文章給大家介紹APB協(xié)議相關(guān)的知識(shí)點(diǎn),并結(jié)合實(shí)際的代碼給大家講解了一下APB slave的設(shè)計(jì)。并說明了一下APB
    的頭像 發(fā)表于 01-13 10:09 ?721次閱讀
    <b class='flag-5'>AMBA</b><b class='flag-5'>總線</b><b class='flag-5'>中</b><b class='flag-5'>APB</b> interconnect的<b class='flag-5'>介紹</b>