|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位,初来论坛。也不知道题目写的有没有问题,见谅。0 {/ n/ R, f2 M# I. e. x
本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:
3 x ?, E# h8 q* e$ E6 g% ?- w3 c, P# E
5 _6 w5 |) x, Z) [1 A% o6 x- `2 J这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/
9 d! v2 w4 U* e* ^) P0 O: e$ }+ \' o2 s/ y! v
. P8 L, D8 t/ u& I! g1 X以下是一部分代码:
2 {( S; B; v# G* G% T) V( X& d- u
//用有限状态机的办法,设计报纸售卖机的投币器
$ j& h' a. m. ?' U% r
5 X. A# L5 O# D9 L. C" _7 ~module vend(coin,clock,reset,newspaper);
1 s0 t$ Q0 d& A; `; c9 Z
n6 L3 N2 L; `" H# B2 Q//声明输入输出端口; {. G, G j- T$ ?# A' |
% |" g Q% M) d7 Linput [1:0] coin;/ [0 ^2 a" Z' L
8 i& J g( j% ?- d3 W% {
input clock;7 R7 w0 r' W* t1 t& Q$ P) s
6 x/ u5 [8 ?& T/ _( e+ e2 V
input reset;- X) }$ ]% O9 g* ?6 S, M
" `: I' G5 C' {* H, Ioutput newspaper;, \6 D; t9 [* d4 v* i. N
7 h" d' T9 B6 }+ |+ |! }4 Xwire newspaper;
& s V( _/ w- Z. y% g4 s8 x6 X8 q7 b" B
//声明有限状态机的内部状态7 [! v" Q, A6 [+ o
$ \; E7 X& b4 D. F: Iwire [1:0] NEXT_STATE;
6 e E3 u- i0 Y$ l
7 c% C) S7 J" S! u. Z+ A9 [) J: wreg [1:0] PRES_STATE;
1 C; N3 [- B. x# ]4 L) W, _
2 V$ ]2 m) F8 _ C" v! X# y$ B//状态编码
4 c c* j/ H" J" k+ g" ~/ {( D/ c4 G; e4 Z
parameter s0=2'b00;4 [$ r& q( o/ S* L7 z
/ ]9 B+ Z0 X# w* N8 ~( Y3 bparameter s5=2'b01;
4 ]' d0 S& A6 I; S. f( u4 }" }) ?( T4 v5 {' ?4 t# n
parameter s10=2'b10;
: ^7 b( n/ j4 s' x& U# ]
7 l9 W5 u$ b# s& yparameter s15=2'b11;
0 d G" r: w8 r" j4 p0 T! j! H g$ N; e: z4 W b4 y7 D. A
//组合逻辑1 [$ m+ c! _0 _+ u# H
) \- a- q, B5 i7 a k8 K: @* q
function [2:0] fsm;
: R0 Y5 d2 x+ l/ c; w3 ?/ E
! p0 N4 r+ J; [4 ~/ g1 Y7 f2 [1 Dinput [1:0] fsm_coin;
1 d- x4 ]( w' r/ C8 w; @1 A8 b) x! j$ o) I6 a
input [1:0] fsm_PRES_STATE;
; g+ \2 a( b$ S- ?; M& J, b6 g* H" P4 H3 u7 r
reg fsm_newspaper;5 e: c9 v# H: ]3 A7 o9 F
- `+ r# ` ~0 P% E
reg [1:0] fsm_NEXT_STATE;
9 a* W5 r) ?0 d; O/ d* x" @* N" T$ z" j
begin
E. p V! w: y# c5 \% k3 p# h' c+ [$ x2 p) z8 e% d
case (fsm_PRES_STATE), U* Q4 v+ c) _2 ]" n9 X/ j6 e
% k% }, a% v( u S0: //状态为s0
2 N& Z; R4 ?( ^0 D( J$ @7 X& O; ~; x: C6 N3 L3 b
begin
$ H$ y3 O7 f% m! i% _/ m8 f# V0 K. K& }9 i
if(fsm_coin==2'b10)- h+ e0 w8 j6 Y1 n3 f
1 \( |! I. C' r! D+ E: O/ \0 | begin4 l& b. l% X0 f. T
( y" l. d; n0 a+ `+ Z fsm_newspaper=1'b0;/ J/ P# O( V* n# z. m. d% q9 T
. W5 y J1 N' f5 ?7 C fsm_NEXT_STATE=s10;8 m: }! ]# x: B: i1 U
8 g G: r5 X9 u6 I, I
end. E' D: H6 m) a9 o5 X7 u7 x9 ^! k! x
5 D6 [' M: m. \ else if (fsm_coin==2'b01)
7 C* O7 Q- n5 f
O: o1 v" [3 ]6 x begin
; b$ o5 @! L8 r6 Q5 v; o& |
9 `; l# o3 b! ~ fsm_newspaper=1'b0;. y- m) ~) `4 w3 a; j* V! j% [
f$ y: Z# r4 t! Q# b( I( W/ M8 { fsm_NEXT_STATE=s5;
, r1 p7 T* G. B7 k" H- D; i9 ?% U# K7 L0 ]8 L, y) k) f
end8 e% ]! r8 @) @) N" x' [# Q2 C
& ]5 q& b( w# r) P, f
else ]+ _1 I* F" K( V3 d! n
0 [+ y! W/ v( ?; d' t
begin
2 J) \" I3 N0 N8 @% ^# M* t. F3 ?/ b8 x1 o- q7 L0 `
fsm_newspaper=1'b0;
5 k1 o7 {+ q0 [$ [+ n
5 c8 d! f2 M) S( u. d fsm_NEXT_STATE=s0;# ?: [) K( Q: y8 I! K; J
; ^! V; I: M5 C; A( D* d; B7 M2 t5 a
end( f1 H# h. J2 J/ a
5 c- k* B) m/ A. u U T2 p
end6 ?0 A3 L# o. g* W8 y9 A( k
, e) e7 `7 o9 ~( H) Z$ n% C, b& @, F# y& H0 t
# B7 g2 t/ b6 \1 q* Os5: //状态为s54 S% I- S# e2 a
/ \$ s: ~7 E2 N begin
9 X$ R) O) |, ~8 G2 @
( ]- \0 P8 W4 p if(fsm_coin==2'b10)- ~* Z2 N# z$ C6 l; o( Q( d' q
, W d; r1 m; p' t' h7 D( m" c$ } fsm_newspaper=1'b0;
( I9 }8 z* Y6 s; F" _" J f0 s$ x ^8 j1 K# N5 G
fsm_NEXT_STATE=s15;7 _" A% h0 y8 m4 C3 W `4 _7 M
6 T, H" o' P! v6 ~9 a, A U# \# U; r
end
9 O! P, p( E# z7 n' S* c6 d3 r# y
8 z; x! e0 R/ {( A7 [. z+ ]$ D4 n else if(fsm_coin==2'b01)
9 {! C2 l- K. E; |/ S9 j, x6 m! ]- x, G- I; a
begin 6 y( K3 k( Z2 j6 |' f
# d( r+ ]& p% D1 s' _9 a" H, H, { fsm_newspaper=1'b0;# F2 N! c+ Q- y1 A
& S2 W3 y5 O1 X$ o fsm_NEXT_STATE=s10;( s" n. P L) `; H; g
, [2 N6 w( s" R/ O0 g: I! f( A3 C end
. A# } Y$ P( ~5 A. \: O else
?. N7 x8 i" V$ J" m2 t% Z% M% [) b6 C! e! _
begin( Y$ U' I* ]% i; W8 c' U: p6 i* J6 r
1 M" J( n2 @4 `) D6 E) o9 O fsm_newspaper=1'b0;
6 `+ ^: {& V* f2 V; n$ T4 D+ r
" u3 V% r4 I% f fsm_NEXT_STATE=s5;3 V- T5 `/ a* b% y: d8 E
! A1 m- s8 `0 |$ S1 @+ r& n3 q' U
end
5 V- |1 ?" O$ Z# J9 @* K, k4 @
( C& Y" a3 {2 z) I4 D. send
/ K1 } }! l. c8 {* R8 o
5 O# D/ ^* X1 G, \' P% l; d: M( b4 Is10: //状态为s10
5 x- w) V2 q2 r6 r# V( f1 ]0 G" ~' Q2 ?2 N
begin) b/ U) N$ Q1 _# R
n8 [+ a# _$ @6 ^0 _
if(fsm_coin==2'b10)7 I9 i( O; j( \! w
8 Q8 w" f! H0 X }" e9 m begin1 j5 T) A0 T9 I# [2 ?3 P& B4 R: ~
7 `+ h, k0 ?7 r* S$ d
fsm_newspaper=1'b0;
" t& C' `7 t: T
- f- {" H9 l( g/ X$ |9 x' } fsm_NEXT_STATE=s15;
( {; T& \% s% f: \3 d- U! c' e$ l9 ]) `
end! L: }6 y. S. G2 A, {0 f" I- b5 Z
% M8 j. d- z+ J6 X3 m9 h- ` else if (fsm_coin==2'b01)
4 |. B; ]/ V4 p3 n4 k$ X5 ~$ C
5 m3 `; P+ J- c0 a, N begin
( v+ l7 K; e& _) K5 `+ O! Y9 v3 u0 L
fsm_newspaper=1'b0;
/ w/ K/ g G2 I$ W5 Y. O" E* E+ j! l3 G# \+ o- V7 a1 |
fsm_NEXT_STATE=s15;
; k! i `/ ]7 J0 M3 j1 U7 e& v0 ?1 L4 u, V4 K
end% O' M/ }! V; x1 W, ~
) V; ]0 w% K& B: L" r1 g) H
else
( V0 {7 ~: }% e4 _9 j6 l- s& R
3 c9 }2 s5 u% [1 @7 x4 v4 Z& H begin% t7 y1 Z3 E4 R9 }% g
) m! B9 b6 w. P5 v. _& B. F% |: R
fsm_newspaper=1'b0;
' p, R! |4 Q h; Y$ _$ H/ o6 I: ?! I3 ]1 h( T" m. E1 V
fsm_NEXT_STATE=s10;
# Y: v" w- w/ e( z! X' p$ s' A
; ?. e2 b# ]! j+ X0 K end; ~+ U& u( N- k2 Y" r" N
1 Q" g; w5 P+ ~% K: Z3 N" u5 K
end. ^5 ]; @+ j/ W b) u( l* r
$ |) p0 k! Q- P8 Y5 a/ Z: [
s15: // 状态为s15
$ [7 L! K8 _$ V( M( L. \# _& b8 `2 l( a4 o6 j2 n
begin
8 _+ V6 I8 ~: m4 G0 B. C& V- R
6 n0 T# I4 X+ d5 z( v! p fsm_newspaper=1'b1;: H9 q; N: m4 N7 E
& w5 C7 O4 Z# ~
fsm_NEXT_STATE=s0;
4 X" A$ u* O% x% J& `* y% ^' N2 q. w- }( V. B0 D7 b& P2 A! O; P
end4 S$ X0 V" }# E# D' ]
3 ?8 z) @0 o) Y0 Hendcase/ h% C6 J: Y6 J1 u# b7 s0 U
5 T" L6 ?% O; A# ~# e
fsm={fsm_newspaper,fsm_NEXT_STATE};
3 X& z! Q0 p1 _7 q. g" y$ L/ S5 ?( w$ P: q' y
end
3 W7 J3 T) u6 }! u* X+ U3 x5 h9 q
0 \5 n% {8 N3 a6 |& L3 b# H9 Qendfunction) ?% C- H8 c) R& ?, O7 V
. o( M; w7 p e7 X
//每当硬币放入或当前状态改变时,组合逻辑动作
6 O$ O, K# Y. r6 T% A" P& h0 S. p. G; |
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
% b+ y# w0 Y& X' S& f h
- r/ J, o# a1 o" c, P9 r# Q//用同步复位、时钟正跳变沿触发的状态触发器
) @5 w, V0 ?4 D$ c! r
/ A$ L( q0 w% `5 k# u# nalways @(posedge clock), f5 Q8 K% U4 ^/ Y4 g! y, k# \
0 b" y6 m2 h+ u9 R) Mbegin
4 x, s5 L) C3 [
) c9 v# M- K5 u8 g6 j8 M$ H8 I if(reset==1'b1)( Q5 R4 L; N( L
$ U+ ]) Z* K( @. p
PRES_STATE<=S0;
8 J/ Y1 z5 D. Z: k8 U" h, b7 ?
else3 R! _7 s- u; I1 Q
3 ?* \! V: O+ M/ K4 ? C1 x& ]
PRES_STATE<=NEXT_STATE;
! ?+ s' l7 l* c$ w1 T |) A/ Z" l$ Z' v9 c% K3 N# `" W9 h6 ~
end% |2 p+ D: h1 b. h% b# O. d. D1 o5 s
7 ?( Y" x# S0 g" Yendmodule! {% u+ v$ M4 Z/ Z; R2 q* h( W
' v# b6 x# b! c' M; i5 t: [5 K5 ~( @) _
7 t! G' ~3 ^+ A6 h我的疑问在于这里:
2 L- I |6 U% U0 y/ @: @* Y, m Z+ M
//每当硬币放入或当前状态改变时,组合逻辑动作* E, ?) ]" j8 y2 ~6 l
- V8 [, f' `" e$ Q2 v- g- F4 I8 N) Bassign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);' T6 t+ \5 s N0 {5 h
! U4 ^! ~- m2 T. d! P2 \/ u
+ n# t( j: C, v* n# q! X" f
. j9 n( N8 ?5 O就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?
2 `! O$ {0 W: S8 B- n* |
3 F4 y% z3 G i. E- g请问是不是我理解错了什么,初手还望各位指教。。。
' ~! @ c( I( i0 tps:在别的论坛也发了,但是没人回,EDA365要给力啊。。。。 |
|