verilog问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了verilog问题相关的知识,希望对你有一定的参考价值。

always @ ( posedge CLK or negedge RSTn )
40. if( !RSTn )
41. begin
42. H2L_F1 <= 1'b1;
43. H2L_F2 <= 1'b1;
44. L2H_F1 <= 1'b0;
45. L2H_F2 <= 1'b0;
46. end
47. else
48. begin
49. H2L_F1 <= Pin_In;
50. H2L_F2 <= H2L_F1;
51. L2H_F1 <= Pin_In;
52. L2H_F2 <= L2H_F1;
end
assign H2L_Sig = ( H2L_F2 & !H2L_F1 );
assign L2H_Sig = ( !L2H_F2 & L2H_F1 );
这是我在书上看到的判断上升沿和下降沿的程序就是说如果把
assign L2H_Sig = ( !L2H_F1 & Pin_In);和原先有什么区别?
是如果改成那样有什么区别

always内部的程序,在时钟到来的时候是会并行执行的,所以复位后当程序开始时,此时数据还没有开始传递:L2H_F1=1‘b0,而L2H_F2=1’b1。。assign是属于异步执行的逻辑,当程序开始时,就开始执行assign L2H_Sig = ( !L2H_F2 & L2H_F1 )=0;

改变后:assign L2H_Sig = ( !L2H_F1 & Pin_In)=Pin; 若Pin未定值,则结果就是 不定值X

简单点说,,,,
Pin_In经过一个时钟沿H2L_F1 <= Pin_In,再经过下一个时钟沿 H2L_F2 <= H2L_F1
即时钟跳变沿来临时:H2L_F1 赋值为Pin_In;而H2L_F2赋值为 H2L_F1上次运算值,并不是现在的Pin_In!!
举个例子吧,,这样明显的多。。。
if (!rst)
begin
a<='d5;

b<='d6;

c<='d7;

end
else
begin
a<=c;
b<=a;
c<=b;
end
即,当一个时钟后,a=7;b=5,c=6;再过一个时钟,a=6;b=7,c=5; 并不是a=b=c
改变前后,由于两者的读取值已经不同,所以结果当然也不同!追问

阻塞和非阻塞的赋值方式我清楚.
改变后:assign L2H_Sig = ( !L2H_F1 & Pin_In)=Pin; 若Pin未定值,则结果就是 不定值X

//PIN未定值应该也只出现在程序一开始吧?那改了之后怎么程序完全就不正常了

追答

你改变前后的取值情况,就和使用阻塞和非阻塞赋值的 结论一样了,,assign 赋值是不考虑时钟的啊

参考技术A 如果Pin_In是由clk时钟产生,“assign L2H_Sig = ( !L2H_F1 & Pin_In);"和原来区别不大,但比原来提前一个时钟周期。

如果不是,“assign L2H_Sig = ( !L2H_F1 & Pin_In);"可能会有亚稳态问题。

如果不知道“亚稳态”的话,可以再百度一下。追问

那为什么把它存到L2H_F1里就不会有亚稳态问题?如果pin_in本身是不稳定的 存的值不也是不稳定的吗?

而且这个亚稳态问题是不是只有程序刚启动一段时间存在?

追答

百度百科:http://baike.baidu.com/link?url=-gmiueiQZ7HioDLRB7T8BZPbQ0rYbOvTfBYn26R3xVs6tGjYyOilvrMND0-

Pin_In用本地时钟打一拍后,已经同步到本地时钟了。所以L2H_F1和L2H_F2,在本地时钟域,都是稳定的数据。
所谓稳定,即在时钟的上升沿,看到的数据时稳定的。

如果数据不是当前时钟产生,其产生的时间是不可预知的,在时钟沿时,有可能数据正在改变,这时,看到的数据是不稳定的,有可能是1,也有可能是0。

网上有很多这方面的资料,可以搜搜。

追问

也就是说采集数据时最好要通过本地时钟来同步保存这样比较稳定?

追答

是的,最好通过本地时钟同步。
在一些比较严格的场合,还会同步两次,保证100%的稳定。

追问

打两拍有什么必要啊?第二拍的值不永远是第一拍的上个时钟时候的值么

追答

第一拍的值,有极少的概率会振荡,这涉及到模拟电子方面的东东了,具体可以看模电的书。
再打第二拍后,概率几乎没有了。

以上是关于verilog问题的主要内容,如果未能解决你的问题,请参考以下文章

verilog简单例化问题

FPGA verilog 小问题求解

verilog状态机中的一个状态执行时间问题

verilog 循环执行task的问题

verilog中模块例化的问题

verilog 赋值发生的顺序问题?