|
|
1金币
[例1]. 用阻塞赋值的反馈振荡器
3 u) ^$ N) H+ S5 Y [ module fbosc1 (y1, y2, clk, rst);
/ ^6 _! H$ B9 H; e output y1, y2;& Q$ w# R g. i4 i
input clk, rst;
/ b, O, Y+ n: [2 p/ R, \ reg y1, y2;
. G p0 _9 U v; ^- K) Z& V5 K. j2 V, |, l6 F* k* x+ K. ]. Z7 @. _4 s
always @(posedge clk or posedge rst)0 s% N U9 }3 N C
if (rst) y1 = 0; // reset
. C: \4 p0 o& U- k( y! ~* O% X! w else y1 = y2;
* \7 ^6 l# R6 H$ g) k' l8 x/ |9 X
8 P' j$ ?9 q5 B3 \* u always @(posedge clk or posedge rst)& k1 O( S# y) x# a) r: O- B
if (rst) y2 = 1; // preset6 Z$ R5 r& Y% C1 G# ?$ @0 ^
else y2 = y1;
( G4 \; \2 n1 a endmodule$ w2 L' s" M& m! p* k& x/ ^+ E
. F0 Z' X6 v* R5 Q依据IEEE Verilog标准,这两个always块可以以任意的次序执行。如果在reset后第一个块先被执行,结果将是y1和y2都获得赋值1;如果在reset后第二个块先被执行,结果将是y1和y2都被赋值0。这个例子清楚地展示了一个Verilog竞争条件地产生。4 n6 {1 k- f7 H3 K! F
/ h7 w v8 k8 k: @) d1 v. F
很多书上都用来这个例子,我google中翻了10多页,也都是这么说的,并且没人质疑,那看来是很对的,而且也没人问为什么,那说明这是一个很简单的不能再简单的例子了。可是我愣是没想通。希望各位能指点指点,在此先谢过了。6 V& U$ v$ |$ @) ?) W- d
0 D7 U' E- {& H: W$ |
如果第一个先被执行,那if (rst),就执行y1=0,然后,第二个块,if (rst) y2 =1,为啥不对呢?谁能告诉我,我哪里错了呢?谢谢!!!! |
最佳答案
查看完整内容
拙见:
“如果第一个先被执行,那if (rst),就执行y1=0,然后,第二个块,if (rst) y2 =1...”
是reset后先执行和后执行,reset期间是保持复位状态,原文是:
“如果在reset后第一个块先被执行,结果将是y1和y2都获得赋值1;如果在reset后第二个块先被执行,结果将是y1和y2都被赋值0。”
|