在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

AMBA總線中APB slave設計介紹

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

上篇文章給大家介紹了APB協議相關的知識點,本篇文章通過一個實際的APB slave的設計幫助大家鞏固對APB的掌握。

APB slave設計Spec

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

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

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

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

  • 不支持反壓
  • 不支持錯誤傳輸
  • 支持4個RW類型的寄存器
  • 支持12個RO類型寄存器
  • 支持字節選通信

APB slave設計代碼

apb_slave_interface代碼

下面是slave_interface的關鍵代碼邏輯。我們對其進行分析:
  • 首先由于不支持反壓和錯誤傳輸,因此將pready固定為1,pslverr固定為0。
  • APB傳輸進來的paddr可以直接賦給addr,作為讀寫的地址。
  • read_en需要在psel為1且pwrite為0的時候拉高。這實際上是希望在整個讀傳輸過程中都讓read_en信號有效。讀者可能就想問了,讀應該對應著兩個階段嗎?不需要判斷嗎?實際上讀的話,master那邊自己控制好就行了,對于slave而言完全可以在第一拍和第二拍都把rdata提供好,這個是沒有關系的。
  • write_en則對應著setup phase,實際上在這個場景中修改write_en的邏輯讓該信號對應著access phase也是可以的,其它的信號直接賦值就可以,應該很好理解。
// 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代碼

其關鍵邏輯如下所示,我們對其進行分析:
  • 首先由于分為RW寄存器和RO寄存器。這里確定寫地址是否在規定區間,同時寫使能是否有效,以及byte_strobe信號,來決定要不要寫,寫哪個字節。
  • 讀的話就比較簡單了,當讀使能有效,根據地址信號決定rdata。實際上這就是個MUX選擇邏輯。根據read_en加地址從多個寄存器的Q端選出某一個來。
// 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設計

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

72607f3a-b136-11ee-8b88-92fbcf53809c.jpg7271b426-b136-11ee-8b88-92fbcf53809c.jpg其邏輯框圖如上圖所示,非常的簡單啊。就是一個master和多個slave,通過這個額外的DECODE4bit進行16選1。其關鍵代碼如下所示
  • 根據PSEL是否有效以及DECODE4BIT的值,完成16選1,PSEL0~PSEL15有一個或者0個拉高。
  • PREADYm默認為1,當PSEL為1的時候,根據譯碼結果選擇相應的PREADY信號(當端口沒有使能的時候en[x] == 0, 對應的PREADYx信號不會被選擇)。
  • 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

這套代碼的缺點或者說優點是,它是用組合邏輯做的,邏輯非常的簡單。實際上就是多選1,一般來說APB的時鐘頻率很低,所以增加了一定的組合邏輯級數也不會出現時鐘違例。這樣做還可以節省一個時鐘周期,大家也可以用時序邏輯去做,思路是類似的。還有一個問題就是這個模塊沒有PENABLE信號,這個其實挺致命,大家可以手動加上,跟PSEL的邏輯基本是一模一樣的,非常簡單。


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5363

    瀏覽量

    121171
  • AMBA總線
    +關注

    關注

    0

    文章

    35

    瀏覽量

    9612

原文標題:深入理解AMBA總線 — APB slave設計

文章出處:【微信號:IC修真院,微信公眾號:IC修真院】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    什么是APB協議/總線APB總線入門

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

    ARM總線協議AMBAAHB、APB的區別與聯系

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

    AMBAAPB、AHB簡介

    STM32菜鳥學習手冊——1、AMBAAPB、AHB簡介芯片上總線標準種類繁多,而由ARM公司推出的AMBA片上總線受到了廣大IP開發商和
    發表于 02-17 07:18

    AMBA AHB總線APB總線資料合集

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

    分享一個APB slave的verilog實例

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

    AMBAAPB總線協議詳解

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

    基于AMBA APB總線NandFlash控制器的設計

    介紹了基于AMBA APB總線NandFlash控制器的設計,首先簡單介紹了NandFlash的一些特點,然后詳細
    發表于 11-03 15:22 ?54次下載

    基于AMBA總線介紹?

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

    淺述AMBA-APB總線

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

    介紹AMBA2.0總線

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

    數字IC驗證:ARM總線協議AMBAAHB、APB的簡介、區別與聯系

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

    AMBA總線那些事之APB

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

    AMBA總線apb簡介

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

    關于AMBA APB總線的知識點介紹

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

    AMBA總線APB interconnect的介紹

    之前的兩篇文章給大家介紹APB協議相關的知識點,并結合實際的代碼給大家講解了一下APB slave的設計。并說明了一下APB
    的頭像 發表于 01-13 10:09 ?895次閱讀
    <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>
    主站蜘蛛池模板: 狠狠干干 | 精品国产_亚洲人成在线高清 | 手机看片欧美日韩 | 特别黄的免费视频大片 | 国产精品福利一区二区亚瑟 | 亚洲电影在线看 | 欧美在线色视频 | www国产永久免费视频看看 | 亚洲午夜顶级嘿嘿嘿影院 | 操人网站| 四虎影视大全免费入口 | 夜夜艹日日干 | 午夜影院在线观看 | 另类图片综合网 | 黄频网| 欧美无遮挡国产欧美另类 | 色男人网| 天天射天天干天天操 | 可以免费看黄的网站 | 久久婷婷丁香七月色综合 | 成人a级特黄毛片 | 性夜影院爽黄a爽免费视频 性瘾高h姚蕊全文免费阅读 | 久优草 | 久久国内精品 | 在线看黄的网站 | 午夜剧场毛片 | 夜色伊人 | 日本久久久久久久 | 丁香六月啪 | 一区二区中文字幕亚洲精品 | 亚洲欧美视频网站 | 精品视频在线视频 | 国产精品爱啪在线线免费观看 | 午夜免费观看福利片一区二区三区 | 啪啪免费网站 | 26uuu欧美日本 | 亚洲国产精品久久精品怡红院 | 欧美成人 色 图 | 国产精品免费看久久久 | 亚洲无吗在线视频 | 2021国产成人精品国产 |