verilog 并行的一些理解.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
verilog 并行的一些理解

module bingxing(clock,rst,a,b,c,d,e);input clock,rst;output a,b,c,d,e;reg a,b,c,d,e;always@(posedge clock)begin? if(rst==1)? a=0;? else? begin? a=~a;? b=~a;? c=~b;? endendalways@(posedge clock)begind=~c;endalways@(posedge clock)begine=~d;endendmodule这段代码非常简单,输入时钟信号clock和复位信号rst,输出a,b,c,d,e。复位时,使a=0;当clock上升沿到来时执行取反操作,a对自己取反,对a取反的结果赋值给b,对b取反的结果赋值给c,对c取反的结果赋值给d,对d取反的结果赋值给e。但不同的是,程序分为三个块(三个always),每个块之间都是并行处理,第一个块中的三条取反操作时顺序处理。那么问题来了,如果a,b,c,d,e的初值均为0,当第一个clock上升沿到来时,输出分别是多少,第二个clock上升沿到来时,又是多少,直到第n个。这个时候有的同学不淡定了,开始拿出笔算了,如果你的计算结果a,b,c,d,e依次是:第1个clock上升沿输出是10101,第二个是01010,第三个..........,原因很简单,依次取反嘛,我只能告诉你,你算错了。看看我的仿真结果吧是,如下图:第一个时钟周期内先给了一个复位信号,想让a的初值是0(其实后来我才发现,这一步完全没有必要,从图可看出所有的变量初值系统默认是0)。在一个时钟周期内由于复位信号的存在,a,b,c就不用看了,d和e同时反转,并且朝同一方向,都变成了1,而不是像我们yy的那样一个1一个0(因为我们始终认为e是d的反转,所以两个变量应该始终保持一个1一个0的状态),我们yy的不对,是因为没有搞明白并行的深刻含义。我们都知道两个always块之间是并行关系,所以e的反转和d的反转是同时发生的,也就是并行发生,d的取反的对象是此时刻之前的c的值,而e的取反的对象是此时刻之前的d的值,注意!!!重要的话说三遍,e的取反的对象是此时刻之前的d的值,e的取反的对象是此时刻之前的d的值,e的取反的对象是此时刻之前的d的值!!!也就是说并行处理的对象的值都是此时刻之前的值,c在此时刻之前是0,所以d取反后是1;d在此时刻之前是0,所以e取反后的值是1。。。第二个上升沿到来后,d和c又同时为1(我为什么想到了拼刺刀)了,并没有因为d=~c而使c和d一个0一个1(好和谐啊,有守门的有射门的)。而a,,b,c从第二个周期开始时钟保持101或者010的造型,是因为a=~a;b=~a;c=~b;这三条语句是顺序处理的,因为这个缘故不管程序怎么改,a和b始终互反,b和c一样。累死我了,如果还没懂,请看下图,这是上面代码的RTL图看到这么多框框和线线,别害怕,五个框框分别是对a,b,c,d,e取反,为了简化问题,我们只看d~reg0和e~reg0两个框框,这两个框框分别代表d=~c和e=~d这两个并行语句,每个并行的块或者语句对应到实际电路中都是一个器件,每个器件的工作状态是独立的,它的输出只和它的输入有关,它和其他器件之间的唯一关系就是:我的输出正好是你的输入或者我的出入正好是你的输出。正是因为每个器件都独立的工作,所以他们可以在同一时刻做自己的工作,因此是并行的。看看上图,假设他们都是上升沿触发(实际也是),当clock的上升沿来临时,每个器件都在做自己的工作,他们的输入是上升沿来临时输入变量对应的寄存器中的值,也就是上个上升沿结束后寄存器个更新值。说一千到一万,顺行就是流水线,前面的工序没完,后面没法干。并行就是多条流水线,大家各干各,不影响。

文档评论(0)

jiupshaieuk12 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:6212135231000003

1亿VIP精品文档

相关文档