|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位,初来论坛。也不知道题目写的有没有问题,见谅。& D* o( v$ o" f0 \0 A6 x$ q
本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:
r( D4 T' X' V9 S! G, R3 {+ F2 Y o! h6 |+ j9 \ |5 f7 | K
: f, u+ m$ [# F$ d
这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/* f* R1 }- Q/ w3 ?1 D
$ f# ]+ C$ H+ L4 `6 b b
' s& p, s3 P% [; P3 j W
以下是一部分代码:: b2 h. n1 E6 y1 F" p9 c
$ T7 E: x8 `# L: a" C* s//用有限状态机的办法,设计报纸售卖机的投币器
% U5 P/ {# I) T
6 X% o5 W+ z. g$ zmodule vend(coin,clock,reset,newspaper);
" K y3 ]. i1 h* ]. \+ r& y" s, E" e' I7 b
//声明输入输出端口1 b4 q0 _8 P- @9 f j n. E
`3 r' a, ^! s F1 f8 h& B linput [1:0] coin;
) x% }- B+ e7 `4 a! m
6 {# n k) o9 O7 Z& d* a* @, m) Minput clock;
) ?5 I: I# h, w/ e0 v( y
1 D; i: O6 h9 X6 M, vinput reset; w* }$ U$ i3 M. @ A
3 {% h9 \. w- g$ ` t+ S
output newspaper;3 x" n6 s! B/ C+ V) P
" ?- ^4 M4 ~$ f' K: ?4 s0 W
wire newspaper;
* J: T4 \1 d3 B0 U a' }* C0 k
% Y5 F2 p. ^3 {//声明有限状态机的内部状态# q% M, B- O* u) r/ H- K1 t
! G! Z0 |+ H y! l) E& S7 dwire [1:0] NEXT_STATE;( J) [; S; F$ f- |/ c n' ~
/ g. k8 L" e' ?/ W* q X6 preg [1:0] PRES_STATE;' k" V4 _0 M9 T+ N( _' u
6 _6 u! e: C. [/ C( L( I! |" g//状态编码
* S+ I+ M/ D: g
! D0 K' ?4 P. I, G5 T8 K6 yparameter s0=2'b00;$ }2 J5 g T& [3 x
5 w' X5 J" M: @. u
parameter s5=2'b01;
1 E0 w; y0 T, i) r+ O c
: y# m b0 ^" i$ n# Hparameter s10=2'b10;
c+ j+ A1 R1 n0 x
9 m" b) \' Z+ `3 bparameter s15=2'b11;3 R: c3 h- f2 X" X0 d
0 C' r k) T: P v9 i
//组合逻辑' j, ?4 F# j _3 z8 {! }3 ]
1 m) W( ?- b4 r. o6 lfunction [2:0] fsm;( _0 D6 X5 M* k) p6 a' K* U
0 b" z& v3 ]3 R* g; O
input [1:0] fsm_coin;
9 R7 v- W6 L; h8 P2 P% _9 t; |% x; b. G' r% y) v3 I3 V
input [1:0] fsm_PRES_STATE;; U1 f" P/ i8 d1 U, R
0 X* y7 f) u+ {reg fsm_newspaper;4 p% j c) P) p, G' c0 f0 a4 W
- J& B; p& K4 r0 T4 f- Greg [1:0] fsm_NEXT_STATE;
3 o% }: C% L3 p. l1 U
% P& Q( z- {! n- {0 x: P7 s7 U/ Fbegin0 c* z* }2 t% m$ z- m# H( |9 T' O4 A
3 l2 I# n/ [; x: d( c/ g3 I3 G9 } case (fsm_PRES_STATE)" B9 X0 _# Z) | a' B/ p, k$ X6 O
$ q1 U! J3 x. l j' T- M+ i! O S0: //状态为s02 ^4 {( s% r; h6 |$ _8 W8 o- H
0 Y, L6 B) I8 t: ~ begin @2 f- Z" n2 @. ~. r7 `5 l3 \
$ x# W9 r8 O7 v& ^7 Y3 H" N" e
if(fsm_coin==2'b10) u# X7 z$ u9 H" E: g1 y
. j' u0 j, ?1 y4 p" L/ U0 |$ o
begin0 Z1 M' Z0 Z, o& x6 B% A
4 L( S& Y( l' h5 @. j4 F5 ?
fsm_newspaper=1'b0;* q. ]5 | n5 a M% N
( Q2 q v7 k3 O. W( u9 T
fsm_NEXT_STATE=s10;
; C) i& h* L k5 }/ X( n% [# j9 w* V8 X$ m
end; K8 J& {9 }: p2 c S
( e7 @ P- ? H, n
else if (fsm_coin==2'b01)
" O5 M2 B H. V2 N3 c* h+ ]7 i x% B u" A
begin4 k) F9 c$ p3 _
# J& x; A: g/ s1 N/ j
fsm_newspaper=1'b0;$ O8 m4 U2 |/ e7 R: f
Y7 C5 R- F0 w( M/ }1 ~: m9 G9 `
fsm_NEXT_STATE=s5;
8 N9 g% ?, A5 S; `! M7 _& e5 Y$ x; V2 a
end
$ V& }; @/ a9 n2 c+ A& H. b# d' }$ s, \/ Z/ W" U
else4 o* X% D* A: k- \: l
, ?8 A( l- h) Y( ]5 c$ } begin$ N2 U# L7 Y% @- J% `: _
! N2 S3 b1 G7 p. x" {
fsm_newspaper=1'b0;2 p( P8 L. S" J, t
- {& s3 m1 T4 O6 A, O6 Q
fsm_NEXT_STATE=s0;/ ?+ N* _: l/ R! h8 R+ d
7 p- C' e1 L# B5 \8 F% V7 ]) u
end
$ G% x7 L0 G" Q0 {0 `! F
# ~: `* c% { }& aend
+ Z2 h' E& h4 I# ~: H3 Q1 `/ _4 H: S1 R, k) q7 ?
3 R/ w7 z% L: L; p a. A+ p) j# P0 w
s5: //状态为s5+ W! o, X% b. @0 _( r# `: H: W& @
2 z/ m: K- `6 R, \' y begin2 \0 s) A. Z( C0 e
# `* A7 C" V- z# B% g' u
if(fsm_coin==2'b10)
* a- Y, n j: m. \4 b9 S/ n# C
/ W+ W# B2 o% r+ R- N1 F# ^ fsm_newspaper=1'b0;
: D z, f4 Y, B, T5 f/ E0 F% ^6 I8 a% P6 l7 V1 X7 S/ d9 ?- Q
fsm_NEXT_STATE=s15;
% K N0 X( s, o: K+ R' T, C) \" Z' I! A. P6 W, o/ `- V" D% y3 ?
end
3 U6 L5 K& \ t& S- S) Z
! K, Y3 b$ b1 B5 }& Z else if(fsm_coin==2'b01)" K5 ^9 F- n& L3 H* C: k& c
, ?& t, }7 n* W2 N! S
begin
+ t$ M# h% V2 ]7 ]% V) s9 N: K0 g8 r) @, A
fsm_newspaper=1'b0;
. O. H6 S: {, q. A" l6 v& q$ H4 \' h a( r1 u- N
fsm_NEXT_STATE=s10;
( K9 \& }* P2 p( K- q. W/ K$ F: e0 s* \. G9 ?; _2 p/ E
end
1 U& X0 K5 \) V2 B% g else
& G6 a" P$ `/ r; s* q3 d2 R7 S& f4 h* o
begin
4 f' y8 d) I, D, Q+ R- B
. m7 H5 y7 Y, s! s' O fsm_newspaper=1'b0;
9 z# P' N% R# b% U2 e" o, W0 T1 B2 s( `* O5 w/ _& t
fsm_NEXT_STATE=s5;
: I6 h9 M! d- w8 H3 ^& Y+ [. [# O- B7 x1 z: p, d
end; \( Z: v# H2 x: S
4 W, B1 u8 s$ q- u8 p. |
end5 {* D4 u/ ~0 v1 l& s: Z' Z# S" }
! B7 y4 k8 c3 J9 Us10: //状态为s10
% a- x' V# X8 A& F1 D6 x7 p) ?' M: w- R% I' K0 p5 Z, J) E; t
begin$ |# I# A/ A& {3 _0 c2 s% L r
6 |( }. [( P. r( g2 ]3 h
if(fsm_coin==2'b10)
I% `. ?& T+ z0 b; N& x6 H7 p
- G9 J/ d$ I7 ?- D5 j2 A begin/ ^& ]% ], K' i
7 ^$ H- m! ]2 o* O. ^2 }, [6 S+ k
fsm_newspaper=1'b0;2 g* z1 W. |3 f, U
( c. {# Z6 w+ d+ o& `
fsm_NEXT_STATE=s15;
2 b( P/ Z2 [; e* P% v% r: {$ p! p
2 K% Y. v) U* _ end+ g& B% y, [0 c3 G F/ s9 n) y
7 i. h* H' s' Z. J- \ else if (fsm_coin==2'b01)
- J+ T8 t# S: Z, D* u6 d
) U! B9 \3 `9 @" u! Y# ^$ w0 A begin- H5 u( m: y% v% n% d
6 }% f; i E1 u4 c9 Y0 `9 x& w fsm_newspaper=1'b0;
* e& K' r7 j% Y. [ e) H) C- `" v0 S2 j g! k. ^1 f f
fsm_NEXT_STATE=s15;% f* d# s# I4 D3 l) b1 K- Y- P
2 R& o8 E# ^1 o% B3 s
end
3 l) i4 I) H3 g) c/ g
$ y2 ~- h5 w( G7 S8 B: s W' L else
! b1 Z7 _5 h6 }9 y" t" I$ Y. F' n. G3 T4 |( J; {# e- R8 V$ D
begin& H/ ^+ K! E' A: ?8 T
3 P F, b$ n* @8 p& Q fsm_newspaper=1'b0;
8 Z$ G1 x0 i8 r- `5 @+ i L; f# m+ N+ G6 R
fsm_NEXT_STATE=s10;
- x% M6 h% L/ @7 O# C& F
7 N0 F6 n9 G l6 R; l r _; d& v end" ?, h( k5 z4 ` k) I# D5 I
! g. U6 D* B( D9 Cend
6 d2 S. z; \4 U& ^. P: }6 }* s1 k$ r! W# r* R% c
s15: // 状态为s15: i r& Y9 h- A5 k
5 ^3 ^! A5 \6 E4 _# }
begin
; g0 I( j! w2 V6 B; c& c( s5 y I* @/ a: P1 N
fsm_newspaper=1'b1;
+ `* f0 w1 Q" [: H
) V3 i, G5 f9 }" y* u0 c fsm_NEXT_STATE=s0;
) a3 s @4 Q, H3 h$ a
/ P+ M4 F' D& T: ?9 y4 ^ end
3 o0 g; R6 ?! c( n! n/ Z5 S
6 p2 {' S5 f2 Y2 Q* t! i) gendcase1 d4 S4 y2 K) N# R1 s7 ]: j& D
7 {7 T, l- [+ @
fsm={fsm_newspaper,fsm_NEXT_STATE};
e2 b; Y3 U% a6 U5 x) E/ L; T) t$ l7 o6 ]. \7 _6 X8 q, g. P
end4 Y) G% K" Y% |; g( Y
4 R, ?! O! P S6 Z& ^endfunction
1 _) j" i# v1 W
0 E2 ?0 r" p! Y; c//每当硬币放入或当前状态改变时,组合逻辑动作
3 A; f, o8 o9 |7 N5 `" W: Q$ o. S9 Z7 y
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);7 n6 P& g# V' F% ]0 p
9 D7 Y6 ]: d9 a, p& z m
//用同步复位、时钟正跳变沿触发的状态触发器
& e- u+ f! A6 Y# f. b, W2 M0 b; Z2 x0 o" L
always @(posedge clock)
. f% Z( u% U( S. L$ V
$ O4 l. p9 K$ Qbegin
# |# a. U( a) s" `2 b; @7 R$ k: T: T; Q2 j% N5 h
if(reset==1'b1)7 [; d" F$ m- ~
6 b+ s* ^+ d/ G7 \1 y6 F& d n
PRES_STATE<=S0;' Y3 `6 J$ {9 M
" w+ B _0 @4 A7 h else! H% J: Z. j& ~2 w+ p5 H# }, L
0 B" `4 y2 y3 i
PRES_STATE<=NEXT_STATE;
- Q S! |% c+ o5 H2 C
0 z, | n1 z/ Y3 J5 c9 x end3 x/ B& j. t( d5 h9 r: L
& M1 a8 e; H5 @! W5 E5 oendmodule; z' A! }- U9 S" G3 X4 _
; T0 A! U F, |3 o7 r
: @" }6 Y& e) g: f! H( x* P- U
# m& ? j9 V# W8 H
我的疑问在于这里:
; ~- r* B2 Z6 o7 T
5 h% {* A1 l1 Z8 q5 B//每当硬币放入或当前状态改变时,组合逻辑动作
. I) x/ i/ }" A. x& u1 Z5 J6 `( A2 @9 R, g4 v; c+ F" Y" T7 k) k
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
! o+ d7 m: j2 Y! J7 C0 r d- D4 B. w1 q5 o3 K& r3 R; l# y
" ^ R% E! \1 J" H7 p# ^, U7 L
4 E) }) K: S. [' `6 N就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?( U# C# h/ a7 c# e4 E
: t( S$ N2 ?3 ~2 F
请问是不是我理解错了什么,初手还望各位指教。。。
. u4 f& v3 k2 D+ |" y! lps:在别的论坛也发了,但是没人回,EDA365要给力啊。。。。 |
|