用Verilog实现一个同步FIFO,深度16,数据位宽8bit

module syn_fifo(
    input clk,
    input rst_n,
    input [7:0] din,
    input wr_en,
    input rd_en,
    output [7:0] dout,
    output full,
    output empty
    );
    
    reg wr_en_r;
    reg rd_en_r;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) wr_en_r <= 0;
        else wr_en_r <= wr_en;
    end
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) rd_en_r <= 0;
        else rd_en_r <= rd_en;
    end    
    reg [3:0] status_cnt;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) status_cnt <= 0;
        else if(wr_en_r && !rd_en && status_cnt != 4'd15 )
            status_cnt <= status_cnt + 1'b1;
        else if(rd_en_r && !wr_en && status_cnt != 0 )
            status_cnt <= status_cnt - 1'b1;
         else status_cnt <= status_cnt;
    end
    wire full_r1;
    reg full_r2;
    assign full_r1 = (status_cnt == 15)?1'b1:1'b0;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) full_r2 <= 0;
        else full_r2 <= full_r1;
    end
    assign full = full_r1 && full_r2;    
        
    wire empty_r1;
    reg empty_r2;
    assign empty_r1 = (status_cnt == 0)?1'b1:1'b0;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) empty_r2 <= 1;
        else empty_r2 <= empty_r1;
    end
    assign empty = empty_r1 && empty_r2;
            
    reg [3:0] wr_cnt;
    reg [3:0] rd_cnt;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) wr_cnt <= 0;
        else if (wr_en && !full)begin
            if(wr_cnt < 15) wr_cnt <= wr_cnt + 1'b1;
            else wr_cnt <= 0;
        end
        else wr_cnt <= wr_cnt;
    end   
    
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) rd_cnt <= 0;
        else if (rd_en && !empty)begin
            if(rd_cnt < 15) rd_cnt <= rd_cnt + 1'b1;
            else rd_cnt <= 0;
        end
        else rd_cnt <= rd_cnt;
    end
//write    
    reg [7:0] DATA [15:0];
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) begin
            DATA[0] <= 0;
            DATA[1] <= 0;
            DATA[2] <= 0;
            DATA[3] <= 0;
            DATA[4] <= 0;
            DATA[5] <= 0;
            DATA[6] <= 0;
            DATA[7] <= 0;
            DATA[8] <= 0;
            DATA[9] <= 0;
            DATA[10] <= 0;
            DATA[11] <= 0;
            DATA[12] <= 0;
            DATA[13] <= 0;
            DATA[14] <= 0;
            DATA[15] <= 0;
        end
        else if(wr_en && !full)
            DATA[wr_cnt] <= din;
    end
//READ
    reg [7:0] data_r;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) data_r <= 0;
        else if(rd_en_r && !empty)
            data_r <= DATA[rd_cnt];
//        else data_r <= 0;
        else data_r <= data_r;
    end
    assign dout = data_r;
endmodule

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ALTERA FPGA IP FIFO 8bitX8 FIFO读写测试Verilog源码工程文件, FPGA型号Cyclone4E系列中的EP4CE10F17C8,Quartus版本18.0。 module ip_fifo( input sys_clk , // 时钟信号 input sys_rst_n // 复位信号 ); //wire define wire wrreq ; // 写请求信号 wire [7:0] data ; // 写入FIFO数据 wire wrempty ; // 写侧空信号 wire wrfull ; // 写侧满信号 wire wrusedw ; // 写侧FIFO中的数据量 wire rdreq ; // 读请求信号 wire [7:0] q ; // 从FIFO输出的数据 wire rdempty ; // 读侧空信号 wire rdfull ; // 读侧满信号 wire rdusedw ; // 读侧FIFO中的数据量 //***************************************************** //** main code //***************************************************** //例化FIFO模块 fifo u_fifo( .wrclk ( sys_clk ), // 写时钟 .wrreq ( wrreq ), // 写请求 .data ( data ), // 写入FIFO数据 .wrempty ( wrempty ), // 写空信号 .wrfull ( wrfull ), // 写满信号 .wrusedw ( wrusedw ), // 写侧数据量 .rdclk ( sys_clk ), // 读时钟 .rdreq ( rdreq ), // 读请求 .q ( q ), // 从FIFO输出的数据 .rdempty ( rdempty ), // 读空信号 .rdfull ( rdfull ), // 读满信号 .rdusedw ( rdusedw ) // 读侧数据量 ); //例化写FIFO模块 fifo_wr u_fifo_wr( .clk (sys_clk ), // 写时钟 .rst_n (sys_rst_n), // 复位信号 .wrreq (wrreq ), // 写请求 .data (data ), // 写入FIFO数据 .wrempty (wrempty ), // 写空信号 .wrfull (wrfull ) // 写满信号 ); //例化读FIFO模块 fifo_rd u_fifo_rd( .clk (sys_clk ), // 读时钟 .rst_n (sys_rst_n), // 复位信号 .rdreq (rdreq ), // 读请求 .data (q ), // 从FIFO输出的数据 .rdempty (rdempty ), // 读空信号 .rdfull (rdfull ) // 读满信号 ); endmodule

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值