zoukankan      html  css  js  c++  java
  • Verilog实现同步FIFO

    作为实现RS232串行通信的Verilog实现的预备工作,使用Verilog实现了同步FIFO的功能,其代码段如下

    //this program segment realize the function of fifo IPcore
    //synchronous fifo
    module fifo_ip 
    #( parameter Addr_Width=8,Bit_Width=8
    )
    (clk,rst,wren,rden,full,empty,din,dout,counter);
    input clk,rst,wren,rden;
    input[Bit_Width-1:0] din;
    output full,empty;
    output reg[Bit_Width-1:0] dout;
    output reg[2:0] counter;
    reg[3:0] addr_wr,addr_rd;
    reg[Bit_Width-1:0] buf_mem[0:Addr_Width-1];
    parameter s0=2'b00,s1=2'b01,s2=2'b10,s3=2'b11;
    always @(posedge clk or negedge rst)
    begin
    if(!rst)
        begin
            dout<=0;
            counter<=0;
            addr_wr<=0;
            addr_rd<=0;
        end
    else
        begin
            case({rden,wren})
            s1:begin
                    if(!full)
                        begin
                            buf_mem[addr_wr]<=din;
                            addr_wr<=addr_wr+1;
                            counter<=counter+1;
                        end
                end
            s2:begin
                    if(!empty)
                        begin
                            dout<=buf_mem[addr_rd];
                            addr_rd<=addr_rd+1;
                            counter<=counter-1;
                        end
                end
            s3:begin
                    if(!empty)
                        begin
                            dout<=buf_mem[addr_rd];
                            addr_rd<=addr_rd+1;
                            if(full) counter<=counter-1;
                        end
                    if(!full)
                        begin
                            buf_mem[addr_wr]<=din;
                            addr_wr<=addr_wr+1;
                            if(empty) counter<=counter+1;
                        end
                end
            endcase
        end
    end
    assign full=({~addr_wr[3],addr_wr[2:0]}==addr_rd[3:0])?1:0;
    assign empty=(addr_rd[3:0]==addr_wr[3:0])?1:0;
    endmodule

    主要思想是通过两个输入对读写进行控制,创建一个数组向量,存储每次写入的值,采用先进先出(即FIFO)的思想,当写满时,发送满指令,读空时发送空指令。

    此法与网络上能够搜到的其他方法大同小异,纯属记录coding的结果,还没有优化与重构,各位看官见谅!

    以上,互相学习!!!

  • 相关阅读:
    5.1.5 JunkMail Filter
    POJ1067 取石子游戏 跪跪跪,很好的博弈论
    USACO Section 3.2 Magic Squares (msquare)
    5.1.1 A Bug's Life
    USACO Section 3.3 Riding The Fences (fence)
    USACO Section 3.1 Stamps (stamps)
    5.2.7 Entropy
    USACO Section 3.1 AgriNet (agrinet)
    5.1.8 How Many Answers Are Wrong
    4.3.6 N皇后问题
  • 原文地址:https://www.cnblogs.com/lightmonster/p/10198233.html
Copyright © 2011-2022 走看看