AHB-SRAM简单设计之总线控制单元 ahb_slave_if.v

article/2025/10/13 22:56:48

前言

这部分的代码在最后,本来打算刚开始就直接上代码,可是200多行,有点占篇幅。我们就先分析下这部分!

推荐一篇硕士论文,可以自行搜索下载,或点击免费下载:基于AHB总线SRAM控制器 的设计及优化.caj。
在这里插入图片描述

AHB总线控制单元 ahb_slave_if.v

就这么说,市面上arm公司的架构比较受众,最基本的就是AMBA协议。芯片设计公司要把东西(ram、sram、uart等等)按照协议集联起来,所以要考虑的就是如何把他们连接到AMBA里面去!所以就产生了与模块对应的控制单元。

在这里有点迷惑:下面这部分是论文里的,也是参考博客中完全复现的部分!
这部分提到的sram控制器,不是AHB总线控制单元的部分吗?顶层模块只是将两个子模块例化连接起来就行了!难道他们是将这部分单独放了一个模块,然后例化在了ahb_slave_if.v中?
在这里插入图片描述
SRAM 的工作原理很简单,SRAM 控制单元根据接受到的总线控制信号,将这些信号处理转化为 SRAM 存储器可以识别的信号,发送到 SRAM 存储器;之后,将经过地址译码的物理地址传送到存储器的地址总线,并将数据路径处理的数据送到SRAM 存储器的数据总线。最后,SRAM 存储器进行相应的读写访问。如果是写操作,SRAM 控制单元的任务就完成了,SRAM 存储器已将数据信息按照要求写入。如果是读操作,SRAM 控制单元需要接收返回的读数据,将其送到数据路径,由数据路径将信息传输给 AHB 总线,最终实现总线对 SRAM 的读操作。

这里设计的SRAM控制器的作用就是实现SRAM存储器与AHB总线的数据信息交换

声明:下面分析的这部分照搬前言提到的硕士论文 !!!!!!!!

