|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位,初来论坛。也不知道题目写的有没有问题,见谅。, A2 ]6 b+ _9 U6 |' i) S m
本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:* V. \8 ~. F q% @6 f
- I% G8 }1 A; K' g U9 H( |
! O( B2 c: @9 c7 P w& V这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/3 ?4 \# L% g5 n% b
5 [% H7 x* D( k" `
8 r* e! ?0 [3 G以下是一部分代码:
. A! n8 N/ A$ l! q3 r7 v* n9 x5 {( S2 W! r- n
//用有限状态机的办法,设计报纸售卖机的投币器
# Q& {3 p- X& d/ ?2 R
' j* R7 ^3 R8 a( E/ ?4 G# w, i3 x% }module vend(coin,clock,reset,newspaper);
; ~2 ]+ I" Z! O7 G& A
# m) s& H6 K( ]//声明输入输出端口
% N% y! n. [. ? d+ [8 g/ C) G% L! l9 a
input [1:0] coin;5 Y" a8 p( @* r6 q$ Z) p) Z! H3 H
9 ]7 b( K- m. m+ J* Q! K4 rinput clock;6 C8 F, q& |! G, l
( x7 \- V% C. d3 q; Ninput reset;
* }& M1 W7 w/ L$ ?! L- T7 F! A- V
output newspaper;5 O# R/ H( L, ~6 Q; r* }
) R Q7 h1 A- ^4 a; @$ m
wire newspaper;
; e0 d3 \0 ]1 m) U2 `7 _
: w9 P5 @/ q- O- r. z//声明有限状态机的内部状态7 ?$ r5 U% y) V4 Q) w n; h3 f
8 c3 V1 o2 M3 t0 t
wire [1:0] NEXT_STATE;+ S a/ s; d" Z
& E/ _$ \" t/ |+ s nreg [1:0] PRES_STATE;6 Y [. ]$ F$ k- l
! V, y9 }; A4 }. `5 c6 N' m//状态编码7 L0 a l" w4 P6 f( h3 y) I
& \, U U3 V: a, z' qparameter s0=2'b00;
- z' P4 ~/ K& k$ g8 B* |, E8 _& w6 B% n+ p, _, T
parameter s5=2'b01;) W" u( A5 \' h, f5 C, I4 ~& f
5 w. R1 j9 r( Z( S
parameter s10=2'b10;, I4 f1 @: r& ?8 F5 K
3 q% |. x `6 k' B3 f5 W$ l; t
parameter s15=2'b11;
! B0 R q! h5 T7 S+ P, n: y4 a* l& E. O2 I/ j; @/ p
//组合逻辑
# P" d( W: z& p. t8 h+ b
* |# K& B2 h' pfunction [2:0] fsm;
5 r1 }3 r- @# U- h$ ^; {6 d# ^ W+ k9 G; [* b7 e
input [1:0] fsm_coin;
0 ^ o1 \' E# V7 E# W0 a8 I' A4 Z2 H" G* ]: S' L
input [1:0] fsm_PRES_STATE;
% o1 J3 r) R' v+ x" U8 ^" R$ v9 e) p& o% X8 B! A. {
reg fsm_newspaper;
- ~4 n% E+ {' K! {5 |9 L
2 A4 o+ ^: S O& Jreg [1:0] fsm_NEXT_STATE;5 B! N/ q- a/ G- [5 ]# w
5 e( T. u7 J! f @0 P* vbegin q$ i' F0 R3 @& d# y8 l
. C! l1 B( w" e. |" O case (fsm_PRES_STATE)
Q' \* K! A6 f5 d8 e. W8 [9 W) B/ ^# C5 \; D6 \: M
S0: //状态为s0
) D* r4 h/ e1 h! h8 }4 ]( E. X: ?/ w0 M4 N
begin. X9 {: [, c4 d1 b
. Z0 T! f) L2 V' z. N' f3 T6 B* o( T if(fsm_coin==2'b10)$ h* C7 p$ W9 b+ C1 p% X: z7 ~' p
T3 ~6 w; c/ }+ E. r begin
* ?. Y" P3 ~# A
* T! L: n8 s& z fsm_newspaper=1'b0;, X& [* C+ I/ p2 A. R
0 |+ c/ D; _7 p1 l% b fsm_NEXT_STATE=s10;
5 X9 C( v/ F- v$ X# M7 }# O" }/ N
+ l, Z4 V9 W9 F end( | r E( `* S* _# {2 n
+ q: g& P6 ]6 l
else if (fsm_coin==2'b01)5 B2 M- R& z/ E; f# v2 W: }
" q; f \8 Z% m' r0 r. i
begin
9 j% Z0 k% o' w/ f( ?; n# l+ r/ K9 X. `! X" P
fsm_newspaper=1'b0;
# X% P; V- H9 L/ M; F& Y' C0 T7 e0 G0 U9 k3 f& f
fsm_NEXT_STATE=s5;
! K1 [/ M' y9 o
7 b! _* h1 V$ q end% c- n2 {7 _) I$ _
+ v0 h3 b) L5 j+ h8 d3 G
else; j* ~& @. B. I+ _; q3 e$ |
0 x! ]! @8 P. ?9 F C8 J
begin, F3 E2 N2 K! u D, M |
0 G, r4 \2 ?, `% N
fsm_newspaper=1'b0;
; j' A, s$ O3 C6 N& N* ? @* C/ l
1 |, b9 M; {$ \* f3 L fsm_NEXT_STATE=s0;
$ G0 L& z/ l) [& P' U8 y n' B
+ q5 o1 A9 _5 X end
/ q3 A7 w' _" Y5 W' O- l( y! e
9 ^. U' ?6 N# r0 t* |" L4 P# cend& `$ M# h+ |: z1 K
! k1 u2 k$ F' R$ X% J; }6 n: w
1 z* \1 v+ F( M! [5 E7 j; }2 M: U1 |) ]% S
s5: //状态为s5
/ \# P- z: {1 B. {
" w0 I k# c: \$ [$ P begin2 E2 h6 Z; b! Y+ X
" u; X8 a( `# A' s/ Z! z/ ]0 m; l
if(fsm_coin==2'b10). |% u, ^- [1 r* v; i! B7 Z! |
! K7 w# x- x3 b1 f0 s7 Y) r+ z+ h& X( Q fsm_newspaper=1'b0;
* B+ R& \* m8 u" H% y* r: X- w2 a3 M7 F4 h
fsm_NEXT_STATE=s15;
2 P# N: g# H! ]% n
( U) }! g5 I$ o end. ~9 T% S6 a- ]5 j6 V! ^
) ?% r" y( g3 p7 y3 D; y( u8 R
else if(fsm_coin==2'b01)
2 W6 d! ]+ C- |1 p ?* b* Y# d3 V' D5 w. s. X
begin ; w V1 |3 t- `1 r# F( g3 J
' J& E6 w; g3 d3 B5 G fsm_newspaper=1'b0;1 A4 z' k: q/ |+ D6 W! K+ |5 Z
, p: X' X9 G8 L
fsm_NEXT_STATE=s10;
0 @8 b) ?7 M0 ~5 d: O. g% ?# J: l% C. F4 Z. l' ~# o# x0 J6 j
end
5 ~8 J- M4 E) u# ?" R else' K h1 J2 E% R% R/ n1 V1 U
8 z+ n8 p0 J* T0 V6 \ begin
7 [3 C# `! O/ {$ l
2 p% C3 H& m( ^ fsm_newspaper=1'b0;
; G( ?2 f( A) [ T2 \
6 E4 ~$ G1 e1 ?8 L# n2 `0 }# h5 ? fsm_NEXT_STATE=s5;
! S; t4 y- Q9 D/ `& M
8 \" u- J0 o; {+ ^# K& z* ? end" S* D% t/ M& O
5 m* L, i& Q dend
) C% i* V7 a8 N7 w1 ^
$ p! O' ^4 P5 g) j% E& P) Ws10: //状态为s10' e* g* @: A# S+ ~/ ?7 U/ I$ V
/ G7 C0 T3 L7 _& ^+ k/ w7 Lbegin1 o/ Z4 v0 Z+ F' N# e/ j+ B
6 m0 i0 J" m" p4 \6 N% t
if(fsm_coin==2'b10)
% H) ^6 S& n, K9 [ `* H/ e' w) J1 Y& v. B
begin
' D( U0 ?, b8 C' V" m- J% g, _! \0 m/ ~7 J
fsm_newspaper=1'b0;
4 ]# f+ o5 j8 I1 U( n0 \' u5 D- U$ @4 x
fsm_NEXT_STATE=s15;
$ E+ b7 c8 A& f; r: N! y% q( a0 Q. Z2 P p, R) V" p6 |
end
1 {+ [& E- x/ H- J: m, q s3 d) S( m
else if (fsm_coin==2'b01)4 e. D' x4 [2 ]$ R2 @: M
5 e/ J7 |! y$ V; _- ] begin4 O% r6 H K! l- N, h* n
; o" h; k; _% p3 u0 [! j+ I
fsm_newspaper=1'b0;# r- B% V" Y( w
8 O% [6 o% i m7 T9 f fsm_NEXT_STATE=s15;% V- J$ Z8 N7 P# q; h$ I
2 l+ v: L8 Z, S, C: c4 `: k
end
/ F' k) H& s+ {& | l
0 g+ q" X# @+ G% a+ F9 t else5 N7 N# L6 {% s( v: Q/ K
. h$ H1 ]& H" k. M _7 U
begin
( r! F6 h' {$ p2 H8 m0 J4 w- w, \, }0 D* r1 [3 |. e" l0 {
fsm_newspaper=1'b0;
1 d6 x# m2 ]2 W8 h3 o
. \& j1 z# y: B0 q fsm_NEXT_STATE=s10;3 }# m1 L9 ]1 d: z+ }
" U3 O- i, E- P! X2 ~1 O end
3 f' h1 o3 V' J$ C1 u! Y% d* `2 S7 {: L5 P$ h, z" A2 S
end
( v$ x) `6 m4 ]' [: M: J
/ ]7 U; F. i4 S0 b Ds15: // 状态为s15+ _ D J) s N0 K
M9 p5 P" s3 E3 c+ z! H
begin3 D K, d" `3 L! ?
* D3 ^$ c/ ?& T+ n' q
fsm_newspaper=1'b1;2 g2 C) A- L8 h6 F0 o% W6 {" h- h" X
5 ^1 ~3 w( P3 k. ]
fsm_NEXT_STATE=s0;# h3 m, K% \. O9 ]% [
! X0 {9 @( M( k7 ~8 C3 U7 O
end
+ V* f: Y, O* z: r4 ?8 ?3 u1 ]# V* u0 u. Z' Q
endcase
0 N9 j; D8 v. l; Q+ h8 L
/ x2 @' {4 L M! k; m x- wfsm={fsm_newspaper,fsm_NEXT_STATE};& P- {- F# ~0 R% I% Z
f& n: Z6 o6 d/ ^- Nend) ], \6 E Q! [. k1 [1 ], u, n
# Q# C/ B6 d, S9 Y: Zendfunction8 j; f6 K3 Y/ i) O7 {- |4 K( S
+ M( T" {/ S0 D, u' O+ s. k//每当硬币放入或当前状态改变时,组合逻辑动作
$ H# m9 b( S5 R: d! ~2 R
t6 ?8 _, ~; |7 F5 Vassign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);3 Y/ H2 a6 C5 d0 D
+ v8 Q- O( O& ?//用同步复位、时钟正跳变沿触发的状态触发器4 u0 s I% e/ B; P
2 s- g9 z1 P0 p
always @(posedge clock)7 {) X: v) p% W
3 e" g# l* h) l0 {/ q; f; Gbegin
3 G: ?# k5 ~6 T( T3 W$ n4 ?6 \8 f6 s6 i: M
if(reset==1'b1)7 `( W- X; K+ ?. q0 Y8 v4 \
8 {6 F8 K! @0 j2 s PRES_STATE<=S0;
2 l0 ^- ?- S& i) a) R/ S% R! j5 K: z+ b0 W: H2 W3 u
else/ g4 v0 h- c/ Y* g! L" S/ ~; x
# ~, ^1 B' L0 ?/ A% h% ^ PRES_STATE<=NEXT_STATE;
" b" A* a: T$ ?2 t; J
( c2 Y: F) ]5 t" ~. |( d end% A& C" A+ I* o2 c# G8 c
- c* f8 n' R' p0 j8 y6 h
endmodule% u6 J! Z3 h2 e! O; }3 ] ~0 ?
1 }3 n3 W% y& w! P
! x. q/ G( `# f( v H- U5 X! p: U5 R( y( A$ I* A7 ~6 L6 g# e2 d
我的疑问在于这里:- x9 E) p7 N$ z6 l" |
* l {. V. H, Y- G! @2 a: ]6 U s
//每当硬币放入或当前状态改变时,组合逻辑动作# b0 A8 E! i' Z5 g
; d1 y0 s3 A, m; }1 m+ u* y* V
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);' f3 T7 C2 G+ v$ g1 k7 o
' e$ ]6 b$ w* N* J- z4 V2 f f+ y7 l+ D' j" L
: M: @' V7 r* d( q就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?: j6 j' {% \! {% x
K0 {; ^9 J1 c% R
请问是不是我理解错了什么,初手还望各位指教。。。! v. V9 M7 o9 V0 H6 o' Y
ps:在别的论坛也发了,但是没人回,EDA365要给力啊。。。。 |
|