asyn_fifo
//Module Name:afifo_ctrl
//Description:parameterized afifo module afifo_ctrl(
clk_push,
rst_push_n,
clk_pop,
rst_pop_n,
push,
push_data,
full,
pop,
pop_data,
empty,
mem_waddr,
mem_wen,
mem_wdata,
mem_raddr,
mem_ren,
mem_rdata,
almost_full
); parameter DATAWIDTH = ; //the data width of AFIFO
parameter ADDRWIDTH = ; //the address bits of AFIFO and it must be >=2
//the AFIFO depth must be 2^ADDRWIDTH
//input declaration
input clk_push; //push clock
input rst_push_n; //reset signal in push clock domain input clk_pop; //pop clock
input rst_pop_n; //reset signal in pop clock domain
input push ; //push enable to AFIFO
input [DATAWIDTH-:] push_data; //push data to AFIFO
input pop ; //pop enable to AFIFO
input [DATAWIDTH-:] mem_rdata; //read data from memory stack //output declaration
output full; //full indicator,and the logic of user can't push data when this signal is high //ok
output [DATAWIDTH-:] pop_data ; //pop data from AFIFO //ok
output empty; //empty indicator, and the logic of user can't pop data when this signal is high //ok
output [ADDRWIDTH-:] mem_waddr; //write address to memory stack //ok
output mem_wen; //write enable to memory stack //ok
output [DATAWIDTH-:] mem_wdata; //write data to memory stack //ok
output [ADDRWIDTH-:] mem_raddr; //read address to memory stack //ok
output mem_ren; //read enable to memory stack //ok
output almost_full; //register declaration reg [ADDRWIDTH-:] mem_waddr;
reg [ADDRWIDTH-:] mem_raddr;
reg [ADDRWIDTH-:] gray_waddr_1r;
reg [ADDRWIDTH-:] gray_waddr_2r_1_sync;
reg [ADDRWIDTH-:] gray_waddr_3r_2_sync;
reg [ADDRWIDTH-:] gray_raddr_1r;
reg [ADDRWIDTH-:] gray_raddr_2r_1_sync;
reg [ADDRWIDTH-:] gray_raddr_3r_2_sync;
reg [ADDRWIDTH-:] gray_waddr_temp;
reg [ADDRWIDTH-:] gray_raddr_temp;
reg [ADDRWIDTH-:] biny_waddr;
reg [ADDRWIDTH-:] biny_raddr;
reg [ADDRWIDTH-:] biny_waddr_temp;
reg [ADDRWIDTH-:] biny_raddr_temp;
reg [DATAWIDTH-:] pop_data_r;
reg pop_r;
reg empty_flag;
reg full_flag; //net declaration
wire mem_wen;
wire mem_ren;
wire [DATAWIDTH-:] mem_wdata;
wire [DATAWIDTH-:] pop_data;
wire [ADDRWIDTH-:] gray_waddr;
wire [ADDRWIDTH-:] gray_raddr;
wire pop_one_left;
wire pop_ptr_diff;
wire push_one_left;
wire push_ptr_diff; integer i; assign mem_wen = push;
assign mem_wdata[DATAWIDTH-:] = push_data[DATAWIDTH-:];
assign mem_ren = pop; //for output signal pop_data
always@(posedge clk_pop or negedge rst_pop_n)
begin
if(~rst_pop_n)
pop_r<='b0;
else
pop_r<=pop;
end always@(posedge clk_pop or negedge rst_pop_n)
begin
if(~rst_pop_n)
pop_data_r[DATAWIDTH-:] <= ;
else
pop_data_r[DATAWIDTH-:] <= mem_rdata[DATAWIDTH-:];
end assign pop_data[DATAWIDTH-:] = pop_r ? mem_rdata[DATAWIDTH-:]:pop_data_r[DATAWIDTH-:]; //for output signal mem_waddr
always@(posedge clk_push or negedge rst_push_n)
begin
if(~rst_push_n)
mem_waddr[ADDRWIDTH-:] <=;
else
mem_waddr[ADDRWIDTH-:] <= mem_waddr[ADDRWIDTH-:] + 'b1;
end //for output signal mem_raddr
always@(posedge clk_pop or negedge rest_pop_n)
begin
if(~rst_pop_n)
mem_raddr[ADDRWIDTH-:]<=;
else
mem_raddr[ADDRWIDTH-:] <= mem_raddr[ADDRWIDTH-:] + 'b1;
end //for output signal empty
assign gray_addr[ADDRWIDTH-:] = {mem_waddr[ADDRWIDTH-],gray_waddr_temp[ADDRWIDTH-:]};
always@(* )
for(i=;i<(ADDRWIDTH-);i=i+)
gray_waddr_temp[i] = mem_waddr[i]^mem_waddr[i+]; always@(posedge clk_push or negedge rst_push_n)
begin
if(~rst_push_n)
gray_waddr_1r[ADDRWIDTH-:] <= ;
else
gray_waddr_1r[ADDRWIDTH-:] <= gray_waddr[ADDRWIDTH-:];
end always@(posedge clk_pop or negedge rst_pop_n)
begin
if(~rst_pop_n) begin
gray_waddr_2r_1_sync[ADDRWIDTH-:] <=;
gray_waddr_3r_2_sync[ADDRWIDTH-:] <=;
end
else begin
gray_waddr_2r_1_sync[ADDRWIDTH-:] <= gray_waddr_1r[ADDRWIDTH-:];
gray_waddr_3r_2_sync[ADDRWIDTH-:] <= gray_waddr_2r_1_sync[ADDRWIDTH-:];
end
end always@(*)
biny_waddr[ADDRWIDTH-] = gray_waddr_3r_2_sync[ADDRWIDTH-]; always@(*)
for(i=;i<(ADDRWIDTH-);i=i+)
biny_waddr[ADDRWIDTH--i] = gray_waddr_3r_2_sync[ADDRWIDTH--i]^biny_waddr_temp[ADDRWIDTH--i]; always@(*)
biny_waddr_temp[ADDRWIDTH-:] = biny_waddr[ADDRWIDTH-:]; assign pop_one_left = (biny_waddr[ADDRWIDTH-:] ==(mem_raddr[ADDRWIDTH-:] + 'b1));
assign pop_ptr_diff = (biny_waddr[ADDRWIDTH-:] != mem_raddr[ADDRWIDTH-:]); always@(posedge clk_pop or negedge rst_pop_n)
begin
if(~rst_pop_n)
empty_flag <='b1;
else if(pop_one_left && pop)
empty_flag <= 'b1;
else if(empty_flag && pop_ptr_diff)
empty_flag <= 'b0;
end assign empty = ~pop_ptr_diff && empty_flag; //for output signal full
assign gray_raddr[ADDRWIDTH-:] = {mem_raddr[ADDRWIDTH-],gray_raddr_temp[ADDRWIDTH-:]}; always@(*)
for(i=;i<(ADDRWIDTH-);i=i+)
gray_raddr_temp[i] = mem_raddr[i] ^ mem_raddr[i+]; always@(posedge clk_pop or negedge rst_pop_n)
begin
if(~rst_pop_n)
gray_raddr_1r[ADDRWIDTH-:] <=;
else
gray_raddr_1r[ADDRWIDTH-:] <= gray_raddr[ADDRWIDTH-:];
end always@(posedge clk_push or negedge rst_push_n)
begin
if(~rst_push_n)begin
gray_raddr_2r_1_sync[ADDRWIDTH-:]<=;
gray_raddr_3r_2_sync[ADDRWIDTH-:]<=;
end
else begin
gray_raddr_2r_1_sync[ADDRWIDTH-:] <= gray_raddr_1r[ADDRWIDTH-:]:
gray_raddr_3r_2_sync[ADDRWIDTH-:] <= gray_raddr_2r_sync[ADDRWIDTH-:];
end
end always@(*)
biny_raddr[ADDRWIDTH-] = gray_raddr_3r_2_sync[ADDRWIDTH-];
always@(*)
for(i=;i<(ADDRWIDTH-);i=i+)
biny_raddr[ADDRWIDTH--i] = gray_raddr_3r_2_sync[ADDRWIDTH--i] ^biny_raddr_temp[ADDRWIDTH--i]; always@(*)
biny_raddr_temp[ADDRWIDTH-:] = biny_raddr[ADDRWIDTH-:]; assign push_one_left = (biny_raddr[ADDRWIDTH-:] ==(mem_waddr[ADDRWIDTH-:] + 'b1));
assign push_ptr_diff = (biny_raddr[ADDRWIDTH-:] !=(mem_waddr[ADDRWIDTH-:])); always@(posedge clk_push or negedge rst_push_n)
begin
if(~rst_push_n)
full_flag <= 'b0;
else if(push_one_left && push)
full_flag <= 'b1;
else if(full_flag && push_ptr_diff)
full_flag <='b0
end assign full= ~push_ptr_diff && full_flag;
assign almost_full = push_one_left; endmodule
asyn_fifo的更多相关文章
- Verilog学习笔记简单功能实现(八)...............异步FIFO
基本原理: 1.读写指针的工作原理 写指针:总是指向下一个将要被写入的单元,复位时,指向第1个单元(编号为0). 读指针:总是指向当前要被读出的数据,复位时,指向第1个单元(编号为0). ...
- 在Windows下自动运行Modelsim
首先声明:该文章是在刘志伟老师的<Modelsim的Tcl命令>的基础上写的,希望我们能越来越自动化. 1.编写好源文件.包含asyn_fifo.v.fifomem.v.rptr_empt ...
- 异步FIFO的verilog实现与简单验证(调试成功)
最近在写一个异步FIFO的时候,从网上找了许多资料,文章都写的相当不错,只是附在后面的代码都多多少少有些小错误. 于是自己写了一个调试成功的代码,放上来供大家参考. 非原创 原理参考下面: 原文 ht ...
- 基于FPGA的异步FIFO验证
现在开始对上一篇博文介绍的异步FIFO进行功能验证,上一篇博文地址:http://blog.chinaaet.com/crazybird/p/5100000872 .对异步FIFO验证的平台如图1所示 ...
- 基于FPGA的异步FIFO设计
今天要介绍的异步FIFO,可以有不同的读写时钟,即不同的时钟域.由于异步FIFO没有外部地址端口,因此内部采用读写指针并顺序读写,即先写进FIFO的数据先读取(简称先进先出).这里的读写指针是异步的, ...
随机推荐
- E - Multiplication Puzzle
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> ...
- idea | gitee 码云
https://blog.csdn.net/qq_32340877/article/details/81205547
- centos 6.x下pxe+tftp+http+kickstart无人值守安装操作系统
1.1 什么是PXE PXE(Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过 ...
- 使用request实现手工输入验证码登录
我们的目标网站是这个http://awehome.com.cn,登录页面是这个http://awehome.com.cn/tenant/login import requests import jso ...
- C8051系列
C8051F500处理器按AEC-Q100测试标准设计具有寛工作电压(1.8~5.5V).寛工作温度范围(-40~125).抗干扰能力强并内置CAN2.0B及LIN2.1总线控制器,非常适合汽车电子及 ...
- android开发学习 ------- 仿QQ侧滑效果的实现
需要做一个仿QQ侧滑删除的一个效果: 一开始是毫无头绪,百度找思路,找到 https://blog.csdn.net/xiaxiazaizai01/article/details/53036994 ...
- ubuntu 下 docker安装
1移除以前安装docker sudo apt-get remove docker docker-engine docker-ce docker.io 2 安装包以允许apt通过HTTPS使用存储库 s ...
- HTTP/1.1 持久连接 persistent connection
首先:HTTP的长连接和短连接本质上是TCP长连接和短连接. 1. 在HTTP1.0中,默认的是短连接,没有正式规定 Connection:Keep-alive 操作:在HTTP1.1中所有连接都是K ...
- iOS 字符串处理笔记
iOS字符串处理笔记,包括如何使用正则表达式解析,NSScanner扫描,设置和使用CoreParse解析器来解析处理自定义符号等内容 搜索 在一个字符串中搜索子字符串 最灵活的方法 - (NSRan ...
- SQLServer 错误: 15404,无法获取有关 Windows NT 组/ 用户 'WIN-8IVSNAQS8T7\Administrator' 的信息,错误代码 0x534。
在自动清理日志的作业中,执行过程出现如下问题:“SQLServer 错误: 15404,无法获取有关 Windows NT 组/ 用户 'WIN-8IVSNAQS8T7\Administrator' ...