AHB-SRAMC Design

SRAMC(另外一种代码风格)解析

SRAM集成,顶层模块尽量不要写交互逻辑


module ahb_slave_if(
input hclk,
input hrestn, input hwrite,
input hsel,
input hready, input [2:0] hsize,
input [1:0] htrans,
input [2:0] hburst,
input [31:0] haddr
input [31:0] hwdata, 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,
output [3:0] bank0_csn,
output [3:0] bank1_csn, output [31:0] sram_wdata,
output [12:0] sram_addr_out
); // 定义一些内部信号
wire [1:0] haddr_sel; wire [1:0] hsize_sel; wire bank_sel; // bank选择信号,拉高选择bank0,拉低选择bank1 wire sram_csn_en; // sram选择信号 wire sram_read;
wire sram_write; // sram读写信号 wire [15:0] sram_addr;
wire [31:0] sram_data_out; parameter IDLE = 2'b00,
BUSY = 2'b01,
NONSEQ = 2'b10,
SEQ = 2'b11; assign hready_resp = 1'b1;
assign hresp = 2'b00; // 从sram中读取的数据
hrdata = sram_data_out; // 根据bank_sel进行选择bank中的mem读取,bank_sel == 1 选择bank0,bank_sel == 0选择bank1
assign sram_data_out = bank_sel ? {sram_q7,sram_q6,sram_q5,sram_q4}:
{sram_q3,sram_q2,sram_q1,sram_q0}; assign sram_write = hwrite && ((htrans_r == NONSEQ) || (htrans_r == SEQ));
assign sram_read = (!hwrite) && ((htrans_r == NONSEQ) || (htrans_r == SEQ)); // 产生写信号,低有效
assign sram_w_en = !sram_write; assign sram_addr = haddr[15:0];
assign sram_addr_out = sram_addr[14:2]; // 写或读的时候进行片选
assign sram_csn_en = (sram_write || sram_read);
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; assign haddr_sel = sram_addr[1:0];
assign hsize_sel = hszie_r[1:0]; assign sram_wdata = hwdata; always @(hsize_sel or haddr_sel)
begin
if(hsize_sel == 2‘b10)
sram_csn = 4’b0;
else if(haddr_sel == 2'b01)
begin
if(!haddr_sel[1] = 1'b0)
sram_csn = 4'b1100;
else
sram_csn = 4'b0011;
end
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总线控制信号进行打拍处理
always@(posedge hclk or negedge hrestn)
begin
if(!hrestn) begin
hwrite_r <= 1'b0;
hsize_r <= 3'b0;
hburst_r <= 3'b0;
htrans_r <= 2'b0;
haddr_r <= 32'b0;
end
else if(hsel && hready) begin
hwrite_r <= hwrite;
hsize_r <= hsize;
hburst_r <= hburst;
htrans_r <= htrans;
haddr_r <= haddr;
end
else
begin
hwrite_r <= 1'b0;
hsize_r <= 3'b0;
hburst_r <= 3'b0;
htrans_r <= 2'b0;
haddr_r <= 32'b0; end
end endmodule

1.将ahb总线地址和控制信号进行打拍

always@(posedge hclk or negedge hrestn)
begin
if(!hrestn) begin
hwrite_r <= 1'b0;
hsize_r <= 3'b0;
hburst_r <= 3'b0;
htrans_r <= 2'b0;
haddr_r <= 32'b0;
end
// 被选择之后并且hready了,进行信号打拍
else if(hsel && hready) begin
hwrite_r <= hwrite;
hsize_r <= hsize;
hburst_r <= hburst;
htrans_r <= htrans;
haddr_r <= haddr;
end
else
begin
hwrite_r <= 1'b0;
hsize_r <= 3'b0;
hburst_r <= 3'b0;
htrans_r <= 2'b0;
haddr_r <= 32'b0; end
end

2.定义parameter(htrans状态和hsize)

parameter	IDLE = 2'b00,
BUSY = 2'b01,
NONSEQ = 2'b10,
SEQ = 2'b11; // 还可以定义hsize的状态

3.hready_resp拉高并且hresp是okay状态

assign hready_resp = 1'b1;
assign hresp = 2'b00;

4.产生读写使能信号,明确什么时候读数据,什么时候写数据?

根据打拍之后的htrans和hwrite进行组合得到读写信号,由于sram_w_en是低有效的,所以在根据ahb信号产生读写信号之后,将写信号进行取反就可以得到sram_w_en = !sram_write = !hwrite_r,直接使用hwrite_r信号取反也可以表示写使能

注意:为了表示读写信号,定义了sram_write和sram_read两个内部信号

5.产生片选信号(分为sram中的mem选择信号和bank选择信号)

(1)产生片选使能--表示什么时候进行片选

sram_csn -- 表示选择哪几个mem

sram_csn_en --表示什么时候进行片选,在进行读写的时候进行片选--这也是一个中间信号

// 下面两种都是可以的
assign sram_csn_en = sram_write || sram_read;
assign sram_csn_en = (htrans_r == NONSEQ || htrans_r == SEQ);

(2)处理地址信号

  • 根据haddr [31:0]的低16位作为sram_addr
  • sram_addr的最高位表示选择bank
  • sram_addr的低低两位表示选择的mem
  • sram_addr中间的十三位表示读取的写入的地址
assign sram_addr = haddr[15:0];
assign sram_addr_out = sram_addr[14:2];
assign haddr_sel = sram_addr[1:0];

(3)hsize_sel

定义hsize的大小,使用打拍之后的信号低两位

assign hsize_sel = hsize_r[1:0];

(4)产生片选信号

// sram_csn --选择mem的信号

always @(hsize_sel or haddr_sel)
begin
// hsize--word的时候,四个mem全部选中
if(hsize_sel == 2‘b10)
sram_csn = 4’b0;
// hsize--halfword的时候,判断地址的第二位是0,选择低两个,是1选择高两个mem
else if(haddr_sel == 2'b01)
begin
if(!haddr_sel[1] = 1'b0)
sram_csn = 4'b1100;
else
sram_csn = 4'b0011;
end
// hsize--byte的时候,情况是任意的四个mem都可能被选到,四种情况
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 //选择bank的信号--在片选使能的作用下,根据sram_addr最高位选择mem
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;

6.sram的写数据就是hwdata

assign sram_wdata = hwdata;

7.sram_data_out根据选择的bank输出其中mem中的数据

选择bank的标志可以使用sram_addr的最高位还可以设置一个内部信号bank_sel

assign bank_sel = (sram_csn_en && (sram_addr[15]) == 1'b0) ? 1‘b1:1’b0;
// 根据bank_sel进行选择bank中的mem读取,bank_sel == 1 选择bank0,bank_sel == 0选择bank1
assign sram_data_out = bank_sel ? {sram_q7,sram_q6,sram_q5,sram_q4}:
{sram_q3,sram_q2,sram_q1,sram_q0}; assign sram_data_out = sram_addr[15] ? {sram_q7,sram_q6,sram_q5,sram_q4}:
{sram_q3,sram_q2,sram_q1,sram_q0};

SRAM_CORE(了解)

将8个mem进行集成,主要是将slave_if输入的信号广播到端口上

AHB-SRAMC Design-02的更多相关文章

  1. [React] 02 - Intro: why react and its design pattern

    为啥使用React,给我个理由 过去 需要手动更新DOM.费力地记录每一个状态:既不具备扩展性,又很难加入新的功能,就算可以,也是有着冒着很大的风险. 不过,使用这种开发方式很难打造出极佳的用户体验. ...

  2. Design Patterns | 02 什么样的代码是好代码

    目录 01 - 什么是好的代码? 02 - 评价代码的标准有哪些 2.1 可维护性(maintainability) 2.2 可读性(readability) 2.3 可扩展性(extensibili ...

  3. [Arch] 02. Design principle and Software Pattern

    Ref: 软件设计的七大原则 有时间的话,还需进一步深入理解. Figure, 重要的前五个原则 单一职责原则 (Simple responsibility pinciple SRP) 类的设计趋向于 ...

  4. [Design Patterns] 02. Structural Patterns - Facade Pattern

    前言 参考资源 史上最全设计模式导学目录(完整版) 只把常用的五星的掌握即可. 外观模式-Facade Pattern[学习难度:★☆☆☆☆,使用频率:★★★★★] 深入浅出外观模式(一):外观模式概 ...

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

  8. Tutorial: Triplet Loss Layer Design for CNN

    Tutorial:  Triplet Loss Layer Design for CNN Xiao Wang  2016.05.02 Triplet Loss Layer could be a tri ...

  9. facebook design question 总结

    http://blog.csdn.net/sigh1988/article/details/9790337 这里原帖地址: http://www.mitbbs.com/article_t/JobHun ...

  10. RESTful API Design With NodeJS & Restify

    http://code.tutsplus.com/tutorials/restful-api-design-with-nodejs-restify--cms-22637 The RESTful API ...

随机推荐

  1. bash shell笔记整理——tail命令

    作用 Print the last 10 lines of each FILE to standard output. With more than one FILE, precede each wi ...

  2. libgdx摄像头的移动

    要知道,做一个游戏,摄像头是必不可少的.接下来,我将讲解libgdx里面摄像头的移动 2d摄像头OrthographicCamera也叫做正交相机 结果展示: 按上下左右是可以移动的 Orthogra ...

  3. 袋鼠云数栈前端从 Multirepo 到 Monorepo 研发效率提升探索之路

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:星野 困境频生前端代码管理何解? 前端代码管理一直是困扰着 ...

  4. 云MSP服务案例|互联网商城的上云改造之旅

    简介: 在中国,经过十年的发展,云计算产业已走过概念普及的1.0时期,进入"上云"和落地的2. 0阶段,企业上云意识不断增强,越来越多的企业选择部署多云和混合IT. 如今,云计算生 ...

  5. electron入门之试调工具remote(三)

    electron入门到入土,从渲染线程中创建新窗口.2022-03-21入门版本17.1.2 electron重要概念,只有一个主线程,其他都是渲染进程或者叫子线程,他们不能直接相互操作,可以通过ip ...

  6. BFS(三)单词接龙 ⅱ

    对应 126. 单词接龙 II 问题描述 按字典 wordList 完成从单词 beginWord 到单词 endWord 转化,一个表示此过程的 转换序列 是形式上像 beginWord -> ...

  7. Java使用OSS实现上传文件

    阿里云OSS使用 1.准备OSS 访问阿里云官网,注册并登录账户(支付宝方便一些,顺便冲点钱) 在产品分类中,找到阿里云oss 然后创建一个bucket 2.使用OSS(上传文件) 2.1在阿里云网站 ...

  8. 通过鼠标拖拉获取图片原像素的两个点坐标vue

    <template> <div> <img class="no-drag" ref="image" src="https ...

  9. .Net 系列:Attribute特性的高级使用及自定义验证实现

    一.特性是什么?特性有什么用? 特性(Attribute)是用于在运行时传递程序中各种元素(比如类.方法.结构.枚举.组件等)的行为信息的声明性标签. 您可以通过使用特性向程序添加声明性信息.一个声明 ...

  10. Nginx unexpected end of file 配置证书遇到问题,如何解决?

    原文链接 https://bysocket.com/nginx-unexpected-end-of-file-expecting-in-key-file/ 一.Nginx unexpected end ...