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. Oracle数据字典(各种视图、表)

    数据字典是存放整个数据库实例重要信息的一组表,这些数据字典大部分都是SYS用户所有. 数据字典的构成 Oracle数据字典名称由前缀和后缀组成,使用下画线"_"连接.其代表的含义如 ...

  2. 浅谈JSP中forward和redirect

    redirect 重定向,完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接 forward 转向,浏览器中不会显示后面的网址;如果你需要在下一个页面中能从中获取新的信息的话,你可以Reques ...

  3. C#Socket编程详解(一)TCP与UDP简介

    一.TCP与UDP(转载) 1.TCP 1.1 定义 TCP(TransmissionControl Protocol)传输控制协议. 是一种可靠的.面向连接的协议(eg:打电话).传输效率低全双工通 ...

  4. git报错解决,warning: could not find UI helper 'git-credential-manager-ui'

    在克隆远程代码时,可能遇到这样的报错 warning: could not find UI helper 'git-credential-manager-ui' 这样的报错经常会在我们换了一台电脑或者 ...

  5. 一键式调试工具—Reqable 使用指南

    简介 Reqable是一款跨平台的专业HTTP开发和调试工具,在全平台支持HTTP1.HTTP2和HTTP3(QUIC)协议,简单易用.功能强大.性能高效,助力程序开发和测试人员提高生产力!本产品需要 ...

  6. 欢迎 Mixtral - 当前 Hugging Face 上最先进的 MoE 模型

    最近,Mistral 发布了一个激动人心的大语言模型: Mixtral 8x7b,该模型把开放模型的性能带到了一个新高度,并在许多基准测试上表现优于 GPT-3.5.我们很高兴能够在 Hugging ...

  7. puppeteer的简单使用

    引言 对于编写应用程序,尤其是要部署上线投入生产使用的应用,QA是其中重要的一环,在过去的工作经历中,我参与的项目开发,大多是由测试同学主要来把控质量的,我很少编写前端方面的测试代码,对于测试工具的使 ...

  8. SQLite3使用笔记(1)——查询

    目录 1. 概述 2. 详论 2.1. 打开/关闭数据库 2.2. 数据查询 3. 参考 1. 概述 SQLite是一个嵌入式SQL数据库引擎.与大多数其他 SQL 数据库不同,SQLite 没有单独 ...

  9. JavaScript实现:如何写出漂亮的条件表达式

    摘要:就让我们看看以下几种常见的条件表达场景,如何写的漂亮! 本文分享自华为云社区<如何写出漂亮的条件表达式 - JavaScript 实现篇>,原文作者:查尔斯. 条件表达式,是我们在c ...

  10. 想了解Python中的super 函数么

    摘要:经常有朋友问,学 Python 面向对象时,翻阅别人代码,会发现一个 super() 函数,那这个函数的作用到底是什么? 本文分享自华为云社区<Python 中的 super 函数怎么学, ...