AMBA基础知识0:AMBA APB总线

2024-04-09 18:08
文章标签 总线 基础知识 amba apb

本文主要是介绍AMBA基础知识0:AMBA APB总线,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文地址:https://www.cnblogs.com/lyuyangly/p/4853921.html


(一) APB总线接口:

  PCLK APB总线时钟。

  PRESETn APB总线复位。低有效。

  PADDR 地址总线。

  PSELx 从设备选择。

  PENABLE APB传输选通。

  PWRITE 高为写传输,低为读。

  PRDATA 读数据总线。

  PWDATA 写数据总线。

  接口信号定义如下:

复制代码
 1 interface   apb_slv_intf #(
 2     parameter   AW  = 32,
 3                 DW  = 32
 4 ) (
 5     input   logic       PCLK,
 6     input   logic       PRESETn
 7 );
 8     logic               PSEL;
 9     logic               PENABLE;
10     logic   [AW-1:0]    PADDR;
11     logic               PWRITE;
12     logic   [DW-1:0]    PWDATA;
13     
14     logic   [DW-1:0]    PRDATA;
15     
16     
17     modport m (
18         input   PRDATA,
19         output  PSEL, PENABLE, PADDR, PWRITE, PWDATA
20     );
21     
22     modport s (
23         input   PSEL, PENABLE, PADDR, PWRITE, PWDATA,
24         output  PRDATA
25     );
26     
27 endinterface: apb_slv_intf
复制代码

  (二) APB总线时序图:

写传输

读传输

  注意在PENABLE信号有效后从设备需要给出有效数据/读取有效数据。

  (三) AHB总线到APB总线转换桥

复制代码
  1 module ahb2apb_bridge #(
  2     parameter   AHB_AW  = 32,
  3                 AHB_DW  = 32,
  4                 APB_AW  = 32,
  5                 APB_DW  = 32,
  6                 NSLV    = 16
  7 ) (
  8     input   logic   HCLK,
  9     input   logic   HRESETn,
 10     input   logic   PCLK,
 11     input   logic   PRESETn,
 12     ahb_slv_intf.s  ahb,
 13     apb_slv_intf.m  apbv[NSLV]
 14 );
 15     
 16     logic   ahb_work;
 17     logic   apb_work;
 18     
 19     genvar  i;
 20     
 21     typedef enum logic [1:0] {
 22         AHB_IDLE    = 2'b00,
 23         AHB_WRITE   = 2'b01,
 24         AHB_READ    = 2'b10,
 25         AHB_WAIT    = 2'b11
 26     } ahb_state_e;
 27     
 28     // Signal of AHB Domain
 29     struct {
 30         logic                   work;
 31         logic   [AHB_AW-1:0]    addr;
 32         logic   [AHB_DW-1:0]    data;
 33         logic                   write;
 34         ahb_state_e             cstate, nstate;
 35     } ahbd;
 36     
 37     typedef enum logic [1:0] {
 38         APB_IDLE    = 2'b00,
 39         APB_WRITE   = 2'b01,
 40         APB_READ    = 2'b10
 41     } apb_state_e;
 42     
 43     // Signal of APB Domain
 44     struct {
 45         logic                   work;
 46         logic   [APB_DW-1:0]    data[NSLV];
 47         logic                   PSEL[NSLV];
 48         logic                   PENABLE[NSLV];
 49         apb_state_e             cstate, nstate;
 50     } apbd;
 51     
 52     
 53     // AHB Control Logic
 54     always_comb begin
 55         case (ahbd.cstate)
 56             AHB_IDLE: begin
 57                 if (ahb.HSEL && ahb.HTRANS == HTRANS_NONSEQ) begin
 58                     if (ahb.HWRITE)
 59                         ahbd.nstate = AHB_WRITE;
 60                     else
 61                         ahbd.nstate = AHB_READ;
 62                 end
 63                 else
 64                     ahbd.nstate = AHB_IDLE;
 65             end
 66             AHB_WRITE: begin
 67                 if (apbd.work)
 68                     ahbd.nstate = AHB_WAIT;
 69                 else
 70                     ahbd.nstate = AHB_WRITE;
 71             end 
 72             AHB_READ: begin
 73                 if (apbd.work)
 74                     ahbd.nstate = AHB_WAIT;
 75                 else
 76                     ahbd.nstate = AHB_READ;
 77             end
 78             AHB_WAIT: begin
 79                 if (!apbd.work)
 80                     ahbd.nstate = AHB_IDLE;
 81                 else
 82                     ahbd.nstate = AHB_WAIT;
 83             end
 84             default: ahbd.nstate = AHB_IDLE;
 85         endcase
 86     end
 87     
 88     always_ff @(posedge HCLK or negedge HRESETn) begin
 89         if (!HRESETn)
 90             ahbd.cstate <= AHB_IDLE;
 91         else
 92             ahbd.cstate <= ahbd.nstate;
 93     end
 94     
 95     always_ff @(posedge HCLK or negedge HRESETn) begin
 96         if (!HRESETn) begin
 97             ahbd.work   <= 1'b0;
 98             ahbd.addr   <= '0;
 99             ahbd.data   <= '0;
