|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位,初来论坛。也不知道题目写的有没有问题,见谅。
$ R" G& V+ G0 L$ w1 O+ x本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:1 k1 ]7 s1 m* M4 Q
1 u! |' f7 f5 P
4 ^1 P! k7 N+ \$ b# D这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/3 m f; T. W; \
3 l1 l% m' s) _4 o I) l4 I, x
以下是一部分代码:6 e0 f# s$ H0 C
( o+ w' N& c8 l
//用有限状态机的办法,设计报纸售卖机的投币器
% J8 D0 v) F3 i+ a, u5 @' {* u( W. m# G/ u
module vend(coin,clock,reset,newspaper);/ E7 T3 w6 c4 i2 @1 |3 a; \
" {0 B/ U+ Y, f5 [- e
//声明输入输出端口
" \3 a: e3 @# `+ _% h# l
3 m' F5 o2 t; i4 y4 _% zinput [1:0] coin;
$ ^1 w; Q$ H& o7 i
+ b0 A. D0 m6 v9 i# Finput clock;
& z% ]8 ?! m* \1 q
$ |2 d/ w+ a1 E9 E* k/ o: oinput reset;
, O) E1 K+ N* y% R/ W$ m
- N/ q" c7 t0 E I soutput newspaper;
# b- W. u5 h; z/ l
3 Y. M* }( `9 E3 Twire newspaper;% I3 ]# L* N; F$ b$ H
2 c) [( a x8 ?) M5 {+ n
//声明有限状态机的内部状态
" G; M" ^& u- L
- o3 C7 C+ T# t9 @wire [1:0] NEXT_STATE;
) a$ K8 I/ }3 I9 f# n; S: t: x) G/ X; D" n- z
reg [1:0] PRES_STATE;
' l' s1 X, y. T6 h O
; m: Z* ^: x8 `+ f; U) _* d//状态编码, T: _4 u6 b( a
/ }; M6 p8 h$ O+ B: X# n# k* ~- x
parameter s0=2'b00;. v$ @3 `; P. b% ]. o7 E
% `- j5 G- g* D. D Q- Dparameter s5=2'b01;2 G8 m" n+ d9 l, u
# [' g' v4 e/ w; w* P+ N
parameter s10=2'b10;- M# ]+ \- [* v
- o8 \- x( h2 T
parameter s15=2'b11;
1 z6 X& \- Y' Z/ j. c( d+ X! G5 v2 ~
//组合逻辑) \2 _( r* b2 n" o% P- U
3 U% [4 r1 U; M; o! ~) p1 i9 jfunction [2:0] fsm;9 g( B6 b# P! G: K$ e2 p$ d+ [
, F d! I& z# d, j$ y3 @input [1:0] fsm_coin;" t' L/ c: {6 C4 [ r1 L9 x
7 |' {( y. [2 ]3 binput [1:0] fsm_PRES_STATE;$ `' n. J/ p8 f& {) l' Y
( N; r( B+ P1 b
reg fsm_newspaper;/ t2 u( N3 ?* |! I1 t4 p% j) G9 y3 q
" V5 u! y; S- V8 G5 {reg [1:0] fsm_NEXT_STATE;
" V2 n, b! L. W! x2 t; ?: w; h1 P/ f+ @: c0 [! ~
begin
; \) s4 |! {2 O, t# x$ x& j s6 Y+ V! l7 i
case (fsm_PRES_STATE)
9 @7 p0 x- o% O8 s; A
5 @( @, Z& `2 o2 A. k" [! N S0: //状态为s0) `+ X: M( r7 Z% f* B$ F
; V4 y; O# q; \. g begin
# v0 | V$ U9 m7 `/ @' O# Y. v2 G2 W4 p5 z$ ~
if(fsm_coin==2'b10)* F" A" a% Y. b/ ?! u, [6 ?% ~" i( \
n8 @% j9 S/ x6 m
begin/ K t( a4 [+ s& R
\$ R% A* J4 f fsm_newspaper=1'b0;2 J9 j# ~% Y5 \8 e. x! P2 c
- F% ]% V |2 e7 W# w
fsm_NEXT_STATE=s10;
+ G7 }+ I5 C0 V W+ |( z8 l/ O! t8 `4 P- U" R
end2 C8 N5 m" G7 V9 k1 V
. C/ ~9 s* i0 k/ P @; \ else if (fsm_coin==2'b01)& {" }/ C$ X7 B# l( {
) a: B3 t4 J9 _+ V1 `# D5 g* j
begin
4 p( N+ ^2 b. S1 u6 P, `) C$ o
fsm_newspaper=1'b0;+ U0 C/ ~7 t! Z1 X- W0 ] r+ b0 t) Y
" Y0 b2 j4 b+ ?* ]* s! q1 j1 Z
fsm_NEXT_STATE=s5;! F2 E' q" q1 ^9 F( }2 S- K$ {
- p8 r) d8 ~: z2 W
end" T) n2 f3 b! k$ [- S$ l
7 l+ u! e7 A" x/ B" b
else1 U, B# R0 j. X% g( J
6 a2 R1 F, y/ X, l% Z/ z begin2 Q f& Z5 m7 q# A
2 G/ ~* v C# A' R fsm_newspaper=1'b0;6 L! V% t* A0 `: r. Z
& F/ u% `9 Y& N
fsm_NEXT_STATE=s0;! w c1 b$ M$ z% J/ n" M
' @6 S+ S! v0 k- j1 I
end! a Z! D5 R# J& O: A9 W z
' E/ s$ B: M) N1 |end: i' A0 a( U* u" d7 r7 t
) m. ^7 ]( ~$ S6 n+ c) z0 |5 k( K9 m- x1 d- H7 M* U
& |# ?% b' A7 g: l
s5: //状态为s5
$ ^9 d: s# f( M( H( h
6 E2 a- W5 X3 Z5 o begin9 w. @4 h, e! X# P7 R( W
8 I2 y7 k l' s) w8 }; m3 { if(fsm_coin==2'b10) ?4 @1 ]) c) o" ?
+ K& H+ ~1 { k$ G% T0 G fsm_newspaper=1'b0;
$ ~, x3 a, o1 E* W% D" ?% F
7 v, [2 z' P2 W7 @0 N6 A% B- C fsm_NEXT_STATE=s15;
! w, C1 ^3 v# n
: c0 @) F# e- n* Z end5 \* z5 j4 b' C% ~
' x- D1 o( j A9 V* E) s# | R
else if(fsm_coin==2'b01), s2 s% T$ r: X5 e& K
3 n# A A: C/ S0 h5 o
begin
+ H' G+ B) r% S9 c
- [. Q: p' V( ]* K# p8 l/ E' u fsm_newspaper=1'b0;! S( Q2 g) r( I, n
( y7 R \$ @, i0 _6 Z
fsm_NEXT_STATE=s10;/ t- I* f6 d( c# y8 d. n
4 N9 W+ L3 t9 n' n3 V { end
. @: U+ l: M+ p6 R1 { else0 n) ]4 m$ r" k7 }8 L) i. R$ L
0 x* q I6 `* t* w- ?: g, b
begin
1 z8 E$ B0 D% A/ j
7 a$ c6 C. C; `9 C7 L$ Q; c+ h fsm_newspaper=1'b0;- o/ w9 O; X& r+ c3 O
7 j# Z3 }6 i% ` K
fsm_NEXT_STATE=s5;
# y9 v$ p8 n4 `3 c% p' D
5 Y C; ?5 ^9 i' ]$ C# r3 h end
& R. z1 O9 {& S- S, f u2 y) a5 o; b8 i' }
end4 k1 {$ H3 ]- u; M* g
# e ^$ C- M/ J; r0 As10: //状态为s101 a6 m. k( w3 n- |/ X! ~# k
* J1 b$ J+ B% x: w( `3 W9 K% _
begin
+ g' G3 }; o6 ]- n; G z% |; g! @# ]6 W& t$ C
if(fsm_coin==2'b10)$ X/ {8 O- X4 ?) s( ~
5 U, w* G' t+ Y7 g+ Q- |9 l begin
0 W* p9 U3 I/ R! t/ L+ X& H. ]4 N
% _% \( f% i0 P7 K1 O8 I fsm_newspaper=1'b0;
0 E6 Q4 P' M- z- V5 p) [0 N$ [* S0 U# X7 W; g5 D; f
fsm_NEXT_STATE=s15;9 f1 M+ O( I0 h* f7 | g% x
) g5 x2 D: Y( a' s9 T4 b; ?$ c5 R end
0 d& X3 |% q6 g+ M& ?' s1 [6 j$ ~" h0 C/ @' W% k3 h* ^1 Q
else if (fsm_coin==2'b01)
8 l' `; e' Q4 c% _- q2 ^( G# m% ~5 B
begin2 ]" t5 Q3 c/ g& T6 B/ u. T
" h+ r$ I! B d0 W, q1 S5 v' B& l
fsm_newspaper=1'b0;
3 b7 T, W+ w4 o3 s) E! @0 E5 e4 ?$ Y! d8 S, g: v1 Q) y. D
fsm_NEXT_STATE=s15;7 R) p4 A( [& J
. Z9 a' ~! m( k. w3 E end
' A( N: s# ]# C1 }0 j2 U! ]/ Y, U& D4 d# m! j: ]) P, p) Z
else _' \6 }7 S; W, g4 s- U
) Q7 L# ~7 Z9 ^# Z3 P2 f
begin
3 w0 Z5 t6 @" s+ E. G O# \) o* M
fsm_newspaper=1'b0;8 d5 y1 Q( o, X7 \* ~- Q \
" S4 `. p. R1 R' O( @ L fsm_NEXT_STATE=s10;
8 ^; j* F& f# h' E' x4 B4 n$ h4 n# R: e7 r9 p( W2 B( z9 I
end
+ E# E! E% ?5 W* H8 z; u
) i& Y1 Y- h+ `$ ]end" \2 ]3 i9 d) Y+ s) |
2 j+ m& o5 b! a' k8 Q6 [7 F7 d$ p1 O6 hs15: // 状态为s15
6 M/ N* E3 x& b( ]" N0 F" a p& E9 }$ O) I% [! n- C- g
begin, w" u- R8 L, I: V; c5 ?. U
P; a: P: D, g( z! C+ s! H
fsm_newspaper=1'b1;
0 Q0 c: i2 D. Q
: S& N1 A1 y8 z6 \# E. z fsm_NEXT_STATE=s0;
9 H/ k, y# z1 x) d7 t
& ?& l/ H9 |# R; J7 `7 E% E end
3 V$ \. N8 c3 q& T5 s
# P! Y. q+ Y3 zendcase
# R9 c R5 F1 E; e9 M7 F3 p, \* }& T0 g( x4 B( v
fsm={fsm_newspaper,fsm_NEXT_STATE};
/ ^- f( K7 R( F+ q( m5 B q" e9 z
1 _5 j3 Q# @6 F, f! g, Nend
1 x3 R1 z6 m5 W; u8 }3 n7 m7 g# P5 b" |& ~* g- s X
endfunction
' O" F1 _# N# B8 ]' l3 Y
) Z. T1 W/ q9 O2 |6 m+ J- Z& D//每当硬币放入或当前状态改变时,组合逻辑动作
& Q7 {1 w! [( R2 F |8 S
8 E$ f5 y8 i+ I- ?; \7 w3 Wassign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);5 P% D* @6 l, ] n+ \8 _& }- |9 w
/ d- p: \5 k: B; q. A: ~
//用同步复位、时钟正跳变沿触发的状态触发器
6 p/ p0 \& w0 X- @$ v0 G! i. O+ f3 i* n0 S
always @(posedge clock)- v( b9 E) j/ }5 \5 h
2 N7 n% S/ A- l5 i6 V) m2 G- c6 Mbegin* G. ?6 H" I- C3 U# q
/ L" U. b6 I& @: t1 s; C if(reset==1'b1)3 L* C$ Z. B3 a
1 ^1 ^# H, a, f) u- k- O3 R PRES_STATE<=S0;
- J, w! a+ ?5 G" G: C! z, s o# C: y, X% p. _6 D' Q2 d3 }
else# E9 `$ T o( f4 L
! S- Z9 v' M) z# R" B3 s# _0 g PRES_STATE<=NEXT_STATE;
' o- d2 O: P7 C: ^3 i+ W. D
4 n* [% \* b" i% c/ _ end
# P; R. i* A- y/ x: t; L/ B3 p2 T' a2 K
endmodule. X1 |. I6 r/ X" U
& Y$ i: T3 A- {/ \
/ f! A# ?0 U: R6 v# ?4 X
+ h9 G6 W* n( E0 S我的疑问在于这里:
5 T- s; i, D! p; e2 _; X# u- [% k' N; {; O
//每当硬币放入或当前状态改变时,组合逻辑动作 H* ~/ W8 h) O A
: m4 k" j; H2 Q+ I+ f# c
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);* Z- E9 }4 Z( @' l1 S
5 `% K0 }0 }: x
' V. C) U) N/ i$ E& a; w' M- p# U! u" h
就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?& e, H0 c, ?/ V9 a! S1 K/ h
4 }( ~# ] e& L$ B请问是不是我理解错了什么,初手还望各位指教。。。
; X5 e) j& N2 }+ hps:在别的论坛也发了,但是没人回,EDA365要给力啊。。。。 |
|