AMBA总线协议-结合AHB2APB桥设计及验证对AHB和APB协议的理解

2023-10-10 01:30

本文主要是介绍AMBA总线协议-结合AHB2APB桥设计及验证对AHB和APB协议的理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这里的设计参考了arm的ip。

1.接口信号

(1)对于ahb这一侧,相当于ahb-slave的接口信号,基本信号包含:

hclk,hrst_n,hready_in,hready_out,hwrite,hwdata,hrdata,hsel,haddr,htrans,hsize,hprot,hresp

注意这里是ahb-lite的版本,hresp只有error和okay两种情况。

(2)apb这一侧:

psel,penable,pwrite,paddr,pwdata,prdata,pready,pslverr,pstrb,pprot。

注意这里没有pclk信号,外部输入的是pclken信号当做apb的时钟,关于pclken信号的产生逻辑需要mater单独给,如下:

always@(posedge hclk or negedge hresetn)
beginif(!hresetn)hclk_cnt <= 4'b0;else if(hclk_cnt == HCLK_PCLK_RATIO - 1'b1)hclk_cnt <= 4'b0;else hclk_cnt <= hclk_cnt + 1'b1;
endalways@(negedge hclk or negedge hresetn)
beginif(!presetn)pclk_en <= 1'b0;else if(hclk_cnt == HCLK_PCLK_RATIO - 1'b1)pclk_en <= 1'b1;else pclk_en <= 1'b0;
end

也就是pclk_en是hclk分频出来的,文档中规定了这两个信号需要时同相位的。

此外系统中还存在一个apb-active信号。这个信号是用来表示这个桥是否处于工作状态的信号,这个信号存在的意义在于可以将这个信号和pclk进行gate,降低功耗。

 2.内部状态机:

该设计支持通过参数化的配置来设定当前写入或者读出数据是否需要寄存,这样做的目的在于高频下解决时序上的问题。

整个内部状态机共有七个状态:

idle状态,wait1状态,setup状态,enable状态,wait2状态,error1状态,error2状态。

1.idle状态会向wait1状态和setup状态进行跳,wait1状态表示的是是否对输入数据进行寄存。

(1)如果psel信号为1+配置参数对输入数据寄存+hwrite那么进入wait1状态。

(2)idle状态往setup状态直接跳有两种情况,

第一种是写操作时,那么此时需要对输入数据寄存一拍的配置参数为0+psel+pclken;

第二种是读操作,无论配置参数是否为1,只需要满足psel+pclken;

ST_IDLE : beginif (PCLKEN & apb_select & ~(reg_wdata_cfg & HWRITE))next_state = ST_APB_TRNF; 		// Start APB transfer in next cycleelse if (apb_select)next_state = ST_APB_WAIT;		// Wait for start of APB transfer at PCLKEN highelsenext_state = ST_IDLE; 			// Remain idleend

2.wait1状态:

此状态下下一拍就会进入setup状态(实际代码中这里写的是:如果pclken为1的话进入setup状态,但是需要注意的是,实际上pclken的逻辑是只要他不是idle状态他就为1,个人觉得加这个逻辑有点冗余。)

ST_APB_WAIT : beginif (PCLKEN)next_state = ST_APB_TRNF; 		// Start APB transfer in next cycleelsenext_state = ST_APB_WAIT; 		// Wait for start of APB transfer at PCLKEN highend

3.setup下一拍进入enable,代码中同样是pclken为1的时候进入。

ST_APB_TRNF : beginif (PCLKEN)next_state = ST_APB_TRNF2;  	// Change to second cycle of APB transferelsenext_state = ST_APB_TRNF;   	// Change to state-2end

4.enable状态的跳转有四种,分别如下:

(1)当apb-slave返回的ready信号为1+pslverr为0+pclken的时候进入error状态;

(2)当apb-slave返回的ready信号为1+pslverr为0的时候表示这次传输成功,再此基础上加上pclken+配置参数配置读数据需要寄存一拍时进入wait2状态;

(3)当apb-slave返回的ready信号为1+pslverr为0+apb-selct表示紧接着又进行了一此数据的传输,因此进入wait1状态

(4)当apb-slave返回的ready信号为1+pslverr为0+!apb-selct表示紧接着没有数据的传输,因此进入idle状态

ST_APB_TRNF2 : begin		if (PREADY & PSLVERR & PCLKEN) 				// Error received - Generate two cycle// Error response on AHB bynext_state = ST_APB_ERR1; 				// Changing to state-5 and 6else if (PREADY & (~PSLVERR) & PCLKEN) begin // Okay receivedif (reg_rdata_cfg)// Registered versionnext_state = ST_APB_ENDOK; 			// Generate okay response in state 4else// Non-registered versionnext_state = {2'b00, apb_select}; 	// Terminate transferendelse 	// Slave not readynext_state = ST_APB_TRNF2; 				// Unchangeend

注意,在上述的条件下,如果apb-select为1的话实际上进入的是wait1状态,wait1跳到setup需要一拍,setup跳到enable需要一拍,也就是penable至少两拍之后才能再次拉高。

5.wait2状态的跳转:

(1)如果pclken+apb_select+(配置输入数据不需要寄存+写操作)或(读操作)那么均是进入setup状态

