|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位,初来论坛。也不知道题目写的有没有问题,见谅。
0 A( a3 W2 Q' x* S* ?$ V本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:5 ~1 x( O- B* m* R2 C( v' S9 e& N
9 m. @0 d0 G/ O" Z9 u7 K
7 d7 Q8 x) X& W. w: D( p! ]1 l* K
这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/2 ?9 j, S, v- q. U4 x6 z8 |
6 {- P4 ~: B4 ]% ?
0 ~. e1 T t9 a; [以下是一部分代码:& D3 k- Z$ {5 [% p# h6 f! Y
4 D+ c& c4 k1 r/ C7 d4 J
//用有限状态机的办法,设计报纸售卖机的投币器) h v, R# }3 @7 u3 q
+ s" A' Z* B$ V, r7 L/ n
module vend(coin,clock,reset,newspaper);- P7 }; X; F9 Z7 _& w4 T
# P. _ W, b8 T
//声明输入输出端口, A% B ?1 e4 N% ]; ]( M* y
* ~! T" d; ^6 H& H; F9 _
input [1:0] coin;$ M. t$ F- d5 t3 E" h0 m: S6 X# R* N
) ^1 J" X6 e5 |) d% I0 n: ]8 Q. E Ainput clock;; r, G% j: o; p1 p
* p6 {/ p3 Y2 K% O7 B
input reset;
+ t4 J* t2 K8 A4 Z+ g, t |8 S; r, n* j: j* N: a
output newspaper;- o% u3 r; ^: @1 C! q7 H8 ~; d# X
! y/ {2 K" R/ T- G/ t% Bwire newspaper;+ D- C# v6 B7 q/ u0 E2 h3 d
/ ^2 e0 q: K+ D% M//声明有限状态机的内部状态% R1 ^* I. I* A5 V; |
4 P1 `. \8 W0 R% u g5 q$ [/ D
wire [1:0] NEXT_STATE;
& c Z. f7 e# m$ y6 X V5 n: ~$ Y! X
reg [1:0] PRES_STATE;
4 ~8 a3 m; F! i9 y6 S: X ^& Q! X& g/ B8 K1 J, d4 X1 C
//状态编码8 t5 I- z/ k" v l1 S6 g& I: h1 ]
, |2 r6 [+ g8 I. O, \! T3 @2 }
parameter s0=2'b00;% ~. b1 o6 o: p
' D1 p1 i0 w) g! F* Q
parameter s5=2'b01;
4 V: g5 b+ M0 \$ m8 _: K" Z$ Z( D; c: O. x( X/ ~
parameter s10=2'b10;
, p0 p4 i; q, V3 f. d$ O" w5 n0 b$ v* V, j, j+ t! O
parameter s15=2'b11;! A2 f$ L' a* ~3 I7 \9 I5 h' \0 t
; C3 z# t: Q, Y, |4 E5 J
//组合逻辑
# q" x* z% e. P- D% ~# j& F
+ n" |+ C& B6 m' ofunction [2:0] fsm;3 h" w5 [- C8 ^
+ r( F+ N% Q, |! [% Y; M
input [1:0] fsm_coin;
4 e* _8 f% B6 S, ~" P0 g
# H. D: X, f/ c( N4 \input [1:0] fsm_PRES_STATE;
3 n4 m+ i! {( D4 F5 K/ `) v' V; f( F F( b- Y) Z
reg fsm_newspaper;
& J) ^& ?& S4 R; K/ }5 }; Q! X" l0 ^0 T8 ]: W* {' ?3 d
reg [1:0] fsm_NEXT_STATE;% R. }9 | g: B# R7 c6 P: A
I% R: Q. z* ?6 T
begin. `: R* V/ R9 ?, `: a j8 G
$ j8 M9 x- ?6 V R# U
case (fsm_PRES_STATE), f. v6 h: [. Z' k$ k
1 }) J% z( x3 E3 s' A
S0: //状态为s0
+ h1 U- K+ K/ b$ P F: {1 U7 |& u9 g& g# u! \$ e
begin
1 D0 t. ?1 H. J# m% e1 I, t
6 P2 W' d! w4 B9 m if(fsm_coin==2'b10)8 \$ A( n$ `5 ~
1 x' `3 u e8 |
begin
# @1 U- w" i5 {
% i8 A- _; Y# j! l# c, ] fsm_newspaper=1'b0;
: ?) o4 b, T* C& e% U" q9 I- a f/ p5 f5 {8 P/ ~6 n ^
fsm_NEXT_STATE=s10;! R0 @) W' w% M
' @' Q( B9 T6 M3 ? end+ }3 p( ^; j) @+ h
. W4 I+ O, x4 C9 q$ Q else if (fsm_coin==2'b01)
* D" W4 b7 G$ C& _& n; i( U" L: F" E" R% z5 r5 L' A
begin
4 [) V+ c" r* O; u2 @7 J2 ^: _2 `
fsm_newspaper=1'b0;3 E' H8 K f6 ~* `) X6 l3 N
& P4 o C2 ^. a( X! V) ^# G: E fsm_NEXT_STATE=s5;9 g; y, F6 K5 O5 F) Q V
& C$ k2 Y1 _7 e, l* M
end
5 s/ ~/ u' g; e+ C) e/ O$ d9 P
else* f" \ t( [" E" L
5 {1 e; Q# K$ T5 Z A
begin
5 V1 z4 f# A) a: V% Q. ^0 n* L9 c$ g; `) R, I, @
fsm_newspaper=1'b0;* p T- }$ m2 ]; \& r
7 |) u* p! R- w* `" ^
fsm_NEXT_STATE=s0;
" s7 Y; y' S7 b6 _, o( g" _7 o4 E
. F* ?6 B: n, O7 I$ c' _ end) Q+ _1 _4 L! m7 g
8 P; N( d5 z- q% E( send1 z+ w6 m! H' J' r8 S2 f* f' F7 a
( K" K! L s/ m" g
2 ]" t$ p( A% w }) `& d* I( j4 R0 f9 a; M3 a# r5 @) c; L& H
s5: //状态为s59 R! @6 ]! u% H" B9 O2 D5 J
0 w: _$ {6 v4 V7 G begin7 j3 }6 [! [9 q, V+ [5 O
2 [ l& H( D' o0 T if(fsm_coin==2'b10)
8 n, x4 L- X5 `) \8 D1 y/ e! \1 b, `! P8 E" ~ [
fsm_newspaper=1'b0;+ B, t0 j2 _( c$ Z0 o2 ]$ t; r8 K6 d
9 i$ R' e! G- _9 ] fsm_NEXT_STATE=s15;9 J) B. u" S6 E
( M3 w& N; L3 m- }3 I end" u# M# P* {( C4 Y6 x6 @7 W
( I0 L1 k. M( @+ P7 x else if(fsm_coin==2'b01) C0 T' L' s+ G
/ Y7 d$ h; M5 n3 L3 i9 s2 R/ u
begin % h; T8 c8 y* v
5 ?/ h' {, {3 t: ^& x fsm_newspaper=1'b0;3 Q, a5 t+ A# S1 v5 T
7 E6 z0 }- t) q fsm_NEXT_STATE=s10;+ V9 K% O2 j" P. G! f
: m* Q: t* I. S% d
end. z1 e6 B! S" E7 N% V/ p$ @
else s& Z5 q& X, ] t! n
3 D( q; ~+ w9 Y& s
begin
) ^' L7 ^. ?- o ~, D* ~2 ]: D- H' ?7 V+ l5 A
fsm_newspaper=1'b0;
9 V( [8 Y: z5 J7 `
; c! c0 M5 k/ b% p' h5 I fsm_NEXT_STATE=s5;
& ?9 Y1 r/ F! ~
! v9 c8 V W$ V Y9 ~7 D( K end
; M' O# B8 `$ a5 f( O7 p# N, [( j% }7 `
end
! B! T/ Q- n9 E* X* j* i* z$ V; A/ n* L! |
s10: //状态为s10! q9 B) V9 c, M+ N' K/ c2 f
! ^9 t# ^7 e% r7 V" C
begin
+ [8 r* z8 C& ]( v2 d8 Y& a" ?! c" J& x- f) X. }5 s9 J' ]5 k
if(fsm_coin==2'b10), J, N5 N& N7 h6 d! }
N" H- m; w% f \$ c7 } begin) w% y/ ~% @9 p, F, z& N4 Z
: Y- R( r/ c9 [) ]6 _
fsm_newspaper=1'b0;
4 K$ J- H2 x9 _; P
* |6 A6 s6 q' T. M fsm_NEXT_STATE=s15;" U+ P0 i' K. [) @2 P* j
, f( ^6 T2 A. V# i
end
& `1 e6 c/ b4 N) V
6 D6 j: }# {- [" c" [ else if (fsm_coin==2'b01)- e: r4 z1 l3 J4 g1 s
$ r* g0 k" K" P* p8 H; G3 w, t% d
begin1 m2 p& G: [- [( f% n
$ @3 W# E. s1 \4 B8 p6 k1 h* z6 L fsm_newspaper=1'b0;
1 ]" j& L( R, [$ N; c( f4 J2 R: w" }" \0 }: g
fsm_NEXT_STATE=s15;
0 @3 y6 O+ l* M$ A* e7 g* F* H- S/ p9 E
end
6 o% J7 g8 X& Y! ~4 Q# ]* _) p2 ^- f" \! w% \3 r3 @
else
# u: J4 H* |8 ?2 U9 S. z K# d5 h2 b( K' @8 v3 G4 Z
begin8 ` j0 z3 w3 q! d S( C$ |* a
h- o! g7 z: E" B. L fsm_newspaper=1'b0;
8 J. C9 f4 a, z- n
$ [: x5 r3 }7 {' }& s3 @3 J fsm_NEXT_STATE=s10;
* Q2 i; B7 j- |2 J3 K. }# H( M6 Z6 C* s
end
# c3 [0 ? t; d% H3 G2 P! |" |8 I, n5 I y
end
: c' q( ]7 u! \: e. r
. w. R4 N8 L7 t5 H) \. m' Ws15: // 状态为s15
: D: R% b% |( Q8 r$ O6 t7 V+ u) }2 S/ a9 S
begin- c Z0 L' P ]3 |5 t) A* u: r
8 o2 f7 M* }/ ], Z1 N fsm_newspaper=1'b1;
# o: i# z* P4 G4 Y5 t1 ~& E
" U) J3 q% N& f- h; ^ fsm_NEXT_STATE=s0;, a; Q6 r( w" K" y0 G# p+ N; y
: z& a# C1 a: t8 [% D end4 u' ~; L6 [; v6 ~; y6 b
e0 I! u# l, G5 L8 I! K, xendcase5 A" J4 r# {9 y5 A1 t
/ i9 a" Y& M; W$ \: [7 o# ~
fsm={fsm_newspaper,fsm_NEXT_STATE};
9 N8 t( d) t" j* n- C; Y( N, ~; g' {0 g5 w
end" F$ s9 C; B T# q% _' A
* M* ?! g$ M0 _& Lendfunction
3 D+ Y, m9 J( A$ T) f4 `8 q5 _5 b- C6 x/ t4 z9 p7 `
//每当硬币放入或当前状态改变时,组合逻辑动作" y/ N& S+ v5 g$ _3 P! b
9 u J- e+ ^6 Q9 Qassign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE); q( O5 L9 d( y$ u; G; j
( Z. ?, E" T+ u2 n% V& z/ x& w//用同步复位、时钟正跳变沿触发的状态触发器) a$ T9 G) m4 `: W6 W8 C$ U
3 s+ u3 e7 p% ]! |/ Nalways @(posedge clock), n8 V( |' M; @5 r
* f$ V4 a/ R$ g" _' w, B# J( Abegin
& C7 J5 Z' Y: C$ N5 Z- D& W9 R) Y9 ~1 z- ~
if(reset==1'b1): ], W: G( s" l
- y1 r, ]* T9 ~; C, W. k
PRES_STATE<=S0;
' L" h- N9 K! ]% e0 ?) p B& ~5 V# n6 t3 Y6 r
else
6 q3 B) b" h5 W- c+ u2 I4 z7 u2 n& O* m' y# o5 M- b
PRES_STATE<=NEXT_STATE;
1 ^+ x! K- ?2 H, @* _3 L6 @ C9 \; j6 ~0 r7 u
end
) g- v+ e6 H& L: U9 n. `$ v. k$ ]3 W: p7 |: A% a+ J
endmodule
$ `- M( @7 Y g, B9 d$ b/ I
. Y3 t- F8 g5 s3 ^7 X/ O2 T& ? K0 O" i7 C8 ^' ^ L& L. ]
: N' J0 N+ i7 v) n+ `! o我的疑问在于这里:
5 K* t6 |+ y, U; i3 T4 a9 c, X7 F( k4 L. y# L% w
//每当硬币放入或当前状态改变时,组合逻辑动作5 p( b. {$ [3 @) X
! S5 v! Q- }/ m4 lassign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
1 w4 j/ l9 K9 f/ y4 b
9 l. R8 u2 y6 W: Q B
P! g0 ~, l' T/ h3 c" i. v/ u$ {" }9 @' \6 V" J* b
就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?2 F. f3 _0 q( g/ W
: |) X2 S" Q O4 E+ y; S
请问是不是我理解错了什么,初手还望各位指教。。。
3 I' \" c$ M: o* [8 l" Aps:在别的论坛也发了,但是没人回,EDA365要给力啊。。。。 |
|