//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的更多相关文章

  1. Verilog学习笔记简单功能实现(八)...............异步FIFO

    基本原理:       1.读写指针的工作原理 写指针:总是指向下一个将要被写入的单元,复位时,指向第1个单元(编号为0). 读指针:总是指向当前要被读出的数据,复位时,指向第1个单元(编号为0). ...

  2. 在Windows下自动运行Modelsim

    首先声明:该文章是在刘志伟老师的<Modelsim的Tcl命令>的基础上写的,希望我们能越来越自动化. 1.编写好源文件.包含asyn_fifo.v.fifomem.v.rptr_empt ...

  3. 异步FIFO的verilog实现与简单验证(调试成功)

    最近在写一个异步FIFO的时候,从网上找了许多资料,文章都写的相当不错,只是附在后面的代码都多多少少有些小错误. 于是自己写了一个调试成功的代码,放上来供大家参考. 非原创 原理参考下面: 原文 ht ...

  4. 基于FPGA的异步FIFO验证

    现在开始对上一篇博文介绍的异步FIFO进行功能验证,上一篇博文地址:http://blog.chinaaet.com/crazybird/p/5100000872 .对异步FIFO验证的平台如图1所示 ...

  5. 基于FPGA的异步FIFO设计

    今天要介绍的异步FIFO,可以有不同的读写时钟,即不同的时钟域.由于异步FIFO没有外部地址端口,因此内部采用读写指针并顺序读写,即先写进FIFO的数据先读取(简称先进先出).这里的读写指针是异步的, ...

随机推荐

  1. [poj 2104] K-th Number【主席树】

    传送门:http://poj.org/problem?id=2104 保存模版. #include <cstdio> #include <algorithm> #include ...

  2. a标签中href=""的几种用法

    http://blog.csdn.net/u010297791/article/details/52784879 这是分页上的 <?php function pages($page,$e_pag ...

  3. mac 终端查看端口命令

    查看 端口所在线程 lsof -i:8080 mac-abeen:spider abeen$ lsof -i:8080 COMMAND PID USER FD TYPE DEVICE SIZE/OFF ...

  4. vue cli 脚手架上多页面开发 支持webpack2.x

    A yuri demo for webpack2 vue multiple page.我看到有一些项目多页面项目是基于webapck1.0的,我这个是在webpack2.x上布置修改.  项目地址:  ...

  5. Springboot2.X集成Quartz集群

    为什么要使用Quzrtz集群 在项目进行集群部署时,如果业务在执行中存在互斥关系,没有对定时任务进行统一管理,就会引起业务的多次执行,不能满足业务要求.这时就需要对任务进行管理,要保证一笔业务在所有的 ...

  6. CSS元素隐藏的display和visibility

    一.CSS元素隐藏 在CSS中,让元素隐藏(指屏幕范围内肉眼不可见)的方法很多,有的占据空间,有的不占据空间:有的可以响应点击,有的不能响应点击. { display: none; /* 不占据空间, ...

  7. SQL简单查询后续记录

    --首先创建数据库TEST CREATE DATABASE TEST --创建表tb_user USE TEST CREATE TABLE [tb_user]( [name] [nvarchar] ( ...

  8. 增加和减少mongodb复制集中的节点

    MongoDB Replica Sets不仅提供高可用性的解决方案,同时也提供负载均衡的解决方案,增减 Replica Sets节点在实际应用中非常普通.例如,当应用的读压力暴增时,3台节点的环境已不 ...

  9. COGS 2566. [51nod 1129] 字符串最大值

    ★★★   输入文件:string_maxval.in   输出文件:string_maxval.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 一个字符串的前缀是指包 ...

  10. 洛谷 P1181 数列分段Section I(水题日常)

    题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成连续的若干段,并且每段和不超过M(可以等于M),问最少能将其分成多少段使得满足要求. 输入输出格式 输入格式: 输入文件divide_ ...