|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位,初来论坛。也不知道题目写的有没有问题,见谅。- ~6 \, M9 S( _ l; f
本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:8 V) R- a, B" V/ \0 ^+ [6 V
2 i# H/ ]* k3 D# K6 y$ X* N) p
% Z* B) c# F% X" W" k0 o0 o" I这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/3 @- O# s8 h" S: _. t
4 O) R8 w' k; D. m
# D/ r1 r T( K2 D! Y) R% [以下是一部分代码:1 g# n6 t: Z- ^/ ^; K
- O7 H9 H" t$ S* z1 D/ _
//用有限状态机的办法,设计报纸售卖机的投币器. H" I o& P' s" s) q
+ i2 A! m$ ]; @
module vend(coin,clock,reset,newspaper);9 Y9 D4 G; w$ t5 B/ Y5 o# U1 R
7 z* X# Y! I/ c: m/ {% g
//声明输入输出端口
6 A5 T% {% |5 {2 {0 I, c
/ s2 `, s) R! Y! w; A; U6 Finput [1:0] coin;. m3 t: \+ s0 d% n4 S0 I: p, S
/ Z& ]$ ~7 e: L1 u6 ]
input clock;
* ]0 l4 l v3 q' Z
' n" S( r1 Y R* b; B# \2 u4 Ginput reset;) r1 b' i# Q5 `9 l7 l6 b& e& Q" _
3 p+ l1 g$ h: Q2 J* [output newspaper;
& ?7 n6 H3 | X- S3 r* J
/ E, D! I5 }, I/ B7 Q9 V3 N6 k2 F Cwire newspaper;
7 k! @5 T1 e. V$ J8 B/ {- z
0 v& U* E. q1 z" x- F7 Y//声明有限状态机的内部状态/ a( Q. \# H. n% `7 ]
2 b l/ c# j! m. ]wire [1:0] NEXT_STATE;
( m! _* N* D+ [" @/ \8 D
; S: {' L, Q* `reg [1:0] PRES_STATE;; Z2 k8 P9 c, B5 A" n6 z: |5 z |* v. E
9 v$ R. z/ A% h, E
//状态编码
5 j7 s) D* q H
2 {: `8 ?7 W+ o0 K; cparameter s0=2'b00;
1 ~0 F5 }0 G3 h1 G2 @3 G9 j+ P" F; N& P
parameter s5=2'b01;
h4 u0 H4 Q: J. b3 C! R
/ W8 s+ f% m9 s" S2 L, q+ Aparameter s10=2'b10;( i: ]% T9 J7 S/ W! A
: f& S2 u' E) |' M4 K: n- z- M2 v' Hparameter s15=2'b11;
# d+ V6 B5 ~2 s
& k: J" r4 l( j" D* s% }/ M//组合逻辑
6 N4 |0 R7 x% r5 W0 }1 M, y2 ?1 R2 g" ?' D" ~; n, k
function [2:0] fsm;4 o0 T+ U7 j. a& I% J$ B
* E; y) u ~& h0 t; X
input [1:0] fsm_coin;7 ~3 s. q: U7 a2 |, x5 ^
2 J# M& L5 x- m& e+ A9 g8 p2 s
input [1:0] fsm_PRES_STATE;9 l2 m8 R% Y6 K, L I7 G2 i( g
6 x8 x9 Z9 U2 T; h2 U+ sreg fsm_newspaper;: _0 F& ~& \9 H' @8 W* x# N' e# x
1 y8 l& b3 }! Q" R$ {
reg [1:0] fsm_NEXT_STATE;" u" L5 Q: O- `, P5 n) L3 U
) M: r- L, h, |/ T
begin H K* A5 \ w& V* j$ l/ h$ v
1 n$ o# M9 l, q/ P7 _" b" t case (fsm_PRES_STATE): k1 L1 d* a+ b: Y0 _) a% e( r# D/ V; \
) \ a0 a! }: [8 _; z
S0: //状态为s0, ?! ]! i) C" D+ n- [3 d; i! r
5 s" F' ^% {, c; c2 D) c3 f7 n begin
2 D) U8 j+ V& |* A3 x& I1 Y" b k* d
if(fsm_coin==2'b10)1 S3 z1 H, o" g& h
( Q0 h9 p( t6 h4 }# d5 L
begin7 W$ j: w* o; p
/ ]6 ~2 Z/ f: P' l% j fsm_newspaper=1'b0;8 v/ k) o7 t( d7 Q
# G6 s& \. t' }* R, t! W9 a2 p fsm_NEXT_STATE=s10;8 V; [! z& X" a% y& R
! z' j: b/ I- o& {0 _
end
! f1 n' {9 z* h" z
1 }/ C' m9 j' l9 \1 R else if (fsm_coin==2'b01)
5 N" `( a# x7 q$ @+ z4 C1 Q C6 T+ h" }8 p
begin
# J5 _& [) B S6 m/ d! S) a1 k* @& M1 h* i2 T+ V* m
fsm_newspaper=1'b0;
+ N' T3 f# C5 O- U2 y8 H6 r3 r8 E6 z2 N6 |9 a
fsm_NEXT_STATE=s5;& V9 R) _, O- @) R" v5 b9 m
+ l+ ]! }, H) C7 t
end8 B, }& f4 g4 J% k1 f9 O
# k A; _' @. L- R' a
else
7 @- ^7 d! i3 P! P9 W
% d4 B* @" R% U; x! o% { begin5 \2 p/ ]$ N1 r- c7 J* N
* V- u, z0 u& Q) _' D
fsm_newspaper=1'b0;: H( T% i: D/ n |
7 d0 Y/ z0 s, y; F0 ]- @' t
fsm_NEXT_STATE=s0;4 ]5 l' i9 S0 D
6 g, t' r1 [2 D6 \5 ` `; A
end! E3 l9 S4 Q' V( U4 K; B& o
- Y8 t+ f- B+ }7 A5 O9 E7 Qend! M6 b% i. {$ ]6 S
" ~( W6 [& r4 v1 v7 i( t3 d
1 W, p) _/ D' e: Z, z/ b5 @
* g! @2 p& ]) Is5: //状态为s5$ Z0 z) f% S) E% s( I/ w. y
1 B' r% \4 R$ x
begin$ X4 e* b! }! F8 h
! C# U6 u4 \& a3 G9 E& h% g* I* ~
if(fsm_coin==2'b10)
+ A. a- \/ @' N& F0 `) ?* F: ]; n4 v) r, O, {
fsm_newspaper=1'b0;; ]$ y% F% s8 P
; x; H' e y, s3 ?0 ?$ N. k* R; n+ t2 }
fsm_NEXT_STATE=s15;- o! O* W5 {) ]8 v
" h; r: q; }8 n! ]
end
4 J2 ^/ c1 F6 i* P1 B! o+ t# U, p8 g! i
else if(fsm_coin==2'b01), M! M$ m, r+ S/ o" I5 k
4 x9 G0 t7 J% G# a3 R9 \/ c begin & x( H5 b8 O3 W
& ^2 s! P- ?( \0 M' S1 @) S fsm_newspaper=1'b0;& ]' b* k, n' }( Q6 l: D3 o5 n
- a5 m4 u b* B8 s; A fsm_NEXT_STATE=s10;# s+ H$ g8 u: @, q1 r
! c. n5 A8 @0 G1 j- L. Z) a2 K
end0 \% i5 W/ g6 I: A: ~
else
- r) b4 Z# t/ L9 i, s6 ^$ }& L
begin% T; T8 t. r1 f: C
1 i( g- V, ~6 p% w# ~& ~7 R$ f
fsm_newspaper=1'b0;2 h6 w9 K, X$ F+ v$ U! ^
& n+ G. A& Z4 s9 ^0 a R
fsm_NEXT_STATE=s5;' B4 T0 J) t* N2 Z( b: M$ J
a) d/ n3 o; d6 `' W4 n3 Y
end
; N( w4 L* a- g# e) ~- B- T2 K5 u
0 w; {0 h7 M& K+ ^7 W4 s! O& i+ Z: iend' ? j7 E# j/ F& }
: }! C" }" c5 |
s10: //状态为s105 P8 z" T5 l5 y! \
4 {% i! z4 F8 g8 S
begin- f3 s; l' Q8 G: f
9 K% X; E# T$ y! B6 v" h if(fsm_coin==2'b10)
/ j1 p u4 {) Q& D: d
Y! N6 Z3 ?1 i# q begin
: r8 z& l) Z5 r; W, X# V" d& |3 c- Q2 b- [
fsm_newspaper=1'b0;9 T. j; G) g5 I; o' @4 u
, d: n: h. v( [4 X. ?9 o; [6 q fsm_NEXT_STATE=s15;
# @% u% C/ d* F1 K2 a$ W. u% y$ c% F4 S, V9 W0 L! K' U2 A
end
7 ]0 ~2 q. j9 R- Q; \& n# O+ F4 D5 N9 P2 v
else if (fsm_coin==2'b01)& Q5 G5 U/ v9 Q! v! A0 z
Z: F) D8 v. k: q$ x5 B) V0 z0 Z begin0 ^9 G0 v" l/ E+ l- ]
# J/ ~$ i0 W8 r fsm_newspaper=1'b0;
+ t8 y. F5 v& A' S u$ Y: O$ c4 P+ p& x5 N* ?0 K4 G
fsm_NEXT_STATE=s15;
8 ]% X3 i0 s: k4 V- D2 k7 i9 b+ h: q/ j+ b% s& e' M' a4 E8 Q
end0 i2 h& M2 B/ J& b; X# v2 b/ e
, {0 ?( \# \3 t3 z6 i0 |
else- O9 L6 ^9 v) X% ^) `# E
" Y# q' h$ j, x& N begin" b* V% B( F# Q3 x# N% B+ i/ g
" y5 t# a9 n. Z6 a& Q
fsm_newspaper=1'b0;' ^- p" t& s% i8 g. Q
9 X0 m; i4 N$ L- c
fsm_NEXT_STATE=s10;7 ^8 S- ?/ {0 m1 C7 n- ~
" a, T4 a/ U( o% p T/ v' p) o end+ ?, ^# B$ ^' a! A* k9 m4 ]
x8 @( k5 t# z! w% Z
end
3 y0 l0 I9 D8 c% I, x3 B; x& P! s6 J& n ]9 A
s15: // 状态为s15
# X( M. A; B% A4 q( ?6 y7 H0 o4 n$ {: w
begin
7 T8 _- l! X" f" D) k' b3 \$ x+ {$ s8 B& s+ b3 ]
fsm_newspaper=1'b1;5 o# r7 [5 z0 _: j( S% S. v& l
+ G5 }& ~$ ]: E7 q3 c' Q
fsm_NEXT_STATE=s0;
- B2 {+ j5 f$ j3 E( U) v
/ E6 A7 O7 n9 Q, y+ Q end8 x/ a; J# Z" z: |9 x$ S! L
8 t z, i8 V7 \& z" ]& W# M. r
endcase% O4 ?# D# p0 v$ G4 w
" x1 l! _! p: g* Ffsm={fsm_newspaper,fsm_NEXT_STATE};
p* z# @" A/ G. M+ _
2 S3 ^" s: f+ s. T" g: Xend: b! ~1 N* A$ g \
8 ~) z T) Z$ M) x" ^
endfunction
* m) w* `* f' ?: M
' u) l/ d& t! H+ H" L l//每当硬币放入或当前状态改变时,组合逻辑动作4 N4 A& g4 M* R$ D
* @4 b: ]3 f+ Q* L5 [+ v" Yassign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
) t x$ a5 w$ N% e6 m# ~+ P
. |) O: P, x5 J& o+ N% _//用同步复位、时钟正跳变沿触发的状态触发器
; c$ [: ^% N- O8 c; k! m4 A
5 @, r" H' ~: a6 Z5 ~; ualways @(posedge clock); e. d% {% r. Y0 I: F7 X4 b
* f# a9 q3 P' w4 F) c
begin5 Q0 U3 }, U0 i/ L! z
5 H, {" B _$ e if(reset==1'b1)3 H7 j$ d+ v/ O- p
% P2 l9 B/ ]* \ PRES_STATE<=S0;
( _2 u# ^& o5 F) T0 [
5 z. w8 C/ m) T7 R K8 m else
: r( x) h( U/ {& \" j+ _5 S1 ?& d1 j3 A
PRES_STATE<=NEXT_STATE;# v0 p d3 m7 a i$ z$ N
" M$ o( r/ [+ V$ O end
" `4 V: k& o( d8 k3 `9 x9 _! y" n/ y9 v4 E4 L; b0 G6 j
endmodule
; [& z4 y9 {, D: o
3 \* J& G+ F6 v; q4 E
7 b5 Z1 ^- r* M% ^
4 H) ~8 @; D+ b) ?5 `我的疑问在于这里:' z. }+ n3 B f6 ~( a# h
6 ]( F& S9 ^; n% K! v
//每当硬币放入或当前状态改变时,组合逻辑动作
Z' H1 z* w4 |- W" T- S9 ~6 w" t) {/ _
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);; C/ H7 v. O& T
6 O$ l( W& @" R% R- G8 |# Q0 x4 g2 B, ]4 p5 ?+ Y" Q
7 F# p% \3 n7 A就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?4 @7 O& M1 S ^% p
+ k3 j" F* h, H; W请问是不是我理解错了什么,初手还望各位指教。。。: Q9 p. i% z! k* U+ {
ps:在别的论坛也发了,但是没人回,EDA365要给力啊。。。。 |
|