Verilog实现任意位宽异步FIFO

本文介绍了使用Verilog语言实现任意位宽的异步FIFO,包括主模块的设计与测试,通过逻辑仿真实现验证其正确性,并展示了仿真波形图。
摘要由CSDN通过智能技术生成

主模块:

`timescale 1ns / 1ps

module Async_FIFO#(
    parameter   ADDR_WIDTH = 4,
                DATA_WIDTH = 8,
                ALMOST_GAP = 3
)(
    input   wire                        wr_clk  ,   //写时钟
    input   wire                        wr_rst_n,   //写复位
    input   wire                        wr_en   ,   //写使能
    input   wire    [DATA_WIDTH-1:0]    wr_data ,   //用于写入的数据
    
    input   wire                        rd_clk  ,   //读时钟
    input   wire                        rd_rst_n,   //读复位
    input   wire                        rd_en   ,   //读使能
    
    
    output  reg                         full    ,   //FIFO写满信号,使用输出寄存器以保证与控制时钟同步
    output  reg                         empty   ,   //FIFO读空信号,使用输出寄存器以保证与控制时钟同步
    output  reg                         almost_full,//FIFO将满信号,使用输出寄存器以保证与控制时钟同步
    output  reg                         almost_empty,//FIFO将空信号,使用输出寄存器以保证与控制时钟同步
    output  wire    [DATA_WIDTH-1:0]    rd_data     //读出的数据
);

wire  full_next, empty_next, almost_empty_next, almost_full_next;//空满信号次态逻辑

reg   [ADDR_WIDTH:0]    wr_addr_ptr_next, rd_addr_ptr_next;//读写地址指针二进制码次态逻辑
reg   [ADDR_WIDTH:0]    wr_addr_ptr, rd_addr_ptr;  //读写地址指针
wire  [ADDR_WIDTH-1:0]  wr_addr, rd_addr; //读写地址

//读写地址赋值
assign  wr_addr = wr_addr_ptr[ADDR_WIDTH-1:0];
assign  rd_addr = rd_addr_ptr[ADDR_WIDTH-1:0];  


wire  [ADDR_WIDTH:0]    wr_addr_ptr_gray_next, rd_addr_ptr_gray_next; //读写地址指针格雷码次态逻辑
reg   [ADDR_WIDTH:0]    wr_addr_ptr_gray, wr_addr_ptr_gray1, wr_addr_ptr_gray2; //写地址指针格雷码转换及跨时钟打拍信号
reg   [ADDR_WIDTH:0]    rd_addr_ptr_gray, rd_addr_ptr_gray1, rd_addr_ptr_gray2; //读地址指针格雷码转换及跨时钟打拍信号



// *************************** 写时钟域时序逻辑 ***************************** //
//数据更新
always@(posedge wr_clk or negedge wr_rst_n)
    if(!wr_rst_n) begin
        wr_addr_ptr <= 0;
        wr_addr_ptr_gray <= 0;
        full <= 0;
        almost_full <= 0;
    end
    else begin    
        wr_addr_ptr <= wr_addr_ptr_next;
        wr_addr_ptr_gray <= wr_addr_ptr_gray_next;
        full <= full_next;
        almost_full <= almost_full_next;
    end


/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值