|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位,初来论坛。也不知道题目写的有没有问题,见谅。
1 b4 h! L4 @7 ~( Q( K7 }+ z8 G本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:
" ^7 z% [- X4 w6 x+ t* y5 ]
3 x0 z, B3 J1 b/ f. P4 |6 | K8 R9 [- ~! y
这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/6 u c. D0 r: {, ]1 u L+ R
- V& |6 J ~- L+ w% v+ `6 r" P
以下是一部分代码:
( J. y2 e- C3 d. p( C8 e/ |8 G. A l* w! ~/ C
//用有限状态机的办法,设计报纸售卖机的投币器 h0 w* J: R& F1 z: [
3 t, C9 _5 P3 V3 |
module vend(coin,clock,reset,newspaper);
2 m. u6 @) y9 P# x2 ~
$ F6 n5 L2 ?/ d//声明输入输出端口
8 K, S- ]6 J0 l7 e4 ^% W8 ^/ ^- ?( T6 g9 r
input [1:0] coin;1 c+ K5 z- j' P
( g( ~/ H4 X1 r N6 K( K1 Einput clock;
6 D5 ?/ `! z' |7 g) O* c! ^( i' R3 t; `( m5 ~' ^
input reset;
, V2 D& b/ q! |- V$ S3 y
' x c. ?" a" voutput newspaper;
0 M2 R1 K7 @& r. v: {: F. G4 n3 l- [& l6 }
wire newspaper;1 I- @' t: e: G* m$ `
; _: m9 D: U8 R; W9 e
//声明有限状态机的内部状态1 _% b ?6 A- }' b
0 M+ K6 d, j1 gwire [1:0] NEXT_STATE;
8 h! f4 I1 }; F% V4 @2 v$ u
# q' |( r" l8 O3 I, L" ?, Dreg [1:0] PRES_STATE;# G3 m- ^$ p$ V3 L& A% C! s5 n, |, G
& s" d& Q" U/ q9 L, v; H. h: T! T//状态编码* n4 o5 f3 b; k L1 K- J$ Y+ \
4 a+ D- K6 g( Y
parameter s0=2'b00;8 y0 y+ n+ b2 s+ t$ t: k
! a' ^1 M9 _# v1 [2 v+ Lparameter s5=2'b01;
; ?6 X" B" V" k$ }/ S1 m
# C% s* s1 ~, R0 ^. tparameter s10=2'b10;
! v' C. O! z7 C; g5 A$ y9 p: u1 J* f+ i
parameter s15=2'b11;
5 n( ~5 t2 B- l# g6 l
8 `7 |- A0 H J3 z7 \7 G' K//组合逻辑
. {% p. J& i: Q: }8 f, r' K0 ?- h' i9 ] s0 g/ H9 e1 b+ y0 F# X
function [2:0] fsm;
+ O$ ?. y! Y! _3 D% ?/ B3 u; L5 X$ [" S/ v
input [1:0] fsm_coin;, d6 w: ` O1 ~2 w+ C$ J
+ W! d# ~9 n5 L2 @; Iinput [1:0] fsm_PRES_STATE;
0 g- ]* v }2 @+ Z2 R4 J/ e( c
' f( n1 Q1 ^0 E, g3 Z" v7 ]reg fsm_newspaper;
/ h6 L/ K$ b9 W2 l$ C$ R
% _+ y6 K- H$ ~reg [1:0] fsm_NEXT_STATE;1 w1 S: p" O! N! P; ~# |9 W
; L. z" m8 M/ ?& |6 Obegin
' Z6 K) z5 _: `' E6 s' o; ?7 _$ P* _ t1 y D2 A
case (fsm_PRES_STATE), c$ `: J# v" L# b+ b
, U( E n3 k6 W6 f# R S0: //状态为s07 d* T/ q$ U9 n( `' s# |
( ^' b7 M, e3 D4 y/ a& ?" e9 w begin* S% Y5 N2 w# X, }' C
8 r; o L) J2 m6 B; x8 ] if(fsm_coin==2'b10)
- e: U+ `- X& Y2 n/ f. G+ }; U( p# l, E, E
begin
% ]5 X5 z$ l6 W% O3 @* F- z0 h3 n! x$ M" I
fsm_newspaper=1'b0;
, U$ q. r% y% u% a. U: h8 A7 S4 d/ E, M
fsm_NEXT_STATE=s10;
/ e" m5 z0 q& q1 s
0 C! L v! ]9 Z/ }; L8 l* t end
! G' m4 E7 {) B% V6 o B d- ?8 \0 H- K( Y, U8 c' x9 J: F1 Q
else if (fsm_coin==2'b01)
, W4 j* X* a# i& q2 P8 p# {- m
+ z" a, z- B i- g& I' [ begin
+ m" @$ _5 L' @& E0 h- @- k" d- |0 [) @& W4 F) O2 l' L/ W; I
fsm_newspaper=1'b0;0 T" n2 y8 l+ B$ ^0 ]
; P2 x2 q' d* v4 m0 C, m0 u$ M/ M fsm_NEXT_STATE=s5;
4 T, B! {8 { v$ n' g! _+ C
/ r# `8 x Z5 U8 K+ [+ h( I* L end8 @3 M% \& }- @2 S0 ?5 {; ~
% h7 l2 [1 X; Y" ]% ^& | else6 B# {6 [; ~% n: z4 w
" n" j8 r m( v" h, C+ V begin0 e$ D- {, Z! |, G6 m$ V
4 ?0 N$ N* l! D8 U" t
fsm_newspaper=1'b0;
3 ]) b% Z/ a0 {9 S7 g6 K
3 D! x* p- W. m0 R4 K* E h8 ] fsm_NEXT_STATE=s0;. V4 C U3 v Z
- h" \* o7 w2 ^/ `+ ^ v end
$ c- v- {9 j9 \& P8 @) e
" }% M/ j- h" ]; \end1 K' t7 B7 ]2 L2 u
% e Q+ U+ \9 j, A) C
* k) T, o5 {: X+ L0 e1 T6 |* K6 l1 q
s5: //状态为s5
5 K. B4 j! U: c6 F2 T0 z3 R( ?
1 h9 j* b( r/ W( g, X9 _ begin0 R6 K; Z1 G) V/ M4 f$ n3 B1 D
6 K G( J. y# p! o8 V8 o5 q s: F
if(fsm_coin==2'b10)
' h& O' M- h3 D p, F. Y5 p; `1 M" I- e& w' P% t" s: @5 ~
fsm_newspaper=1'b0;, ]8 s: R( d; z7 E% S
. x, R! }7 l0 x0 V8 S fsm_NEXT_STATE=s15;
+ o' \4 s/ h/ _/ O' S, l+ m) p
7 Q( L2 ~6 W- E2 q: Z. N9 d end1 i$ B$ i/ J! z% o9 e
5 ]( \6 U! D% |4 ^ else if(fsm_coin==2'b01): C- [% h. }; A4 S$ A# ?+ l: V5 G
. i* v+ Q& _( `' ~, ]+ L, n begin * Y' j$ v$ I' d1 C3 I- z' k- x1 G4 c
- p8 Y. ?; @6 r& T& j2 o
fsm_newspaper=1'b0;8 I' ^% H6 r( s- @% O
7 i# F: ]8 T9 o% o4 c2 s# O fsm_NEXT_STATE=s10;
5 k6 @/ X4 q) `: G
+ d. q& F% a T8 N end+ e+ d6 L( }8 ?9 K; S2 Z
else
b. S9 }3 s1 a+ \9 H+ {
# a7 m+ \1 q1 S, F begin
9 h, [" B. w3 W" J
: K9 B& h' k7 m7 N fsm_newspaper=1'b0;
4 `9 u: g% Q) K- L
' R' h/ a( y2 Y fsm_NEXT_STATE=s5;2 | P; W* V2 y; r$ _
% D0 c& Q0 V+ l end1 n' h) f8 H: H+ N# b9 `
) u' ^ y+ t5 J) ?2 j
end; n- d0 H* J6 K0 Y
- v+ ?3 D) w. E$ P& r& B. B8 Ls10: //状态为s10
$ y8 U3 d6 m: x, q$ S( C$ g
9 d& P. G, g' Z/ {0 Z) hbegin1 _# ~. w' R$ A, Y; l6 U# ^) E
' P8 h$ Y7 u9 B" }9 E& y! K if(fsm_coin==2'b10)! W3 G' m3 A: @9 y' F, E9 x- P
/ w$ c4 G: S' O _7 c6 v begin' U& t. M# {7 m0 ?5 J5 L
) M+ M( h+ I6 ]; y/ F% P) A7 d- w
fsm_newspaper=1'b0;
0 \/ @. d" _& J# W0 W. D x/ b9 F) V/ S" n3 m5 v
fsm_NEXT_STATE=s15;2 v3 Z' y, H. i8 [
' l) {% {* J$ C end
+ h( b0 B6 l2 \* \: ~2 M% I
F( S5 N! ~4 o) s else if (fsm_coin==2'b01)$ f3 t3 t+ W6 P
4 \: U3 \2 Y* f" ^ begin
: I* v' t: Q: T9 f. y) N% ]7 i7 E9 p, [
fsm_newspaper=1'b0;! M" }0 x; x( C5 w
; Z; O6 K6 H6 Q7 t$ x6 ^# o6 b fsm_NEXT_STATE=s15;
7 e) _; r+ u! P+ I
% [8 K* A/ C+ M# g2 @ end7 m. z9 C% Q! S0 p+ w- T) w
. c' K, m' S2 _+ y {
else
4 u( o* H- C, u1 m6 G0 p+ L& E3 S- z8 B/ A; u
begin
: Z0 \5 E6 e& l
6 J' M* k! G/ Q* V6 F7 _: k fsm_newspaper=1'b0;- s( |, V* m' ]2 ~- g9 _; r/ F0 l
- f& Z& q" {& e ~! \- o fsm_NEXT_STATE=s10;
) M& H+ M5 R7 n& d; \
& g* y% s1 W, }" m- u end
+ ?1 X0 y0 }9 d" ]& ?
$ e& c5 j! l! @# \end; T8 u( G2 q. J' m' U9 k
9 o# L* B4 v2 B, x/ Z# Us15: // 状态为s15
; A3 Q/ [8 Y0 V( D
1 C2 d8 m% k+ G8 {/ f; N* I begin
2 B0 x* q" _4 K: o. _
0 ?6 @+ p @" } fsm_newspaper=1'b1;
6 a* }; |$ Z, D) L( W9 g" {9 r9 M3 H* Y M8 M0 f5 A+ B J
fsm_NEXT_STATE=s0;; b5 w! e# M/ A# ?. |* i6 H% |
; \5 X# |# r) N3 _* `2 o end* o& F+ q, |) o/ j% X7 I( Z
, {& r1 E% W2 O8 Y) i
endcase
( p# W) _7 f% J* Q# {1 q2 ^1 G9 _5 Z& [6 ^2 D& f- B0 ]
fsm={fsm_newspaper,fsm_NEXT_STATE};' G) f8 W! X' e
! c7 ?/ q/ u& g/ }+ L3 O/ t
end4 z: x/ E# N# q: }1 z3 ?" `
" I7 G8 u* B5 t. A
endfunction- f8 P( k# J. N+ a4 x4 f
' v- t$ R8 Y5 l, |2 G//每当硬币放入或当前状态改变时,组合逻辑动作
. Y" a' c! V$ q B7 M
, _3 V. H; L9 N- P9 [assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
7 o" s# C h Y' F! d
" T/ G; a: B8 |, v3 d//用同步复位、时钟正跳变沿触发的状态触发器
A/ `& }$ |) R
# _" P; e S o" S/ A' Qalways @(posedge clock)" g4 ~8 g% b8 K/ v0 I
" h6 r: w0 S' M1 l+ @begin
6 V9 i- [1 E, T8 e# D) @( _+ e+ W" B
' m8 j# |2 U7 J9 T" }7 v& z5 J( {+ i if(reset==1'b1)9 \3 J/ l9 i2 e
4 Y, B% m0 o9 j8 y PRES_STATE<=S0;
) K' G, R1 D3 V- [3 b9 J' D6 V$ q: u( I
% O+ T9 X. f* t: {2 A else
8 M7 |) `7 P+ Z6 j3 Y) l j1 r
$ ]4 I- a, |6 S PRES_STATE<=NEXT_STATE;- E9 B1 T6 {0 w% H+ Z
/ C4 r5 R1 w2 ? end
. }& V9 l3 H1 [# t' P, h1 N* u; Q0 F* w
endmodule0 T" _8 q! R0 P/ b
- f. g3 G8 j& d) |( }# B1 C
3 m+ |9 b' n8 |& {9 r- K, b- W
A8 K3 K" I+ D0 M我的疑问在于这里:3 E' q$ v# B. c( d8 Y# ^/ L
* v0 g, ^: m. _6 z+ J
//每当硬币放入或当前状态改变时,组合逻辑动作7 Z G* G: t4 I6 k% v1 l
+ k' n- X7 k3 j; [% @1 w6 f
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);# M6 b- b; Q# r) g
# Z$ \8 H3 Z( z1 h, E: L8 K! ~
+ S a' E$ f0 F% G! `
% ?/ r5 p' b9 K6 f4 n7 y# n
就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?
6 [0 K) o% E$ r- f R1 s
; l: M! E: P9 l9 j6 M5 z ?请问是不是我理解错了什么,初手还望各位指教。。。
% z2 Y s) f) Tps:在别的论坛也发了,但是没人回,EDA365要给力啊。。。。 |
|