|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位,初来论坛。也不知道题目写的有没有问题,见谅。
# `& _7 h7 i' X0 B" h& N6 x1 D本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:( i$ b; L5 g8 p; y
) l5 }0 M5 ~( r# b8 e$ A% u+ c5 d8 D$ i7 H( L! |
这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/: G A" H9 Z3 [1 q( O
* ~- w9 r- p4 ?/ A% N$ P3 K, G1 M9 S4 M& u2 c T$ f
以下是一部分代码:
" _2 }) ?" O0 c1 d
! G7 I6 |- C' P+ L2 ?//用有限状态机的办法,设计报纸售卖机的投币器
) j" ]- V( P" |3 O
. t& R5 W# W9 O7 C# Emodule vend(coin,clock,reset,newspaper);* n- v; T6 m+ m
5 U8 \5 X. I% \2 Z$ _
//声明输入输出端口2 ^ b+ Q$ w" f/ g! A% q# P$ L2 T
% D/ y: l# `% p, V. }2 U8 \, v
input [1:0] coin;0 B o: w5 h" _& w# ]
# h: v2 x7 c2 _4 P' `
input clock;
& l2 \. [: M6 A& ~- y9 w$ q) h$ X7 r& I g
input reset;
9 W1 T& B5 x5 Z7 L: s; I. g( T7 v9 n2 Z* S
output newspaper;
2 Q7 K# X$ Q/ ~. T- H/ U3 Z
; ]+ G+ }/ Z" ^: ~7 E. awire newspaper;
* j6 i1 H/ D' F Z" `, S3 o) z3 j+ G
//声明有限状态机的内部状态6 q9 {$ F4 Y2 a" n
2 U/ D& F; ^" w" B& Dwire [1:0] NEXT_STATE;
/ V6 a; i/ K3 U% t: @5 g) `& U" K
- [5 i6 T! \1 S2 F1 W( Ireg [1:0] PRES_STATE;
* C' z1 I/ t# v- w D
# ?. C2 E' A" ?# c" O: i//状态编码
6 V0 o/ L( I& `, q, P! t4 A, x. u+ N: a/ z
parameter s0=2'b00;9 L, V% Q# h& S8 I; \8 U
) l5 O5 i: G) r7 I. O; d5 rparameter s5=2'b01;
& w/ C, ]. j. Q+ W9 ?: L/ t1 [5 n% E J& M0 p! T0 F: t1 d
parameter s10=2'b10;
9 z3 ]! H4 E4 L) M
1 O8 o: W. E1 Q2 V0 F8 n# vparameter s15=2'b11;- ^4 \& {4 e! g: g1 M: ?. Y$ x# |( `
4 |( ^; d |5 g5 H H
//组合逻辑. R0 S7 L5 b: u* S
- \$ P! @* w+ w
function [2:0] fsm;3 n' \4 d1 P$ L/ n
1 t. m6 D) D3 M1 ainput [1:0] fsm_coin;/ k, h# ?- [: l; u6 [6 Z( T
5 [- D' y! e+ E2 D8 t# K8 t) Q/ Finput [1:0] fsm_PRES_STATE;2 c* J, J0 z3 g& N' \/ f$ E
" q9 @6 Q! R1 t# P5 `reg fsm_newspaper;" B: J- L, c6 v P0 l- K& A" M% n
+ P- A0 Z5 U: x, G: j% D) {
reg [1:0] fsm_NEXT_STATE;4 D. m& S8 h2 k
, t# j8 Q" W9 F' Kbegin% K3 g4 g ^! s4 e8 `% k# U/ e
+ R: X5 g0 U7 e) l) l' Y case (fsm_PRES_STATE), o/ R# ?9 \" a% m1 E0 @
) [! R' @( I) N1 G) f; {) j. }: l S0: //状态为s0
6 _% Z5 y2 V( W; }: E* X' ^" b w) v6 K! S$ i" i" e6 s9 {( Q" ?3 v2 f, i
begin
6 F& u5 B) K, c; l |& O) ]4 p/ U& ^
if(fsm_coin==2'b10)0 A f" G* h- I* T- l
k& C+ f8 C$ Z/ |9 c' P
begin
2 z/ L% d( R5 T$ `& I, \4 h
7 R9 D9 _' [: T0 y5 ` fsm_newspaper=1'b0;
* x+ e6 g, C; Y% o1 @
8 M6 \1 Q( y0 r3 f fsm_NEXT_STATE=s10;
, y2 Y4 f4 d; s' J5 q6 w% a
+ ?8 n; m0 w" _7 @ end
2 G k9 k5 a! C" M& b0 j0 O
& i: B" \$ O+ y7 z$ e else if (fsm_coin==2'b01)
1 h/ Z1 R# k- A8 @$ e$ j: K* c" X
begin
* f, g, W+ Y5 U, c% e
2 d) ^' y0 R( G1 A fsm_newspaper=1'b0;) i' A d% }- p P6 x9 @
8 |$ L7 \& R2 Q7 v. D0 \# x" t
fsm_NEXT_STATE=s5;
+ K' }$ q& L. n* M# B$ }7 `( ^7 w7 ~, d" B7 z* C
end
3 ?8 H: |4 ]* X; @4 x" _, N" }) J0 d# G
else
5 N9 P6 ?2 F" a6 L- y1 b- p5 h1 G) U; O ^' `8 b1 b/ H7 |0 D- M
begin% r% h; \' F& A+ M; a% A* t6 ~
8 i, k; R/ A: m! L
fsm_newspaper=1'b0;2 K+ I; Z2 Y6 w9 }( S5 e
7 I. C( c9 P ?2 h2 ] fsm_NEXT_STATE=s0;
9 F/ D4 ]6 Y9 C
; r9 P" f u/ B. ]) t# H end
! L) Z- l2 G% S0 p& f9 C1 C5 L+ l5 Q
: E( x; G4 ~5 L& q6 vend8 g5 q" X, s7 v! K& ~7 ]. x: K
/ l# p8 x+ c3 ~: q
7 d% c: R4 w$ D! v7 p: g4 n2 N3 s1 x
3 c) @5 B& G0 i7 \2 u* Ns5: //状态为s5$ \% b: u6 x1 e3 q7 X5 y) x2 y
: h2 s% }: r; W1 y& n begin
- ?" Y7 [# J* s! f n/ D. p# m( P9 k* Z2 @/ l' T
if(fsm_coin==2'b10)
~$ Y: k2 f4 m8 u) G$ W( G, Z! t0 N) J
fsm_newspaper=1'b0;0 z' @0 Y3 P" F) s
, A$ i0 j# K3 \7 A( u6 D6 | fsm_NEXT_STATE=s15;7 X/ {/ Z7 }- N( C
) o& I/ x* L2 M; ~, Q/ w
end0 E* e8 K0 o* {: |$ u% P- Z% h
% |! F3 m; h1 V6 x* \ B0 L L4 k0 w else if(fsm_coin==2'b01): x2 U. e8 U; O) u7 _
! ^ i4 \& @$ l: | q- b begin
' ~8 _% c' k7 i& ]+ b' [% g/ v4 v: Y; t6 O7 I5 }5 S
fsm_newspaper=1'b0;0 s0 }- C' ]1 [' v6 l% ~' x
S7 ~5 n5 B0 r9 P T4 G. c fsm_NEXT_STATE=s10;# C5 g: Z- p' _+ ^6 W. C8 e0 {" ^
# |9 G1 B( [# H- _( R6 W
end
' N2 l! K/ T/ L- M1 H. J else
: ?8 `4 \8 Z+ U% B) t* v9 \
( f! w" N8 y' \6 H0 q begin
3 r' o, z' N7 i' F) @4 f# J0 {. g9 _( A' c6 \2 {; V' p
fsm_newspaper=1'b0;
5 q8 |5 T& _! @3 R' d8 ~1 w8 B7 a6 l- ?5 b8 [$ n
fsm_NEXT_STATE=s5;
! S. g3 B* H2 A8 a. v4 H* @& Q4 n! _; y4 r1 ~; P G& O
end
" H5 l/ ], \# _- }1 f' f4 {: R6 b( p, j+ ]) j" Z6 ]
end+ U: L; P/ \$ k' w' |9 |! D
( a( C$ Y, b5 o7 K( I- ^& S" us10: //状态为s10
$ b/ J& m5 o' a1 \1 s
. g q9 N. ^) t* y: W. Q; |- W( p- Obegin
- T3 l9 |) i2 {6 ]: x" V% a
- K- K1 y0 i. ~1 f; Y5 C if(fsm_coin==2'b10)2 n% f6 B* w. `' | G+ ^3 c, u' N
- e/ X4 _. N. r8 y4 X6 f! U7 T2 |8 f begin3 m2 i) J: Z! X3 k
F" p6 O# }% s! N; b8 P fsm_newspaper=1'b0;
E6 ?( D; l( R& Z0 h6 R7 x' a: m- c: S# y& Q
fsm_NEXT_STATE=s15;9 k5 [: C9 T6 {
' b4 h0 \- x( p0 ]: i& [
end. }- A. H- Y0 h1 ?. J. W
" A3 \% N$ N# e" A* v( |4 D0 e
else if (fsm_coin==2'b01)
$ o) X. U& G' b/ c) d
K1 x# u* K! I begin
$ _- S( K' i% }4 y% L
. v4 Z" ]9 ?% G* ~9 F" | fsm_newspaper=1'b0;
7 X" g$ m( P8 U+ ~( @' D& S
% H3 i- K1 ^' Z7 Z- q5 r$ q! h fsm_NEXT_STATE=s15;
+ j: d! y/ X9 ^" @6 K$ M% Z f( y; w
end
* T* u/ n. C5 H# N$ }/ b$ |8 q
6 K2 n( }8 B6 Y else% L. D/ q( B8 ]& l6 R# Y$ Q! O$ N
8 H- Y( ?9 q& U' v' X$ K
begin4 z6 p: X+ ^3 X, S3 z% Q! b$ R# S
' a, v4 r8 u2 Q% X# j3 ? fsm_newspaper=1'b0;
' j w' k- x. n9 W7 t; B9 R/ d( K# ~
) o$ M/ L4 h( N+ C+ P0 E1 q fsm_NEXT_STATE=s10;
) L4 G. j$ w# V& ^' K$ B4 A: Y/ |5 A) ]: z, J: A: O. O
end
4 X' K! V& p0 i' B, x. c% A4 a# Z; b
end. s( i: o8 Y5 y O9 B1 v- J
# l4 q b) C# d8 E6 [s15: // 状态为s15) G0 A: i- M5 y
4 o; Y* d+ ?8 N5 `0 a+ A j* { begin8 M+ q' s$ I' g3 u
. W4 |5 J s5 Z+ t6 i* X1 E fsm_newspaper=1'b1;! _ [1 N& l% w+ H. \3 y
' ]" N7 s0 [" @: y! \ fsm_NEXT_STATE=s0;' F7 {+ J5 h2 M7 z& y6 K
# ?" Y. x( ~1 F* V. I' ?' N
end
* O. K% \. S+ `; R
( e- D: b& |8 l% H, t+ ^endcase
) m. v( ~* U4 z; K; E3 E' R8 n2 p' _& F+ y" H
fsm={fsm_newspaper,fsm_NEXT_STATE};
, i. y9 k' U, u. c( S b" p* ]- T
end4 o; I. \1 }- P% a* W0 n
, h9 i: {& }* v1 c$ M- G" P: nendfunction2 D5 _8 \( T4 z3 h ^* [
; A4 R# O* ?& m6 x3 I0 |; \# N//每当硬币放入或当前状态改变时,组合逻辑动作
+ Q+ \- \# R% a9 f7 w: D h% b4 o
9 V! o6 b0 l7 T8 }9 N4 x# x7 Qassign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);" ~2 U! y* Y! V6 s
! v! q) i+ |( X3 a0 T3 x+ U& I//用同步复位、时钟正跳变沿触发的状态触发器
: x0 X/ H+ i+ y' b% c: Y( c3 N) a% v* V
always @(posedge clock)
' h, |# G" b1 J( z9 m/ d9 f% W' Y; l9 j
! B# v# F3 H. X! H% R$ {, }/ lbegin* @7 O. K6 v0 p# H5 i
8 I& T9 X, Z+ l
if(reset==1'b1)4 Z7 D0 w4 K# w2 V
" v, y9 z, n0 T, F
PRES_STATE<=S0;
7 @; e5 s/ C8 D" [, t
" @ o9 o- U ?6 Z) C else$ G |* ]0 Y3 q- f+ U
( ?: d/ |1 @0 V3 y& v. B( b PRES_STATE<=NEXT_STATE;& }; g) g2 i; d) u. ^
/ r$ ?8 D1 ?/ c7 V; [
end# a% s- a/ M. j, z6 K
q Q$ Y, f: `" Bendmodule& u6 _. B* R7 N" {$ x Z: U
8 e' {: @: v: V" \- X
4 u0 J% Z8 ? l( u( t4 w
& b9 S" w# b/ g- K. U7 p
我的疑问在于这里:" a4 A6 I" r5 F" N
# c7 o, L& p! V" o' T5 ]//每当硬币放入或当前状态改变时,组合逻辑动作: S8 n4 I8 B8 a+ v! W8 A% o
4 ^% p1 P0 x( I7 Nassign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
# S4 D1 _$ H- T! s
" @' M/ P; J+ h5 x
$ d% F, A9 S/ {7 N4 o5 Y0 L
! A1 c# ^7 H4 }+ B0 \0 f8 I( |就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?
- A0 x. B, o+ P, c/ D1 G( n1 \9 P6 x& j& O+ g1 R ]# A0 O! a
请问是不是我理解错了什么,初手还望各位指教。。。3 T+ M/ O' l. b, q7 R, `
ps:在别的论坛也发了,但是没人回,EDA365要给力啊。。。。 |
|