//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. C - Heavy Transportation

    //改版dijkstra #include <iostream> #include <algorithm> #define Faster ios::sync_with_stdi ...

  2. JSP && Servlet | 上传文件

    在WebContent下新建index.jsp 要点: 1.  表单 method 属性应该设置为 POST 方法,不能使用 GET 方法. 2.  表单 enctype 属性应该设置为 multip ...

  3. 两句话跳转QQ聊天界面 通过web方式

    NSString *qq=[NSString stringWithFormat:"]; NSURL *url2 = [NSURL URLWithString:qq]; if ([[UIApp ...

  4. 相册选择头像或者拍照 上传头像以NSData 图片二进制格式 表单上传

    一.点击头像图片 或者按钮 在相册选择照片返回img,网络上传头像要用data表单上传 (1)上传头像属性 // 图片二进制格式 表单上传 @property (nonatomic, strong) ...

  5. 如何使用程序调用webApi接口

    如何使用程序调用webApi接口 在C#中,传统调用HTTP接口一般有两种办法: WebRequest/WebResponse组合的方法调用 WebClient类进行调用. 第一种方法抽象程度较低,使 ...

  6. 2个rman自动恢复的脚本

    ### scripts 1--the scirpt is used for restore db from vcs to a point to time recovery--and the targe ...

  7. 项目用Git上传到coding

    关于这样的东西,网上很多教程,这里就结合自己看的还有自己的例子来说明一下吧: 1.你得下载一个git软件并成功安装 2.生成ssh: 关于这个,我觉得似乎不是一定的,因为通过https也可以连接到co ...

  8. STM32使用注意事项

    一 IO引脚: 1.1 PC13~PC15作为IO输出的限制,PC13/PC15输出最大2MHZ,负载2PF,驱动电流不超过3mA,所以不能用来驱动LED. 2 输出的引脚是否可以用来读引脚: cas ...

  9. libev 使用

    观察器 IO ev_io_init (ev_io *, callback, int fd, int events) ev_io_set (ev_io *, int fd, int events) I/ ...

  10. SSAS中雪花模型

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