一、单口 RAM 设计

module BRAM_PORTA(
input clka,
input ena,
input wea,
input [3:0]  addra,
input [15:0] dina,
output reg [15:0] douta
);reg [15:0] mem [15:0];always @(posedge clka)beginif(ena)beginif(wea)begin//写数据mem[addra] <= dina;douta      <= 16'bzzzzzzzzzzzzzzzz;endelse begin  //读数据douta      <= mem[addra];mem[addra] <= mem[addra];endend elsedouta <= 16'bzzzzzzzzzzzzzzzz;
endendmodule

二、同步 FIFO 设计

`define INDEX 6
`define WIDTH 16
`define DEPTH 64
module Sync_FIFO(
input clk,
input rst_n,
input re,
input we,
input [`WIDTH-1:0] din,
output empty,
output full,
output reg [`INDEX-1:0] fifo_cnt,
output reg [`WIDTH-1:0] dout
);reg [`WIDTH-1:0] mem [`DEPTH-1:0];
reg [`INDEX-1:0] raddr;
reg [`INDEX-1:0] waddr;// 1、空满标志;
assign empty = (fifo_cnt == 0) ? 1:0;
assign full  = (fifo_cnt == `DEPTH-1) ? 1:0;// 2、读写计数;
always @(posedge clk or negedge rst_n)beginif(!rst_n)fifo_cnt <= 0;else beginif((!empty && re)&&(!full && we))// 同时读写,计数不变;fifo_cnt <= fifo_cnt;else if(!empty && re)// 读数据,计数减一;fifo_cnt <= fifo_cnt - 1'b1;else if(!full && we)// 写数据,计数加一;fifo_cnt <= fifo_cnt + 1'b1;elsefifo_cnt <= fifo_cnt;end
end// 3、读写数据;
always @(posedge clk or negedge rst_n)begin// 读数据;if(!rst_n)dout <= 0;else beginif(!empty && re)dout <= mem[raddr];elsedout <= dout;end
end
always @(posedge clk)begin// 写数据;if(!full && we)mem[raddr] <= din;elsemem[raddr] <= mem[waddr];
end// 4、读写地址;
always @(posedge clk or negedge rst_n)begin// 写地址;if(!rst_n)waddr <= 0;else beginif(!full && we)waddr <= waddr + 1'b1;elsewaddr <= waddr;end
end
always @(posedge clk or negedge rst_n)begin// 读地址;if(!rst_n)raddr <= 0;else beginif(!empty && re)raddr <= raddr + 1'b1;elseraddr <= raddr;end
endendmodule

三、异步 FIFO 设计

`define INDEX 6  // FIFO 索引;
`define WIDTH 16 // FIFO 宽度;
`define DEPTH 64 // FIFO 深度;
module Async_FIFO(
input rd_clk,
input wr_clk,
input rst_n,
input re,
input we,
input [`WIDTH-1:0] din,
output empty,
output full,
output [`WIDTH-1:0] dout
);reg  [`WIDTH-1:0] mem [`DEPTH-1:0];
wire [`INDEX-1:0] raddr;
wire [`INDEX-1:0] waddr;
reg  [`INDEX:0] wbin,rbin;
wire [`INDEX:0] wbin_next,rbin_next,wgray_next,rgray_next;
reg  [`INDEX:0] rp,wr1_rp,wr2_rp,wp,rd1_wp,rd2_wp;// 1、空满标志;
// 可能需要延时;
assign empty = (rd2_wp == rgray_next) ? 1:0;
assign full  = ({~wr2_rp[`INDEX:`INDEX-1],wr2_rp[`INDEX-2:0]} == wgray_next) ? 1:0;// 高两位不同,取反;// 2、读计数;
// 产生读地址 raddr + 读地址自增 + 将普通二进制码转化为格雷码,并赋给读指针 rp;
// 将读指针 rp 同步到写时钟域;
always @(posedge rd_clk or negedge rst_n)beginif(!rst_n){rbin,rp} <= 0;else{rbin,rp} <= {rbin_next,rgray_next};
endassign raddr = rbin[`INDEX-1:0];// 抛弃高位;
assign rbin_next = rbin + (!empty && re);// 地址加一;
assign rgray_next = rbin_next ^ (rbin_next >> 1);// 转为格雷码,右移 + 异或;always @(posedge wr_clk or negedge rst_n)beginif(!rst_n){wr2_rp,wr1_rp} <= 0;else{wr2_rp,wr1_rp} <= {wr1_rp,rp};
end// 3、写计数;
// 产生写地址 waddr + 写地址自增 + 将普通二进制码转化为格雷码,并赋给写指针 wp;
// 将写指针 wp 同步到读时钟域;
always @(posedge wr_clk or negedge rst_n)beginif(!rst_n){wbin,wp} <= 0;else{wbin,wp} <= {wbin_next,wgray_next};
endassign waddr = wbin[`INDEX-1:0];// 抛弃高位;
assign wbin_next = wbin + (!full && we);// 地址加一;
assign wgray_next = wbin_next ^ (wbin_next >> 1);// 转为格雷码,右移 + 异或;always @(posedge rd_clk or negedge rst_n)beginif(!rst_n){rd2_wp,rd1_wp} <= 0;else{rd2_wp,rd1_wp} <= {rd1_wp,wp}; // 多比特的,但是只有单比特发生变化,属于单比特处理领域;
end// 4、异步读数据;
assign dout = mem[raddr];// 5、同步写数据;
always @(posedge wr_clk)beginif(!full && we)mem[waddr] <= din;elsemem[waddr] <= mem[waddr];
endendmodule

