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 ...
随机推荐
- 使用代码生成工具快速开发应用-结合后端Web API提供接口和前端页面快速生成,实现通用的业务编码规则管理
在前面随笔<在Winform应用中增加通用的业务编码规则生成>,我介绍了基于Winform和WPF的一个通用的业务编码规则的管理功能,本篇随笔介绍基于后端Web API接口,实现快速的Vu ...
- Javascript Ajax总结——GET请求和POST请求
1.GET请求GET最常用于向服务器查询信息.可在URL末尾添加查询字符串参数.XHR中,传入open()方法的URL末尾的查询字符串必须经过正确的编码,使用encodeURIComponent()编 ...
- 初识BigDecimal
BigDecimal所创建的是对象,我们不能使用传统的+.-.*./等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法. 方法中的参数也必须是BigDecimal的对象. BigDecim ...
- iMessage群发,iMessage群发功能,iMessage群发功能设计,iMessage群发系统
在数字通讯时代,群发消息已经成为我们日常生活中不可或缺的一部分,无论是商务.社交还是日常沟通,群发功能都大大提高了消息传递的效率和便利性. 而在众多的通讯软件中,iMessage无疑是其中的佼佼者,今 ...
- 【难受】SpirngCloud-Alibaba-nacos跨服务器访问接口的问题
原想法:我首先准备了 一个网关 2个服务 分别将两个服务部署到不同的远程服务器当中 实现跨服务器访问接口 网关为本地调用--这里就不一一介绍了 问题 利用gateway做路由时出现服务不可用的情况,看 ...
- 微软成为PostgreSQL主要贡献者
微软成为PostgreSQL主要贡献者 微软对PostgreSQL贡献的很多新功能都来自于客户在使用微软Azure上的PostgreSQL管理实例数据库,所以这些新功能都来自于真实的客户需求 微软对P ...
- 聊一聊如何结合Microsoft.Extensions.DependenyInjection和Castle.Core
.net下 aop的实现AspectCore+Microsoft.Extensions.DependenyInjection.Autofac+Castle .DoraInterception+Micr ...
- 【华为云技术分享】40%性能提升,华为云推出PostgreSQL 12 商用版
摘要:日前,华为云数据库正式推出了RDS for PostgreSQL 12版本,并开始商用.本文将从华为云RDS for PostgreSQL 12的4大特性和架构图等多方面来解读华为云Postgr ...
- 非暴力拆解:小熊派NB-IoT通信扩展板
摘要:相信大家对小熊派的NB-IoT通信扩展板已经非常了解了,但你有真正的了解过其内部构造吗?今天小编不聊技术,带你做一回拆·机·客! 相信大家对小熊派的NB-IoT通信扩展板已经非常了解了,但你有真 ...
- Java程序员都要懂得知识点:原始数据类型
摘要:Java原始数据类型有short.byte.int.long.boolean.char.float.double.原始数据是未处理的或简化的数据,它构成了物理存在的数据,原始数据具有多种存在形式 ...