EDA365电子工程师网

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

作者: 烂泥桑    时间: 2014-3-26 15:58
标题: verilog书上投币器代码,不懂请教
各位,初来论坛。也不知道题目写的有没有问题,见谅。
' V- P- @/ f5 c0 w+ Y! _本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:
& f) g/ A5 ^* b: u2 D; o& b0 Q/ v2 B( [1 G- B4 ?( \5 V8 H: r

# y9 F5 _% @' Y- z, M% i$ w这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/" B8 Q( p, M# J
9 N1 Y0 l- ^5 r* V

4 p) k! X: B8 D, I3 i以下是一部分代码:
1 s- ^/ r& _, X8 N- m# [
8 B6 L" D! Y* g& L" O//用有限状态机的办法,设计报纸售卖机的投币器% }: p4 F  c5 E4 ]8 {

& r  Q' `- {, `8 a" ]module vend(coin,clock,reset,newspaper);& P$ @% Y* Y2 Y" q- S( M6 w

, H. Z2 S; O0 Z: \2 Z//声明输入输出端口: G3 @3 i3 b: P+ V
5 {* S4 r' T8 a3 l5 ~8 B. m0 j3 N* V9 J# x
input [1:0] coin;. P9 e( a) F9 x
$ |$ m1 ^2 B  n& n
input clock;& N2 z6 V. _+ n% j
- d$ j6 w! W. v. L  K
input reset;
8 [" `! A) b& u/ f
4 e2 ]" I4 }5 v1 |; S, D& ]output newspaper;! h" K, b( r2 }- s% X6 s, P2 W
& X- }3 t9 g2 \* V' R7 {" c/ B- A) u
wire newspaper;
) M6 b6 a) Q4 @
- A) Q) v  A* W! \3 v) r! `8 e' y//声明有限状态机的内部状态
) B' |' Z9 a' E, |7 c5 g6 |& O0 z- l9 r9 C
wire [1:0] NEXT_STATE;" W" {. }' G4 F+ h: V3 m: W  W: g: q
  O) L$ |+ f( j  r, M8 h
reg [1:0] PRES_STATE;$ A4 x% g& t( V. v; x
9 ]/ m/ ]) b! R( q$ z1 ?$ U) Y
//状态编码* Y% ~! o( M& z

" Q8 Z/ M" g2 V) j+ lparameter s0=2'b00;+ h* j" i) F# Q' M+ Q

2 S4 J! U' ~6 t% W3 [parameter s5=2'b01;
) S0 D% J2 ~! d+ s
/ N, Y- i5 ]4 E: yparameter s10=2'b10;1 l7 a) i0 {& u; j+ H( \$ J
2 i$ n% M5 q% S/ ?# W' |3 `, W. d
parameter s15=2'b11;
  ^& i( S, x: K9 {0 ]4 A3 g& r
; _* M) r3 P1 G/ }//组合逻辑
; B% P* H' t( t; M6 Q% ^5 p5 ?1 w* {  m! w" C/ E3 E
function [2:0] fsm;5 `" |$ g; Y: Z4 `+ x, g8 ]9 B5 |
7 M' K8 d9 j7 W. |' `3 s
input [1:0] fsm_coin;
3 L% _! Y% }3 E9 u$ e) U. ]( W8 R0 @) ]6 h6 @" g
input [1:0] fsm_PRES_STATE;6 |) F7 ^8 Q7 V+ N
! P5 ^/ b+ U( q5 S" w
reg fsm_newspaper;
( m1 U& Q# d* O8 Y. ~& H8 B
- N2 R  S* Y; J  yreg [1:0] fsm_NEXT_STATE;( Z8 i4 |  |) G+ G
4 \# q! V$ w4 r  c6 Z7 O
begin
" ]" H# `! j2 L+ ?8 I% m* Y- e; r& U* }) ~% n
  case (fsm_PRES_STATE)0 r: t0 s! Q9 P* S- d* S

4 r4 W; `4 V' N  s, M! k; B  S0:  //状态为s0' S% T3 N8 y3 i' n
! Q$ W* `9 R8 ~$ k* Q
  begin: @* W6 V# [! g$ z6 @
