OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2073|回复: 5

[XILINX] 关于 IP核之FIFO实验 的请教

[复制链接]

1

主题

7

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2023-5-1
在线时间
10 小时
发表于 2023-6-13 21:07:35 | 显示全部楼层 |阅读模式
本帖最后由 dqyang 于 2023-6-13 21:49 编辑

各位大佬,在《达芬奇指南》的第十八章 IP核之FIFO实验中,fifo_rd_en应该是almost_full延迟两拍后再延迟10拍拉高,fifo_wr_en应该是almost_empty延迟两拍后再延迟10拍拉高。
可是我看波形图上fifo_rd_en是在延迟10拍后又延迟了3拍才拉高, fifo_wr_en是在延迟10拍后又延迟了2拍才拉高,这是为啥啊?
openedv_2.png openedv_1.png



以下为fifo_wr.v的官方代码:
  1. <font face="微软雅黑">//****************************************Copyright (c)***********************************//
  2. //原子哥在线教学平台:www.yuanzige.com
  3. //技术支持:www.openedv.com
  4. //淘宝店铺:http://openedv.taobao.com
  5. //关注微信公众平台微信号:"正点原子",免费获取ZYNQ & FPGA & STM32 & LINUX资料。
  6. //版权所有,盗版必究。
  7. //Copyright(C) 正点原子 2018-2028
  8. //All rights reserved
  9. //----------------------------------------------------------------------------------------
  10. // File name:           fifo_wr
  11. // Last modified Date:  2019/05/10 13:38:04
  12. // Last Version:        V1.0
  13. // Descriptions:        写FIFO模块
  14. //----------------------------------------------------------------------------------------
  15. // Created by:          正点原子
  16. // Created date:        2019/05/10 13:38:14
  17. // Version:             V1.0
  18. // Descriptions:        The original version
  19. //
  20. //----------------------------------------------------------------------------------------
  21. //****************************************************************************************//

  22. module fifo_wr(
  23.     //mudule clock
  24.     input                  clk    ,           // 时钟信号
  25.     input                  rst_n  ,           // 复位信号
  26.     //FIFO interface      
  27.     input                  almost_empty,      // FIFO将空信号
  28.     input                  almost_full ,      // FIFO将满信号
  29.         output    reg          fifo_wr_en ,       // FIFO写使能
  30.     output    reg  [7:0]   fifo_wr_data       // 写入FIFO的数据
  31. );

  32. //reg define
  33. reg  [1:0]  state            ; //动作状态
  34. reg                  almost_empty_d0  ;  //almost_empty 延迟一拍
  35. reg                  almost_empty_syn ;  //almost_empty 延迟两拍
  36. reg  [3:0]  dly_cnt          ; //延迟计数器
  37. //*****************************************************
  38. //**                    main code
  39. //*****************************************************

  40. //因为 almost_empty 信号是属于FIFO读时钟域的
  41. //所以要将其同步到写时钟域中
  42. always@( posedge clk ) begin
  43.         if( !rst_n ) begin
  44.                 almost_empty_d0  <= 1'b0 ;
  45.                 almost_empty_syn <= 1'b0 ;
  46.         end
  47.         else begin
  48.                 almost_empty_d0  <= almost_empty ;
  49.                 almost_empty_syn <= almost_empty_d0 ;
  50.         end
  51. end

  52. //向FIFO中写入数据
  53. always @(posedge clk ) begin
  54.     if(!rst_n) begin
  55.         fifo_wr_en   <= 1'b0;
  56.         fifo_wr_data <= 8'd0;
  57.         state        <= 2'd0;
  58.                 dly_cnt      <= 4'd0;
  59.     end
  60.     else begin
  61.         case(state)
  62.             2'd0: begin
  63.                 if(almost_empty_syn) begin  //如果检测到FIFO将被读空
  64.                     state <= 2'd1;        //就进入延时状态
  65.                 end
  66.                 else
  67.                     state <= state;
  68.             end
  69.                         2'd1: begin
  70.                 if(dly_cnt == 4'd10) begin  //延时10拍
  71.                                                                                         //原因是FIFO IP核内部状态信号的更新存在延时
  72.                                                                                         //延迟10拍以等待状态信号更新完毕                  
  73.                     dly_cnt    <= 4'd0;
  74.                                         state      <= 2'd2;     //开始写操作
  75.                                         fifo_wr_en <= 1'b1;     //打开写使能
  76.                                 end
  77.                                 else
  78.                                         dly_cnt <= dly_cnt + 4'd1;
  79.             end            
  80.                         2'd2: begin
  81.                 if(almost_full) begin        //等待FIFO将被写满
  82.                     fifo_wr_en   <= 1'b0;  //关闭写使能
  83.                     fifo_wr_data <= 8'd0;
  84.                     state        <= 2'd0;  //回到第一个状态
  85.                 end
  86.                 else begin                 //如果FIFO没有被写满
  87.                     fifo_wr_en   <= 1'b1;  //则持续打开写使能
  88.                     fifo_wr_data <= fifo_wr_data + 1'd1;  //且写数据值持续累加
  89.                 end
  90.             end
  91.                         default : state <= 2'd0;
  92.         endcase
  93.     end
  94. end

  95. endmodule
  96. </font>
复制代码

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2022-5-24
在线时间
21 小时
发表于 2023-6-14 11:03:33 | 显示全部楼层
这是最初的代码设计,那会的设计思路有些问题,读写模块是一样的问题,这里以写模块为例说一下。之前写模块的设计思路是通过将空信号来判断是否进行写操作的,但是将空信号来的时候其实读模块还没有停止工作,又因为是异步的读写,所以延迟10拍比较保险(10拍内读操作肯定已经结束并停止工作了,而且FIFO内各个参数的值也肯定稳定了不再变化了),但是这个设计思路是有些问题的,就显得很冗余而且不好理解和说明。合理的设计思路应该使用空信号来判断是否进行写操作,因为空信号来的时候说明读模块已经停止了工作,说明可以进行写操作了。这个问题在新版的领航者资料中已经修改过来了,达芬奇等其它开发板的资料在后续发布新版资料时也会修改更正过来。
回复 支持 1 反对 0

使用道具 举报

0

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2022-5-24
在线时间
21 小时
发表于 2023-6-14 11:11:48 | 显示全部楼层
fifo_wr_en是在延迟10拍后又延迟了2拍才拉高这个问题是因为异步FIFO中,将空信号是FIFO读时钟域下的信号,对于FIFO写时钟域来说属于异步信号,所以在进入写模块的时候先对信号打了两拍,让它同步到的FIFO写时钟域下(如代码44~54行所示),然后代码又使用了打拍后的同步信号(almost_empty_syn)作为判断条件进行打10拍的操作,所以看到的结果是fifo_wr_en总共延迟了12拍。读模块同理
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2023-5-1
在线时间
10 小时
 楼主| 发表于 2023-6-14 15:10:35 | 显示全部楼层
HUANGweicong 发表于 2023-6-14 11:03
这是最初的代码设计,那会的设计思路有些问题,读写模块是一样的问题,这里以写模块为例说一下。之前写模块 ...

好的,谢谢!
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2023-5-1
在线时间
10 小时
 楼主| 发表于 2023-6-15 17:47:44 | 显示全部楼层
本帖最后由 dqyang 于 2023-6-15 18:01 编辑
HUANGweicong 发表于 2023-6-14 11:03
这是最初的代码设计,那会的设计思路有些问题,读写模块是一样的问题,这里以写模块为例说一下。之前写模块 ...


您好!我看了领航者的FIFO例程,其中用到了wr_rst_busy和rd_rst_busy信号。但是达芬奇好像不存在这两个信号,IP核的例化模板中也没有相应的端口,请问该如何解决?



报错信息

报错信息
回复 支持 反对

使用道具 举报

0

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2022-5-24
在线时间
21 小时
发表于 2024-1-10 14:10:34 | 显示全部楼层
dqyang 发表于 2023-6-15 17:47
您好!我看了领航者的FIFO例程,其中用到了wr_rst_busy和rd_rst_busy信号。但是达芬奇好像不存在这两个 ...

要在IP核配置界面勾选的,以前的没有勾选,你可以看一下新版的IP核配置部分
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-8 02:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表