/*选用单周期读写SRAM且SRAM一直处于“OK”状态*/ 
assign hready_resp =1’b1;
assign hresp =2’b00;/*数据从SRAM传输到AHB总线 */ 
assign hrdata = sram_data_out /* 根据AHB总线协议,只有当TRANS信号为NONSEQ或者SEQ时,数据读写才有效,
因此,需要保证SRAM读写时,TRANS信号有效。SRAM进行写操时,hwrite信号为高;
SRAM进行读操作时,hwrite信号为低 */ 
assign sram_write = ((htrans_r == NONSEQ) || (htrans_r == SEQ)) && hwrite_r; 
assign sram_read = ((htrans_r == NONSEQ) || (htrans_r == SEQ)) && (!hwrite_r); /*写使能信号低有效*/ 
assign sram_w_en = !sram_write; 
/*只有当SRAM进行读写操作时,片选使能信号才为高电平,主要是节省功耗*/ 
assign sram_csn_en = (sram_write || sram_read);/*当片选信号为1时,选中bank0;当片选信号为0时,选中bank1*/ 
assign   sram_data_out = (bank_sel) ?   {sram_q3, sram_q2, sram_q1, sram_q0} : {sram_q7, sram_q6, sram_q5, sram_q4} ; /*这一部分片选操作时,低32K空间选择bank0,在高32K空间选择bank1*/ 
assign bank_sel = (sram_csn_en && (sram_addr[15] == 1'b0)) ? 1'b1 : 1'b0; 
assign bank0_csn= (sram_csn_en && (sram_addr[15] == 1'b0)) ? sram_csn : 4'b1111; 
assign bank1_csn= (sram_csn_en && (sram_addr[15] == 1'b1)) ? sram_csn : 4'b1111; /*数据从AHB总线写入SRAM */ 
assign sram_wdata = hwdata; 
/*每个bank有4片SRAM,每一片SRAM有一个片选信号  */ 
always@(hsize_sel or haddr_sel)  
begin if(hsize_sel == 2'b10) sram_csn = 4'b0; /*一次片选两片SRAM */ else if(hsize_sel == 2'b01)  begin      if(haddr_sel[1] == 1'b0)        sram_csn = 4'b1100; else sram_csn = 4'b0011; end /*选择一片SRAM,具体到4片中的某一片*/ else if(hsize_sel == 2'b00)  begin case(haddr_sel) 2'b00 : sram_csn = 4'b1110; 2'b01 : sram_csn = 4'b1101; 2'b10 : sram_csn = 4'b1011; 2'b11 : sram_csn = 4'b0111; default : sram_csn = 4'b1111; endcase end else sram_csn = 4'b1111; 
end 

ahb_slave_if.v

module ahb_slave_if(//input signalsinput		   hclk,input		   hresetn,input		   hsel,input		   hwrite,input		   hready,input	[2:0]  hsize,input [1:0]  htrans,input [2:0]  hburst,   // hard code -> parameterinput [31:0] hwdata,input [31:0] haddr,//output signalsoutput		hready_resp,output [1:0]	hresp,output [31:0]	hrdata,//sram outputinput [7:0]	 sram_q0, // 8bitsinput [7:0]	 sram_q1,input [7:0]	 sram_q2,input [7:0]	 sram_q3,input [7:0]	 sram_q4,input [7:0]	 sram_q5,input [7:0]	 sram_q6,input [7:0]	 sram_q7,output		sram_w_en,      // 0:write, 1:readoutput [12:0]	sram_addr_out,output [31:0] sram_wdata,     //写sram数据output [3:0]	bank0_csn,      //四字节可以单独写入output [3:0]	bank1_csn);//-------------------------------------------------------//internal registers used for temp the input ahb signals//-------------------------------------------------------//temperate all the AHB input signalsreg        hwrite_r;reg [2:0]  hsize_r ;    reg [2:0]  hburst_r;reg [1:0]  htrans_r;reg [31:0] haddr_r;reg [3:0]  sram_csn; //------------------------------------------------------//Internal signals//------------------------------------------------------//"haddr_sel " and "hsize_sel" used to generate banks of//sram: "bank0_sel" and "bank1_sel".wire [1:0] haddr_sel;wire [1:0] hsize_sel;wire bank_sel;wire sram_csn_en;          //sram chip select enablewire sram_write;           //sram write enable signal from AHB buswire sram_read;            //sram read enable signal from AHB buswire [15:0] sram_addr;     //sram address from AHB buswire [31:0] sram_data_out; //data read from sram and send to AHB busparameter     IDLE   = 2'b00,BUSY   = 2'b01,NONSEQ = 2'b10,SEQ    = 2'b11;//---------------------------------------------------------//  Combinatorial portion//---------------------------------------------------------//assign the response and read data of the ahb slave //In order to implement the sram function-writing or reading//in one cycle, the value of hready_resp is always "1". assign hready_resp = 1'b1; // Singal Cycleassign hresp  = 2'b00;     // OK//---------------------------------------------------------//sram data output to AHB bus//---------------------------------------------------------assign   hrdata = sram_data_out; //组合逻辑读,CPU读SRAM,地址有效则立即读//Choose the right data output of the two banks(bank0, bank1) according//to the value of bank_sel. If bank_sel = 1'b1, bank0 sleceted, or //bank1 selected.assign  sram_data_out = (bank_sel) ?  {sram_q3, sram_q2, sram_q1, sram_q0} :{sram_q7, sram_q6, sram_q5, sram_q4} ;//Generate sram write and read enable signals.assign sram_write = ((htrans_r == NONSEQ) || (htrans_r == SEQ)) && hwrite_r;assign sram_read =  ((htrans_r == NONSEQ) || (htrans_r == SEQ)) && (!hwrite_r);assign sram_w_en = !sram_write;//generate sram address//SRAM总寻址64K 0x0--0xffffassign sram_addr = haddr_r [15:0];//64K 8*8Kassign sram_addr_out = sram_addr[14:2]; // word//Generate bank select signals by the value of sram_addr[15].//Each bank(32kx32) comprises of four sram block(8kx8), and//the width of the address of the bank is 15 bits(14~0), so //the sram_addr[15] is the minimun of the next bank. If its //value is "1", it means the next bank is selcted. assign sram_csn_en = (sram_write || sram_read);//低32K bank0 高32K bank1assign bank_sel  = (sram_csn_en && (sram_addr[15] == 1'b0)) ? 1'b1 : 1'b0;assign bank0_csn = (sram_csn_en && (sram_addr[15] == 1'b0)) ? sram_csn : 4'b1111;assign bank1_csn = (sram_csn_en && (sram_addr[15] == 1'b1)) ? sram_csn : 4'b1111;//signals used to generating sram chip select signal in one bank.assign haddr_sel = sram_addr[1:0];assign hsize_sel = hsize_r [1:0];//-------------------------------------------------------//data from ahb writing into sram//-------------------------------------------------------assign sram_wdata = hwdata;//-------------------------------------------------------//Generate the sram chip selecting signals in one bank.//The resluts show the AHB bus write or read how many data//once a time: byte, halfword or word.//---------------------------------------------------------always@(hsize_sel or haddr_sel) beginif(hsize_sel == 2'b10)//32bitsram_csn = 4'b0;else if(hsize_sel == 2'b01) begin//16bitif(haddr_sel[1] == 1'b0) //little-endiansram_csn = 4'b1100;elsesram_csn = 4'b0011;endelse if(hsize_sel == 2'b00) begin//8bitcase(haddr_sel)2'b00 : sram_csn = 4'b1110;2'b01 : sram_csn = 4'b1101;2'b10 : sram_csn = 4'b1011;2'b11 : sram_csn = 4'b0111;default : sram_csn = 4'b1111;endcaseendelsesram_csn = 4'b1111;end//--------------------------------------------------------//  Sequential portion//--------------------------------------------------------//tmp the ahb address and control signalsalways@(posedge hclk , negedge hresetn) beginif(!hresetn) beginhwrite_r  <= 1'b0  ;hsize_r   <= 3'b0  ;  hburst_r  <= 3'b0  ;htrans_r  <= 2'b0  ;haddr_r   <= 32'b0 ;endelse if(hsel && hready) begin //hsel要片选,否则信号一直在翻转,可能会功能错误,并且功耗大hwrite_r  <= hwrite ;//写SRAM时,把控制信号寄存。因为写操作时,要把地址打一拍,和数据对齐hsize_r   <= hsize  ;  //   hburst_r  <= hburst ;//AHB中master会把burst传输所有地址传递过来,AXI只传递起始地址。此处用处不大。减少一个REGhtrans_r  <= htrans ;haddr_r   <= haddr  ;end else beginhwrite_r  <= 1'b0  ;hsize_r   <= 3'b0  ;  hburst_r  <= 3'b0  ;htrans_r  <= 2'b0  ;haddr_r   <= 32'b0 ;endendendmodule

后记

这是AHB-SRAM项目中,总线控制单元ahb_slave_if.v的所有文件,如果需要跳转到查看此项目的架构,请点击跳转
AHB-SRAM简单设计之架构图解

笔者是小白,自学输出过程中,难免有错误,请大家指正!


http://chatgpt.dhexx.cn/article/7Rt9Wiet.shtml

相关文章

AMBA5 AHB协议规范(AHB5,AHB-Lite)中文版-第六章 数据总线

第六章 数据总线 本章描述了数据总线。它包含以下部分&#xff1a; – 数据总线 on page 6-60. – 大小端 on page 6-61. – 数据总线宽度 on page 6-65. 6.1 Data buses 实现AHB系统需要独立的读写数据总线。虽然推荐的最小数据总线宽度被指定为32位&#xff0c;但可以按照…

[接口-AMBA-AHB] AHB总线协议

一、典型AMBA系统 AHB总线的强大之处在于它可以将微控制器CPU、高带宽的片上RAM、高带宽的外部存储器接口、DMA总线master、各种拥有AHB接口的控制器等连接起来构成一个独立的完成SOC系统&#xff0c;不仅如此&#xff0c;还可以通过AHB-APB桥来连接APB总线系统。 AHB可以成为一…

基于AHB的SRAM设计

基于AHB的SRAM设计 一、描述 作为系统的缓存&#xff1b;SRAM存储体由MeMery complier生成&#xff1b;项目完成SRAM控制器的设计&#xff1b;SRAM作为AHB Slave的形式存在&#xff1b; 二、特性 支持8位&#xff0c;16位和32位的SRAM数据读写操作&#xff1b;支持SRAM的单…

AHB lite协议

文章目录 概述特点AHB的组成单个master的AHB lite结构多个master的AHB lite结构结构1结构2 AHB lite基本信号1.系统信号2.master3.slave信号4.译码器信号5.多路器 信号详细解释HSIZE[2:0]HTRANS[1:0]HBURST[2:0]HREADY与HREADYOUTHRESP AHB基本传输1.没有等待状态的单个传输2.有…

【读书笔记】AMBA 2 AHB、AMBA 3 AHB(AHB_Lite)和AMBA 5 AHB协议比较

1、牛客算是一个Verilog宝藏刷题网站了&#xff0c;网站提供在线仿真环境&#xff0c;不用自己找题&#xff08;点击直达&#xff09;&#xff0c;<刷题记录>专栏&#xff0c;持续打卡中… 2、官方手册&#xff1a;AMBA系列官方协议规范文档&#xff0c;点击下载 更详细的…

Ahb2ApbBridge

一、设计前需注意 &#xff08;1&#xff09;要做总线&#xff0c;协议是关键&#xff0c;每个控制信号与输入输出的时序一定要搞清楚&#xff0c;直接看amba官方spec&#xff0c;链接已贴出http://pan.baidu.com/s/1gfwxTWB。 &#xff08;2&#xff09;Ahb2Apb桥作为逻辑连接…

AHB总线协议

文章目录 1.说明2.简介3. SOC中的AHB4.完整的AHB架构5.AHB接口信号列表6.htrans[1:0]/hsize[2:0]/hburst[2:0]/hresp[1:0]信号解读1.htrans[1:0]2.hsize[2:0]3.hburst[2:0]4. hresp[1:0] 7.基本传输1. 没有等待的读写操作2.有等待的传输3. 多个流水传输3.WRAP4的传输 8. hready…

AMBA AHB介绍

AMBA AHB介绍 AHB是为提出高性能可综合设计的要求而产生的新一代AMBA总线。它是一种支持多总线主机和提供高带宽操作的高性能总线。 AMBA AHB实现了高性能&#xff0c;高时钟频率系统的以下特征要求&#xff1a; 突发传输分块处理单周期总线主机移交非三态执行更宽的数据总线…

qspi AHB总线学习 - 01

经过几天的学习发现如果不了解AHB总线有些知识get不到&#xff0c;下面是转 qixin_william的博客 http://blog.163.com/qixin_william/blog/static/240217035201491133626819/ 一、AHB的基本介绍 AHB是ARM退出的AMBA总线系列中的其中一种&#xff0c;它是一种高性能的pipe系统总…

AMBA5 AHB协议规范(AHB5,AHB-Lite)中文版-第五章 从机响应信号

第五章 从机响应信号 介绍从机响应信号。它包括以下部分: – 从机传输响应on page 5-56. 5.1 Slave transfer responses 在主机开始传输后&#xff0c;控制传输的进展。在传输开始后&#xff0c;主机不能取消传输。 对于支持AHB5 Exclusive_Transfers属性的组件&#xff0c;…

AHB总线学习汇总

博客不是写书&#xff0c;基本的背景也不做什么介绍了&#xff0c;了解的人是不会介意这些东西的。 一、AHB的基本介绍 AHB是ARM退出的AMBA总线系列中的其中一种&#xff0c;它是一种高性能的pipe系统总线。 1. AHB总线有一下特性&#xff1a; a.Burst 传输 b.Split 事务处理…

AHB协议相关

AHB协议相关 Created: November 9, 2021 7:19 PM Tags: AMBA &#x1f340;简介 AHB(Advanced High Performance Bus)总线规范是AMBA(Advanced Microcontroller Bus Architecture) V2.0总线规范的一部分&#xff0c;AMBA总线规范是ARM公司提出的总线规范&#xff0c;被大多数…

AHB协议

文章目录 什么是AHB总线协议AHB总线组成AHB信号描述AHB传输Bust传输 AMBA高级处理器总线架构&#xff0c;不同的速率要求构成了高性能SOC设计的通信标准: AHB高级高性能总线APB高级外围总线AXI高级可拓展接口 什么是AHB总线协议 AHB&#xff1a;主要是针对高速率、高频宽及快…

AHB 协议学习

文章目录 AHB 协议学习一、 AHB 协议 信号二、 AHB 协议 传输2.1 a read transfer with two wait states2.2 a write transfer with one wait states2.3 transfer with HTRANS&#xff08;控制信号&#xff09;**2.4 transfer &#xff1a;Eight-beat incrementing burst, INCR…

AMBA5 AHB协议规范(AHB5,AHB-Lite)中文版-第三章 传输

第三章 Transfers 本章描述读写传输。它包括以下部分: – 基本传输 on page 3-28. – 传输类型 on page 3-30. – 锁定传输 on page 3-32. – 传输大小 on page 3-33. – 突发操作 on page 3-34. – 等待传输 on page 3-39. – 保护控制 on page 3-44. – 内存类型 on page 3-…

AMBA 系列之 AHB 协议

目录 1. 简介 1.1 AHB总线的架构 1.2 AHB基本特性 2. AHB总线的组成 3. 信号描述 3.1 AHB Slave 接口 3.2 AHB Master 接口 3.3 AHB Arbiter 接口 3.4 AHB Decoder 接口 4. 总线操作 5. 基本传输 5.1 没有等待状态的单次传输&#xff08;Single Transfer&#xff0…

AHB总线

大部分的总结在csdn里面都有。这里只是总结自己理解的。 AHB基本特性有&#xff1a; Burst传输&#xff08;一共有Hburst[2 : 0]的类型&#xff09;&#xff0c;single&#xff0c;incr&#xff0c;wrap4&#xff0c;incr4&#xff0c;wrap8&#xff0c;incr8&#xff0c;wra…

AMBA5 AHB协议规范(AHB5,AHB-Lite)中文版-第一章 引言

ARM AMBA 5 AHB 协议规范 AHB5, AHB-Lite 发行信息 变更历史 日期版本保密性更改2006/6/26A非保密First release for v1.02015/6/25B.a保密Update for AMBA 5 AHB Protocol Specification2015/10/30B.b非保密Confidential to Non-Confidential Release Contents ARM AMBA 5 A…

AHB协议详解

AHB总线 AHB总线在AMBA2中就已经定义&#xff0c;AHB总线一开始主要是作为系统高速总线使用&#xff0c;适用于高性能&#xff0c;低功耗的系统设计。目前因为AXI总线作为高速总线的优势更加明显&#xff0c;AHB会用在相对低速的系统设计中。基本排序就是APB适用于低速设计&am…

AHB学习笔记

1.AHB概述 AHB总线是一种专为高性能同步传输设计的总线&#xff0c;层次高于APB总线&#xff0c;支持以下特性&#xff1a; 突发传输拆分事务主设备单时钟周期传输单时钟沿操作非三态实现宽数据总线配置&#xff08;64/128bit&#xff09; 1.1.典型AHB系统 典型的AHB系统包括以…