EDA365电子工程师网

标题: verilog书上投币器代码,不懂请教 [打印本页]

作者: 烂泥桑    时间: 2014-3-26 15:58
标题: verilog书上投币器代码,不懂请教
各位,初来论坛。也不知道题目写的有没有问题,见谅。
/ K$ ^' j: A5 H1 x% Q8 d本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:. c8 e2 W1 W/ }; T& P

" m9 M/ G0 z2 T2 C' _9 O+ q' ~: |% W2 N: p+ j& g0 v
这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/' T0 x" v( q1 h1 e
2 O2 o- n/ g$ d& k  C8 ~) ]0 f3 L8 U3 a

- j+ F: p% r- h5 }( w# I* m3 a以下是一部分代码:' G; I% o; A! ~+ o8 n: ?* S

; v) |, W2 p* Q1 y2 R8 S7 d//用有限状态机的办法,设计报纸售卖机的投币器
! a4 ?0 s6 A9 \1 x$ \" {" D; y' X4 t. T# H- l
module vend(coin,clock,reset,newspaper);
) s  t! b5 R9 g) m; v) x2 @0 s0 Z, s: P6 w. p2 [( C0 D9 i. Q& |
//声明输入输出端口
& g( h6 G6 g1 y) X* W, z5 e8 A
6 Z2 e$ r9 x1 i" Finput [1:0] coin;" H  m9 N: s# x& h) W

/ t  \  Z/ E0 R) P: S0 [9 c, dinput clock;. n! M% h' o5 R3 b; }
9 _( j5 o, ^4 {
input reset;6 ^8 D$ A& c9 O2 O. k. ^% P
  b' o* d  K$ P6 m3 N$ `
output newspaper;
6 t7 g& w5 k- `' U# z( P0 [9 J8 t
7 v7 a1 ]% _! @0 i2 v* Qwire newspaper;
& [& m) x; M: b6 f+ B* d
" M) x) _" D& Q  G+ v3 R9 m( L: `//声明有限状态机的内部状态$ r, J" W6 A* a1 X- q
" w5 p/ l1 H/ ^8 u, ?: E' \2 V! h
wire [1:0] NEXT_STATE;1 C( L' \7 [6 u

* e6 Y1 z. k; P& Q% ?2 `' }5 n3 lreg [1:0] PRES_STATE;
7 G# M3 R" c7 _6 C& c8 Q
0 l: q# Q. u$ M+ s" h. P//状态编码
1 M) P- D$ W, R  J. z% m( j( ?' f' `6 M1 s5 Q0 M3 X
parameter s0=2'b00;
8 Z0 W  A# l8 b1 c( T; v6 g8 ?3 p/ d* T+ U  a
parameter s5=2'b01;
' w7 F/ t3 p6 T- K8 q: d' _: a7 |  p" R! ]3 M7 l9 q* J
parameter s10=2'b10;
1 d4 F3 J$ ?8 O$ [8 K2 b, ~
% C3 l" J, Q$ q0 @% \0 @parameter s15=2'b11;
' J# q" t7 A  Y, i! |/ K' k
: R( s7 \7 `2 m0 E//组合逻辑* q4 w9 T& N2 [" M$ c
& b( N; V; u! `) ^
function [2:0] fsm;3 Z& B" |' q' n9 a( k; z& T% e
) i, a8 w# P, G# ~+ [( Q) ?% A
input [1:0] fsm_coin;
/ i3 S, O6 X/ |+ W3 A
. U0 e/ q, ], B2 v9 c* c' Binput [1:0] fsm_PRES_STATE;
  B  J2 m, u, B5 K3 _  g' a: C$ t3 q7 T1 i1 _- C$ F
reg fsm_newspaper;
0 m- t. q% z% X+ S2 z( y" A9 {) g) e9 R0 U- v% K: Z. ~
reg [1:0] fsm_NEXT_STATE;
3 C( j/ e8 n4 X4 W( j/ ?" I+ ^
* F! w9 @& Y8 z# V" m9 a: F3 {begin0 p( o- _! c3 |: m

* @% b9 L# L: G( @0 m' P2 A  case (fsm_PRES_STATE)+ S; O; m) ~6 D7 C- ]

2 f3 t9 ]' B! L5 b# ^) j5 t  S0:  //状态为s0% @+ i" {0 c* C+ ?

0 v8 \. ~" Q+ E5 c5 _- \  begin
$ v. J5 p( d+ n: O  D  C
- k( F  k+ ]* C  j" \    if(fsm_coin==2'b10)
4 y$ q" \9 }  I6 E# {  o; K. u. R! o- [) T" r" ~1 f
     begin
4 v/ I4 @. a' P6 J
5 Y3 b5 `2 p. R! {        fsm_newspaper=1'b0;8 X4 W9 R( d4 o4 m

- }" \5 Y2 X- }  [/ r2 y& Y( A$ X         fsm_NEXT_STATE=s10;
1 n  {) @1 R! w( |* V' b4 \* |% p; k7 L7 E7 |. x) |
       end
3 D! C9 p. F) K, S$ ]" b. Y# W* A  G5 d
   else if (fsm_coin==2'b01)
: w* t3 C& h) ^- Y* P4 ~) n& J/ ?" l' S9 {% k. t: L% D  v
      begin/ o& l$ Z. t7 J8 W" `# [. L

7 m, m4 O' _# H! w7 n2 o) G      fsm_newspaper=1'b0;8 i# \5 m0 x: Q
* g) M7 ^  J3 A/ M  H& B/ N+ b) x
         fsm_NEXT_STATE=s5;0 ?9 A+ U3 k9 F7 E
4 f- g7 N" N$ I; n- r
      end0 \" G' o5 v4 a- _$ j

+ x$ l( w- X. P    else- r! y" v1 f# o- l, j

  u3 n) I0 a8 F- t' B; P. N- H% N! G    begin% K; F! w" X5 Y+ D. l1 w
/ {$ K+ ]7 E* i
         fsm_newspaper=1'b0;
# T0 H. N9 H+ \( h
3 L* F5 j4 m% U3 H& M+ |5 O         fsm_NEXT_STATE=s0;5 J- s* M6 X' Y% n, C  y: J1 b

% K( m+ b! A' Z; o     end# z) w0 w" i1 p. c% f2 T0 |
8 u$ d4 H1 d( r% W1 F
end6 N6 |+ ^% h- h: S

  ?" n4 \/ }9 b- w) o# D& K8 c1 j
) k* R  M6 n7 e) F! z  ?( ]. w9 [: o7 C4 k" a
s5:  //状态为s55 t1 M8 Q& o  Q( U  r: j2 U) r
/ m$ h" G" J# C5 H2 _
  begin
1 Q3 a/ A: }5 w9 p1 q1 ^1 n7 s. q
     if(fsm_coin==2'b10)
* f7 y/ k# e9 Y8 ?2 @5 E' R8 L+ a6 w% R, U
        fsm_newspaper=1'b0;
8 V! [9 a3 Y& t; N1 D2 A1 P- s/ k' R
; y6 a7 U$ Q: ]% f. k% S; C         fsm_NEXT_STATE=s15;9 A! T% n6 }: d& N5 A

' h8 R9 D  z' _7 {& A      end5 p& ]/ X7 u5 l2 x8 K) X) ^7 j% i

. B! i. _9 P! M2 R    else if(fsm_coin==2'b01)
9 G3 ?1 L& r) i+ {, D- `
0 o% p+ V/ Y: R3 `* Q3 ]9 O    begin 8 g1 h4 f( ^. O% n

" J' |+ u( W; h  }/ c6 l+ N0 S7 }        fsm_newspaper=1'b0;
. P& s- m3 O  p5 T3 w4 `# ?1 h
! x% H  S2 r2 |2 r( J3 B, U6 {+ u         fsm_NEXT_STATE=s10;
$ z6 K: y, E$ E. T$ c2 f- S( P/ m. O* e, C( c* D8 [" i
      end
% R) c+ E, j% q2 K0 g6 o   else
7 F" W" k& w4 k; O# T; f' w6 s- ]' b5 ?" s4 |9 D  ~
      begin( g; F/ b( k' [- r* w( X( y

9 E% m) u1 E1 U9 Z: W! n% Y        fsm_newspaper=1'b0;1 Q" i9 W+ Z; y5 G' X

2 q1 F1 p$ G3 @" r         fsm_NEXT_STATE=s5;" K4 H( J7 i2 R# f  a' w9 ^' O

! o# S/ C8 R: P3 j7 w- I   end, {% H, D9 h' c  F8 a) o

' U" l: W$ c+ i1 a' Cend5 w6 c% c" m+ Z8 D% l* ~- g
* r: w" E+ H# t( R5 y9 o! [) w# u
s10: //状态为s10) w: j: `; V7 P6 l1 J0 m
$ J9 i, U0 X2 ?, R1 J" W9 q, @1 b, y5 F
begin
' m- `, e4 V$ M' X% R' e* M+ i3 y1 H
    if(fsm_coin==2'b10)
& ]4 Q8 P1 d. e% |/ t' T+ v/ Z
* T9 l' o! K, H* D) t& H    begin
! q6 p! b! K: D5 O* R3 I
& o, I0 a6 i" A- f" V4 @         fsm_newspaper=1'b0;
% P; \3 A: B$ e- |- O) {4 X$ D' M* T1 S0 u9 V
         fsm_NEXT_STATE=s15;# j0 l! I* T& ?; n$ Y
# R) S/ x+ m8 k1 ^8 V
       end
( A+ E* j2 f5 K, U" H+ f& @! m9 D
1 u( \) N0 R1 y+ Q* m        else if (fsm_coin==2'b01)
  m! @1 r1 h' }2 M# e8 _1 }. t8 @' s7 z: v" v3 k
          begin0 a$ Q5 U& J' W7 c+ a

1 i. ]' r  r3 O; g( t               fsm_newspaper=1'b0;, G' q% K* g$ {3 a8 B7 b5 A

3 \# W: ]0 o2 Y5 E                fsm_NEXT_STATE=s15;
' i# h) }: u# p- y8 X* T3 h4 U8 i( b, i! l2 U0 F& Q
             end
) ]3 B% }8 x/ |) P0 ^& V& L" O% @* h7 ?+ B. L% S- M3 w% l& S
        else- V6 `2 M0 W6 E9 e' O9 {
! y! D( Z6 A5 w0 v4 C
          begin! N2 P) Q6 ], L# h
- |5 S6 y5 R! G' t
               fsm_newspaper=1'b0;. m4 d; \" ^6 w! ]7 y; R5 T3 N
2 A9 H; I, O/ ]: z; x
                fsm_NEXT_STATE=s10;2 ]" v. X7 B9 S( v6 z8 w* x
* ~" g1 q( }  w/ l" R
             end/ q8 v9 U) |3 p* [! p4 b0 Z4 e
# W$ X( e" B# ?8 o
end( l4 b* h2 |6 }% z& m& M
( U4 t& ~, G7 T2 u! P5 T- }6 s
s15:  // 状态为s15
" r4 q/ K3 T. V
7 m& ^, E- \- M1 b, e" i2 W  begin( i9 r( k/ q3 g6 n
3 n2 m- q9 F* y8 r
        fsm_newspaper=1'b1;
0 j1 h4 G$ k. y4 m. Z: C8 t1 o$ E' u2 u6 ~- }
         fsm_NEXT_STATE=s0;
! ]- p1 p' g, A, k8 s3 \
1 _( L7 k& `  W# X) u# ?      end
2 F& T( f1 l$ g& a* f# f$ F7 Y5 l# Y% O2 K2 F
endcase% S; S, y# [! h' \1 P  K

) G7 |% O- c3 f6 Q% }1 F! c* ffsm={fsm_newspaper,fsm_NEXT_STATE};
0 |% v, q5 z/ f: F) m3 k! s- m& ~4 I& R! ]
end  L* q7 p. H) B- g- w

