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的数据先读取(简称先进先出).这里的读写指针是异步的, ...
随机推荐
- VUE循环菜单
- 最短路之Dijkstra(单源)HDU 2544
#include <iostream> using namespace std; ; ][]; ]; int middist; ]; void dijkstra(int n,int m) ...
- 爬虫的UA池和代理池
爬虫的UA池和代理池 一.下载中间件 先祭出框架图: 下载中间件(Downloader Middlewares) 位于scrapy引擎和下载器之间的一层组件. - 作用: (1)引擎将请求传递给下 ...
- Django (十) 项目部署 1
阿里云部署项目 1, 购买阿里云ECS云服务器(可免费试用1个月) 2, 阿里云实例更换为Ubuntu 3, 安全组配置 4, xshell远程连接 5, 创建虚拟环境: 5.1 linux基本命令 ...
- 转 查看磁盘IO负载 - 看哪些进程在读写磁盘 以及oracle 异步I/O 和同步I/O
https://www.cnblogs.com/cloudstorage/archive/2012/11/11/2764623.html #####sample 1: Oracle等待事件db fil ...
- 如何在VirtualBox虚拟机中安装XP系统? 转
关闭VM (windows 7 )的方法, 使用 退出 保持状态 开启VM (windows 7 )的方法, 选择启动 ######Iissue 1 网络连接不上,可以重新初始化 网络连接. #### ...
- hdu 3686 Traffic Real Time Query System 点双两通分量 + LCA。这题有重边!!!
http://acm.hdu.edu.cn/showproblem.php?pid=3686 我要把这题记录下来. 一直wa. 自己生成数据都是AC的.现在还是wa.留坑. 我感觉我现在倒下去床上就能 ...
- 牛客网Java刷题知识点之什么是死锁、死锁产生的4个必要条件、死锁的解除与预防
不多说,直接上干货! https://www.nowcoder.com/ta/review-java/review?query=&asc=true&order=&page=16 ...
- java transient关键字作用,使用场景
transient的作用及使用方法,官方解释为: Variables may be marked transient to indicate that they are not part of the ...
- Linux 查找bom头文件,清除bom头命令
1.查找bom头文件 grep -r -I -l $'^\xEF\xBB\xBF' ./ 2.替换bom头文件 find . -type f -exec sed -i 's/\xEF\xBB\xBF/ ...