7 Z( [' Q0 \. w, }! X+ Q
    if(fsm_coin==2'b10)
" ~% c& [/ P% a4 e4 p" T; \( U* Q3 r7 B& P' d. \8 a
     begin" \5 g- B, ?9 B8 {6 w8 b2 U

2 ]; T4 T: M/ ~& S! F( D% d; L5 ~        fsm_newspaper=1'b0;
% n, U% q7 }3 z$ @  ~7 R, m7 ^" l1 k# d; @' S1 B: q1 N3 L
         fsm_NEXT_STATE=s10;
2 C3 {9 c: w4 [, w& T# p. i! }1 \0 B8 q- h4 S. _
       end3 G9 j9 H& [  r5 I: U  V
( Y& [; r# F( O; ]
   else if (fsm_coin==2'b01)7 W2 H0 C+ M4 N3 r
/ n4 o* [" E/ [5 x. Y
      begin
/ x6 b0 `. Q8 ]% w& t. k
6 y- x' z) z% |! a      fsm_newspaper=1'b0;( ]+ u1 V$ D+ S4 y6 Y* R  Y
; }6 R. s5 j, T2 ^  r' F+ a
         fsm_NEXT_STATE=s5;
; V8 y9 o, Y2 g* Q. r' P4 g  f+ [( R2 {; ~
      end/ I: E- V: [6 B6 J

( ^# {3 {: H/ Q( i  P! X  P    else
; g) r+ G7 c% G- |
5 W2 M! a2 p7 p' G) |& Z, @& E    begin3 V/ a  p+ \. ]* o4 T# A
- ^: Z; J" `$ \/ _* L
         fsm_newspaper=1'b0;
# Q2 _1 u( Z% `1 c; a$ w  k3 l1 P9 C
         fsm_NEXT_STATE=s0;5 p% g5 j9 N# L2 Q7 n
) o" `) V9 h5 P% E: D- u
     end
$ Y3 T% v, P+ Y# k0 j9 [- k8 i- ~; R
end
& S4 ?0 T  Z1 U# }8 d& W6 p. _6 Y; d0 p3 R

! u' a$ i+ c$ R
) {' y6 G+ B% L# cs5:  //状态为s5' a8 D$ n8 a. Q$ {' ~( O. B9 v
  F2 @2 j, ~0 E
  begin1 }+ l: O3 R- ^7 M: k

& q) ^9 [7 K" z     if(fsm_coin==2'b10)
$ h8 D7 ?7 v! v# E7 _' E! w4 D
) {7 E! O4 D0 R5 D6 i  Q9 G        fsm_newspaper=1'b0;
9 Z4 R! U) r- f7 S/ C5 Z/ h& G; K2 j: `. q' D
         fsm_NEXT_STATE=s15;, I* A  b5 J5 l8 l2 I

! A4 Y! _; Y5 I1 L; w- }% K$ n      end) X) O; J. w) Z# D5 C

  C8 k1 n6 y- S1 w8 f    else if(fsm_coin==2'b01)- D& g. n0 ~# U
& c6 B% k/ ^- C2 r' q3 e: G
    begin
4 ]8 V( a# @3 `$ s  l2 j$ k
4 J/ a9 o) l3 S/ z2 l        fsm_newspaper=1'b0;
" F& f2 V2 w; C" u
) u( U# I7 B' R) B         fsm_NEXT_STATE=s10;
" h8 y( {* M% y; D
% G. [- i4 ]* x3 \      end
2 S6 W/ k1 u! a4 I# y9 n3 G, h   else
& i' O6 U* Z4 b* n' u9 r4 K# q, e. h. U# R
      begin
, o1 n5 x; `( D) g% c
( z) u/ T9 G! l# M! }" z        fsm_newspaper=1'b0;# A# E: f$ S6 O+ c% [5 `) |
$ k5 ]% N/ Q. b) {' b
         fsm_NEXT_STATE=s5;
: x/ `" E# q$ }( p/ E
, j' J3 V  Z: t   end
5 J0 w  U8 _, D
; m) U3 B  x: wend
& a! V! q  ~1 z% l
# q; k1 N' m- \( rs10: //状态为s10
' X. Z" P3 h$ E8 _
5 O; R2 P- N/ k* G  Zbegin% @5 \0 ^0 |# w# F
" ^  D9 z7 o. g/ Y9 X5 d% o
    if(fsm_coin==2'b10)
9 V* V* a$ f% N& N% N# o. L$ X1 D9 q9 b0 M+ n" i' T( ]0 D
    begin! _5 X' a/ r) y) P  V1 n2 v

: {8 T$ q, M( t7 Y- _/ g         fsm_newspaper=1'b0;( {% I. ?# H: @1 a! _6 P
: K$ C! _0 @0 I4 H
         fsm_NEXT_STATE=s15;
2 O( l' ~7 `* s
, u! H  n" X' f  Y5 z* o       end
7 o/ p# M4 o! m7 v+ V: u( a. V. t! c
        else if (fsm_coin==2'b01)
" P: e: o* m) c: B1 L  p, M9 i2 c" B6 f
          begin) ]  I8 I, d: w+ c  N6 [

( D! v" E  @: O7 f( k" T; A               fsm_newspaper=1'b0;( u9 U4 V% y2 j9 G/ C& M) g8 C0 q4 P

; @& S4 q9 Z* M, v" z+ V                fsm_NEXT_STATE=s15;
) Z8 O4 T' d4 S: }( _& H3 m! Q& j3 r; B
             end( Q1 D! m& O, o

2 V9 K" y/ |: s        else9 Q* D* I& d6 o- U- t" c
# ~  d; @, S' K3 b
          begin- K6 q' z* ^& s) N0 r7 w9 d

8 E0 I! b" Y3 p, ~0 b' Y  ]               fsm_newspaper=1'b0;7 ?6 L" Y0 F8 A/ N

2 d: A" U* K# Q3 E& b7 @% Y, b! M                fsm_NEXT_STATE=s10;" L, y7 i/ I! p2 v4 \# f8 r& h# i) r

4 ~6 W' e3 n  u2 }, a7 x             end
% V/ |: P- z' @% p, d$ b5 |4 U0 m$ _0 P/ }, Z
end/ ~9 h! Z2 a7 f
" L; N. X) v- g: K9 ]1 u; `8 s3 H: n
s15:  // 状态为s15. S7 t; E7 |$ h& H) l$ E) }
  q9 D3 U% M+ W( ]9 c
  begin: P  c6 }3 ?# S+ y& t. H5 @6 g
/ K: f* x1 V: G: w! V
        fsm_newspaper=1'b1;
. T' p  ^1 I. E( B) Y( n2 m' \" p, v' a3 ]9 U3 u. }
         fsm_NEXT_STATE=s0;( w+ }. s  z+ ~$ l
% r$ ]4 t- C# a$ c
      end
. r) p! J% J5 n7 {* L7 t) M- I! a* z. r  J* ]. @9 I8 Q+ }' `
endcase+ R1 y/ U( w, `9 o: W. @0 W" j
" C1 H& d! B6 d: _" V) J! z
fsm={fsm_newspaper,fsm_NEXT_STATE};8 P* l6 ~' ~) I

1 r! @$ \, Q; h2 |end
+ h* ~; C1 }7 X$ a# d) V/ o6 Z0 y$ f# b- T
endfunction  P% C4 Q3 m3 `

6 N( {' D6 n3 n2 f6 r. y* f3 R//每当硬币放入或当前状态改变时,组合逻辑动作/ H/ w: B1 Y1 u4 v0 _0 H9 C% A% B
. I6 l2 A+ s& M" ?0 `" u
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
/ L( h7 e  j1 X, G' v  G  x  g$ }% ~  X
//用同步复位、时钟正跳变沿触发的状态触发器
  y' [+ X: C% b" s2 k  E# N/ s  H% F* C
always @(posedge clock)
* I6 c1 U* y$ ^# z# \5 c) L- u2 Y7 f+ \7 R" T6 k" I' X
begin
. m: p5 \' D$ _3 E0 s( I
3 m& q- p0 `1 R3 m    if(reset==1'b1)  v3 @- Q. \5 a$ R, G+ ^% X

# C/ W; Y' F$ U      PRES_STATE<=S0;' j( h9 N3 w! X

- r$ d, }0 [/ t9 y- L+ L    else
' N; `. I& \  L- M- ^8 e$ I6 @9 L
8 e. v6 m# E1 x* N0 s+ n2 n       PRES_STATE<=NEXT_STATE;  f# d$ k9 ]% w4 i' `9 I

: u. C% S( b- ^& X5 a: N  end
# ~( \+ f  k$ z6 u" I2 S- O) t
/ d: E" t% o: D. h/ N3 yendmodule* P( S  _# q" _1 U1 f- P
* G5 M" g& s0 S8 @
( S( N. @, y$ ~9 }9 I$ l) {
* F: ~' p, ]8 Z1 z  r2 t
我的疑问在于这里:
: d" k0 [; z6 M8 f8 K' f& V# \) X. Z4 R1 C' e) `7 f
//每当硬币放入或当前状态改变时,组合逻辑动作$ E$ D6 p- s! A3 ]- H* Z
: L8 d$ n8 B8 _* K, N# g0 D1 E. ^$ d
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
0 f/ F9 B2 h& f& F# k* C; ]% p
# b/ b) |( `* o) {1 y. _  \6 ^+ J, _
$ \: @* _/ F$ K. C3 b0 N- x
就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?
+ B- w( p/ y6 g/ D
$ _: [  n+ T9 B5 b4 Z' T5 w; w请问是不是我理解错了什么,初手还望各位指教。。。
1 L3 n) n* B6 K1 n" Nps:在别的论坛也发了,但是没人回,EDA365要给力啊。。。。
作者: lvsy    时间: 2014-3-27 13:13
cion输入一般来讲应该是同步信号,也就是说是在clock的上升沿跳变的,所以不存在你所担心的情况。
作者: 烂泥桑    时间: 2014-3-27 15:44
lvsy 发表于 2014-3-27 13:135 |0 E& Y" h" B& p
cion输入一般来讲应该是同步信号,也就是说是在clock的上升沿跳变的,所以不存在你所担心的情况。

4 e  [5 S" B- s8 A  w5 q这是整个题目的网址:http://andrew810810.blog.163.com ... 763992007895125290/
; R1 Q. [6 r8 k' m- b, `
2 k( @7 M6 M$ m1 a& I& X, n0 b.2  电路要求" p, M) X$ V5 `! o
必须为该数字电路设置一些要求,如下所示:$ Z2 `: j( `* J; W
.当投入硬币时,一个两位的信号coin【1:0】被传送到数字电路。该信号在全局clock信号的下一个下降沿取值,并且准确地保持—个时钟周期.1 `& K" f8 M) {1 b% h: L+ O$ [
.数字电路的输出是一位的。每次当投入的硬币总数为15分或者超过15分时.输出信号newspaper变为高电平,并且保持一个时钟周期.售卖机的门也被打开。: p7 A0 ]* I. r: K! ~1 G' S

3 F' J0 Y8 ]7 S, _.可以用一个reset信号复位有限状态机。假设为同步复位.: Z* {8 N# n( s1 G# A! k& }, S

作者: lvsy    时间: 2014-3-28 09:01
烂泥桑 发表于 2014-3-27 15:440 N% p. ]' V5 X& I+ q
这是整个题目的网址:http://andrew810810.blog.163.com/blog/static/51763992007895125290/# `+ N7 h9 e! ?# A3 @# v. t7 i
" r" B9 c0 N1 T! P
.2  电 ...

/ T+ K; \; q: C如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了,这样误导的人的书不看也罢!( g+ ^4 V& t3 w3 R. j3 {

! y+ Y8 b( @( l$ N; m) q多废话一句,通常在代码设计中,要尽量避免同时使用时钟的上下沿,这意味着你的电路是在倍频的时钟下工作的,如果时钟频率很高的话,可能会有timing的问题。如果非用不可的话,设计上要保证你的组合逻辑输出至少能保持一个时钟周期,否则可能有些结果时钟是采样不到的。
作者: 烂泥桑    时间: 2014-3-28 11:52
lvsy 发表于 2014-3-28 09:01! C  o& }- N9 E. K3 ~! {& K
如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了 ...

3 l! \+ I* w! k! y如果是有bug的题目设置,那实在有些出于意料,毕竟这本书不是很经典的吗,而且都到了第二版了。总之,感谢朋友你的回答。




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