2 D0 m; R" G; A& t9 Z* vendfunction7 v! U4 k: c+ k5 J7 {8 ?
# P2 ]4 i  _' S* ~, R
//每当硬币放入或当前状态改变时,组合逻辑动作+ h6 [3 R. \2 q+ N( Z/ x$ ~
4 o+ |( a; V; b; y9 o( y
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);8 V- @+ ^- N" \' \0 F8 T7 x

! J3 o) d3 s- b  I  L//用同步复位、时钟正跳变沿触发的状态触发器
% U. v( n7 r- y  E3 h9 q
: k6 C% a; q/ a3 ralways @(posedge clock)8 \" @' \" q- K. u

& [# K6 J6 N0 E0 r4 b( xbegin
. o3 t/ }$ d  m. S& z- d- n, d$ ^2 O) P- U9 A, G+ L' B0 h; C
    if(reset==1'b1)
  X7 [& P& Z* y- d' o6 e- H' _2 G' n: v7 C+ I; D' C
      PRES_STATE<=S0;
! |8 s# ~6 ^, p' ^6 g5 {8 ?+ I" I
& x6 e) o  _$ O  P1 h$ A, Z+ @) Y. J    else( _9 J1 e; m8 U6 ?# V! C- q4 B- e$ Q
8 f: B1 q' y4 H2 J4 S
       PRES_STATE<=NEXT_STATE;1 U2 {2 g" J- m! P0 N, U

4 x! S3 s$ e$ [. h' z  end
5 q9 P9 n8 f' G
& V4 N( K( J, z3 i* x1 D( a9 E& mendmodule
5 L9 @- M2 i7 f; v0 m' @5 ^/ ?, ]$ a0 X3 o4 Q
0 W1 t# ?) y' a- p; _

( j  b! ?+ R; g. q+ j我的疑问在于这里:3 [$ m# m( ^2 a7 z
0 o& e* Y1 I4 [; Y& v8 L7 Q
//每当硬币放入或当前状态改变时,组合逻辑动作& ~6 P2 z' w: M7 ^! W5 G

# P7 [" E2 [6 ^  tassign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);7 _3 _) T) N4 t9 I

% n' u5 c, K5 G1 b. u. [" V
0 ?+ v6 t. ]& x, P. g7 a4 ^
, B7 c# ~3 u7 H& c3 n6 C% }& L. h' j就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?
4 m7 K/ F' [4 k% Y" k+ L- P* S% t" W/ P; P* v
请问是不是我理解错了什么,初手还望各位指教。。。: o% W8 z7 E" J7 g
ps:在别的论坛也发了,但是没人回,EDA365要给力啊。。。。
作者: lvsy    时间: 2014-3-27 13:13
cion输入一般来讲应该是同步信号,也就是说是在clock的上升沿跳变的,所以不存在你所担心的情况。
作者: 烂泥桑    时间: 2014-3-27 15:44
lvsy 发表于 2014-3-27 13:135 L9 l2 k- u2 Y: |, M8 Q, ^
cion输入一般来讲应该是同步信号,也就是说是在clock的上升沿跳变的,所以不存在你所担心的情况。
0 m7 l6 C$ A1 M+ R: h
这是整个题目的网址:http://andrew810810.blog.163.com ... 763992007895125290/
: M1 z* R' R. W* W8 i
& z0 Q, l0 F3 s" P  P" f1 t  [.2  电路要求
4 S+ n- }; h% }7 I必须为该数字电路设置一些要求,如下所示:% q! t' K* a6 N2 H. ^
.当投入硬币时,一个两位的信号coin【1:0】被传送到数字电路。该信号在全局clock信号的下一个下降沿取值,并且准确地保持—个时钟周期.
7 z, A) @% C0 v2 X" }8 F" O.数字电路的输出是一位的。每次当投入的硬币总数为15分或者超过15分时.输出信号newspaper变为高电平,并且保持一个时钟周期.售卖机的门也被打开。9 l1 ^, }6 z! b1 j$ M7 v1 h

- P( P- \0 U2 y. F& Q.可以用一个reset信号复位有限状态机。假设为同步复位.. b$ v3 R( k% h* S' g4 g

作者: lvsy    时间: 2014-3-28 09:01
烂泥桑 发表于 2014-3-27 15:446 A! [+ F1 j1 M: L
这是整个题目的网址:http://andrew810810.blog.163.com/blog/static/51763992007895125290/
+ x& |, q  r0 T3 C8 g! f5 ^: Q3 m- ]5 F; _1 d
.2  电 ...

. _$ C+ B3 ~4 [% e1 y3 s如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了,这样误导的人的书不看也罢!
# m* B0 m4 y6 G9 s' D. J
0 [% W6 E$ s$ n  N多废话一句,通常在代码设计中,要尽量避免同时使用时钟的上下沿,这意味着你的电路是在倍频的时钟下工作的,如果时钟频率很高的话,可能会有timing的问题。如果非用不可的话,设计上要保证你的组合逻辑输出至少能保持一个时钟周期,否则可能有些结果时钟是采样不到的。
作者: 烂泥桑    时间: 2014-3-28 11:52
lvsy 发表于 2014-3-28 09:010 @0 P8 b2 A) E9 ~
如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了 ...
& `! E" `9 v/ f4 r4 S: ~
如果是有bug的题目设置,那实在有些出于意料,毕竟这本书不是很经典的吗,而且都到了第二版了。总之,感谢朋友你的回答。




欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/) Powered by Discuz! X3.2