|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位,初来论坛。也不知道题目写的有没有问题,见谅。# V4 e. X, k+ S" b* u# g* M
本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:3 z5 `$ J5 P3 p; e
+ a$ i* [, U/ l; f3 E/ P' D6 T- F
! I0 x. k4 t5 v: |这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/ |) q8 k% U/ j
. W( X% Z+ P9 y/ q- F6 O4 H4 V# X! r w1 q1 S0 f5 [
以下是一部分代码:
* q7 E6 D. @3 }/ U8 \+ Q5 O9 B* g9 c) s4 G# B( f
//用有限状态机的办法,设计报纸售卖机的投币器
# a8 D! s% h3 b$ u5 f% E; n. G* ^' b# u
module vend(coin,clock,reset,newspaper);9 T' @2 ~6 g7 a' _* A
- t; [: ~9 z- @; c4 F. v
//声明输入输出端口
# V1 i4 [! i! I& B1 y0 q- ~
3 G+ ?0 E2 W, _; X1 B7 z' X5 vinput [1:0] coin;
]( h& K# B5 q9 F! }
6 ^( D9 v J! x6 b1 Rinput clock;
6 V1 O% H( [2 c$ d7 ?* _
6 W% Z6 t; J" N: w& Sinput reset;
* W) B+ l, f4 Q. G4 L: ?0 x& U3 T* R5 U. c2 \. c6 C. J- d
output newspaper;
5 s u |0 R" ^. c8 ], \8 F3 ]: x) Z6 E- Q9 M$ t
wire newspaper;
3 K! L" l) V9 o4 Q" g- c' }: w4 X* j
//声明有限状态机的内部状态
/ H/ r3 t6 C5 X/ ^8 {( X& \" q/ ~, \( t+ H6 V2 q7 `
wire [1:0] NEXT_STATE;7 g% Q* a! u8 X) m r0 c: n1 u
9 e& m; g I- H* W) Q& e% greg [1:0] PRES_STATE;
( L5 h0 ~* @% j$ p1 U/ a
: r6 K ^6 i5 @$ F1 l2 K6 m2 q% t//状态编码
, `4 W4 T5 h1 L1 i" K) x/ J0 }$ O1 Q! _6 o" H5 r4 Z
parameter s0=2'b00;$ E+ v! u; c; Z9 h7 e
: I) O) y% X0 u3 e
parameter s5=2'b01;
+ F) _6 t9 t( r1 @, H! c
8 E& e% {" Q" H, K7 j3 Vparameter s10=2'b10;
) N# K) d3 X4 @ E! R& F# b- y0 @7 c0 W; M
parameter s15=2'b11;1 U8 \0 [5 E, u) a! g. `9 h
2 ?9 {" v& H& `# ]) G
//组合逻辑
9 G, P% ]( e6 u- D0 e; k1 ]- I8 F* J3 X. g& ?5 k5 C
function [2:0] fsm;9 N( |+ X; j' F+ @ @+ B
' p0 Z( `# A/ }input [1:0] fsm_coin;
; Q$ V% F6 N1 A4 g& ?
0 b& y8 ~+ T3 ^" E d: binput [1:0] fsm_PRES_STATE;
. h% ~4 B1 @+ C, [, j1 G' F2 o5 r' x% U. s7 f3 y
reg fsm_newspaper;
: r, ?$ _ E, G. T2 F. V3 b1 I# @/ d* C- k
reg [1:0] fsm_NEXT_STATE;
) h; B# s3 j0 f4 a# o# ^4 b' b$ k1 f2 g4 a+ {; N" o
begin
! R+ f5 L7 i5 w* V6 U
4 r' Q, q% {* @( ?+ M1 |% o y case (fsm_PRES_STATE)
; v0 l2 l( w! k9 ?4 z
) V" \# L. b( [) P ] S0: //状态为s0
7 u, H* f- r' l G
, b, t5 X- C& S2 A3 b" X, P! l2 n' M begin0 [$ c8 s7 Y6 Z1 R
- I( Q5 J; z& F0 }5 ~2 \3 _. j
if(fsm_coin==2'b10)- }6 y6 `1 U, v- v- i, g- C
5 n4 F; ]- K0 }; m: J9 s( `/ T$ b begin7 j e& h1 O2 p4 T, G
. a& ~! o# t& |8 `' Q$ k
fsm_newspaper=1'b0;" O' H8 w* @" I% a7 N3 Y; w' J0 d& L
, ?! O2 s! v3 b" C fsm_NEXT_STATE=s10;
5 j3 F0 a7 }# n3 Q; v( G
1 h+ e% L- l, @5 t G end
- _2 e. g( b( _; M
& B1 v# B1 z0 D3 u6 S+ d else if (fsm_coin==2'b01)
K" ]' _9 X8 Q& E) [% S6 Y
4 }" M) u# C& c3 v! g: x4 P" } begin
3 K. p' V7 q' l- _! b& B2 f& |: {+ a
fsm_newspaper=1'b0;
& K+ d4 Z4 s0 `8 u k( }4 W
+ E/ W' h r, |% a fsm_NEXT_STATE=s5;& M1 [ b' u( x% ^1 U) ^ _: C" e
' {4 |5 _6 E8 D9 @# Y
end
! `$ j6 v/ v: t7 h3 S- c
, E* t, Y9 Q. L4 `) B/ b else
, E# n8 p' ^6 d9 P& I" j
" w: I- k k0 P% j5 d6 ]3 z3 ] begin9 R3 }' Z, V+ p0 f) L
0 C, {9 U9 e/ E! H+ q* @1 ^& g% q$ Y fsm_newspaper=1'b0;0 @) u' D. r* ^4 B" Z% {6 ]
' O3 j/ O1 v9 m( x F# ~* L fsm_NEXT_STATE=s0;7 h$ Q, I* x0 A; P5 V
: `* h! v2 K+ I6 |5 B end- U& B) G( i$ T7 j; j M& {
6 a" _0 j( Q+ S6 o# }( M% y' f# Bend5 ~! y( ]7 y' a; c, A) F6 b
1 x! g1 I# q; d7 r
' w$ k8 L' M$ l- ~+ ~6 W# e& D4 e7 l
7 t4 W* X8 N) o2 A" {! S4 ns5: //状态为s5. }3 s2 D; W b7 E. s
' m' `0 r0 e, {& {" y; s- ]# W
begin4 C) ~& ^& C8 ]% I" c
7 D0 k$ n$ K& m4 I+ K6 O if(fsm_coin==2'b10)
5 c; g& Y. t1 ^& c8 G E
0 i7 m# D0 S& J6 V9 y0 b+ B fsm_newspaper=1'b0;7 B3 k" i' F" A: j' }+ W3 _( c+ p
: ~" ^0 m/ X' O" x& n# j fsm_NEXT_STATE=s15;4 X5 F, h, y; N( V4 U2 M$ X+ O
7 I; E' a" B. i2 D end
. @# y4 `1 D, c* @. Q! G0 w( P# Z0 e8 k$ ]* I" Q
else if(fsm_coin==2'b01)5 r$ H2 B0 E# x% }4 J: n7 e
$ I( v$ Y; l5 \( y4 z begin ; \: E! J7 u* j Z9 q% E' O2 \
5 J; j5 x8 t1 d5 s
fsm_newspaper=1'b0;$ h5 L: x; r* t! }! j3 n
8 b- v" t3 a G6 S$ W fsm_NEXT_STATE=s10;
( m6 C5 ^0 ]# I0 |" ^% T _, ]: t7 W; d3 H
end2 c2 d' \3 y: b
else
1 K8 P. u/ P& `$ p/ S( k& y& |* y# I9 G' Z% U) ^% q! ]" ^4 Q' B
begin, D4 d6 ?" K! Z2 H% n9 X0 G
. G' V1 ~; r/ ]6 g fsm_newspaper=1'b0;) T; a- b# h7 Q- @
' x- _: v: V S, w1 [- C) y: w, x fsm_NEXT_STATE=s5;
1 m, c+ N3 |2 ~& T" M; K
- d, G( x1 [2 w6 k6 b9 q end) a9 ]5 V# H5 C8 ^1 `
1 }" d4 m0 Q- c6 j$ t. [end5 G1 V5 o0 w+ v$ J
- {+ V _. T S- I- H2 X, P2 Is10: //状态为s10
3 d& F0 d4 H7 I* }9 u# s+ x3 d! v/ I1 p9 J) `* E |! y) H: `
begin
8 U9 R8 P! _( Z) x5 R0 N$ Q I N9 ]7 M- L+ g% S8 g+ K4 B+ A/ }$ f
if(fsm_coin==2'b10). T/ g( p# o- p- M% s7 d
. o0 z7 Q1 [. H7 r' d: U" c begin- Y2 D& d# J1 W# y
0 O4 R7 e( Q. @" ~$ g" M fsm_newspaper=1'b0;5 J# n- u9 j5 f
$ l8 I/ e" j* a4 w% o" |8 i* v/ B
fsm_NEXT_STATE=s15;
0 u Z) ~4 |8 O9 H ?$ A- `+ U; L* ?( T0 W6 M9 b' Z1 @
end- S! R' A$ d1 C2 l* b
# E b8 {- t; M1 C# x* w7 |
else if (fsm_coin==2'b01)* _/ Q6 m' z- Q4 `! i) M7 H
- V+ |$ D, \2 r: e. _8 n. J
begin. c7 v6 G" u0 O% o& \9 z; L
' {: X3 S% _' w8 w5 m2 A6 x$ e
fsm_newspaper=1'b0;3 E$ Q. c, L% D- K
) _9 {$ H; n7 ]$ F9 T9 k
fsm_NEXT_STATE=s15;
8 b0 z5 v& T+ O( v! G6 r% l3 U1 Y* ^5 P# ?1 q* t0 J
end
. F( Q8 w! o$ Y9 Y# [+ T% n7 u9 f' z
else6 A* M1 [: D5 C# ?( r2 M* J
( q; t1 x& b7 O; C/ S _ begin! Q. ?& G' G: `1 l5 ?# U3 F6 n% N* a0 d$ D
6 m2 M' `9 S) P X+ B( B fsm_newspaper=1'b0;2 g6 M( ?$ P$ O. h% T
5 l$ a% U: @% Y) D8 |& `
fsm_NEXT_STATE=s10; R8 k: `# s+ O8 V9 {
6 w4 B- Y! L' e7 w8 c1 T- [ end
0 f( C/ q2 M: c" a' x+ W# E' b) K0 m6 N' [8 N* W) n
end
( W; h% [4 U. r; S$ N! V
& V, b" H: O- H- _4 L6 ]s15: // 状态为s15
/ p' k8 i5 J- i9 ~1 @
) h7 t1 P0 e1 p, b0 U$ _/ @' I begin$ h# ], ^- `- P/ R9 N" t
( z' \8 ]# Q' @; d8 Z fsm_newspaper=1'b1;' R( V# x- X* n! `0 H' L7 N" c0 `
: c9 ]6 x7 h {4 j% D5 p+ X
fsm_NEXT_STATE=s0;
. F2 B4 C( K/ H; k
. [5 [. V0 a. f end
9 s, T7 p: w" Z: D) N$ W2 m8 r$ V( p4 t* U: O" q
endcase
7 m2 q; Q% X8 G+ w3 Q: W2 S0 m# F9 T7 {9 \9 L
fsm={fsm_newspaper,fsm_NEXT_STATE};. I" k h- q, M6 F
0 R& r- B( n6 J+ iend U, p# C0 L# z+ N
! Q! [" s% B, \6 X' `3 Wendfunction
7 [6 Z% D# [# g! b! L7 A7 _4 R% r' n1 n/ R& _0 e& a+ f; N, f
//每当硬币放入或当前状态改变时,组合逻辑动作
2 D; u( O/ g$ o8 w' W6 N+ ~+ d4 j* |5 b# ~, o# }8 U9 R% Z k
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
, p) }8 @) M4 X
6 L) a2 [8 G0 b g6 l//用同步复位、时钟正跳变沿触发的状态触发器
- L5 v* y& z# S+ S* v) l
7 _2 J+ D1 V4 J) X1 zalways @(posedge clock)
+ [0 y' ]0 E: h4 M9 C' X: {) [( x1 [. F- O# `/ G' `# q
begin' Y+ C" \- e8 i+ K9 `
7 \" m2 ~2 c& n* ~0 P if(reset==1'b1)
; O# N, L; G' q3 Q! a3 T7 ~" Z$ d R/ j. R) n7 J- f% K" G
PRES_STATE<=S0;
( g R3 C" `. d0 h8 @% Q+ H
# }7 J7 m0 u& K* L else
" y. i. A6 \# ~! Y5 U$ t I% I3 }4 Y7 x1 L$ g$ Z1 B
PRES_STATE<=NEXT_STATE;+ C3 ]+ p7 C/ x f9 y
7 [! t; i$ E9 N end
& }2 n% N1 Z9 k$ s! a0 l+ Q6 l+ d1 S0 D+ Z/ ?* N! H8 i2 y
endmodule
5 X. W3 H( K6 _9 i" Y5 S( ~+ x
+ r/ j5 z4 f. Z3 S8 ~# e, \, U5 U, e
" R: k! _% |7 `2 |7 N8 V我的疑问在于这里:
8 c- h% s8 k4 c2 S1 o/ ^1 r+ ~7 @! T0 ^# q* z% ^6 k' h7 d g0 Z" k
//每当硬币放入或当前状态改变时,组合逻辑动作3 i1 ~2 M7 ^ w* V
, q z" H) r) p( t4 T, G; U0 o$ qassign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);# c. d* @% z: f+ o' o L9 K' e$ o! c0 r
( ~4 j9 }: x" D6 t7 ?
8 t6 {/ O2 a+ o; f" q! P. O# U; _1 W( ]7 v
就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗? I9 |+ @' N" O- c- O# n, a- V
5 ~' u2 X: h" G请问是不是我理解错了什么,初手还望各位指教。。。 y: L1 Z: t) w1 F( j) c9 d6 T( A
ps:在别的论坛也发了,但是没人回,EDA365要给力啊。。。。 |
|