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的更多相关文章

  1. 《Software Design中文版01》

    <Software Design中文版01> 基本信息 作者: (日)技术评论社 译者: 苏祎 出版社:人民邮电出版社 ISBN:9787115347053 上架时间:2014-3-18 ...

  2. Design Patterns | 01 为什么要尽早掌握设计模式

    标题:Design Patterns | 01 为什么要尽早掌握设计模式 链接: 标签:设计模式 摘要:设计模式是前人经验的总结,教大家如何写出可扩展.可读.可维护的高质量代码.设计模式与日常工作中的 ...

  3. [Arch] 01. Before Design Patterns - UML

    From: 史上最全设计模式导学目录 设计模式,这是软件设计过程中的一个环节. 在这个环节之上,需要overview的事业,就是UML,一种通用的建模语言. Ref: 软件设计之UML—UML的构成[ ...

  4. [Design Patterns] 01. Creational Patterns - Abstract Factory

    设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结,使用设计模式的目的是提高代码的可重用性,让代码更容易被他人理解,并保证代码可靠性.它是代码编制真正实现工程化. 四个关键元素 ...

  5. malware analysis、Sandbox Principles、Design && Implementation

    catalog . 引言 . sandbox introduction . Sandboxie . seccomp(short for secure computing mode): API级沙箱 . ...

  6. [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. 软件模 ...

  7. API Design

    REST API Design Guidelines V 1.0.201208 Draft 5 Last Updated: 08/31/2012 1       简介 本文档旨在规范REST API的 ...

  8. 【转】【翻】Android Design Support Library 的 代码实验——几行代码,让你的 APP 变得花俏

    转自:http://mrfufufu.github.io/android/2015/07/01/Codelab_Android_Design_Support_Library.html [翻]Andro ...

  9. scan design flow(二)

    在scan stitch之后,scan synthesis就已经完成, Scan extraction主要用来从scan design中extracing所有的instance,来保证scan cha ...

  10. 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 ...

随机推荐

  1. django自带的cache缓存框架使用

    https://docs.djangoproject.com/zh-hans/4.2/topics/cache/#top 主要步骤官网也写得很清楚了,包含怎么区使用. 这里就展示一些配置django- ...

  2. C++ Qt开发:Charts绘制各类图表详解

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TreeWid ...

  3. 关于eclipse中找不到recyclerview的问题

    在eclipse中直接引入v7包之后,还是找不到recyclerview的问题,我们可以通过 sdk\extras\android\support\v7\recyclerview\libs这个目录找到 ...

  4. MyBatisPlus配置类-配置分页插件,注册为bean对象

    import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import org.mybatis.spring.a ...

  5. Git和Github库详细使用教程

    SVN 是集中式或者有中心式版本控制系统,版本库是集中放在中央服务器的; Git 是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为 ...

  6. MinIO客户端之du

    MinIO提供了一个命令行程序mc用于协助用户完成日常的维护.管理类工作. 官方资料 mc du 用于输出桶内对象的数量和占用的空间. 命令如下: ./mc du local1/bkt1 控制台的输出 ...

  7. IIS通过ARR实现负载均衡

    一.实现整体方式介绍 项目中部署在windows服务器上的项目,需要部署负载均衡,本来想用nginx来配置的,奈何iis上有几个项目,把80端口和443端口占用了,nginx就用不了了(因为通过域名访 ...

  8. shell的变量

    变量含义 学生时代所学的数学方程式,如x=1,y=2,那会称之为x,y是未知数 对于计算机角度,x=1,y=2等于定义了两个变量,名字分别是x,y,且赋值了1和2 变量是暂时存储数据的地方,变量临时存 ...

  9. JVM优化:如何进行JVM调优,JVM调优参数有哪些

    Java虚拟机(JVM)是Java应用运行的核心环境.JVM的性能优化对于提高应用性能.减少资源消耗和提升系统稳定性至关重要.本文将深入探讨JVM的调优方法和相关参数,以帮助开发者和系统管理员有效地优 ...

  10. GDAL使用PROJ坐标转换相关问题的总结

    目录 1. 概述 2. 详论 2.1. 数据 2.2. PROJ库 2.3. 参考 1. 概述 GDAL是使用PROJ进行坐标转换的,但是很容易出现转换不了的问题,这里总结一二,以供参考. 2. 详论 ...