• 同步FIFO


    同步fifo电路图

    同步FIFO指的是写操作和读操作都是同一个时钟。为了保证数据的正确性,必须保证FIFO在满的情况下不能进行写操作,在空的状态下不能进行读操作。同时还需要明白一个就是写入了什么的数据,那么才能读出什么数据。电路的代码设计如下:

    module fifo(
    input sys_clk,
    input sys_rst_n,
    input [7:0]datain,
    input wr,
    input rd,
    output reg [7:0]dataout,
    output empt,
    output full
    );
    reg [3:0]cnt;
    reg [3:0]wr_ptr;
    reg [3:0]rd_ptr;
    reg [7:0]fifo_mem[15:0];
    parameter s0=2'b00;
    parameter s1=2'b01;
    parameter s2=2'b10;
    parameter s3=2'b11;
    always @(posedge sys_clk or negedge sys_rst_n)begin
    if(!sys_rst_n)begin
    cnt<=4'b0;
    wr_ptr<=4'b0;
    rd_ptr<=4'b0;
    dataout<=8'b0;
    end
    else begin
    case({rd,wr})
    s0:begin
    cnt<=cnt;
    wr_ptr<=wr_ptr;
    rd_ptr<=rd_ptr;
    dataout<=8'b0;
    end
    s1:begin
    if(!full)begin
    fifo_mem[wr_ptr]<=datain;
    wr_ptr<=wr_ptr+1'b1;
    cnt<=cnt+1'b1;
    dataout<=8'b0;
    end
    end
    s2:begin
    if(!empt)begin
    dataout<=fifo_mem[rd_ptr];
    rd_ptr<=rd_ptr+1'b1;
    wr_ptr<=wr_ptr;
    cnt<=cnt-1'b1;
    end
    end
    s3:begin
    if(!full)begin
    fifo_mem[wr_ptr]<=datain;
    wr_ptr<=wr_ptr+1'b1;
    end
    if(!empt)begin
    dataout<=fifo_mem[rd_ptr];
    rd_ptr<=rd_ptr+1'b1;
    end
    end
    default:;
    endcase
    end
    end
    assign full=(cnt==4'd15);
    assign empt=(cnt==4'd0);
    endmodule

    电路的仿真代码设计如下:

    `timescale 1ns/1ns
    module fifo_tb;
    reg sys_clk;
    reg sys_rst_n;
    reg [7:0]datain;
    reg wr;
    reg rd;
    wire [7:0]dataout;
    wire empt;
    wire full;
    initial begin
    sys_clk=1'b1;
    sys_rst_n=1'b0;
    datain=0;
    #10 sys_rst_n=1'b1;
    #40 wr=1'b1;
    #20 rd=1'b1;
    #20 rd=1'b0;
    #170 wr=1'b0;
    #200 rd=1'b1;
    #40 rd=1'b0;
    #60 rd=1'b1;
    #40 rd=1'b0;
    #1000 $stop;
    end
    always #10 sys_clk=~sys_clk;
    always @(posedge sys_clk)begin
    datain<=datain+1'b1;
    end
    fifo u_fifo(
    .sys_clk (sys_clk),
    .sys_rst_n (sys_rst_n),
    .datain (datain),
    .wr (wr),
    .rd (rd),
    .dataout (dataout),
    .empt (empt),
    .full (full)
    );
    endmodule

     仿真结果:

  • 相关阅读:
    POJ1061:青蛙的约会+POJ2115C Looooops+UVA10673Play with Floor and Ceil(扩展欧几里得)
    扩展欧几里得算法
    常用数学公式
    实训作业
    sdut 迷之容器(线段树+离散化)
    HDU1556:Color the ball(简单的线段树区域更新)
    HDU1698:Just a Hook(线段树区域更新模板题)
    32位的二进制数
    HDU5139:Formula(找规律+离线处理)
    HDU5023:A Corrupt Mayor's Performance Art(线段树区域更新+二进制)
  • 原文地址:https://www.cnblogs.com/FPGAer/p/13626570.html
Copyright © 2020-2023  润新知