|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位,初来论坛。也不知道题目写的有没有问题,见谅。+ U2 e* X ~1 v9 v! P
本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:
$ c) |8 s- ~9 g' d
: C9 j6 f+ k; Z9 _! t; a
" k; X$ ~& e1 G, t- `) D这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/
1 d7 m1 V5 ?8 t% _) J
- [( D: M; U; m5 U/ ]
& ]' M" m! W: t4 v I2 s以下是一部分代码:
" f+ j# R, v0 T$ ~0 I/ X% d
! t2 v7 b. [ j$ Y: A6 v) H3 V//用有限状态机的办法,设计报纸售卖机的投币器9 C% O! \6 Z7 I: k7 L4 I [4 r
/ d5 L+ F' g E- a/ e. S8 Nmodule vend(coin,clock,reset,newspaper);
( _3 }8 Z; {1 d% a3 O7 p( ?
0 l( t4 l) w3 C, }5 d* s( A//声明输入输出端口
6 P4 i1 `- o! p# Y9 f
' y+ C1 P) Y, jinput [1:0] coin;
/ m( W7 g( }! G; {
; t; y5 T/ t, P. p4 ~input clock;" \0 }$ e) ^. B( d3 v# @; c
2 e/ @3 r( ~5 k! i5 [; o! Yinput reset;; m! m, V' D/ z9 Z5 C
; n( d# @) [, } |% _1 h1 @
output newspaper;
3 b$ V7 s( D% ~* i. m
& `! q( C" B8 C$ n0 gwire newspaper;+ u- H5 n3 e. A0 {) Y8 S0 V
; J5 U/ a8 a8 O
//声明有限状态机的内部状态
( O, R6 X5 G" t: S2 C" j
5 |9 J( J: P3 r N: Wwire [1:0] NEXT_STATE;
; I# h" I4 ]3 y; i
: W) V% x* Y; ]reg [1:0] PRES_STATE;. R- [, k3 l7 B+ ^9 K0 d& y
9 E' @: r& N) u& |; F
//状态编码5 r& V% h! P: Y- Y6 K
; s/ B7 `# H+ p3 V' d% [* Aparameter s0=2'b00;, [4 M+ O3 l, _+ F
: _, _4 I: i6 P6 m3 K- Q
parameter s5=2'b01;* R6 y3 q& P& K6 F+ Z" E( y/ O
1 U, _. m$ h \% P6 Q
parameter s10=2'b10;# E' z! g. u$ ?6 ^2 K0 V/ x& D
& c' U. X: i5 V% X/ e, zparameter s15=2'b11;3 S: k+ ?) i( [' l" O
+ @& C2 }7 v7 g' E
//组合逻辑
5 \9 g9 U# a. S- P
4 Z- c1 i1 I! t/ E5 i8 A W8 S7 ]3 |function [2:0] fsm;
d5 G9 X# u' U ~: N+ P
# e; h; D b' I# y% G4 K4 {input [1:0] fsm_coin;$ K% H; P, B; y, d6 j) g
/ u5 l9 H/ R: I. N" ^4 q
input [1:0] fsm_PRES_STATE;
+ K5 U- \/ r) f; o. V7 {! [2 E5 c5 k, M
reg fsm_newspaper;
P" i. P* h o) S+ z4 v2 l2 `
1 ~$ y5 e6 O$ l3 O) c( g& U/ i6 Ureg [1:0] fsm_NEXT_STATE;
% B6 G6 W. D) i& U% @" ?4 @! R2 r/ f, ^5 f5 X
begin
+ f: E& T) \' M# N: v/ k* _1 m' e {2 a- H0 I2 B
case (fsm_PRES_STATE)9 O! a9 y4 X4 C+ h: }
' A7 ?/ @: i' V" X& v
S0: //状态为s00 _3 D3 w) B' f) h# |
. D; j; b$ L [. g6 I
begin2 q3 Z5 U. X8 J! }: @ [4 H
/ e5 K' X/ {$ b& u. B9 P
if(fsm_coin==2'b10)/ C6 g/ m8 z# |8 p5 E) ^ ]
8 O2 R2 g. p$ b' q, E' V
begin
2 U$ Q0 |: Q7 k, ?& r3 W$ p
4 x/ T7 B/ V7 {7 y# E. G: N fsm_newspaper=1'b0;, O3 B' L$ x( Q$ h/ d% q( K! i
5 |! P8 h! y1 N0 a" ]* h9 q. e fsm_NEXT_STATE=s10;/ d* O7 r, f% E8 P* S
+ i$ y+ X$ i! m
end- d+ G( C9 P: ]$ C2 m1 _7 k3 W
6 e& r# v1 A1 b) G4 Q else if (fsm_coin==2'b01)
9 N0 m& Z! j6 t# b$ U
# g& Z0 ~. C- r) m: x% d6 Z! }/ H begin
5 j D4 R+ \! I U7 }2 i- a. z$ s1 u) w6 U! t/ B0 ?# }" c
fsm_newspaper=1'b0;
+ Q1 `, c! y: B4 y) N+ W5 _* U0 I- V! r; |) r% H) s
fsm_NEXT_STATE=s5;9 |/ A( {' x& T0 c
3 B9 o# U& G. O+ i
end
/ |4 B+ r0 |! Q3 l, f
7 F. ~' w7 h R+ L) r* u2 _ else
R/ l* Z8 E# j% B, C2 m v
9 ^9 a* m2 H+ q& m2 M begin$ e' R/ P4 K" N
* x! L# }7 v1 ]4 g& R+ I fsm_newspaper=1'b0;' p& G* l7 o' [! i* x% u ~
8 }! v" t" M( _# v8 k: E fsm_NEXT_STATE=s0;2 P+ D7 Z8 Z1 {; O; L
6 }9 n5 T& U! p4 s# X
end
2 _) }% c: @7 F! v, g
0 Y7 J& G" w* [3 E8 T5 u3 o3 y/ M" vend4 n) r( h9 y; B
7 J* |( I& f* j, r3 Y7 A- ^2 v; W+ C: \8 O7 l( V& W% ^$ i
* T* V0 x+ N7 I( r+ |7 j0 |s5: //状态为s53 R; G7 V& K4 E% V* M7 T1 _
% Y& F: B/ w5 U1 v" i2 U8 L begin
1 f" k( {0 s s7 U& q+ _; q+ ^
( _0 B; S I* l/ I5 D if(fsm_coin==2'b10)
6 O4 o3 o6 `# c4 h! L0 V" m; m @; @! G! B
fsm_newspaper=1'b0;
8 t u6 \- M3 v3 S, r. _0 H9 L, Y: {5 I
fsm_NEXT_STATE=s15;
( E0 N2 m! Z! E m* g& O5 n& L7 ~4 A
end
5 ^# p( K! |7 a1 m9 O/ M+ n! S
+ Q& Y+ O! @) F; Y3 L' ?( C else if(fsm_coin==2'b01)" b/ b- d) y! s. E5 g" {
9 J. n+ a) ~$ ^' u6 x3 @9 D$ ]5 a begin
/ ^: F9 Y+ K* a/ n, a+ I& O3 {, N4 e( \5 s7 {9 J9 ^
fsm_newspaper=1'b0;/ r8 Z: ^) Q! B% `4 a4 c
9 a3 b$ b5 ~5 f/ i
fsm_NEXT_STATE=s10;
0 I5 ]# p: S5 Q/ b- H: v" Z9 G2 E* I9 u+ ~- F4 w+ W- E# Q
end
. H' {+ j- C6 J3 m0 x6 z L# l' u else
$ G+ j. B. _; r- ^5 R0 C: x9 S# V: @) v) ^$ N* x1 b) M
begin- \$ z7 Z' ^' u) r) J
( |* L4 {1 a2 @5 J/ l; Q) u t$ p
fsm_newspaper=1'b0;
% n! o F3 b9 ?5 O8 t
# H+ r; C" ]" Q% K* X6 X2 { fsm_NEXT_STATE=s5;
. t/ w1 F9 p5 Q1 p9 s& }% D# N' L% m
end
: S5 N% }/ u; C. @7 G+ S$ N ^$ X' `4 w# w" w
end* z) R ]) q2 l6 _) `/ g( B
0 A/ G& U( s* [# M$ m
s10: //状态为s106 @3 ^$ {: ?* U( V
! t& C7 } J k% n7 L
begin* i; t: M5 \' z. ?! X) c
- G( r# `# A; ?6 o5 U& { if(fsm_coin==2'b10)
( h' J* ~: l8 D) s' E
" b$ `8 {" u) i begin
0 P/ n6 K( v6 k9 s% ]
. H5 d1 O, p+ \' L1 ` fsm_newspaper=1'b0;
" W- W& ?: u* E4 H% q* s& e) k$ c7 |/ d
fsm_NEXT_STATE=s15;
$ ~* H8 j0 |; |- C5 p- e7 e! E2 a- s2 P& k) o, Q
end* j1 ^4 X- l0 [, b: q
2 S- Q, {! s/ w/ P5 t7 N
else if (fsm_coin==2'b01)
, x! B7 N; t5 Z0 N. \- C7 @& ?( p; }& _2 Q+ _5 K6 L$ m
begin
0 ~" m0 F/ c' ?* ~" Z
# _4 R3 a" q) b& t fsm_newspaper=1'b0;
; P0 h4 m8 \, B: k( n( [
+ }; e* O. E* G7 D$ x fsm_NEXT_STATE=s15;
: ]* D/ F9 q7 A
" h& P8 V( P3 V% K( ?# O end
$ ^3 f' G# K) Z% c1 W/ A
* o2 V6 B1 a+ \ else8 K: j0 v: G( N* r# B4 q3 k
. U" h9 D; F4 m* p7 @4 B( R begin6 j! g s R! Z2 l
& O0 ~# `: D$ t% g& }; j* w
fsm_newspaper=1'b0;0 h8 P8 X F4 j. z- Z
) n! D/ F0 s0 T& u: n/ I( u/ @ fsm_NEXT_STATE=s10;6 ~2 T+ _- t) G9 E4 C
3 j+ U6 D& @1 O- _
end
; J5 w8 a5 Q0 F+ S9 d. f* f# I4 A7 G# |$ S& Y9 B+ z" a+ J9 M% H' C
end: R" A4 k+ v" Z8 P5 G# I: j
+ n/ i/ z0 L" j& X' e
s15: // 状态为s153 B, v9 E" r, f' a5 p/ d% s% }
2 z, ]& W+ U. O2 \
begin9 m* l. w9 O" w( t+ N% Y
8 ]& _7 W7 q2 J" v' c
fsm_newspaper=1'b1;
, {$ r L* E/ _! p+ N8 ? t0 N3 k6 z' o: H* v$ o
fsm_NEXT_STATE=s0;/ C* E, D" b0 u$ W& c
9 s6 `+ G: I$ ]2 B2 F9 S
end
5 @6 ^* Q) L6 `3 X7 P" k% n7 w+ K5 C4 j( T
endcase
$ F( a+ L% s+ `, a( x
$ z% N' Y( q3 n2 L; c, i% nfsm={fsm_newspaper,fsm_NEXT_STATE};
7 E+ J l/ J6 h g" L# a& n0 V$ s5 w9 x- c9 b
end) _( }! V2 l- O& R9 I5 n3 ?: j) ?
+ R/ U, B5 J) x$ ]endfunction
9 s4 }6 p, o7 G. n# r
$ z; H- i# N- y0 E! D' C6 P1 P' v//每当硬币放入或当前状态改变时,组合逻辑动作- G K. `& {4 c" }1 V$ i
4 w1 E) [2 N" k& l# u1 U' F, `% `assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);; ~% P' g( a, p2 y0 z* f
# C J* ^$ e! b# P2 C [0 F//用同步复位、时钟正跳变沿触发的状态触发器- m. G$ m- c* \/ m
5 x* H, o+ _4 u# W2 galways @(posedge clock)3 G4 h0 _" {7 }& p1 a9 W! o
) W D- k7 o0 N- l/ _3 |6 e7 T
begin* L0 @6 h. X! Q- S: z
. Z$ B5 m9 @- {$ u) b
if(reset==1'b1)
; e7 l9 o/ k6 v. M' I6 T, f9 p
1 F7 ]' d$ V% g PRES_STATE<=S0;, Q. R& c5 n; G: @
4 V) [( X6 M0 L7 b+ ^& z8 F else
& s) R# Y% ^# F; u6 J
! a. F% k, r5 X8 V% L, X PRES_STATE<=NEXT_STATE;
- o' I! T2 \5 W* \: d: l& ]# S+ N1 q( w8 U$ Z% A+ D
end# i( j/ \! k3 y) l! e( f1 u0 q
. _3 u7 K& E# z: |0 W$ J2 q" a3 {endmodule( \0 s' U2 V% m- \2 }
. R; M* L$ m( h9 P- [
5 @0 R3 k5 G! U( _- c" W6 X
1 K. N* k7 h" d; N# g
我的疑问在于这里:
: @$ ^# U' w+ d, d( b/ b, S+ Q. a& D( |. V4 l4 Y3 B
//每当硬币放入或当前状态改变时,组合逻辑动作4 d5 \! A' \3 l, B& D
, _$ A( f$ d4 w' s6 i
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);2 V! v) s$ x7 X: _: a
# v4 a7 y0 K. e! T" T, G5 ~* h) s9 a2 h# Y8 `
/ ?7 l7 R. a4 Z) u+ |9 H0 S6 m
就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?
6 T$ `8 J# p2 d3 n9 R: E/ M( G' B" n2 i2 @/ j8 e
请问是不是我理解错了什么,初手还望各位指教。。。
% S7 h/ [1 d! ?, Q3 H! xps:在别的论坛也发了,但是没人回,EDA365要给力啊。。。。 |
|