• 手撕IP核系列——Xilinx FIFO IP核-同步FIFO


    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

    手撕IP核系列——Xilinx FIFO IP核-同步FIFO


    关键信号说明

    同步FIFO中的一些关键信号说明
    在这里插入图片描述
    实际上,我们需要做的就是将上面几个信号的时序做到与IP核的一模一样也就成功了,当然,还有输出数据和data_count的时序也要一样

    IP核设置

    设置宽度为16,深度为64的FIFO。

    配置卡片1:
    在这里插入图片描述
    配置卡片2:

    在这里插入图片描述
    注意,这里output register考虑进去,因为这个地方可以优化时序

    卡片3
    在这里插入图片描述
    卡片4:
    在这里插入图片描述
    配置总结:
    在这里插入图片描述

    设计细节

    my_fifo:第一版
    my_fifo1:第二版,最终用这个

    module my_fifo1#(
    	parameter 		WIDTH		  =	16,
    	parameter 		DEPTH		  =	64,
    	parameter 		ADDR_WIDTH	  =	clogb2(DEPTH),
    	parameter 		PROG_EMPTY_ASSERT =	2,
    	parameter 		PROG_EMPTY_DESERT =	3,    
    	parameter 		PROG_FULL_ASSERT  =	62,
    	parameter 		PROG_FULL_DESERT  =	61,
        parameter       EMBEDDED_REGISTER = 1
    )(
    	input 			sys_clk,
    	input 			sys_rst,
    	input			[WIDTH-1:0]din,
    	input 			wr_en,
    	input 			rd_en,
    	output reg		[WIDTH-1:0]dout,
    	output reg 		full,
    	output reg 		empty,
    	output reg 		prog_full,
    	output reg 		prog_empty,
        
    	output reg 		almost_full,
    	output reg 		almost_empty,    
        
    	output reg		[ADDR_WIDTH-1:0]data_count
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    WIDTH/ DEPTH
    PROG_EMPTY_ASSERT/ PROG_EMPTY_DESERT
    PROG_FULL_ASSERT/ PROG_FULL_DESERT
    EMBEDDED_REGISTER
    这些设置是和IP核能够对应上的

    仿真验证

    所有输出端口进行一对一的对比

    reg flag1 = 0;
    reg flag2 = 0;
    reg flag3 = 0;
    reg flag4 = 0;
    reg flag5 = 0;
    reg flag6 = 0;
    reg flag7 = 0;
    reg flag8 = 0;
    
    always @(posedge i_clk)
    begin
    flag1 <= fifo_dou == fifo_dou1;
    flag2 <= fifo_full == fifo_full1;
    flag3 <= fifo_empty == fifo_empty1;
    flag4 <= prog_full == prog_full1;
    flag5 <= prog_empty == prog_empty1;
    flag6 <= fifo_count == fifo_count1;
    
    flag7 <= almost_empty == almost_empty1;
    flag8 <= almost_full  == almost_full1;
    
    
    end
    
    
    //测试1:连续写入和读出测试full 和 prog_full 和 almost_full 和 empty 和 prog_empty 和 almost_empty
    
    /*
    always @(posedge i_clk)
        r_cnt <= r_cnt + 1;
        
        
        
        assign i_wr_en = r_cnt[15:0] > 15 && r_cnt[15:0] < 150;
        assign i_din = r_cnt;
        
    
        assign rd_en = r_cnt[15:0] > 300 && r_cnt[15:0] < 450;
    */
    
    
    
    //测试2:间隔写入和读出测试full 和 prog_full 和 almost_full 和 empty 和 prog_empty 和 almost_empty
    
    /*
    always @(posedge i_clk)
        r_cnt <= r_cnt + 1;
        
        
        
        assign i_wr_en = r_cnt[15:0] < 3000 && r_cnt[3:0] == 15 ;
        assign i_din = r_cnt;
        
    
        assign rd_en = r_cnt[15:0] > 3000 && r_cnt[3:0] == 15;
    */
    
    
    //测试3:同时写入和读出测试full 和 prog_full 和 almost_full 和 empty 和 prog_empty 和 almost_empty
    
    
    always @(posedge i_clk)
        r_cnt <= r_cnt + 1;
        
        
        
        assign i_wr_en = r_cnt[15:0] > 2880 && r_cnt[3:0] == 14 ;  //15/14
        assign i_din = r_cnt;
        
    
        assign rd_en = r_cnt[15:0] > 3000 && r_cnt[3:0] == 15;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72

    仿真结果

    在这里插入图片描述
    8个flag输出至始至终是一样的,说明手写RTL和IP核输出时序是完全一致的

    最后说明:

    资源备份:百度网盘-Xilinx设计-Xilinx同步FIFO
    执行srcs中tb_sync_fifo.tcl 文件即可直接仿真

  • 相关阅读:
    一种文件切片上传策略
    Python 零代码的22个小游戏集合 freegames
    【UNI-APP】阿里NLS一句话听写typescript模块
    eventfd
    Error creating bean with name ‘xImpl’: Unsatisfied dependency expressed through field 'baseMapper'
    火绒安全:全面守护你的数字世界
    python LeetCode 刷题记录 14
    react hooks 封装svg 双色(可拓展多色)图标组件
    golang使用JWX进行认证和加密
    进程以及线程
  • 原文地址:https://blog.csdn.net/gzy0506/article/details/126177947