|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位,初来论坛。也不知道题目写的有没有问题,见谅。, }& [3 ~6 ~/ t+ w1 k4 U
本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:7 H5 j2 w" |5 X; n
& ^8 v$ m9 \ I2 y/ J9 Q+ L& r; j+ N4 i
- U7 i- P4 g/ ^. n% H0 x2 h这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/ O; ]- U6 Y: W* B3 D
) d- g+ X5 \9 f: A8 J# [$ `% o
$ k) v% V1 F+ {2 |0 Z j* ^以下是一部分代码:6 G( q8 X" J( n( T
3 _6 q9 _ H4 p4 @% K
//用有限状态机的办法,设计报纸售卖机的投币器& n9 [. l! ?. o- n
: G$ E0 w. Q: E& |& b, s7 ~
module vend(coin,clock,reset,newspaper);
- g& s |9 z- x+ ?
7 N1 ^# \7 C& \8 w- c1 ?; \* V//声明输入输出端口9 p" v! g6 e" L! Z
* F, [$ `8 u& E! M1 M1 Oinput [1:0] coin;
, @" X- L( z' M" H- X
2 |% y0 h5 Y) u0 _& G5 [input clock;
5 n8 ^5 l3 N) [5 G6 d2 T8 M4 Y: U( U& j" _0 ^
input reset;8 @+ w$ }& j; K: a- \; l
9 k1 @: r" o8 G. V/ s: ~+ g, Y
output newspaper;5 x) P5 v5 C" D% s4 j
* T! i* z0 a. Q4 q9 Q6 E
wire newspaper;
% `* e2 u, k3 t: k T" r
, W6 r8 {% f4 {4 J. P* M//声明有限状态机的内部状态/ l( Q6 C# N: v5 H
* I) k+ Y) o* @% k- q
wire [1:0] NEXT_STATE;
8 G0 m/ M; [/ U1 e( r: v4 j4 Y* [! Q( ]; w' Q% o/ ]* s
reg [1:0] PRES_STATE;
% E; s$ H9 X6 j, ]1 E0 {0 W- a2 j* e1 I2 \6 a) O+ v# r% e
//状态编码
( F1 ?/ I9 s: b6 V1 a$ h- w; q, f4 w, b" g U: i
parameter s0=2'b00;
8 }" J7 G! B& R: A1 p2 W3 S1 R
% O- k* [6 Q* i" V+ i: hparameter s5=2'b01;& o' `# N, @: n: o* _7 ]
% H+ M- V$ D: _% a5 Q
parameter s10=2'b10;5 a& P+ ^ M6 F. U$ `! E
0 K2 n* ^; I A2 pparameter s15=2'b11;# D4 N4 G( I, _* |) s
3 |( _6 P- ~' ?$ V! i$ I5 Q" V5 y
//组合逻辑4 |- Z O1 Y2 N6 A q
4 U5 N1 F/ i: g+ S b8 r0 Hfunction [2:0] fsm;" g2 v& q$ C* z, @" z0 |0 h6 T& {1 V
$ x$ v+ G; ?3 i7 K8 Y1 V
input [1:0] fsm_coin;
T' X; U, L& L. V
3 J! \. O6 B0 _/ f) E" E6 \input [1:0] fsm_PRES_STATE;
' P0 W, w4 G; {* {# g/ n5 `, U/ Y8 o
- E/ ~/ c& ~6 e! M8 Wreg fsm_newspaper;
/ n3 H, E7 s3 F# w8 ] A V; G. `5 `/ L# t
reg [1:0] fsm_NEXT_STATE;
2 u+ d6 i, J1 J' ]5 ]7 A* Q1 k. X* _: z* r% I, Y
begin: T% t% ]! }' j2 s
# |7 [6 F" j5 I5 h2 `( H! q2 e' ?. }
case (fsm_PRES_STATE)
; ?, U' Q1 z' w( |
( s9 x# u. p. V0 e S0: //状态为s0, _+ p; ?, P7 M2 J) D" A! N
% ?: R/ f' i) K% S& _
begin0 ^" E/ d: K9 u2 d
9 e. B" N: H! I) P) [ if(fsm_coin==2'b10)
: `- T$ s) z4 U6 ^0 l4 a/ Y3 b5 t" I: K, {% w+ @
begin
1 w- w+ n) g4 C) g0 u" Q2 [' W# Y: z2 j( a
fsm_newspaper=1'b0;
2 t) u5 A) E/ {% U' R- I( G, U# C* ?7 ?9 g: L+ D9 p
fsm_NEXT_STATE=s10;/ b& m1 t1 K/ o7 |4 |
2 S7 S/ x% W+ Y% } end
0 _% y! Q- }& T; Z# q$ `6 q- I: d2 Q4 f d
else if (fsm_coin==2'b01)( T/ g- a, U) j7 x; f' t
& e# r+ y9 V7 [3 D+ R; Y& ~% c
begin- Z9 h3 E+ t/ B. B
( C: ?8 R3 i7 h+ T7 N fsm_newspaper=1'b0;* ~6 b- i$ N$ U* i; Q5 T) c! E
; ~5 W' S/ G+ X2 E" [& z
fsm_NEXT_STATE=s5;# T. ?- B O; f$ b+ Q: N
2 n- D* w [4 o1 A( f1 K; { end7 w5 U/ M) u R
. m+ ]; t2 [% i
else
- L* o+ v& g( J3 D+ y7 H5 F8 ], R8 H6 J
begin
4 y+ @ }$ T9 U/ x: \4 ^, R: v0 Z g1 M, Z
fsm_newspaper=1'b0;
, D2 @' E' T6 _0 P' q0 S
8 @% L1 @0 f! ]: S F) J( W fsm_NEXT_STATE=s0;
) K8 P3 r2 z0 `. k; o7 j- ?. `5 P( H6 ^
end$ o3 u/ k! S/ K
, D' K- u3 W0 P: B4 |/ b8 D6 Bend
* h0 z% l4 a$ F; ?/ D0 Q2 p3 y" t6 u* r% X" U
/ N8 A* z, ~. J! k& j6 E8 I# B# t
" @. @. q X0 E9 j, B
s5: //状态为s5
. L% V5 l& m6 U, {
, z4 {$ R! N0 I, } begin
! r: R3 g Q7 U/ k- D6 q% ?
) g* k: v4 j5 V if(fsm_coin==2'b10)
9 J6 V- K) P% Z& S3 z- k1 p+ N* U1 T2 z9 f- j+ |5 U- l
fsm_newspaper=1'b0;3 t" k: M* c% V; X) C4 g
) D2 C! ~' L& I3 ]) ?1 B R! |
fsm_NEXT_STATE=s15;( y* x* X1 @6 ^' J) i* I* d6 J8 R
: j5 g% ~* w9 ]0 O. v# u1 {* u
end) d8 ~% r0 u4 s, J0 v" m( q
4 l! j3 r4 D# h( C6 l
else if(fsm_coin==2'b01)
1 N8 g( w3 E! H _9 f) ^+ j
6 k( P+ @0 y4 o% D: P* D2 n9 F/ B/ A begin 5 O5 J6 z, B! S S
% P! W/ k) A+ g b fsm_newspaper=1'b0;) H+ E( s6 D* ~5 z
( e" u' n- U& d1 S' ?( l
fsm_NEXT_STATE=s10;
. T, |7 e# e9 y/ L& k1 B4 ?3 H X$ V" S+ T, }
end
3 ]( }* [0 s2 B7 n; k% u else" t: z8 [* e% G2 q7 ~( x1 r
; t; Q$ r& u% G! [; @5 E7 |7 c begin
; ~( r: M- |- t7 v4 K1 n+ q7 w, F- H' P8 W: l. ]
fsm_newspaper=1'b0;
3 H3 l y$ S1 l. f/ ~) _, ?+ r x: v9 D0 }
fsm_NEXT_STATE=s5;
: f' ]) ^* {+ N8 Q7 T. ]
+ M2 e' u; J3 c8 R% F/ b2 f end
% |3 V: _2 _' U: T+ o6 {9 B6 E7 U' k( U; P. L
end
, A P u% a7 n9 _8 n
+ F$ |* b0 o$ Fs10: //状态为s101 d/ O/ O1 U+ c) i9 W
* d+ a3 Q7 \7 }! V" [8 u; w
begin
7 P7 z+ H w3 z1 u$ f( h$ M
, ^" G- r ~; L' i if(fsm_coin==2'b10), b! ]9 ]3 C4 F% ^$ A' k
" H8 V$ }9 G% e7 C5 \
begin
- z9 g: k2 L) P6 q" e0 D2 L6 S& |8 ^2 ?3 K
fsm_newspaper=1'b0;
, N" z Z" B) K7 g
$ Q# g g3 S/ l! K' I4 {, W fsm_NEXT_STATE=s15;
6 ?' T/ g) p- |3 q
6 S' i' _1 D2 |4 S end/ d) ?; ^5 @* T& u% {$ p
8 b, f0 B; U% p6 O7 s else if (fsm_coin==2'b01)/ x3 a5 @& [, z9 `% u4 B
% J: H% j+ v0 n) N
begin
; W# l. d/ l5 S! h( T5 o) L
4 K3 M9 J/ Z5 _4 v' B, c% G fsm_newspaper=1'b0;. e$ }/ k" x3 p. A: n1 C
9 v8 Y# z7 d( f8 [5 ?- M0 W fsm_NEXT_STATE=s15;
, K; k$ g3 w7 A3 |
+ y7 U# z! w% k9 b end
. f! i- C# }. {) c! V$ P, ?0 c! s% E2 z& {( B+ O' I
else j# B! S) a9 S8 J; d( v1 l4 o: i
7 d6 g- _% ^& j- v0 T' [
begin0 `; a* _. C' f# i
3 I' m$ q9 ~2 o8 r& i5 F fsm_newspaper=1'b0;
% x: k: \/ q( L% B& ]) Q! A+ n A" _# J
fsm_NEXT_STATE=s10;
$ e0 g G3 }, N4 \9 D
' Q- ~7 F A5 b end6 J, G) Z1 o: T+ H- O/ O9 A
4 K3 M- x$ Q, h8 Uend
5 |" ?9 Q5 q2 x7 h- @
+ `; O! z$ s& X- F! u9 E; c5 @s15: // 状态为s15
- |% y) e0 f8 x: [9 v3 g7 m: r% D" C6 ? ^0 `# o$ r
begin6 j/ t5 j% r0 `
+ Y$ C2 U4 S8 }- D, S4 }+ I fsm_newspaper=1'b1;- O2 ^( n$ ^3 j# ^5 q
) \ I' T% R) _# M4 `9 e5 \; k0 K
fsm_NEXT_STATE=s0;
# r5 _+ A+ L6 J& w& t- _" S Q- o2 Z& q3 p9 P2 Y0 [5 d" J |
end
) g. R9 M3 Q. p# r& f( |5 v) w
endcase( ? T9 Z, ^. E2 s7 z. q+ h3 G' [
$ ^$ H5 r5 j _: y+ B9 g: P' ~
fsm={fsm_newspaper,fsm_NEXT_STATE};7 [, a H, a. @/ N8 ?
3 d" q2 _: r- V9 f7 K) K
end
1 E! g* E% }0 C- l* P1 Z. O
0 T; g8 v! r% |7 U+ r; ]1 Q; Jendfunction
9 C! Y$ N" l4 Y; e5 L4 A
- ^9 V# S& D( ?//每当硬币放入或当前状态改变时,组合逻辑动作
' l8 Q4 R+ C, B, Q" Q9 C! l9 S3 L$ ~$ H
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
6 G) }1 S! w$ H2 P/ D: k" {. M+ `6 a. Q9 a$ S
//用同步复位、时钟正跳变沿触发的状态触发器
# X0 h1 {$ Y/ e6 B
- @( Q$ r4 a& A, ]' T5 walways @(posedge clock)# @5 S0 ~; x0 q' s }# n6 l
# U# X6 W7 u$ L6 X N+ U; ?, p
begin k' @3 U. Q# R& @ F
! s6 q- ^: L/ @; H/ z' i if(reset==1'b1)
7 j( Y6 c$ K5 k( Z, o8 @0 {, o/ u; r/ k. @9 H
PRES_STATE<=S0;( j' T$ U5 ?3 j% V* R0 i' m
0 o$ s! ~' Z! N
else
' p; T) G( P# p% q: L, r7 Z" R- N
PRES_STATE<=NEXT_STATE;. H) A& c/ p0 m# u
; `' \. L1 l% z3 I. _" ~4 q
end7 k/ y3 [& r; r' ~7 j: U8 m
9 ~( v1 G% B; [2 [0 h3 r; R0 jendmodule
) [7 \4 U$ f d1 w y2 s* d" V2 c: U/ w: K4 q; ?9 y ?
3 y2 X; }* D9 s) e+ T3 ?: C; L1 A/ `+ n( S5 O7 [1 w9 D
我的疑问在于这里:
6 [ k- o' p' i5 U$ Q9 M* k! v: \8 Y4 R
//每当硬币放入或当前状态改变时,组合逻辑动作
; J* M4 g; t; u" Z9 f' u+ s: o6 b4 j/ z
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
n F, R8 x- Y( r2 a) R$ O
$ d7 K- ^, \$ ] z$ `# o& A- l* O U5 o" q0 O3 r2 p
" L# u: Z/ ~* T R4 V就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?
& z7 P6 A1 M0 V6 z% f# j
1 j8 y; S5 }8 {2 _' H8 }- r请问是不是我理解错了什么,初手还望各位指教。。。! u! _' O/ V6 q+ H4 _2 ^* h* _9 ?
ps:在别的论坛也发了,但是没人回,EDA365要给力啊。。。。 |
|