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的数据先读取(简称先进先出).这里的读写指针是异步的, ...
随机推荐
- OSPF-1-OSPF的数据库交换(5)
三.LAN中的指定路由器 没有DR概念的话,共享同一条数据链路的一对路由器会形成完整的邻接关系,每对路由器之间都会直接交换它们的LSDB,假设在一个只有6台路由器的LAN中,其中没有DR,那么就会 ...
- djangoXadmin
是一个基于admin二次开发的开源组件,但是貌似已经停止开发了. 安装方式:(py3.6,django2.1) 1 先用pip安装xadmin2,它会安装xadmin和一些依赖包 2 用pip卸载xa ...
- Tinghua Data Mining 2
数据预处理 https://www.bilibili.com/video/av23933161/?p=11 http://www.xuetangx.com/courses/course-v1:Tsin ...
- Git本地分支与远程分支关联
当clone完版本库,切换到开发分支后,使用git pull -r 拉取并合并分支之后会出现一下提示: $ git pull -rFrom ssh://192.168.1.226:29418/etha ...
- [poj 2104] K-th Number【主席树】
传送门:http://poj.org/problem?id=2104 保存模版. #include <cstdio> #include <algorithm> #include ...
- ORA-00972_标识符过长
执行SQL查询报:"ORA-00972:标识符过长"错误. 执行SQL: SELECT T.F_FTBS, T.F_TZMC "X组/XXXX/XXXX名称", ...
- QlikView入门
1.windows x64下载地址: http://d1cf4w4kkla6tb.cloudfront.net/qlikview/11.20/11718/_MSI/QlikViewDesktop_x6 ...
- 关于React的赋值与调用方法
#关于React的赋值与调用方法 比如调用方法的时候我们可以这样来使用closeFrm() <div className = "infoFrm_close" onMouseO ...
- idea 设置加载多个资源文件,显示本地图片
idea 经常只会设置一个资源路径,这个路径就是项目的路径.但是当要加载的文件处于其他位置时,则需要增加虚拟路径的配置. 如图:第一个是项目路径 第二个是图片路径
- 你不知道的HTTP之首部字段一览
一.HTTP/1.1 首部字段一览 HTTP 首部字段根据实际用途被分为以下 4 种类型: 1.通用首部字段:请求报文和响应报文两方都会使用的首部. 首部字段名 说明 Cache-Control 控制 ...