微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 时序调整问题

时序调整问题

时间:10-02 整理:3721RD 点击:
最近在接手维护离职同事的项目,FPGA控制的多信号采集存储系统。没想到他几万行的代码都没写注释,头都大!看代码的时候发现他经常用下来的语句来调整时序:

  1. module example(iclk,idata,odata);
  2. input iclk;
  3. input idata;
  4. output odata;

  5. reg rdata1,rdata2,rdata3;
  6. always@(posedge iclk)
  7. begin
  8.     rdata1<=idata;
  9.     rdata2<=rdata1;
  10.     rdata3<=rdata2;
  11. end
  12. assign    odata = rdata3;
  13. endmodule

复制代码



请问这种这种延时靠谱吗,是他比较厉害规划出要设置几个reg来控制延时,还是这样写不好?

很多时候他的设计,嵌套在大模块底下的小模块的一些判断下降沿的语句:

  1. module example2(imainclk,idata,odata);
  2. input imainclk,idata;
  3. output odata;
  4. reg rdata1,rdata2;
  5. always@(posedge imainclk)
  6. begin
  7.     rdata1<=idata;
  8.     rdata2<=rdata1;
  9.     if(rdata2 == 1 && rdata1 == 0)
  10.         odata<=1;
  11.     else
  12.         odata <=0;
  13. end
  14. endmodule

复制代码



请问各位大大,这样的他为什么要这样写,改成if(posedge idata)会有什么区别啊?


他那么判断下降沿是对的。因为实际沿检测电路就是那样的
你那个写法我没见过,你确定语法正确?
你可以自己试验下么

1.用打拍方式调整时序是很常用的做法,用于多条通路同步数据。
2.这么判断下降沿没问题。你说的那种方法虽然方便,但是对时序来说很不好。

可以,前面是打拍,这样的延时是每个时钟的周期,不是用逻辑来延时。后面说的取数据跳变的沿。正负沿都可以。不可以用数据去做时钟。这种用在行波时钟里面有。但是不好。另外这个代码没有复位操作的。
多多学习代码风格。


谢谢,以前只在学校小打小闹,没有经验。



   谢谢,我还是学生,刚出来实习,没接触过大项目。很多不懂。谢谢!但是用这种打拍的方式的话,如果是大系统的话,我怎么知道应该打多少拍才能满足时序要求啊?是需要仿真仿出来吗?



   谢谢!我上面举的例子只想说明这种打拍的方式,没写复位信号,谢谢提醒。我也很想多学习代码风格,苦于刚接触。

   这个打拍,不需要你去仿真打几拍合适..大部分这个操作是在跨时钟域信号传递的IO处理部分的逻辑处理,避免亚稳态用的。
你可以看看用到这个模块的地方的前后模块,是不是clk的频率不同.

你需要先画出时序图,然后就知道延迟几拍了。
你同事做的比较标准,你要学他,别乱改。

这个同事写的代码挺规范的,符合硬件描述语言的规则,小编说的方法我是从来没见过的。

你同事写的没有问题!

写得不错!就是少点comment!



    所以怎么从一个好学生变成一个优秀的工程师。那就是多想少做,事半功倍。打几拍,什么信号的上升沿,哪两个信号与一起,都需要在动手敲代码之前想清楚。同样开发一个模块需要10天,清华的学生可能想8天,写2天;普通的学生会想5天,写5天;在校学生只混1天,写9天。哪个方法好,最终质量孰好,你可以在之后的项目中体会到。
p.s. 要做同步电路,切勿乱动时序块alway@()中的边沿触发信号。

1. The first part should be only used by single bit retiming. Mostly used by sync Asynchronous signal. Never use it on Data Bus directly.
2. That the edge detection. It is the normal way to do it. If you use @(posedge xxx), the synthesis tool sometime would this that is another generated clock. Most time that is not what we want. You can try to synthesis it and check what's the difference between these two style.

没有问题。

延迟几个节拍可能有几种需要,在跨时钟域的时候,对于单BIT的控制信号可以使用这样的延迟消除亚稳态。在同步时钟域中如果是对边沿的检测也是通过延迟来实现,还有就是时序的需要。
从这个实例中可以看出代码规范及注释的重要性,写代码时一定需要规范及注释。

还是学生的路过。受益匪浅,顶下帖子…

这两个程序都没什么问题,
第一个程序是双跳技术,用于处理跨时钟控制信号,这么写主要是因为idata不属于iclk这个时钟域;而一般对于跨时钟数据处理可以用FIFO缓冲数据。
第二个程序也比较标准,而如果采用小编的方案,属于异步处理,容易产生时序上的问题。



    兄弟··清华的?清华的数字设计很强的吧?

1、这种延时是可以的,而且比较准;
2、if(posedge idata)这种写法也不是不可以;不过假若idata不干净的话很容易误触发,他的写法里的时钟如路径如果用时钟树,会干净得多。常规的写法就是像他那样。



    看了你的帖子觉得你很有才华,能和你交个朋友吗..希望有机会可以多向你请教和学习一下ic design的问题~谢谢老兄

路过看看!

   过奖,才疏学浅..只是先学一步而已...论坛讨论是不错的交流平台..



    真的好谦虚啊~小女子希望可以加大侠的qq, 有些问题希望可以及时请教,谢谢~!

呵呵,还是自己重新写吧

学习下,谢谢

这是我看到的讨论最好的一个帖子!真的收获好多啊。虽然两个例子是最常用的。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top