首页 > 其他分享 >verilog 简易fifo

verilog 简易fifo

时间:2023-11-14 15:47:27浏览次数:34  
标签:en read fifo write 简易 verilog data reg

fifo.v

`timescale 1ns / 1ps
module fifo #(
    parameter fifo_depth = 128
)(
    input clk,
    input rst,
    input read_en,
    input write_en,
    input write_data,
    output reg read_data,
    output full,
    output empty
);
    localparam ptr_len = $clog2(fifo_depth);
    reg [ptr_len-1:0] write_ptr;
    reg [ptr_len-1:0] read_ptr;
    reg [fifo_depth-1:0] memory;
    reg [ptr_len-1:0] num;
    always @(posedge clk or negedge rst)
    begin 
        if(!rst)
            read_ptr <= 0;
        else if (read_en && !empty)
            begin
            if ( read_ptr == fifo_depth - 1 )
                read_ptr <= 0 ; 
            else 
                read_ptr <= read_ptr + 1 ;
            end
        else  
            read_ptr <= read_ptr;
    end 
    always @(posedge clk or negedge rst)
    begin 
        if(!rst)
            write_ptr <= 0 ;
        else if (write_en && !full)
            begin
            if ( write_ptr == fifo_depth - 1 )
                write_ptr <= 0 ; 
            else 
                write_ptr <= write_ptr + 1 ;
            end
        else  
            write_ptr <= write_ptr;
    end 
    always @(posedge clk or negedge rst)
    begin
        if(!rst)
            num <= 0 ;
        else if (write_en && !full && read_en && !empty)
            num <= num;
        else if (write_en && !full)
            num <= num + 1 ;
        else if (read_en && !empty)
            num <= num - 1 ;
        else 
            num <= num ;
    end
    always @(posedge clk)
    begin
        if (write_en && !full)
            memory[write_ptr] <= write_data ;
        if (read_en && !empty)
            read_data <= memory[read_ptr] ;
    end
    assign full         = (num == fifo_depth);
    assign empty        = (num == 'd0);    
endmodule

fifo_tb.v

`timescale  1ns / 1ps

module tb_fifo;
// fifo Parameters
parameter PERIOD      = 10 ;
parameter fifo_depth  = 128;
// fifo Inputs
reg   clk                                  = 0 ;
reg   rst                                  = 0 ;
reg   read_en                              = 0 ;
reg   write_en                             = 0 ;
reg   write_data                           = 0 ;

// fifo Outputs
wire  read_data                            ;
wire  full                                 ;
wire  empty                                ;
initial 
begin
    $fsdbDumpfile("fifo_tb.fsdb");
    $fsdbDumpvars("+all");          
end
initial 
begin
    #(PERIOD) write_en = 1;
    write_data = 1;
    #(PERIOD*4) read_en = 1;
    #(PERIOD*128) $finish;
end
initial
begin
    forever #(PERIOD/2)  clk=~clk;
end

initial
begin
    #(PERIOD*2) rst  =  1;
end

fifo #(
    .fifo_depth ( fifo_depth ))
 u_fifo (
    .clk                     ( clk          ),
    .rst                     ( rst          ),
    .read_en                 ( read_en      ),
    .write_en                ( write_en     ),
    .write_data              ( write_data   ),

    .read_data               ( read_data    ),
    .full                    ( full         ),
    .empty                   ( empty        )
);
endmodule

标签:en,read,fifo,write,简易,verilog,data,reg
From: https://www.cnblogs.com/xzh-personal-issue/p/17831748.html

相关文章

  • m基于FPGA的2ASK调制解调系统verilog实现,包含testbench测试文件
    1.算法仿真效果 本系统Vivado2019.2平台开发,测试结果如下:   2.算法涉及理论知识概要      2ASK调制解调是一种数字调制解调技术,它是基于ASK调制的一种数字调制方式。ASK调制是一种模拟调制方式,它是通过改变载波的振幅来传输数字信号。而2ASK调制解调则是将数......
  • m基于FPGA的2ASK调制解调系统verilog实现,包含testbench测试文件
    1.算法仿真效果本系统Vivado2019.2平台开发,测试结果如下:2.算法涉及理论知识概要2ASK调制解调是一种数字调制解调技术,它是基于ASK调制的一种数字调制方式。ASK调制是一种模拟调制方式,它是通过改变载波的振幅来传输数字信号。而2ASK调制解调则是将数字信号转换为二进制码,再通......
  • USB(2.0 / Type-C) to MPSSE(JTAG / SPI / IIC) / UART / FIFO: FTDI 的FT4232H配成SP
    Ti60Demo板FT4232H串口使用易灵思FPGA技术交流2022-04-1508:43Ti60F225demo板使用的是FT4232H,有4个通道A,B,C和D。其中A通道用于SPI接口,可以是AS也可以是PS。通道B用于JTAG,通道C连接了UART,通道D连接了FX3。A,B,C和D四个通道分别对应Zadig中的TitraniumTi60F225develo......
  • 简易版
    publicList<CategoryEntity>queryWithTree(){//所有数据List<CategoryEntity>entityList=baseMapper.selectList(null);List<CategoryEntity>collect=entityList.stream().filter(item->{returnitem.getParentCid()==......
  • 简易版扫雷游戏的实现(可能)
    其实我没怎么玩过这游戏,除了在古早的xp系统上见到过内置的扫雷软件外,稍微玩过几把后就体验到了脑补雷的位置并推断地雷的位置是一件多么烧脑的事情,遂放弃了。其实我更喜欢玩蜘蛛纸牌。好了废话就讲这几句=-=嗯,首先,我们要知道扫雷游戏是怎么实现的呢?下面来看一张图:这个是微软出品的......
  • Icarus Verilog的命令行参数
    IcarusVerilog的命令行参数。IcarusVerilog是一个开源的Verilog模拟器,它使用命令行界面。以下是对这些参数的详解:-E:仅进行预处理,不编译或模拟。-I:添加包含目录。-L:添加库目录。-M:生成依赖文件。-N:忽略文件中的某些部分。-o:指定输出文件名。-p:设置特定参数......
  • C#学习-winform窗口程序实践-简易学生信息管理系统
    最近逐步开始学习C#,今天完成了一个简易的C#实现的winform窗口程序,如下图所示,可以实现插入,修改,删除学生信息和查询学生成绩;使用VS并连接了mysql数据库 插入 选中相应的信息可以修改 删除 ......
  • 电量计驱动的简易框架
    电量计驱动的简易框架背景最近调试了一个电量计的问题,顺便把电量计驱动的框架简单梳理了一下Kernel:5.15以cw2015电量计的驱动为例整体框架代码主要位于:drivers/power/supply/,powersupplyclass的实现,具体的电量计、充电IC等设备驱动都在此目录下整体框架大致如下:作者:She......
  • Electrical(Hardware) Protocols: FIFO / JTAG / SPI / IIC / IIS / UART / SWD / ICS
    Electrical(Hardware)Protocols:JTAG(JointTestActionGroup),JTAGisactuallyaprotocoloverSPI.5pins/connections(GND,TMS,TCK,TDI,TDO),Outputtype:Maximumvoltage:5.5volts(5voltsafe),3.3voltnormal,oropencollector(pull-upresistorsre......
  • 实验5---Swing UI设计(简易计算器)
    一、实验目的本实验的目的是掌握JAVA容器类JFrame和JPanel的使用;掌握Swing常用布局的使用;掌握常用可视组件的使用。二、实验内容完成一个简单的计算器的功能。实现的效果图如下所示:  计算器实现的计算功能为:加、减、乘、除法、求余;“C”为清除,“<-“为退格等功能。三、......