|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位,初来论坛。也不知道题目写的有没有问题,见谅。
: k' F! c/ U' b- H本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:
; v* X0 [) Y5 J1 ~) s1 z4 F# l3 _! X( r
0 R# X0 d5 x% W$ F2 {/ C% ~ H
9 c; D+ x1 {4 s这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/
( Q) B1 b D4 c) [$ _$ x% h
- L/ M: c) d5 U5 A9 x1 |3 E. [* ^0 k% F" y8 x0 H% H
以下是一部分代码:
. q" b0 Z5 K5 u. M, q* a7 f6 t$ L, \. N
//用有限状态机的办法,设计报纸售卖机的投币器+ K+ l7 _: Q$ D& H
# t/ y& T9 g, C. n# k- T1 T
module vend(coin,clock,reset,newspaper);# G% B7 g a4 j8 I5 D9 Q. c5 ?
0 i! f- r9 s7 `0 Q8 F5 K6 z! i
//声明输入输出端口: M4 B4 e N F; @, {: F
; {( q, R7 I: p5 g9 S$ }
input [1:0] coin;
9 d0 e" `* R6 i5 v- k* T- c" v, O) F
input clock;6 ^, ^7 V; i2 P8 E) G
1 t# o4 w- @( b, C" T
input reset;9 |2 C# X8 A5 g6 d' J
7 @. ~: d5 T7 Z% Loutput newspaper;
5 E) T4 r1 \4 Z6 Z2 W/ G0 w/ ^* |( }. E; H0 Y" n( d
wire newspaper;
3 d+ T3 y. U/ j( E8 Q
" V& M3 d) ]0 k9 Y7 p- ?, C//声明有限状态机的内部状态6 e2 e4 N& B# W, p
: E2 x7 ?: F2 \1 zwire [1:0] NEXT_STATE;
5 Z0 R$ H2 W# R3 e3 c3 I" ?) j( q/ v
, O! @' j+ l; F' E; s& ~9 x/ p# |- c2 Preg [1:0] PRES_STATE;
8 X+ q. Y, i/ v1 B+ Z0 L) k, V) h& z3 b4 b3 Y& s. N
//状态编码: r1 a, k+ p# b' v3 ]) y
0 [ N* D# D4 F' j8 |parameter s0=2'b00;0 @+ ^- z8 a( r2 |
x% j' b5 ~1 eparameter s5=2'b01;; I* M0 c, o5 ^8 L: y' i. C' w) Y
7 W, t1 p& ]/ ]& T( h7 k4 a0 P, v
parameter s10=2'b10;; | ?( I9 V$ ~/ ~* x/ s Y5 p
5 o+ V( J" ]' \; W
parameter s15=2'b11;$ ~, ~ F% s3 U+ a; U
" z. s5 y/ S) X" E8 o3 U
//组合逻辑* f4 ^; V* @3 Q7 L: B, C5 `$ f6 g
( ]6 l; O7 _/ d
function [2:0] fsm;- g: R6 C4 r2 D
/ v* u; h5 W- s) }+ A0 Y
input [1:0] fsm_coin;# {$ Q0 {: N5 U3 P* a3 L
) Q9 F8 K4 F: K3 q4 L" Jinput [1:0] fsm_PRES_STATE;3 g+ t z, x- u4 n- ~( C
# L8 @3 b( N! z' ]" Y# Breg fsm_newspaper;+ S5 V$ X( D0 ?3 L
4 g- g4 V3 d# a" Y7 {% }! wreg [1:0] fsm_NEXT_STATE;$ }& k: v- ]$ T- a5 V
! O6 X6 m7 ?3 b R6 c( V
begin
5 A2 r, Q* m% x0 o# y( w6 _" m* U: I5 F8 H2 r5 c5 U
case (fsm_PRES_STATE)' Z% w, {' `6 F6 N9 s8 C- X
5 x0 O1 V. g. u0 p7 ]4 A
S0: //状态为s03 M( [+ I, E( @6 ?* X
- b8 H S3 V8 L. L& y* n
begin
" u; Y1 l8 Z: w2 ]% m" p6 J! c2 B7 `' {+ J
if(fsm_coin==2'b10)
, V/ K% @0 r4 t; p
, o' V( L7 c+ w begin& l F# o! C, o8 [! ~3 W( o
; Y1 R$ m% t' u6 V' _' O
fsm_newspaper=1'b0;
( [9 Z# J F- O# N# l# J; K+ F- e! Q( r) t( b! _
fsm_NEXT_STATE=s10;! M7 B1 g; l4 S# y( Y+ D
- i S/ G) R2 L. p0 B end
4 b" m. h4 S A( ^4 y7 e* X: R) X' a/ X- o( n
else if (fsm_coin==2'b01)
& E1 U5 r) z) t( w9 q& z
6 c8 Q: U; F( `* n% Y V6 f begin7 o7 l2 s i9 L( x
' o7 [% ]5 T3 F* X# F9 D D
fsm_newspaper=1'b0;
( |9 b1 g; H1 `& r; u' v/ `1 m
# \/ l' G. r4 g fsm_NEXT_STATE=s5;
$ V3 @% m, H! Q: m, l
& ^. h6 n! N H+ b( w end
0 j$ [& X% n' ~3 o) z }1 z; d, U) Z$ Z6 c5 T/ F, q3 Y) O& d
else5 e- V( Q6 E7 o4 a9 |
$ t& _7 O: T& Y1 g0 l
begin+ y1 O! V" i. A. h& M. Z' {
) p; W+ u1 M/ Y, G5 j- U* x) A fsm_newspaper=1'b0;
0 S2 H; i" C2 f% @2 ^+ x
2 j) @8 a+ }( B: A2 `/ B fsm_NEXT_STATE=s0;4 F, W% \1 C) |' [# g
7 S! s0 Y, `' M. n- c$ p1 a end/ u3 O5 |. t( E; ^/ C( b* |
$ }: _/ u& m6 U; x6 l, Z m& ^$ Send
: S3 ^, i: L2 ^7 H" Q
6 O& v' s8 ]5 X* A* T! Q1 A5 t# h- o: u8 ]. Y
' V) T" L5 ~7 M2 x/ `
s5: //状态为s5
3 [" e2 ~/ P6 u% }+ P/ |; U5 d" W+ P; H- u
begin
7 D; L i# J& }0 N* M% C2 t( _9 j* L; Y
! w. W1 b( R. [5 f4 v if(fsm_coin==2'b10)
r x3 h/ J/ Z) p4 n
9 R/ g) ]. I5 L fsm_newspaper=1'b0;: r( l& U' q; } c! Y
+ Y4 Q$ z5 }8 x
fsm_NEXT_STATE=s15;
, p4 g+ _ E9 n4 S; f) `( l# l1 p0 l9 {7 K P3 @
end
, K# j v: I# v$ V& W3 ]# u9 m. V8 ~: V# M
else if(fsm_coin==2'b01)( A5 {9 n( l7 i3 h4 H
% O& x, [9 A g* `" G
begin " F2 A1 L3 X$ u: _. ?
+ m% _ W* l) T* U- b
fsm_newspaper=1'b0;
5 b# d; X0 }, X3 b' @* R0 b# H2 h/ ~2 t
fsm_NEXT_STATE=s10;
7 t; N A0 m: R. x P5 w7 G& I2 H" ^. f/ P. S+ F
end- Y" Y: s7 H8 @+ ]
else
3 C/ A( P0 q% }$ x6 A5 T
- }$ F; I; D( s begin
d' X" G/ [* l& {& Q; a
5 L1 u( h) G( v. T' e* Q fsm_newspaper=1'b0;9 H' |, @3 X, R) L5 N8 E1 ]$ y) c
( x( m) F, G4 `3 o1 c* F& {, V; {
fsm_NEXT_STATE=s5;5 z0 m" T8 H7 E: r( z- S$ C
- \# U' J2 ?- a0 d+ G4 w
end9 m4 Z6 t% T, I0 T
' B) T: n0 c9 c
end2 m6 c8 K# w# ~3 Z( ]1 Z
7 h& _; l# z" t- E5 ~3 @s10: //状态为s10% K) Q/ m& N- Z
! L Q8 m: n4 }, r
begin
. f y% o0 m' G6 j% q
3 U% Y W) K4 C: s if(fsm_coin==2'b10) s! o0 I5 X) H% | R
' Z1 k, o v0 Y, t9 F
begin
?" `' _1 p- F. H* @, }, n
' L8 f) U$ H/ y, L( a fsm_newspaper=1'b0;
- u& _( d2 C) ~$ t( V! G
8 Y2 P% \5 ~ S6 z `7 o fsm_NEXT_STATE=s15;
+ e/ N7 u6 ^, \( {% h# n& y- \. U T4 r* P% A
end0 H" s% y' o/ T# W
0 V+ F% V- J7 o) j) R7 ?( \. P/ L else if (fsm_coin==2'b01). J5 \1 U; E; {
8 Z) C' I7 P' L: M4 D/ X X begin' [4 e' {) u& j
% K/ p0 O% f8 j: s; t fsm_newspaper=1'b0;
5 B/ S8 s0 Q, {5 C6 A z
5 }) e1 I0 M- q fsm_NEXT_STATE=s15;. R/ E8 y+ P+ u% f. q7 k: [
4 c, _$ r h. q& T: T m% b9 }4 { end
$ Y. V5 V. ?0 ~4 [: p" _% q
' L- V2 e! }) t! n7 ` else( T F( B4 z- M& m [% P
0 \8 _9 _" ^+ c; g* c) o
begin$ Q& Z& |9 k- ]& Q5 S
- _2 a+ k [) O$ i$ G fsm_newspaper=1'b0;8 Y( d) k2 c/ B' v! X
5 @2 u& T3 e2 u4 F4 S2 e* K0 r1 @ fsm_NEXT_STATE=s10;
. ^! Q A: V+ d" a9 N+ G& k
, G6 _, `( Y6 P% G2 @ end9 Z. A$ I( A& U
+ e2 L1 j: y v* t8 \0 M# F
end
9 B& k! [2 ], _3 w" T# v% k) u( O" b
4 f; b6 _; E! y& d' j$ N5 p9 os15: // 状态为s15
/ J2 N6 O2 {7 y9 A+ B5 }# T) c9 M `6 }* {, M
begin
. Z# l0 x( v3 G; l# U8 w& A
$ q6 ^0 l% e$ m fsm_newspaper=1'b1;
, Q( M0 `4 D6 t) b- x0 A& h0 D/ |) K) M, t* c
fsm_NEXT_STATE=s0;
+ g1 a( v0 I! M3 `1 B
0 S' ]( w8 a4 x) |2 ^ end% U2 x' A( W8 v9 s. n% O
8 D, C2 C& y3 c4 z# U
endcase
4 t- H t5 h, P6 }( z: ]& \7 [, X; i' B2 c
fsm={fsm_newspaper,fsm_NEXT_STATE};
" i$ h2 }0 O; t c# c6 ]) N2 _* V9 [0 W4 l4 \( V
end' x9 o; u! k9 C) n8 q
n) d1 y6 Y2 E! I
endfunction
( O9 _7 ~. t x: T( i
" \7 Y6 q% l, d5 p//每当硬币放入或当前状态改变时,组合逻辑动作
- O5 @ \% u: p# b! u8 p$ V' n8 T5 T. k1 v
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
1 O' `0 d( ?; J2 {( c n6 m; G' S1 ^+ K$ M( V5 F3 M$ a
//用同步复位、时钟正跳变沿触发的状态触发器
w" n4 {& Z1 T. t; F- Q+ A1 t% {* I& [9 A
always @(posedge clock)+ z) G" v. C( x5 A' X: ?$ ^
* \- y# @( j ?, U2 [4 e& Jbegin1 Q" D: f! ~8 E% f' _& ~# `9 A
0 C5 S! F' P( \% e% V7 d if(reset==1'b1)7 l9 b; a# R8 c, ], C+ d' Z
G1 I" V8 S& E
PRES_STATE<=S0;
) {8 L r a- Y# a* ^
6 b8 d- L5 Y" q! s else
# H R2 r) P$ ^' ^. B; e$ g# j8 o2 n. m9 d7 |+ y1 X/ t9 E1 n2 J
PRES_STATE<=NEXT_STATE;7 u5 @5 y- j! n3 U4 d) ^% [
1 Q* z% }6 o: e
end
0 ~! J* a. z- e! X0 R
7 ^- O5 X; U3 f+ \+ vendmodule
. e' {* ]& T- U2 u. I4 M% }! c1 z, \5 |
2 B2 D( j- B* ^- T
|$ o. s* u; u2 X4 p0 ?; Q6 t我的疑问在于这里:+ v5 ^! M, P q+ Z# G
" ]% c) Z: V5 A# p9 o. P//每当硬币放入或当前状态改变时,组合逻辑动作& G8 H. c- Y: _4 j& v
5 }3 o4 r' \8 A% H. n
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
: k& i5 u3 \ H8 Y. |4 i; h' f' r% ?$ J8 z# f4 O9 E7 |+ k. o: H% b/ n% O1 I
6 S5 n, @2 V4 n, H: i' _
, {+ g/ ~8 m) `% K/ G就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?
$ v: m2 N# Z2 P- a4 g
# F$ ]1 h8 y, r8 \3 q请问是不是我理解错了什么,初手还望各位指教。。。# t7 M D6 }8 v; w( U% e) X
ps:在别的论坛也发了,但是没人回,EDA365要给力啊。。。。 |
|