基于 FPGA 的高级数字电路设计(7)单口 RAM、同步 FIFO、异步 FIFO 设计
2024-06-09 14:59:45
一、单口 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 设计相关推荐
- 基于 FPGA 的高级数字电路设计(5)基于 PE 的脉动阵列设计
脉动阵列定义:多个相同的处理单元(简称 PE),按一定互联规则组成的网络,称为脉动阵列.脉动阵列可以是一维线形.二维矩形.二维二叉树型.三维长方体形等等. 脉动阵列特点 ...
- 基于 Verilog 的经典数字电路设计(12)串并转换器
基于 Verilog 的经典数字电路设计(12)串并转换器 版权所有,新芯设计,转载文章,请注来源 引言
- 基于 Verilog 的经典数字电路设计(4)编码器
基于 Verilog 的经典数字电路设计(4)编码器 版权所有,新芯设计,转载文章,请注来源 引言
- 基于 Verilog 的经典数字电路设计(2)比较器
基于 Verilog 的经典数字电路设计(2)比较器 版权所有,新芯设计,转载文章,请注来源 引言
- 基于FPGA的遥控数字时钟设计
基于FPGA的遥控数字时钟设计报告 Author:张宏宇 摘要 数字时钟是一种通过数字显示时间的计时装置,本次项目采用Cyclone Ⅳ系列芯片,使用QuartusII开发环境,使用Ver ...
- 基于 Verilog 的经典数字电路设计(13)并串转换器
基于 Verilog 的经典数字电路设计(13)并串转换器 版权所有,新芯设计,转载文章,请注来源 引言
- 基于 FPGA Vivado 的数字钟设计(附源工程)
今天给大侠带来基于 FPGA Vivado 的数字钟设计,开发板实现使用的是Digilent basys 3,如有想要入手 basys 3 开发板的,可以联系牛总:18511371833.话不多说,上 ...
- 源码系列:基于FPGA的PS2通信电路设计(附源码)
今天给大侠带来基于FPGA的PS2通信电路设计,附源码,获取源码,请在"FPGA技术江湖"公众号内回复"PS2源码",可获取源码文件.话不多说,上货. 设计背景 ...
- FIFO、单口RAM、双口RAM的区别
FPGA设计中,经常需要用存储器来存储数据,目前常用的存储器有FIFO和RAM,其中RAM又分单口RAM与双口RAM,那么它们各自有什么区别呢? 双口RAM:双口RAM 是在一个SRAM 存储器上具有 ...
最新文章
- Visual Studio Styles
- Leetcode-区域和检索 - 数组不可变(303)
- boost::fusion::map_tie用法的测试程序
- HDU4367(线段相交与斐波那契数列)
- leetcode 75. Sort Colors | 75. 颜色分类(荷兰国旗问题,快速排序)
- IDEA/Tomcat 原理:如何将 Tomcat 集成到 IDEA?实现由传统部署延伸到热部署 Java EE 项目?
- 华为P30系列机身侧面照曝光 摄像头仍然“凸起”...
- oracle 常用索引分析,使用原则和注意事项
- 安全模式 提权_WEB安全第八章实战篇01 提权安全狗服务器
- 两分钟,帮你搞懂光纤接头
- python实现格兰杰因果关系检验
- git stage 暂存_Git暂存区之理解Git暂存区(stage)
- 人类一败涂地做图教程_人类一败涂地皮肤怎么弄 人类一败涂地皮肤制作教程...
- Cadence Orcad Capture主要工作窗口介绍
- 液晶如何显示变量的内容
- 笔试题-2023-思远半导体-数字IC设计【纯净题目版】
- Js Event Loop
- PMML模型-评分卡模型Undefined result解析
- 视频号扩展链接一键转换文章链接
- Outlook邮件存档设置