(2)如果是apb-select+写操作+配置输入数据需要寄存一拍进入wait1状态

(3)如果没有apb_selct进入idle状态。

ST_APB_ENDOK : beginif (PCLKEN & apb_select & ~(reg_wdata_cfg & HWRITE))next_state = ST_APB_TRNF; 	// Start APB transfer in next cycleelse if (apb_select)next_state = ST_APB_WAIT; 	// Wait for start of APB transfer at PCLKEN highelsenext_state = ST_IDLE; 		// Remain idleend

6.error1

error1下一状态进入error2

ST_APB_ERR1 : next_state = ST_APB_ERR2; 	

7.error2

error2状态的跳转和wait2状态的跳转相同。

ST_APB_ERR2 : beginif (PCLKEN & apb_select & ~(reg_wdata_cfg & HWRITE))next_state = ST_APB_TRNF; 	// Start APB transfer in next cycleelse if (apb_select)next_state = ST_APB_WAIT; 	// Wait for start of APB transfer at PCLKEN highelsenext_state = ST_IDLE; 		// Remain idleend

3.信号输出

always @(state_reg or reg_rdata_cfg or PREADY or PSLVERR or PCLKEN)begincase (state_reg)ST_IDLE      : HREADYOUT = 1'b1; // IdleST_APB_WAIT  : HREADYOUT = 1'b0; // Transfer announced on AHB, but PCLKEN was low, so waitingST_APB_TRNF  : HREADYOUT = 1'b0; // First APB transfer cycle// Second APB transfer cycle:// if Non-registered feedback version, and APB transfer completed without error// Then response with ready immediately. If registered feedback version,// wait until state_reg==ST_APB_ENDOKST_APB_TRNF2 : HREADYOUT = (~reg_rdata_cfg) & PREADY & (~PSLVERR) & PCLKEN;ST_APB_ENDOK : HREADYOUT = reg_rdata_cfg; // Ending cycle for OKAY (registered response only)ST_APB_ERR1  : HREADYOUT = 1'b0; // First cycle for Error responseST_APB_ERR2  : HREADYOUT = 1'b1; // Second cycle for Error responsedefault: HREADYOUT = 1'bx; // x propagation (note :3'b111 is illegal state)endcaseend

关于hreadyout输出的逻辑就是idle状态下为1,enable状态下,如果输出不需要寄存+hready+!error+pclken就为1,wait2状态下如果输出需要寄存为1,其他状态均为0.

这篇关于AMBA总线协议-结合AHB2APB桥设计及验证对AHB和APB协议的理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/176976

相关文章

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

Python数据验证神器Pydantic库的使用和实践中的避坑指南

《Python数据验证神器Pydantic库的使用和实践中的避坑指南》Pydantic是一个用于数据验证和设置的库,可以显著简化API接口开发,文章通过一个实际案例,展示了Pydantic如何在生产环... 目录1️⃣ 崩溃时刻:当你的API接口又双叒崩了!2️⃣ 神兵天降:3行代码解决验证难题3️⃣ 深度

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

Python结合Free Spire.PDF for Python实现PDF页面旋转

《Python结合FreeSpire.PDFforPython实现PDF页面旋转》在日常办公或文档处理中,我们经常会遇到PDF页面方向错误的问题,本文将分享如何用Python结合FreeSpir... 目录基础实现:单页PDF精准旋转完整代码代码解析进阶操作:覆盖多场景旋转需求1. 旋转指定角度(90/27

GO语言zap日志库理解和使用方法示例

《GO语言zap日志库理解和使用方法示例》Zap是一个高性能、结构化日志库,专为Go语言设计,它由Uber开源,并且在Go社区中非常受欢迎,:本文主要介绍GO语言zap日志库理解和使用方法的相关资... 目录1. zap日志库介绍2.安装zap库3.配置日志记录器3.1 Logger3.2 Sugared

深入理解Redis线程模型的原理及使用

《深入理解Redis线程模型的原理及使用》Redis的线程模型整体还是多线程的,只是后台执行指令的核心线程是单线程的,整个线程模型可以理解为还是以单线程为主,基于这种单线程为主的线程模型,不同客户端的... 目录1 Redis是单线程www.chinasem.cn还是多线程2 Redis如何保证指令原子性2.

深入理解MySQL流模式

《深入理解MySQL流模式》MySQL的Binlog流模式是一种实时读取二进制日志的技术,允许下游系统几乎无延迟地获取数据库变更事件,适用于需要极低延迟复制的场景,感兴趣的可以了解一下... 目录核心概念一句话总结1. 背景知识:什么是 Binlog?2. 传统方式 vs. 流模式传统文件方式 (非流式)流

深入理解Go之==的使用

《深入理解Go之==的使用》本文主要介绍了深入理解Go之==的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录概述类型基本类型复合类型引用类型接口类型使用type定义的类型不可比较性谈谈map总结概述相信==判等操作,大

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

Java JDK Validation 注解解析与使用方法验证

《JavaJDKValidation注解解析与使用方法验证》JakartaValidation提供了一种声明式、标准化的方式来验证Java对象,与框架无关,可以方便地集成到各种Java应用中,... 目录核心概念1. 主要注解基本约束注解其他常用注解2. 核心接口使用方法1. 基本使用添加依赖 (Maven