微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 当ALWAYS超个两个边沿

当ALWAYS超个两个边沿

时间:10-02 整理:3721RD 点击:
诸如always @(posedge ck or posedge rst or posedge another_edge)
if(rst)
q<=x'h0;
else if(another_edge)
q<=Y; //or anything else
else
q<=d;
我知道以上代码是可以综合的,但有人说最好不要在同一个ALWAYS模块里出现超个两个以上的沿。但我觉得一般DFF都有一个复位端,一个置位端,这样写不会造成什么问题。

“但我觉得一般DFF都有一个复位端,一个置位端,”,关键问题在这里。实际上,不是所有厂家的工艺库里的DFF都有复位端和置位端的。如果有OK,如果没有呢?
设计中的一个原则是要保证,设计的代码方便移植和应用。我的意思到不是否认你这种写法一定有错,如果确定所采用的工艺的DFF是这样的,那倒是会更节约资源。
实际上,从你这段代码来看。置位端绝大多数DFF是没有的,你看数字电子方面的书,里面的标准DFF,连复位都没有。这都是工艺库研发厂商加上去的。置位基本上没有的。FPGA里面倒是经常会有。ASIC少见。



    补充两句
1.你的代码可能导致仿真与综合结果的不一致
2.你写无穷个沿都可以,别人教你不要写多个沿和可不可综合没什么关系

你的代码可以认为rst和another_edge是异步set/reset信号吧?
设想一下这样的情况:
rst先来了个上升沿,然后another_edge来了个上升沿,然后rst变成0了。
按你的代码,这时寄存器仍保持0值,等下一个clk来了就会变成Y值。
结果,你的another_edge信号对寄存器的控制事实上处于一种不伦不类的状态:
有时是同步的,有时是异步的。

Thank you very much.

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

网站地图

Top