明德扬论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信扫一扫,快捷登录!

查看: 149782|回复: 0

至简设计法之RDY信号的代码设计

[复制链接]
发表于 2020-3-20 17:21:38 | 显示全部楼层 |阅读模式

马上注册,看完整文章,学更多FPGA知识。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
至简设计法的模块划分拥有一套独特的规范,其中信号定义规范中rdy的信号比较特殊,本文描述一下rdy信号的代码设计方法。
假设模块A往模块B发送数据,模块A使用信号data表示传送的数值,使用信号data_vld来表示数据的有效性。
图片 0.png
如上图可以看出模块A往模块B发送了4个数据,分别是7033

在一些场合,模块B每接收一个数据要处理比较长时间,这种情况下,模块B可以通过产生一个rdy信号,告诉模块A,我是否可以接收数据。有了rdy信号,模块A和模块B之间,就可以每次A传输一个数据、B处理一个数据,B处理完后,A再传输下一个数据。
图片 14_2.png
上图是一个比较典型的波形图。注意,信号rdy是由模块B产生的,而data_vlddata是由模块A产生的。
站在模块A的立场考虑:只要检测到rdy=1,我就可以发送数据给模块B
站在模块B的立场考虑:只要我可以接收一个数据并且处理正确,我就让rdy1,表示我可以接收数据,否则就让rdy=0

注意看上图中rdy信号由1变成0的时刻,它是在时钟上升沿之后才变低的。也就是说,在第3个时钟上升沿的时候,对于模块A来说,看到的rdy=1,所以之后模块A产生data_vld=1是符合定义,是正确的。
对于模块B来说,当收到data_vld=1时,就要立刻将rdy置为0,否则不符合模块B的要求定义。为什么这么说呢?请看下图。
图片 17.png

上图中假设rdy延迟一个时钟为0,站在模块A的角度来看,时钟上升沿3和时钟上升沿4都是看到rdy1,因此A就可以发送两个数据。这样就不符合“每传输一个数据就处理一个数据”的原则。

综上所述,正确的波形要求就如下图所示:
图片 14.png
由于收到data_vld=1时,rdy就立刻变成0,不能延时一个时钟,这意味着rdy的信号一定要用“组合逻辑”产生。同时,看到data_vld=1时,rdy就要立刻为0,说明条件包括data_vld



按照至简设计法的规范,为了处理这个数据,模块B内部一般会有一个工作使能的信号,即flag_add信号,它是由时序逻辑产生的,每接收一个数据有效(data_vld),就变为1,处理完就变为0。如下图。
图片 20.png

有了这个flag_add信号,综合上面的讨论,就可以得出rdy的代码如下。
  1. always  @(*)begin
  2.         if(data_vld|| flag_add)begin
  3.             rdy = 0;
  4.         end
  5.         else begin
  6.             rdy = 1;
  7.         end
  8.     end
复制代码


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

本版积分规则

QQ|手机版|小黑屋|MDYBBS ( 粤ICP备16061416号 )

GMT+8, 2024-4-26 06:57 , Processed in 0.064056 second(s), 23 queries .

Powered by Discuz! X3.4

本论坛由广州健飞通信有限公司所有

© 2001-2019 Comsenz Inc.

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