明德扬肖老师 发表于 2020-3-20 17:21:38

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

至简设计法的模块划分拥有一套独特的规范,其中信号定义规范中rdy的信号比较特殊,本文描述一下rdy信号的代码设计方法。假设模块A往模块B发送数据,模块A使用信号data表示传送的数值,使用信号data_vld来表示数据的有效性。 如上图可以看出模块A往模块B发送了4个数据,分别是7、0、3、3。
在一些场合,模块B每接收一个数据要处理比较长时间,这种情况下,模块B可以通过产生一个rdy信号,告诉模块A,我是否可以接收数据。有了rdy信号,模块A和模块B之间,就可以每次A传输一个数据、B处理一个数据,B处理完后,A再传输下一个数据。 上图是一个比较典型的波形图。注意,信号rdy是由模块B产生的,而data_vld和data是由模块A产生的。站在模块A的立场考虑:只要检测到rdy=1,我就可以发送数据给模块B。站在模块B的立场考虑:只要我可以接收一个数据并且处理正确,我就让rdy为1,表示我可以接收数据,否则就让rdy=0。
注意看上图中rdy信号由1变成0的时刻,它是在时钟上升沿之后才变低的。也就是说,在第3个时钟上升沿的时候,对于模块A来说,看到的rdy=1,所以之后模块A产生data_vld=1是符合定义,是正确的。对于模块B来说,当收到data_vld=1时,就要立刻将rdy置为0,否则不符合模块B的要求定义。为什么这么说呢?请看下图。
上图中假设rdy延迟一个时钟为0,站在模块A的角度来看,时钟上升沿3和时钟上升沿4都是看到rdy为1,因此A就可以发送两个数据。这样就不符合“每传输一个数据就处理一个数据”的原则。
综上所述,正确的波形要求就如下图所示: 由于收到data_vld=1时,rdy就立刻变成0,不能延时一个时钟,这意味着rdy的信号一定要用“组合逻辑”产生。同时,看到data_vld=1时,rdy就要立刻为0,说明条件包括data_vld。


按照至简设计法的规范,为了处理这个数据,模块B内部一般会有一个工作使能的信号,即flag_add信号,它是由时序逻辑产生的,每接收一个数据有效(data_vld),就变为1,处理完就变为0。如下图。
有了这个flag_add信号,综合上面的讨论,就可以得出rdy的代码如下。 always@(*)begin
      if(data_vld|| flag_add)begin
            rdy = 0;
      end
      else begin
            rdy = 1;
      end
    end

页: [1]
查看完整版本: 至简设计法之RDY信号的代码设计