|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位,初来论坛。也不知道题目写的有没有问题,见谅。
' d9 \ J$ a( P( r A- g4 w5 m本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:9 |/ h: A6 w! ?6 O4 u
: T) N1 K4 S" ]% _
- c% I( V' `& }1 Z1 c这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/
! G p. f K, I4 s& `; l2 H: s* ~. _' u
5 ?9 j& F1 M& u" m( \以下是一部分代码:3 z( ~# k9 q2 E& d9 s) W6 a! V
% X+ {2 N% g" w* Q//用有限状态机的办法,设计报纸售卖机的投币器
9 ]6 c1 X* J- d* l! ?$ s/ J9 e. x4 a3 R9 F( s2 y
module vend(coin,clock,reset,newspaper);
6 M3 o8 N# y/ C9 Y4 y9 r1 R! H7 d7 D3 o: }: U
//声明输入输出端口5 G, w: b( X$ T1 ^2 l0 U1 a/ g% T9 m7 K8 _
) V% ]( F9 S6 e3 c4 q h2 W: E
input [1:0] coin;- b2 B" r% P1 D! k
0 q6 n3 o' H5 T3 r5 r1 zinput clock;
" L9 g6 h8 ?" N. r1 y, Y
. I5 M. F5 r6 n& \5 o% i) ginput reset;
) ]5 H/ t2 ~4 T% X
& C3 i; X, N+ i/ f$ B& |; b- Q$ p. xoutput newspaper;) m6 z! c. ]9 Q; r+ E" z# W
$ N6 Z+ k' }$ ^* N- b' xwire newspaper;2 C3 Y, T3 T' G5 b
I$ h, A& a& w" K) F//声明有限状态机的内部状态
/ n3 k. c: ?$ q9 j
+ V2 n- r6 Z% y3 I c) d4 B% ^wire [1:0] NEXT_STATE;
. d6 @ z- g, e
1 n- O& e0 B9 {* B6 z; @/ zreg [1:0] PRES_STATE;; t" D* ^; s( D! e% z/ R
$ q( |" a5 ^. C
//状态编码
: I7 @" U& e2 m/ B
4 Z; r$ i" H: t: L( L8 fparameter s0=2'b00;
' ?9 Z0 y9 ~$ n3 J+ [; o9 H* ^( \ G) U
parameter s5=2'b01;) j9 t+ n. h' Y8 z
" x r7 \( e8 B) h' g
parameter s10=2'b10;$ A( [1 t5 @9 r+ N8 V
; D) l/ E( L5 [3 e% ^parameter s15=2'b11;% G$ ]8 W- k+ j. g. ~1 A) r
, C" o O6 R( A. R0 n3 |* x. D' q
//组合逻辑
6 K! _5 S/ G O; U# o6 Q* f
% [- K9 B( `3 K$ d9 s% w; d6 Z& {function [2:0] fsm;; J2 p a6 U* Z1 }' f
, ^1 f3 y" v% X6 _; J3 I% B; ]input [1:0] fsm_coin;
& X# D8 W% C; Z
9 ^5 d; j1 c/ Y1 d: Y6 iinput [1:0] fsm_PRES_STATE;
8 o3 R9 w5 H6 r) u' S2 ~# @& ~6 m7 q( h: i" D1 T" Q
reg fsm_newspaper;. Q7 O' u% u% C1 x, n: [
H( p, j% w, p9 @reg [1:0] fsm_NEXT_STATE;6 ?2 ?7 ~8 ~3 r* }# A
9 U/ `3 w6 C& C9 v I( y
begin+ K- a; e0 n2 [& y
) Q* n- J# p* a9 c3 h0 q8 l) T: ~$ r
case (fsm_PRES_STATE)8 H" \- ~% S; @6 }+ i" A5 g( |) A
8 r+ _9 O E" M3 j: z
S0: //状态为s0# m+ G- K5 ^/ C$ t+ C9 d
/ O/ g. {3 q8 o p1 u5 x; r; C begin! F2 v: e0 ~5 a
% d/ |; E6 Z; f( }6 l0 v. Q if(fsm_coin==2'b10)
- p u0 f: Y6 ^7 r; u( @$ T* i$ [( k1 J5 I! X- @' ]4 Z0 Q
begin) [, Y; [" J* V! c3 Y
" E8 H* A# ]+ @ u% k8 b$ A
fsm_newspaper=1'b0;2 U) S1 \6 B" r2 k
4 L- R6 T/ E$ E, }) _ A fsm_NEXT_STATE=s10;
! ^8 D; s5 n, e: U' C4 G
+ b& B: ?" U( ^& ? end
7 G& \3 v! b! m+ y+ E; c
) F% B( l- k/ i7 a' A- `! C else if (fsm_coin==2'b01)
( @7 H2 _* h, `. [( O
5 b; x" e: i9 f+ U$ ^3 { begin. Y+ r6 O7 p0 S0 E2 q
4 X; h; c2 P+ S# r$ J1 u
fsm_newspaper=1'b0;
8 {5 s' i3 V9 S* V' i6 s
. B- Y7 b( Z& q; V( i fsm_NEXT_STATE=s5;
& H r; B' k! ~8 J3 ^" ?, @7 s' i0 w7 V# j. @
end
) l3 U" G9 h5 Q" k. s& L4 ~- T) q' Z. L9 w1 s; @* A
else
: N8 k: e6 t& E+ ^9 F0 Q0 B# j- M6 Q; S2 @4 [0 V8 S! p; Y
begin
2 x m" @* x+ J5 G5 ~8 r+ }4 F* h$ z( m9 f/ C2 `. `& x1 `
fsm_newspaper=1'b0;
6 x, |5 I) N% Q. G- [& @8 Q- o' Q' K2 E G/ }) M' N. ~2 B
fsm_NEXT_STATE=s0;' P1 U( `0 ^ r
# w5 ]+ l5 y& T5 @
end$ v7 T, H; ?4 d1 w7 k' ]
8 t) A% q+ @- G) o
end
& m* i' U! p/ ^3 P% F m" ^, R
P$ @) y b1 V, t$ S) {' D1 ~0 y% C5 Q/ v
+ c s/ a* ]# [s5: //状态为s58 d2 ^) W6 `% J' K) z" Q
' M! `2 b) {/ k" A5 Y6 e6 { begin
* J8 ~7 r5 |% f2 t8 t& I# `& |: g) w! l. n: {! @) _
if(fsm_coin==2'b10)
! I7 m6 T/ A `" d& Y+ a: P2 g
' g2 {9 F* i7 s" J fsm_newspaper=1'b0;/ `# _7 d$ z" H3 R
! r6 _7 @ z" H fsm_NEXT_STATE=s15;
. k! k ^4 Z1 i6 j; O, I: \) M, `# \0 d3 w; @! \ ]1 j; d
end
: B* y8 Q$ u- \5 d3 L* E! o/ `. U+ U
else if(fsm_coin==2'b01)
4 F/ Y' o/ @+ S. [. ]% m& E. h6 m; n+ `7 h: I
begin % j+ G3 u; \0 P; I) _ ^- @( G
) n& H- o- I+ W fsm_newspaper=1'b0;
( p T# r3 T$ j7 g1 Y4 }9 l2 }* p( s' b0 ]0 \0 k" J) ?9 a( [
fsm_NEXT_STATE=s10;% V: Y5 D a" F) }/ ^
1 E6 w* R7 ~; D& j) X' |# C% X end% O7 `. T3 ?$ @
else; t5 v, n9 t2 o/ U
7 D! v& e( O0 [# G( _8 j
begin
4 Z4 M! B: I) B6 V4 U# v" B! s* C2 I
fsm_newspaper=1'b0;
' R0 _2 T$ B: c/ O8 q d7 L/ \ K5 h/ a7 ~% V
fsm_NEXT_STATE=s5;+ a1 S$ ^1 I: \8 u( P( Z
* ^/ v q& M- Q
end0 L7 { r" v4 o" V4 E
4 Z* g6 C: m# R0 {4 e2 \$ f
end
$ S# k8 y3 m# ]& e- {& e# E
$ a4 O Z0 E) b% x, x! l- ds10: //状态为s101 O5 X6 G4 U6 G: A% I/ Y0 M7 ~
6 t% i0 o7 {( f2 }# g9 p7 R8 a
begin, W" o7 k/ _" |" T
7 ?1 A$ P# O0 K/ K$ C5 u if(fsm_coin==2'b10)- e# m; B2 B! O7 M" y* A5 e
9 I0 P2 v! @( P5 A begin9 f9 ^! ?# P0 u4 F! U& Z* Q
+ b; E7 n5 K1 y/ o# N1 t6 b( E C- B
fsm_newspaper=1'b0;
& u# _7 H5 |1 `0 P2 l# ]6 a4 K4 ]$ I3 ?# l! M$ b
fsm_NEXT_STATE=s15;2 x# N! _' F; T0 I, g" A
% B: m7 u; ^. A0 I end
+ S3 i: G; C7 `3 f, w- d; [4 k1 a0 y
else if (fsm_coin==2'b01)
1 D& q. V, @, U. K5 X
6 Q' t: r8 H! p begin, s1 s+ n5 |/ q0 |
# [( h& r4 d2 g& U G! E" ` fsm_newspaper=1'b0;
% g5 X. x; k5 P; D ?3 {- S
+ U9 @: z, l1 ?$ k fsm_NEXT_STATE=s15;
. D* I) B& L% s4 w
6 A3 ?$ R0 V6 t end4 ?: y g H5 m# w. E5 w
- l# \ Y; U1 L# g! f else
- N3 o" N7 G: v* V3 O* [2 B
2 B0 t4 i; l% K6 y7 z begin
! R* }, f9 w8 r/ }6 |1 }6 a+ F4 i8 s1 G/ y, W' B
fsm_newspaper=1'b0; x) G9 `. E3 z
* ^7 C! v+ W! _7 A3 S fsm_NEXT_STATE=s10;0 E6 u K; y ~) e) O6 Y2 _
) r& v2 q+ j) Q* E end- N8 D, ^5 A; r3 g+ Z: E- R* ?
, X4 `. P1 H; O: m5 @7 \# |end
& \, }, F! A" l9 q9 M5 r/ N
/ P' v: w& p; [s15: // 状态为s15
! Q+ S& t H; U0 q* I5 h2 G
~& n) K4 G; R( G begin
, K# W) k- h1 Q2 t c3 ?$ \( \; {) [. m, G8 ^3 H+ w
fsm_newspaper=1'b1;
# T( {& h, d8 ?1 C ]* M9 _' @) Z2 ~( _, [ X; y
fsm_NEXT_STATE=s0; l U1 ^. Q, V) b& N" A+ `
7 }- C1 H# F4 p+ {
end
" c" r1 U) n+ s8 ~% K$ X" u \: ^9 N
7 v8 Z8 a/ q+ h [+ K& M7 E1 {+ G$ yendcase
* m0 D. H$ N! Q9 [( s' u2 |6 `/ ^5 {! }: A: r( @
fsm={fsm_newspaper,fsm_NEXT_STATE};
6 q0 z, v6 _ ]# G: s& |9 a
* a9 ]; Z5 ?5 A7 M& T5 xend+ |/ N; f- T5 i3 g1 p
) }: f+ v9 I- ?, ^) t& n
endfunction7 f, c7 T+ N- V3 c5 B/ I2 F
2 a, g1 q, O5 b: l0 ?! ?//每当硬币放入或当前状态改变时,组合逻辑动作
7 I/ L1 E7 O& L5 [, D/ k3 i$ m8 `. o. {3 d; x
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
1 Q9 {" J1 }6 v1 N9 A
8 Z9 \1 X) J4 n% D//用同步复位、时钟正跳变沿触发的状态触发器
0 O: Z$ o! c/ Q- R
1 g, K! m! X* Q) ]always @(posedge clock)) k/ Z3 Z0 M+ D' n( q& [6 W% U
: J: Q% G: z1 q' K
begin$ ~# d/ G W! W6 T% b" n: W
' l" w+ g5 X4 t" P
if(reset==1'b1)) i" o" a2 B- q3 S0 W: I" M" F
# D; k3 a. a! Q3 H# {& I
PRES_STATE<=S0;& G( q6 B$ P/ ]1 V2 U
! ~; X: `& J% T5 y9 \
else
& p0 A$ B4 E; C/ l* n' F& ^5 s) y* F
PRES_STATE<=NEXT_STATE;
; G/ Z4 F- e8 }6 v+ s, N) u4 F* j# \9 e. j4 ?
end- @- y' }; M+ u7 H) Q
. D$ a1 K- J) X; F) Hendmodule
1 ^- }" t# ?( a. m
+ h& \8 R' o) C# l/ N
/ y9 r+ g% }, I+ c' o
0 W" }' e) g( M) ~7 @, X4 L我的疑问在于这里:) Q! m0 R$ I7 m" I; X. U# i+ J6 A
2 i" v8 U8 b; l. N8 C7 x- e0 h
//每当硬币放入或当前状态改变时,组合逻辑动作) |$ z, K! o/ i( g! ]
. y! s. h; L4 ?7 n+ Rassign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
: h" \) q# _/ A' m C' k9 ?3 A, `' H- v, K# N( m
' Q0 \5 j1 `' h5 t; Y2 ]
4 f s: v' a# Q# Q就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?
4 z5 ] g' s+ s) h) y/ I2 }# u" p. ^* l
请问是不是我理解错了什么,初手还望各位指教。。。* e, D. u; v$ I9 v3 A
ps:在别的论坛也发了,但是没人回,EDA365要给力啊。。。。 |
|