//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. Jquery | 外部插入节点

    after(content) : //在 span 元素外部的后面 插入 "<span><b>Write Less Do More</b><span ...

  2. Django的锁和事务

    Django的锁和事务 锁 select_for_update(nowait=False, skip_locked=False) 返回一个锁住行直到事务结束的查询集,如果数据库支持,它将生成一个 SE ...

  3. hdu2586 LCA带边权的Targan算法

    bryce1010模板 http://acm.hdu.edu.cn/showproblem.php?pid=2586 #include<bits/stdc++.h> using names ...

  4. 转 SecureCRT中文乱码解决方法

    1. 打开对话窗口,在工具栏中点开“选项”,选择“会话选项”.  2. 在打开的“会话选项”中,选择“外观”.  3. 在显示的“窗口和文本外观”中找到“字符编码”.  4. 把“字符编码”设置为“U ...

  5. RTT

    Segger RTT的使用 一般arm系统中,如何通过电脑键盘和显示器同mcu进行交互最有效的有两种形式:arm7的semihost,cm时代的traceswo.现在jlink推出了颇具特色的rtt( ...

  6. Crusher Django 学习笔记3 学习使用模板系统

    http://crusher-milling.blogspot.com/2013/09/crusher-django-tutorial3-using-template.html 顺便学习一下 goag ...

  7. SSAS中雪花模型

    上面的[销售事实表]与[门店]维度.[集团]维度就组成了一个雪花模型. 1.可以把[集团]关联到[门店]的维度上去: 2.如果要把[集团]作为一个单独的维度,先在[维度]里把Dim_Group添加进来 ...

  8. RedHat Linux Shell常用命令(多数也适用于Unix和AIX)

    注:本文转载自疯狂的矩阵一文,http://www.cnblogs.com/520sojustdoit/p/4642568.html --------------------------------- ...

  9. maven 3.3.9版本下载地址

    请使用迅雷下载 http://www-us.apache.org/dist/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.zip

  10. LR中常见请求的使用示例

    Action(){ //application/x-www-form-urlencoded //application/json //web_add_auto_header("Content ...