100             ahbd.write  <= 1'b0;
101             ahb.HREADY  <= 1'b1;
102             ahb.HRDATA[APB_DW-1:0]  <= '0;
103         end
104         else begin
105             case (ahbd.cstate)
106                 AHB_IDLE: begin
107                     if (ahb.HSEL && ahb.HTRANS == HTRANS_NONSEQ) begin
108                         ahbd.addr   <= ahb.HADDR;
109                         ahbd.write  <= ahb.HWRITE;
110                         ahb.HREADY  <= 1'b0;
111                     end
112                     else begin
113                         ahbd.addr   <= '0;
114                         ahbd.write  <= 1'b0;
115                         ahb.HREADY  <= 1'b1;
116                     end
117                     ahbd.work   <= 1'b0;
118                     ahbd.data   <= '0;
119                     ahb.HRDATA[APB_DW-1:0]  <= apbd.data[ahbd.addr[AHB_AW-5:AHB_AW-8]];
120                 end
121                 AHB_WRITE: begin
122                     ahb.HREADY  <= 1'b0;
123                     ahbd.work   <= 1'b1;
124                     ahbd.data   <= ahb.HWDATA;
125                     ahb.HRDATA[APB_DW-1:0]  <= '0;
126                 end
127                 AHB_READ: begin
128                     ahbd.work   <= 1'b1;
129                     ahbd.data   <= '0;
130                     ahb.HREADY  <= 1'b0;
131                     ahb.HRDATA[APB_DW-1:0]  <= '0;
132                 end
133                 AHB_WAIT: begin
134                     ahbd.work   <= 1'b0;
135                     ahb.HREADY  <= 1'b0;
136                     ahb.HRDATA[APB_DW-1:0]  <= '0;
137                 end
138             endcase
139         end
140     end
141     
142     assign  ahb.HRESP = HRESP_OKAY;
143     // assign  ahb.HRDATA[AHB_DW-1:APB_DW] = '0;
144     
145     
146     // APB Control Logic
147     always_comb begin
148         case (apbd.cstate)
149             APB_IDLE: begin
150                 if (ahbd.work) begin
151                     if (ahbd.write)
152                         apbd.nstate = APB_WRITE;
153                     else
154                         apbd.nstate = APB_READ;
155                 end
156                 else
157                     apbd.nstate = APB_IDLE;
158             end
159             APB_WRITE:  apbd.nstate = APB_IDLE;
160             APB_READ:   apbd.nstate = APB_IDLE;
161             default:    apbd.nstate = APB_IDLE;
162         endcase
163     end
164     
165     always_ff @(posedge PCLK or negedge PRESETn) begin
166         if (!PRESETn)
167             apbd.cstate <= APB_IDLE;
168         else
169             apbd.cstate <= apbd.nstate;
170     end
171     
172     always_ff @(posedge PCLK or negedge PRESETn) begin
173         if (!PRESETn) begin
174             apbd.work   <= 1'b0;
175             for (int j = 0; j < NSLV; j++) begin
176                 apbd.PSEL[j]    <= 1'b0;
177                 apbd.PENABLE[j] <= 1'b0;
178             end
179         end
180         else begin
181             case (apbd.cstate)
182                 APB_IDLE: begin
183                     if (ahbd.work) begin
184                         apbd.work <= 1'b1;
185                         for (int j = 0; j < NSLV; j++)
186                             apbd.PSEL[j] <= (ahbd.addr[AHB_AW-5:AHB_AW-8] == j) ? 1'b1 : 1'b0;
187                     end
188                     else begin
189                         apbd.work <= 1'b0;
190                         for (int j = 0; j < NSLV; j++)
191                             apbd.PSEL[j] <= 1'b0;
192                     end
193                     for (int j = 0; j < NSLV; j++)
194                         apbd.PENABLE[j] <= 1'b0;
195                 end
196                 APB_WRITE: begin
197                     apbd.work <= 1'b1;
198                     for (int j = 0; j < NSLV; j++)
199                         apbd.PENABLE[j] <= (ahbd.addr[AHB_AW-5:AHB_AW-8] == j) ? 1'b1 : 1'b0;
200                 end
201                 APB_READ: begin
202                     apbd.work <= 1'b1;
203                     for (int j = 0; j < NSLV; j++)
204                         apbd.PENABLE[j] <= (ahbd.addr[AHB_AW-5:AHB_AW-8] == j) ? 1'b1 : 1'b0;
205                 end
206             endcase
207         end
208     end
209     
210     generate
211         for (i = 0; i < NSLV; i++) begin: apbv_loop
212             assign apbv[i].PADDR    = {4'h0, ahbd.addr[APB_AW-4-1:0]};
213             assign apbv[i].PWRITE   = ahbd.write;
214             assign apbv[i].PWDATA   = ahbd.data[APB_DW-1:0];
215             assign apbd.data[i]     = apbv[i].PRDATA;
216             assign apbv[i].PSEL     = apbd.PSEL[i];
217             assign apbv[i].PENABLE  = apbd.PENABLE[i];
218         end
219     endgenerate
220 
221 endmodule: ahb2apb_bridge

这篇关于AMBA基础知识0:AMBA APB总线的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/888863

相关文章

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

计组基础知识

操作系统的特征 并发共享虚拟异步 操作系统的功能 1、资源分配,资源回收硬件资源 CPU、内存、硬盘、I/O设备。2、为应⽤程序提供服务操作系统将硬件资源的操作封装起来,提供相对统⼀的接⼝(系统调⽤)供开发者调⽤。3、管理应⽤程序即控制进程的⽣命周期:进程开始时的环境配置和资源分配、进程结束后的资源回收、进程调度等。4、操作系统内核的功能(1)进程调度能⼒: 管理进程、线

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

java常用面试题-基础知识分享

什么是Java? Java是一种高级编程语言,旨在提供跨平台的解决方案。它是一种面向对象的语言,具有简单、结构化、可移植、可靠、安全等特点。 Java的主要特点是什么? Java的主要特点包括: 简单性:Java的语法相对简单,易于学习和使用。面向对象:Java是一种完全面向对象的语言,支持封装、继承和多态。跨平台性:Java的程序可以在不同的操作系统上运行,称为"Write once,

关于回调函数和钩子函数基础知识的整理

回调函数:Callback Function 什么是回调函数? 首先做一个形象的比喻:   你有一个任务,但是有一部分你不会做,或者说不愿做,所以我来帮你做这部分,你做你其它的任务工作或者等着我的消息,但是当我完成的时候我要通知你我做好了,你可以用了,我怎么通知你呢?你给我一部手机,让我做完后给你打电话,我就打给你了,你拿到我的成果加到你的工作中,继续完成其它的工作.这就叫回叫,手机

有关机械硬盘的基础知识

1,机械硬盘的品牌   目前市场中常见的笔记本电脑的机械硬盘品牌主要有希捷、西部数据、三星等。   2,机械硬盘的容量   硬盘容量,即硬盘所能存储的最大数据量。虽然笔记本电脑硬盘的容量会因单位密度的提升而增加,不过和台式电脑的大容量比起来,笔记本电脑硬盘的容量仍然落后许多。笔记本电脑的硬盘除了对磁盘有体积较小和数量较少的要求之外,对功耗、耐用程度、抗震性及成本等的考虑,也让笔记

OpenGL ES学习总结:基础知识简介

什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库。 为桌面版本OpenGL 的一个子集。 OpenGL ES管道(Pipeline) OpenGL ES 1.x 的工序是固定的,称为Fix-Function Pipeline,可以想象一个带有很多控制开关的机器,尽管加工

电子电气架构---私有总线通信和诊断规则

电子电气架构—私有总线通信和诊断规则 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节能减排。 无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事.而不是让内心的烦躁、

计算机基础知识复习9.6

点对点链路:两个相邻节点通过一个链路相连,没有第三者 应用:PPP协议,常用于广域网 广播式链路:所有主机共享通信介质 应用:早期的总线以太网,无线局域网,常用于局域网 典型拓扑结构:总线型 星型(逻辑总线型) 介质访问控制  静态划分信道 信道划分介质访问控制 频分多路复用FDM 时分多路复用TDM 波分多路复用WDM 码分多路复用CDM 动态分配信道 轮询访问介质访问控

Gitflow基础知识

0.理想状态 现状 听完后的理想状态 没使用过 git 知道 git 是什么,会用 git 基础流程命令 用过 git,但只通过图形化界面操作 脱离图形化界面操作,通过 git 命令操作 会 git 命令 掌握 gitflow 规范,合理使用 rebase 和解决代码冲突问题 1.Git 的基础流程&命令 1.1 基础概念 工作区:代码生产基地,pycharm