基于 FPGA 的高级数字电路设计(7)单口 RAM、同步 FIFO、异步 FIFO 设计相关推荐

  1. 基于 FPGA 的高级数字电路设计(5)基于 PE 的脉动阵列设计

            脉动阵列定义:多个相同的处理单元(简称 PE),按一定互联规则组成的网络,称为脉动阵列.脉动阵列可以是一维线形.二维矩形.二维二叉树型.三维长方体形等等.         脉动阵列特点 ...

  2. 基于 Verilog 的经典数字电路设计(12)串并转换器

    基于 Verilog 的经典数字电路设计(12)串并转换器 版权所有,新芯设计,转载文章,请注来源 引言

  3. 基于 Verilog 的经典数字电路设计(4)编码器

    基于 Verilog 的经典数字电路设计(4)编码器 版权所有,新芯设计,转载文章,请注来源 引言

  4. 基于 Verilog 的经典数字电路设计(2)比较器

    基于 Verilog 的经典数字电路设计(2)比较器 版权所有,新芯设计,转载文章,请注来源 引言

  5. 基于FPGA的遥控数字时钟设计

    基于FPGA的遥控数字时钟设计报告 ​ ​ Author:张宏宇 摘要 ​ 数字时钟是一种通过数字显示时间的计时装置,本次项目采用Cyclone Ⅳ系列芯片,使用QuartusII开发环境,使用Ver ...

  6. 基于 Verilog 的经典数字电路设计(13)并串转换器

    基于 Verilog 的经典数字电路设计(13)并串转换器 版权所有,新芯设计,转载文章,请注来源 引言

  7. 基于 FPGA Vivado 的数字钟设计(附源工程)

    今天给大侠带来基于 FPGA Vivado 的数字钟设计,开发板实现使用的是Digilent basys 3,如有想要入手 basys 3 开发板的,可以联系牛总:18511371833.话不多说,上 ...

  8. 源码系列:基于FPGA的PS2通信电路设计(附源码)

    今天给大侠带来基于FPGA的PS2通信电路设计,附源码,获取源码,请在"FPGA技术江湖"公众号内回复"PS2源码",可获取源码文件.话不多说,上货. 设计背景 ...

  9. FIFO、单口RAM、双口RAM的区别

    FPGA设计中,经常需要用存储器来存储数据,目前常用的存储器有FIFO和RAM,其中RAM又分单口RAM与双口RAM,那么它们各自有什么区别呢? 双口RAM:双口RAM 是在一个SRAM 存储器上具有 ...

最新文章

  1. Visual Studio Styles
  2. Leetcode-区域和检索 - 数组不可变(303)
  3. boost::fusion::map_tie用法的测试程序
  4. HDU4367(线段相交与斐波那契数列)
  5. leetcode 75. Sort Colors | 75. 颜色分类(荷兰国旗问题,快速排序)
  6. IDEA/Tomcat 原理:如何将 Tomcat 集成到 IDEA?实现由传统部署延伸到热部署 Java EE 项目?
  7. 华为P30系列机身侧面照曝光 摄像头仍然“凸起”...
  8. oracle 常用索引分析,使用原则和注意事项
  9. 安全模式 提权_WEB安全第八章实战篇01 提权安全狗服务器
  10. 两分钟,帮你搞懂光纤接头
  11. python实现格兰杰因果关系检验
  12. git stage 暂存_Git暂存区之理解Git暂存区(stage)
  13. 人类一败涂地做图教程_人类一败涂地皮肤怎么弄 人类一败涂地皮肤制作教程...
  14. Cadence Orcad Capture主要工作窗口介绍
  15. 液晶如何显示变量的内容
  16. 笔试题-2023-思远半导体-数字IC设计【纯净题目版】
  17. Js Event Loop
  18. PMML模型-评分卡模型Undefined result解析
  19. 视频号扩展链接一键转换文章链接
  20. Outlook邮件存档设置

热门文章

  1. 自动备份android,Android自动备份错误
  2. Dubbo 3.0新特性记录
  3. JS实现多张图片绕中心点转动
  4. 【装载】宋鸿兵:美国国债是史上最大骗局 中日是最大输家
  5. 数据残酷物语:北上广深租房图鉴
  6. 完全模拟FIFA2014世界杯 原创求顶!
  7. 网页小图标和文字混排时如何对齐基准线
  8. 数据库身份证号用什么类型_【文末送书】MySQL数据库?看这一篇干货文章就够了!...
  9. 谷歌2014年中国区应届毕业生校园招聘B轮机试第一题——数独问题的解法(C++实现)
  10. uc浏览器视频缓存合并工具