AMBA APB总线
前面分析了AHB总线协议。接下来分析APB总线协议。
(一) APB总线接口:
PCLK APB总线时钟。
PRESETn APB总线复位。低有效。
PADDR 地址总线。
PSELx 从设备选择。
PENABLE APB传输选通。
PWRITE 高为写传输,低为读。
PRDATA 读数据总线。
PWDATA 写数据总线。
接口信号定义如下:
- interface apb_slv_intf #(
- parameter AW = ,
- DW =
- ) (
- input logic PCLK,
- input logic PRESETn
- );
- logic PSEL;
- logic PENABLE;
- logic [AW-:] PADDR;
- logic PWRITE;
- logic [DW-:] PWDATA;
- logic [DW-:] PRDATA;
- modport m (
- input PRDATA,
- output PSEL, PENABLE, PADDR, PWRITE, PWDATA
- );
- modport s (
- input PSEL, PENABLE, PADDR, PWRITE, PWDATA,
- output PRDATA
- );
- endinterface: apb_slv_intf
(二) APB总线时序图:
写传输
读传输
注意在PENABLE信号有效后从设备需要给出有效数据/读取有效数据。
(三) AHB总线到APB总线转换桥
- module ahb2apb_bridge #(
- parameter AHB_AW = ,
- AHB_DW = ,
- APB_AW = ,
- APB_DW = ,
- NSLV =
- ) (
- input logic HCLK,
- input logic HRESETn,
- input logic PCLK,
- input logic PRESETn,
- ahb_slv_intf.s ahb,
- apb_slv_intf.m apbv[NSLV]
- );
- logic ahb_work;
- logic apb_work;
- genvar i;
- typedef enum logic [:] {
- AHB_IDLE = 'b00,
- AHB_WRITE = 'b01,
- AHB_READ = 'b10,
- AHB_WAIT = 'b11
- } ahb_state_e;
- // Signal of AHB Domain
- struct {
- logic work;
- logic [AHB_AW-:] addr;
- logic [AHB_DW-:] data;
- logic write;
- ahb_state_e cstate, nstate;
- } ahbd;
- typedef enum logic [:] {
- APB_IDLE = 'b00,
- APB_WRITE = 'b01,
- APB_READ = 'b10
- } apb_state_e;
- // Signal of APB Domain
- struct {
- logic work;
- logic [APB_DW-:] data[NSLV];
- logic PSEL[NSLV];
- logic PENABLE[NSLV];
- apb_state_e cstate, nstate;
- } apbd;
- // AHB Control Logic
- always_comb begin
- case (ahbd.cstate)
- AHB_IDLE: begin
- if (ahb.HSEL && ahb.HTRANS == HTRANS_NONSEQ) begin
- if (ahb.HWRITE)
- ahbd.nstate = AHB_WRITE;
- else
- ahbd.nstate = AHB_READ;
- end
- else
- ahbd.nstate = AHB_IDLE;
- end
- AHB_WRITE: begin
- if (apbd.work)
- ahbd.nstate = AHB_WAIT;
- else
- ahbd.nstate = AHB_WRITE;
- end
- AHB_READ: begin
- if (apbd.work)
- ahbd.nstate = AHB_WAIT;
- else
- ahbd.nstate = AHB_READ;
- end
- AHB_WAIT: begin
- if (!apbd.work)
- ahbd.nstate = AHB_IDLE;
- else
- ahbd.nstate = AHB_WAIT;
- end
- default: ahbd.nstate = AHB_IDLE;
- endcase
- end
- always_ff @(posedge HCLK or negedge HRESETn) begin
- if (!HRESETn)
- ahbd.cstate <= AHB_IDLE;
- else
- ahbd.cstate <= ahbd.nstate;
- end
- always_ff @(posedge HCLK or negedge HRESETn) begin
- if (!HRESETn) begin
- ahbd.work <= 'b0;
- ahbd.addr <= '0;
- ahbd.data <= '0;
- ahbd.write <= 'b0;
- ahb.HREADY <= 'b1;
- ahb.HRDATA[APB_DW-:] <= '0;
- end
- else begin
- case (ahbd.cstate)
- AHB_IDLE: begin
- if (ahb.HSEL && ahb.HTRANS == HTRANS_NONSEQ) begin
- ahbd.addr <= ahb.HADDR;
- ahbd.write <= ahb.HWRITE;
- ahb.HREADY <= 'b0;
- end
- else begin
- ahbd.addr <= '0;
- ahbd.write <= 'b0;
- ahb.HREADY <= 'b1;
- end
- ahbd.work <= 'b0;
- ahbd.data <= '0;
- ahb.HRDATA[APB_DW-:] <= apbd.data[ahbd.addr[AHB_AW-:AHB_AW-]];
- end
- AHB_WRITE: begin
- ahb.HREADY <= 'b0;
- ahbd.work <= 'b1;
- ahbd.data <= ahb.HWDATA;
- ahb.HRDATA[APB_DW-:] <= '0;
- end
- AHB_READ: begin
- ahbd.work <= 'b1;
- ahbd.data <= '0;
- ahb.HREADY <= 'b0;
- ahb.HRDATA[APB_DW-:] <= '0;
- end
- AHB_WAIT: begin
- ahbd.work <= 'b0;
- ahb.HREADY <= 'b0;
- ahb.HRDATA[APB_DW-:] <= '0;
- end
- endcase
- end
- end
- assign ahb.HRESP = HRESP_OKAY;
- // assign ahb.HRDATA[AHB_DW-1:APB_DW] = '0;
- // APB Control Logic
- always_comb begin
- case (apbd.cstate)
- APB_IDLE: begin
- if (ahbd.work) begin
- if (ahbd.write)
- apbd.nstate = APB_WRITE;
- else
- apbd.nstate = APB_READ;
- end
- else
- apbd.nstate = APB_IDLE;
- end
- APB_WRITE: apbd.nstate = APB_IDLE;
- APB_READ: apbd.nstate = APB_IDLE;
- default: apbd.nstate = APB_IDLE;
- endcase
- end
- always_ff @(posedge PCLK or negedge PRESETn) begin
- if (!PRESETn)
- apbd.cstate <= APB_IDLE;
- else
- apbd.cstate <= apbd.nstate;
- end
- always_ff @(posedge PCLK or negedge PRESETn) begin
- if (!PRESETn) begin
- apbd.work <= 'b0;
- for (int j = ; j < NSLV; j++) begin
- apbd.PSEL[j] <= 'b0;
- apbd.PENABLE[j] <= 'b0;
- end
- end
- else begin
- case (apbd.cstate)
- APB_IDLE: begin
- if (ahbd.work) begin
- apbd.work <= 'b1;
- for (int j = ; j < NSLV; j++)
- apbd.PSEL[j] <= (ahbd.addr[AHB_AW-:AHB_AW-] == j) ? 'b1 : 1'b0;
- end
- else begin
- apbd.work <= 'b0;
- for (int j = ; j < NSLV; j++)
- apbd.PSEL[j] <= 'b0;
- end
- for (int j = ; j < NSLV; j++)
- apbd.PENABLE[j] <= 'b0;
- end
- APB_WRITE: begin
- apbd.work <= 'b1;
- for (int j = ; j < NSLV; j++)
- apbd.PENABLE[j] <= (ahbd.addr[AHB_AW-:AHB_AW-] == j) ? 'b1 : 1'b0;
- end
- APB_READ: begin
- apbd.work <= 'b1;
- for (int j = ; j < NSLV; j++)
- apbd.PENABLE[j] <= (ahbd.addr[AHB_AW-:AHB_AW-] == j) ? 'b1 : 1'b0;
- end
- endcase
- end
- end
- generate
- for (i = ; i < NSLV; i++) begin: apbv_loop
- assign apbv[i].PADDR = {'h0, ahbd.addr[APB_AW-4-1:0]};
- assign apbv[i].PWRITE = ahbd.write;
- assign apbv[i].PWDATA = ahbd.data[APB_DW-:];
- assign apbd.data[i] = apbv[i].PRDATA;
- assign apbv[i].PSEL = apbd.PSEL[i];
- assign apbv[i].PENABLE = apbd.PENABLE[i];
- end
- endgenerate
- endmodule: ahb2apb_bridge
AMBA APB总线的更多相关文章
- AHB总线和APB总线
AHB主要用于高性能模块(如CPU.DMA和DSP等)之间的连接,作为SoC的片上系统总线,它包括以下一些特性:单个时钟边沿操作:非三态的实现方式:支持突发传输:支持分段传输:支持多个主控制器:可配置 ...
- APB总线
APB(Advance Peripheral Bus)是AMBA总线的一部分,从1998年第一版至今共有3个版本. AMBA 2 APB Specfication:定义最基本的信号interface, ...
- AMBA AHB总线
Advanced Microcontroller Bus Architecture, 即AMBA,是ARM公司提出的总线规范,被很多SoC设计所采用,常用的实现有AHB(Advanced High-P ...
- STM32WB AHB总线、APB总线与外设
方框图: 如图所示: 1)APB1外设 2)APB2外设 3)AHB1外设 4)AHB2外设 5)AHB3外设 6)AHB4外设(ABH共享总线外设) 内存映射关系图:
- AMBA总线介绍
The Advanced Microcontroller Bus Architecture (AMBA) specification defines an on- chip communication ...
- APB协议
https://wenku.baidu.com/view/2663f629ef06eff9aef8941ea76e58fafab04592.html https://www.cnblogs.com/l ...
- AMBA总线协议AHB、APB
一.什么是AMBA总线 AMBA总线规范是ARM公司提出的总线规范,被大多数SoC设计采用,它规定了AHB (Advanced High-performance Bus).ASB (Advanced ...
- AMBA总线协议AHB、APB、AXI对比分析【转】
转自:https://blog.csdn.net/ivy_reny/article/details/56274412 一.AMBA概述 AMBA (Advanced Microcontrolle ...
- [转]AMBA、AHB、APB、ASB总线简介
[转]http://www.cnblogs.com/zhaozhong1989/articles/3092140.html 1.前言 随着深亚微米工艺技术日益成熟,集成电路芯片的规模越来越大.数字IC ...
随机推荐
- Chakra TypedArray代码实现笔记
ArrayBuffer.cpp阅读 对象继承关系 JavascriptArrayBuffer: ArrayBuffer: ArrayBufferBase: DynamicObject: Recycla ...
- poj 1125 谣言传播 Floyd 模板题
假如有3个点 点1到点2要5分钟 点1到点3要3分钟 那么5分钟的时间可以传遍全图 所以要先找一个点到其他点的最长时间 再从最长的时间里找出最小值 Sample Input 3 // 结点数2 2 4 ...
- (第4篇)hadoop之魂--mapreduce计算框架,让收集的数据产生价值
摘要: 通过前面的学习,大家已经了解了HDFS文件系统.有了数据,下一步就要分析计算这些数据,产生价值.接下来我们介绍Mapreduce计算框架,学习数据是怎样被利用的. 博主福利 给大家赠送一套ha ...
- Android的简单应用(二)——使用dispatchKeyEvent双击退出程序
原文:https://www.cnblogs.com/cpacm/archive/2014/11/10/4087070.html Android系统按键操作最先是在dispatchKeyEvent ...
- day16--HTML、CSS、JavaScript总结
HTML 一大堆的标签:块级.行内 CSS position background text-align padding font-size background-image z-index ...
- openstack学习-KeyStone安装(二)
一.安装keystone # yum install -y openstack-keystone httpd mod_wsgi memcached python-memcached 二.设置Memca ...
- “教你如何玩转Web响应式布局” 的更多相关文章
“教你如何玩转Web响应式布局” 的更多相关文章 网址:http://www.360doc.com/relevant/641896074_more.shtml
- HDU1512 ZOJ2334 Monkey King 左偏树
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - ZOJ2334 题目传送门 - HDU1512 题意概括 在一个森林里住着N(N<=10000)只猴子. ...
- Jetbrains 2018 等系列软件激活破解除去黄色警告框方法(含多个平台)
现在以IDEA 2018软件在windows为例进行讲解破解方法,其它软件及其在不同平台的破解方法原理 大同小异,有需要的有兴趣的可以尝试一下. 最近更新了Intellij IDEA到2018.1.5 ...
- FZU 2150 Fire Game(双起点)【BFS】
<题目链接> 题目大意: 两个熊孩子在n*m的平地上放火玩,#表示草,两个熊孩子分别选一个#格子点火,火可以向上向下向左向右在有草的格子蔓延,点火的地方时间为0,蔓延至下一格的时间依次加一 ...