按照第一种写法的话,2个IF语句没有优先级的关系,都可以驱动CNT信号,那么就会产生“CNT信号不能在时钟边沿之外保存它的值”的错误。因为第二个IF 的触发是用CLK,最后综合后生成的就是一个D触发器了,而第一个IF语句和第二个IF语句没有任何的关系,它要改变D触发器所锁存的值就会与D触发器产生冲突,那么就会错误。
所以要有一个优先级的判断的IF写法就是:
IF ENA='0' THEN
CNT <= (OTHERS=>'1');
ELSIF RISING_EDGE(CLK) THEN
xxxxxxxxxxxxxxxxxxxxxxxxxxx