AHB-SRAMC Design-01
AHB-SRAMC Design
1.AHB-SoC芯片架构图
- CPU赋予了SoC的可编程性
- SRAM可以存储数据和代码
2.AHB-SRAMC Features
- 总线版本号
- 在进行设计的时候可以将地址位宽进行参数化设计
3. AHB-SMRC Specication
4. AHB-SRAMC Architecture
5. AHB Operation Timing:Basic Transfer
6. AHB Transfer Types
- BUSY是在burst传输期间,还没有准备好下一笔请求使用BUSY;IDLE是被授予了权限但是还没有发起burst传输
7.AHB Burst Transaction
8.AHB Transaction Reponse
9.AHB Slave Interface
- split是可选的
10.SRAM Specification
11.SRAM Timing
12.SRAM logic table
- CEN 拉高,OEN拉低 -- standby模式,输出上一笔输出,这种模式下功耗较低
13.SRAM power
14.SRAMC Architecture
15.hclk vs sram_clk
16.RTL Coding
16.1 ahb_slave_if module
//由微架构设计文档转换为RTL代码
//AHB_Slave_Interface
module ahb_slave_if(
// input
input hclk,
input hresetn,
// Signals from AHB bus used during nomal operation
input sel,
input hwrite,
input hready,
input [2:0] hsize,
input [2:0] hburst,
input [1:0] htrans,
input [31:0] hwdata,
input [31:0] haddr,
// Signals from sram core data output(read srams)
input [7:0] sram_q0,
input [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
// Signals to AHB bus used during nomal operation
output hready_resp,
output [1:0] hresp,
output [31:0] hrdata,
// Sram read or write enable signals
// When sram_w_en is low,It means write sram,and high it means read sram
output sram_w_en, // 写使能
// choose the right srams when bank is confirmed
output [3:0] bank0_csn, // 写片选
output [3:0] bank1_csn,
//Signals to sram core in nomal operation,it contains sram
//address and data writing into sram
output [12:0] sram_addr_out, // 地址
output [31:0] sram_wdata, // 数据
);
// htrans的状态
parameter IDLE = 2'b00,
BUSY = 2'b01,
NONSEQ = 2'b10,
SEQ = 2'b11;
// hsize
parameter HALF_WORD = 2'b00,
WORD = 2'b01,
BYTE = 2'b10,
// 控制信号delay,将ahb的address信号打一拍
reg hwrite_r;
reg [2:0] hsize_r;
reg [2:0] hburst_r;
reg [1:0] htrans_r;
reg [31:0] haddr_r;
// 定义标志打拍的信号
wire delay_en;
// 有效的data phase的时候将ahb信号delay
assign delay_en = hsel && (htrans == NONSEQ || htrans == SEQ) && hready;
// 1. 将地址和控制信号进行打一拍
// hrestn为低的时候进行复位
// 当hsel && hready && htrans ==
always @(posedge hclk or negedge hresetn) begin
if(!hresetn) begin
hwrite_r <= 'b0;
hsize_r <= 'b0;
hburst_r <= 'b0;
htrans_r <= 'b0;
haddr_r <= 'b0;
end
else if(delay_en) begin
hwrite_r <= hwrite;
hsize_r <= hsize;
hburst_r <= hburst;
htrans_r <= htrans;
haddr_r <= haddr;
end
end
// 2.产生控制信号,根据输出信号进行产生
assign hready_resp = 1'b1; // 永远有效
assign hresp = 2'b0; // ok状态
// sram_w_en 是1bit信号,广播到8个mem中的,所以直接用hwrite取反就可以
// 因为低电平有效所以直接取反
assign sram_w_en = !hwrite_r;
// 先不管bank0和bank1,就假设已经选择了一个bank,哪些bank中的mem被选中
// sram_csn -- sram片选,不管哪个bank被选中,看其中到底选中哪个mem
// 根据hsize和haddr[1:0]进行确定的
reg [3:0] sram_csn;
always @(*) begin
if(hsize_r == BYTE) begin
case(haddr[1:0])
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'b0111;
endcase
end
else if(hsize == HALF_WORD) begin
sram_csn = haddr_r[1] ? 4'b0011 : 4'b1100;
end
else if(hsize == WORD) begin
sram_csn = 4'b0000;
end
else begin
sram_csn = 4'b1111;
end
end
// delay_en信号为高的时候,当前有一个有效的请求,一定是对当前sram进行读写操作
// 所以通过delay信号可以产生bank选择信号
// delay_en信号拉高之后的下一个周期就会发起请求,所以将delay信号打一拍
reg delay_en_r;
always @(posedge hclk or negedge hresetn) begin
if(!hresetn) begin
delay_en_r <= 'b0;
else
delay_en_r <= delay_en;
end
// delay_en_r为高并且最高位为0,选择bank0,最高位为1,选择bank1
// 当前是读写操作并且最高位为0,选择bank0
assign bank0_csn = (delay_en_r && !haddr[15]) ? sram_csn :4'b1111;
// 当前是读写操作并且最高位为0,选择bank1
assign bank1_csn = (delay_en_r && haddr[15]) ? sram_csn : 4'b1111;
// haddr_r为32bit,其中有16bit有用,取其中16bit中的中间13bit表示地址
assign sram_addr_out = haddr_r[14:2];
assign sram_wdata = hwdata;
// 读数据根据当前选择的bank0还是bank1,将其中的四个sram输出的数据进行拼接得到32bit的hrdata
assign hrdata = haddr[15] ? {sram_q7,sram_q6,sram_q5,sram_q4};
assign hrdata = haddr[15] ? {sram_q3,sram_q2,sram_q1,sram_q0};
endmodule
module ahb_sram_if (
input clk,
input hrestn,
input [31:0] hwdata,
inpu hsel,
input [2:0] hsize,
input [1:0] htrans,
input [2:0] hburst,
input [15:0] haddr,
input hwrite,
input hready,
input [7:0] sram_q0,
input [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 hready_resp,
output [1:0] hresp,
output [31:0] hrdata,
// 产生读写使能
output sram_w_en,
// 输出读地址,根据bank
output sram_addr_out,
// 产生bank的片选
output [3:0] bank0_csn,
output [3:0] bank1_csn,
output wdata
);
// 定义htrans的状态
parameter IDLE = 2'b00,
BUSY = 2'b01,
NONSEQ = 2'b10,
SEQ = 2'b11;
// 定义hsize的大小
parameter HALF_WORD = 2'b00,
WORD = 2'b01,
BYTE = 2'b10,
// 控制信号delay
reg hwrite_r;
reg [2:0] hsize_r;
reg [2:0] hburst_r;
reg [1:0] htrans_r;
reg [31:0] haddr_r;
// 处理ahb时序,将ahb时序打拍
// 定义一个标志什么时候延迟打拍的信号delay_en
// 这是一个模块内部的连线
wire delay_en;
assign delay_en = hsel && hready && (htrans == NONSQE || htrans == SQE);
always @(posedge hclk or negedge hrestn) begin
if(!hrestn) begin
hwrite_r <= 'b0;
hsize_r <= 'b0;
hburst_r <= 'b0;
htrans_r <= 'b0;
haddr_r <= 'b0;
end
else if(delay_en) begin
hwrite_r <= hwrite;
hsize_r <= hsize;
hburst_r <= hburst;
htrans_r <= htrans;
haddr_r <= haddr;
end
end
// 单周期读写,hreay_out没有延迟,所以将hready_resp固定为高
// 将hresp选择okay
assign hready_resp = 1'b1; // 永远有效
assign hresp = 2'b0; // ok状态
// 上面处理完ahb时序之后,将产生sram控制信号
// 1.产生读写使能 -- 将ahb的读写信号反相
assign sram_w_en = !hwrite_r;
// 2.产生片选信号
// 首先定义一个sram_csn信号表示选择哪几个mem(不管选择哪个bank)
// 选择哪个mem是由hsize和地址的低两位进行确定的
reg [3:0] sram_csn;
always @(*) begin
if(hsize_r == BYTE) begin
case(haddr[1:0])
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'b0111;
endcase
end
else if(hsize == HALF_WORD) begin
sram_csn = haddr_r[1] ? 4'b0011 : 4'b1100;
end
else if(hsize == WORD) begin
sram_csn = 4'b0000;
end
else begin
sram_csn = 4'b1111;
end
end
// 上面处理完选择mem的信号之后,产生选择bank的信号
// 选择bank要根据地址,所以时序与delay信号一致
// 因为delay信号的下一个周期一定会发起读写请求,所以将delay_en打一拍
// 产生bank的选择信号
// delay信号为高的时候,一定是对当前sram进行读写操作
// 所以通过delay信号可以产生bank选择信号
// delay信号拉高之后的下一个周期就会发起请求,所以将delay信号打一拍
reg delay_en_r;
always @(posedge hclk or negedge hresetn) begin
if(!hresetn) begin
delay_en_r <= 'b0;
else
delay_en_r <= delay_en;
end
// delay_en_r为高并且最高位为0,选择bank0,最高位为1,选择bank1
assign bank0_csn = (delay_en_r && !haddr[15]) ? sram_csn : 4'b1111;
assign bank1_csn = (delay_en_r && haddr[15]) ? sram_csn : 4'b1111;
// 输出结果信号
// 由ahb的地址中间的十三位得到sram中mem的地址
assign sram_addr_out = haddr_r[14:2];
// 由ahb总线上的数据得到写入sram中的数据
assign sram_wdata = hwdata;
// 输出的读数据根据选择的bank进行输出,地址最高位就是bank选择的信号
assign hrdata = haddr[15] ? {sram_q7,sram_q6,sram_q5,sram_q4};
assign hrdata = haddr[15] ? {sram_q3,sram_q2,sram_q1,sram_q0};
endmodule
16.2 sramc_top
- 顶层不写交互逻辑
module sramc_top (
// input signals
hclk,
sram_clk,
hresetn,
hsel,
hwrite,
hready,
hsize,
htrans,
hburst,
hwdata,
haddr,
dft_en,
bist_en,
// output signals
hready_resp,
hresp,
hrdata,
bist_done,
bist_fail
);
// list of AHB signals
// signals used during normal operation
input hclk;
input sram_clk;
input hresetn;
// Signals from AMBA bus used during normal operation
input sel;
input hwrite;
input hready;
input [2:0] hsize;
input [2:0] hburst;
input [1:0] htrans;
input [31:0] hwdata;
input [31:0] haddr;
// Signals to AMBA bus used during normal operation
output hready_resp;
output [1:0] hresp;
output [31:0] hrdata;
// Signals for BIST and DFT test mode
// When signal "dft_en" or "bist_en" is high,sram
// controller enters into test mode.
input dft_en;
input bist_en;
//When "bist_done" is high,it shows BIST test is over
output bist_done;
//"bist_fail" shows the results of each sram functions.
//There are 8 srams in the controller.
output [7:0] bist_fail;
//Select one of the two sram blocks according to the value of sram_csn
wire [3:0] bank0_csn;
wire [3:0] bank1_csn;
//Sram read or write signals:When it is high ,read sram ;low write sram
wire sram_w_en;
//Each of 8 srams is 8k*8,the depth is 2^13,so the sram's address width is 13 bits
wire [12:0] sram_addr;
//AHB bus data write into srams
wire [31:0] sram_wdata;
//sram data output data which selected and read by AHB bus
wire [7:0] sram_q0;
wire [7:0] sram_q1;
wire [7:0] sram_q2;
wire [7:0] sram_q3;
wire [7:0] sram_q4;
wire [7:0] sram_q5;
wire [7:0] sram_q6;
wire [7:0] sram_q7;
//instance the two modules:
//ahb_slave_if.v and sram_core.value
ahb_slave_if U_ahb_slave_if (
// AHB input signals into sram controller
.hclk (hclk),
.hresetn (hresetn),
.sel (hsel),
.write (hwrite),
.hready (hready),
.hsize (hsize),
.htrans (htrans),
.hburst (hburst),
.hwdata (hwdata),
.haddr (haddr),
//8 sram blocks data output into ahb slave
// interface
.sram_q0 (sram_q0),
.sram_q1 (sram_q1),
.sram_q2 (sram_q2),
.sram_q3 (sram_q3),
.sram_q4 (sram_q4),
.sram_q5 (sram_q5),
.sram_q6 (sram_q6),
.sram_q7 (sram_q7),
.sram_q8 (sram_q8),
//AHB slave(sram controller) output signals
.hready_resp (hready_resp),
.hresp (hresp),
.hrdata (hrdata),
//sram control signals and sram address
.sram_w_en (sram_w_en),
.sram_addr_out (sram_addr),
// data write into sram
.sram_wdata (sram_wdata),
// choose the correponding sram in a bank,active low
.bank0_csn (bank0_csn),
.bank1_csn (bank1_csn)
);
sram_core U_sram_core(
// AHB bus signals
.hclk (hclk),
.sram_clk (sram_clk)
.hresetn (hresetn),
//sram control signals from ahb_slave_if.v
.sram_addr (sram_addr),
.sram_wdata_in (sram_wdata),
.sram_wen (sram_w_en),
.bank0_csn (bank0_csn),
.bank1_csn (bank1_csn),
//test mode enable signals
.bist_en (bist_en),
.dft_en (dft_en),
//8 sram data output into AHB bus
.sram_q0 (sram_q0),
.sram_q1 (sram_q1),
.sram_q2 (sram_q2),
.sram_q3 (sram_q3),
.sram_q4 (sram_q4),
.sram_q5 (sram_q5),
.sram_q6 (sram_q6),
.sram_q7 (sram_q7),
.sram_q8 (sram_q8),
//test results output when in test mode
.bist_done (bist_done),
.bist_fail (bist_fail)
);
endmodule
AHB-SRAMC Design-01的更多相关文章
- 《Software Design中文版01》
<Software Design中文版01> 基本信息 作者: (日)技术评论社 译者: 苏祎 出版社:人民邮电出版社 ISBN:9787115347053 上架时间:2014-3-18 ...
- Design Patterns | 01 为什么要尽早掌握设计模式
标题:Design Patterns | 01 为什么要尽早掌握设计模式 链接: 标签:设计模式 摘要:设计模式是前人经验的总结,教大家如何写出可扩展.可读.可维护的高质量代码.设计模式与日常工作中的 ...
- [Arch] 01. Before Design Patterns - UML
From: 史上最全设计模式导学目录 设计模式,这是软件设计过程中的一个环节. 在这个环节之上,需要overview的事业,就是UML,一种通用的建模语言. Ref: 软件设计之UML—UML的构成[ ...
- [Design Patterns] 01. Creational Patterns - Abstract Factory
设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结,使用设计模式的目的是提高代码的可重用性,让代码更容易被他人理解,并保证代码可靠性.它是代码编制真正实现工程化. 四个关键元素 ...
- malware analysis、Sandbox Principles、Design && Implementation
catalog . 引言 . sandbox introduction . Sandboxie . seccomp(short for secure computing mode): API级沙箱 . ...
- [Design Patterns] 3. Software Pattern Overview
When you're on the way which is unknown and dangerous, just follow your mind and steer the boat. 软件模 ...
- API Design
REST API Design Guidelines V 1.0.201208 Draft 5 Last Updated: 08/31/2012 1 简介 本文档旨在规范REST API的 ...
- 【转】【翻】Android Design Support Library 的 代码实验——几行代码,让你的 APP 变得花俏
转自:http://mrfufufu.github.io/android/2015/07/01/Codelab_Android_Design_Support_Library.html [翻]Andro ...
- scan design flow(二)
在scan stitch之后,scan synthesis就已经完成, Scan extraction主要用来从scan design中extracing所有的instance,来保证scan cha ...
- Machine Learning - 第6周(Advice for Applying Machine Learning、Machine Learning System Design)
In Week 6, you will be learning about systematically improving your learning algorithm. The videos f ...
随机推荐
- django自带的cache缓存框架使用
https://docs.djangoproject.com/zh-hans/4.2/topics/cache/#top 主要步骤官网也写得很清楚了,包含怎么区使用. 这里就展示一些配置django- ...
- C++ Qt开发:Charts绘制各类图表详解
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TreeWid ...
- 关于eclipse中找不到recyclerview的问题
在eclipse中直接引入v7包之后,还是找不到recyclerview的问题,我们可以通过 sdk\extras\android\support\v7\recyclerview\libs这个目录找到 ...
- MyBatisPlus配置类-配置分页插件,注册为bean对象
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import org.mybatis.spring.a ...
- Git和Github库详细使用教程
SVN 是集中式或者有中心式版本控制系统,版本库是集中放在中央服务器的; Git 是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为 ...
- MinIO客户端之du
MinIO提供了一个命令行程序mc用于协助用户完成日常的维护.管理类工作. 官方资料 mc du 用于输出桶内对象的数量和占用的空间. 命令如下: ./mc du local1/bkt1 控制台的输出 ...
- IIS通过ARR实现负载均衡
一.实现整体方式介绍 项目中部署在windows服务器上的项目,需要部署负载均衡,本来想用nginx来配置的,奈何iis上有几个项目,把80端口和443端口占用了,nginx就用不了了(因为通过域名访 ...
- shell的变量
变量含义 学生时代所学的数学方程式,如x=1,y=2,那会称之为x,y是未知数 对于计算机角度,x=1,y=2等于定义了两个变量,名字分别是x,y,且赋值了1和2 变量是暂时存储数据的地方,变量临时存 ...
- JVM优化:如何进行JVM调优,JVM调优参数有哪些
Java虚拟机(JVM)是Java应用运行的核心环境.JVM的性能优化对于提高应用性能.减少资源消耗和提升系统稳定性至关重要.本文将深入探讨JVM的调优方法和相关参数,以帮助开发者和系统管理员有效地优 ...
- GDAL使用PROJ坐标转换相关问题的总结
目录 1. 概述 2. 详论 2.1. 数据 2.2. PROJ库 2.3. 参考 1. 概述 GDAL是使用PROJ进行坐标转换的,但是很容易出现转换不了的问题,这里总结一二,以供参考. 2. 详论 ...