• 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的结果,还没有优化与重构,各位看官见谅!

    以上,互相学习!!!

  • 相关阅读:
    单点登录
    企业SOA架构案例分析
    京东峰值系统设计
    阿里搜索离线大数据平台架构
    国内不FQ使用ARCore
    Unity Android上视频使用Seek方法跳转有误差
    《搬砖日记》Obi Rope插件的简单使用
    《搬砖日记》AssetsBundle实现资源更新及通过反射添加脚本
    入园一周年
    《搬砖日记》Unity原生MicroPhone的使用
  • 原文地址:https://www.cnblogs.com/lightmonster/p/10198233.html
Copyright © 2020-2023  润新知