AHB2APB Bridge模块的Verilog设计

前言:
本文是个人FPGA项目《基于AMBA总线的流水灯控制器系统》中的第二章节,
文章主要内容是介绍项目中AHB2APB Bridge模块的Verilog设计方法,
由于该模块在AMBA总线架构中具有不可替代的地位,因此本文章所介绍的设计方法和思路在其他设计项目中具有很强的通用性,
《基于AMBA总线的流水灯控制器系统》介绍了一个完全用Verilog HDL手写的AMBA片上系统,设计了一个基于AMBA总线的流水灯控制系统,
项目中所有数字电路逻辑RTL设计都是通过Verilog进行的,不会调用成熟IP核,
RTL模型的仿真、综合与布线在Vivado平台上完成,最后在FPGA开发板上进行板级验证。
对于FPGA项目感兴趣的朋友们,可以参照本人发布于博客园的设计文档与项目在FPGA开发板上的运行演示视频:
博客园链接:https://www.cnblogs.com/sjtu-zsj-990702/p/17251396.html
正文:
AHB2APB Bridge是AHB与APB总线之间的桥梁,负责两种协议信号的相互转换,
AHB2APB Bridge的模块框图和信号定义如下:

AHB2APB Bridge既是AHB总线上的一个Slave,也作为APB总线上唯一的Master,
其任务是将来自于AHB总线上的信号转化为APB信号,实现AHB系统和APB的互联,
2.1 AHB2APB Bridge有限状态机
那么如何实现一个可以完成上述功能的Bridge模块呢?
答案是通过一个有限状态机(FSM,Finite State Machine)来进行控制,
看看一次典型的AHB到APB信号转换时序图(以Read为例):

在T1-T2期间,Bridge作为AHB总线上的Slave被HADDR选中,
在T2-T4两个时钟周期内,Bridge将AHB的HADDR上的地址Addr1放在APB总线的PADDR上,
其中T2-T3,PENABLE尚未被拉高,且HREADY会被Bridge拉低,因为APB的传输速度是低于AHB的,需要AHB总线上的Master进行等待,
而T3-T4,PENABLE被Bridge使能,数据信息被放上PRDATA并且由Bridge转交给HRDATA,
我们将T1-T2,T2-T3,T3-T4这个周期分别称为IDLE,SETUP和ENABLE,
于是我们得到AHB2APB Bridge的状态机转换示意图:

总结一下:
1. 对于SETUP,下一个周期必定跳往ENABLE,
由于本项目用的是APB-Lite,没有PREADY信号,所有APB传输必须在两个周期完成
2. 对于IDLE或ENABLE,若总线上有传输,则下一个周期为SETUP;若无,则下一个周期为IDLE
(“有无传输”,意思是AHB端的HADDR是否选中APB上的设备)
注意:在T2-T4传输Data1后,APB总线又在T4-T6两个周期内完成了Data2的传输,
这两次传输之间并没有经历IDLE状态,这表明当AHB总线上仍然有传输任务时,ENABLE状态直接跳往SETUP状态以准备下一个数据的传输,
由此我们得到AHB2APB Bridge的状态机:
2.2 AHB与APB信号转换
完成上述状态机设计后,剩下的工作就非常简单了,我们需要把AHB总线上的信号放到APB总线上:
1. APB上的控制信号(PWRITE,PADDR)与数据信号(PWDATA,PRDATA)都是直接从AHB那边的信号拿过来的,
2. PENABLE只在ENABLE状态下拉高,
3. PSELx取决于HADDR落在APB总线上哪个外设的地址空间范围内,在本设计中,APB Slave为APB GPIO模块
于是可以得到AHB与APB信号之间的对应关系:
最后,
附上AHB2APB Bridge模块的完整RTL: