SoC进阶 - AHB master设计
扫描二维码
随时随地手机看文章
前两篇进阶文章主要讲述了AHB slave的核心内容,这篇来讲AHB lite master的设计。
AHB master主要用于一下三个方面:
1.计算模块和crossbar的沟通桥梁,例如加速器模块。
2.crossbar或者bridge的AHB master口,例如noc或者ahb matrix的ahb master口。
3.DMA模块的AHB master口,用于读取source数据,并发送到target地址。
AHB master在整个SOC领域可以起到敲门砖的作用,掌握了它,对后续掌握其他模块的设计非常有帮助。
1、输入输出接口
在设计某个模块时,首先需要理清它有哪些输入输出,从而对设计进行一个整体了解。由于本文的读写模块设计属于比较基础的AHB传输,不涉及突发传输、锁定传输和从机的分块传输。本设计的输入有:hclk_i、irst_n、hgrant_i、hrdata_i、hready_i,输出有:hwdata_o、htrans_o、hwrite_o、haddr_o、hbusreq_o。
2、状态机设计
状态机的设计比较重要,本设计的主状态机是:空闲状态、读状态、写状态,从状态机分为读状态机(rd_fsm_r)和写状态机(wr_fsm_r),读状态机和写状态机的状态转移图如图所示。
状态机
根据AHB总线地址段和数据段的特性,可将其分为:空闲状态、请求总线状态、地址段状态、读/写数据状态和读/写最后一个字节状态。注意:在状态机中,何时有效很重要,从图中可以看出,各状态的触发条件都有hready_i信号(由于hready_i信号是一直在变化的,可能前一个状态hready_i信号为高,但后一个状态会变低,不能使用软件思维去思考。),其次,何时开始读/写数据,何时数据读/写完成,这都是由计数器计数来决定的。
3、设计时序图
读写过程比较类似,时序图如图所示:
读写时序图
从图中可以看出,地址与数据并非在同一周期(AHB总线的特性)。当前周期的地址,存储的数据在下一周期才会出现。这种地址和数据交叠出现使总线能进行高性能操作的同时,给从机也提供了足够的时间来响应传输。
4、基本代码
状态机逻辑:
至此,本文基于AHB总线的master读写设计就完成了。这是我很早之前设计的代码了,可能存在一些小问题。
总结
为什么AHB master的学习,这么重要呢?
就是因为它的作用,初次 之外,还有设计它所使用的基础知识。如下图:
AXI master场景1
我们接受的数据来自运算单元,它给我们的内容有,读写使能(doorbell),读写控制,包括burst类型,数据size,地址valid,以及握手信号。我们需要对这些数据进行采样,设计状态机来保证AXI的时序,如果两个模块时钟不一样,我们还要进行异步处理。
这是我在内网很久之前练习的小设计。
基于FIFO的AHB LITE架构图
FIFO和axi master
设计思路
我们正常设计AHB master时,因为要支持burst传输,所以数据是要缓存到同步FIFO中的,我们常用的设计思路如下:
-FIFO满时发起AHB burst 写,将FIFO清空。FIFO空时发起AHB burst读,填满FIFO。
-FIFO深度=burst length。
-FIFO宽度=AHB数据宽度。
-地址帧wr_req作为FIFO rd_en,读取FIFO数据,转化为hwdata。
-数据帧将rd_vld作为we_en,将读取的hrdata写到FIFO。
代码在下面图中,有点不清晰,谅解,和之前的代码相比,优化了状态机,状态机太多可读性较差。
要点补充
只要设计的AXI master支持burst传输,前面一定有一个FIFO缓存数据。真正项目中,不一定时空满时才发起AHB读写,一定会有预警信号。
并且真正设计时一定是两个FIFO,我这里只是图省事用了一个。
AXI master设计时,难点是除了数据需要缓存,commands也需要缓存。