找回密码
 注册
关于网站域名变更的通知
查看: 1194|回复: 4
打印 上一主题 下一主题

verilog书上投币器代码,不懂请教

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2014-3-26 15:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
各位,初来论坛。也不知道题目写的有没有问题,见谅。
# `& _7 h7 i' X0 B" h& N6 x1 D本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:( i$ b; L5 g8 p; y

) l5 }0 M5 ~( r# b8 e$ A% u+ c5 d8 D$ i7 H( L! |
这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/: G  A" H9 Z3 [1 q( O

* ~- w9 r- p4 ?/ A% N$ P3 K, G1 M9 S4 M& u2 c  T$ f
以下是一部分代码:
" _2 }) ?" O0 c1 d
! G7 I6 |- C' P+ L2 ?//用有限状态机的办法,设计报纸售卖机的投币器
) j" ]- V( P" |3 O
. t& R5 W# W9 O7 C# Emodule vend(coin,clock,reset,newspaper);* n- v; T6 m+ m
5 U8 \5 X. I% \2 Z$ _
//声明输入输出端口2 ^  b+ Q$ w" f/ g! A% q# P$ L2 T
% D/ y: l# `% p, V. }2 U8 \, v
input [1:0] coin;0 B  o: w5 h" _& w# ]
# h: v2 x7 c2 _4 P' `
input clock;
& l2 \. [: M6 A& ~- y9 w$ q) h$ X7 r& I  g
input reset;
9 W1 T& B5 x5 Z7 L: s; I. g( T7 v9 n2 Z* S
output newspaper;
2 Q7 K# X$ Q/ ~. T- H/ U3 Z
; ]+ G+ }/ Z" ^: ~7 E. awire newspaper;
* j6 i1 H/ D' F  Z" `, S3 o) z3 j+ G
//声明有限状态机的内部状态6 q9 {$ F4 Y2 a" n

2 U/ D& F; ^" w" B& Dwire [1:0] NEXT_STATE;
/ V6 a; i/ K3 U% t: @5 g) `& U" K
- [5 i6 T! \1 S2 F1 W( Ireg [1:0] PRES_STATE;
* C' z1 I/ t# v- w  D
# ?. C2 E' A" ?# c" O: i//状态编码
6 V0 o/ L( I& `, q, P! t4 A, x. u+ N: a/ z
parameter s0=2'b00;9 L, V% Q# h& S8 I; \8 U

) l5 O5 i: G) r7 I. O; d5 rparameter s5=2'b01;
& w/ C, ]. j. Q+ W9 ?: L/ t1 [5 n% E  J& M0 p! T0 F: t1 d
parameter s10=2'b10;
9 z3 ]! H4 E4 L) M
1 O8 o: W. E1 Q2 V0 F8 n# vparameter s15=2'b11;- ^4 \& {4 e! g: g1 M: ?. Y$ x# |( `
4 |( ^; d  |5 g5 H  H
//组合逻辑. R0 S7 L5 b: u* S
- \$ P! @* w+ w
function [2:0] fsm;3 n' \4 d1 P$ L/ n

1 t. m6 D) D3 M1 ainput [1:0] fsm_coin;/ k, h# ?- [: l; u6 [6 Z( T

5 [- D' y! e+ E2 D8 t# K8 t) Q/ Finput [1:0] fsm_PRES_STATE;2 c* J, J0 z3 g& N' \/ f$ E

" q9 @6 Q! R1 t# P5 `reg fsm_newspaper;" B: J- L, c6 v  P0 l- K& A" M% n
+ P- A0 Z5 U: x, G: j% D) {
reg [1:0] fsm_NEXT_STATE;4 D. m& S8 h2 k

, t# j8 Q" W9 F' Kbegin% K3 g4 g  ^! s4 e8 `% k# U/ e

+ R: X5 g0 U7 e) l) l' Y  case (fsm_PRES_STATE), o/ R# ?9 \" a% m1 E0 @

) [! R' @( I) N1 G) f; {) j. }: l  S0:  //状态为s0
6 _% Z5 y2 V( W; }: E* X' ^" b  w) v6 K! S$ i" i" e6 s9 {( Q" ?3 v2 f, i
  begin
6 F& u5 B) K, c; l  |& O) ]4 p/ U& ^
    if(fsm_coin==2'b10)0 A  f" G* h- I* T- l
  k& C+ f8 C$ Z/ |9 c' P
     begin
2 z/ L% d( R5 T$ `& I, \4 h
7 R9 D9 _' [: T0 y5 `        fsm_newspaper=1'b0;
* x+ e6 g, C; Y% o1 @
8 M6 \1 Q( y0 r3 f         fsm_NEXT_STATE=s10;
, y2 Y4 f4 d; s' J5 q6 w% a
+ ?8 n; m0 w" _7 @       end
2 G  k9 k5 a! C" M& b0 j0 O
& i: B" \$ O+ y7 z$ e   else if (fsm_coin==2'b01)
1 h/ Z1 R# k- A8 @$ e$ j: K* c" X
      begin
* f, g, W+ Y5 U, c% e
2 d) ^' y0 R( G1 A      fsm_newspaper=1'b0;) i' A  d% }- p  P6 x9 @
8 |$ L7 \& R2 Q7 v. D0 \# x" t
         fsm_NEXT_STATE=s5;
+ K' }$ q& L. n* M# B$ }7 `( ^7 w7 ~, d" B7 z* C
      end
3 ?8 H: |4 ]* X; @4 x" _, N" }) J0 d# G
    else
5 N9 P6 ?2 F" a6 L- y1 b- p5 h1 G) U; O  ^' `8 b1 b/ H7 |0 D- M
    begin% r% h; \' F& A+ M; a% A* t6 ~
8 i, k; R/ A: m! L
         fsm_newspaper=1'b0;2 K+ I; Z2 Y6 w9 }( S5 e

7 I. C( c9 P  ?2 h2 ]         fsm_NEXT_STATE=s0;
9 F/ D4 ]6 Y9 C
; r9 P" f  u/ B. ]) t# H     end
! L) Z- l2 G% S0 p& f9 C1 C5 L+ l5 Q
: E( x; G4 ~5 L& q6 vend8 g5 q" X, s7 v! K& ~7 ]. x: K
/ l# p8 x+ c3 ~: q
7 d% c: R4 w$ D! v7 p: g4 n2 N3 s1 x

3 c) @5 B& G0 i7 \2 u* Ns5:  //状态为s5$ \% b: u6 x1 e3 q7 X5 y) x2 y

: h2 s% }: r; W1 y& n  begin
- ?" Y7 [# J* s! f  n/ D. p# m( P9 k* Z2 @/ l' T
     if(fsm_coin==2'b10)
  ~$ Y: k2 f4 m8 u) G$ W( G, Z! t0 N) J
        fsm_newspaper=1'b0;0 z' @0 Y3 P" F) s

, A$ i0 j# K3 \7 A( u6 D6 |         fsm_NEXT_STATE=s15;7 X/ {/ Z7 }- N( C
) o& I/ x* L2 M; ~, Q/ w
      end0 E* e8 K0 o* {: |$ u% P- Z% h

% |! F3 m; h1 V6 x* \  B0 L  L4 k0 w    else if(fsm_coin==2'b01): x2 U. e8 U; O) u7 _

! ^  i4 \& @$ l: |  q- b    begin
' ~8 _% c' k7 i& ]+ b' [% g/ v4 v: Y; t6 O7 I5 }5 S
        fsm_newspaper=1'b0;0 s0 }- C' ]1 [' v6 l% ~' x

  S7 ~5 n5 B0 r9 P  T4 G. c         fsm_NEXT_STATE=s10;# C5 g: Z- p' _+ ^6 W. C8 e0 {" ^
# |9 G1 B( [# H- _( R6 W
      end
' N2 l! K/ T/ L- M1 H. J   else
: ?8 `4 \8 Z+ U% B) t* v9 \
( f! w" N8 y' \6 H0 q      begin
3 r' o, z' N7 i' F) @4 f# J0 {. g9 _( A' c6 \2 {; V' p
        fsm_newspaper=1'b0;
5 q8 |5 T& _! @3 R' d8 ~1 w8 B7 a6 l- ?5 b8 [$ n
         fsm_NEXT_STATE=s5;
! S. g3 B* H2 A8 a. v4 H* @& Q4 n! _; y4 r1 ~; P  G& O
   end
" H5 l/ ], \# _- }1 f' f4 {: R6 b( p, j+ ]) j" Z6 ]
end+ U: L; P/ \$ k' w' |9 |! D

( a( C$ Y, b5 o7 K( I- ^& S" us10: //状态为s10
$ b/ J& m5 o' a1 \1 s
. g  q9 N. ^) t* y: W. Q; |- W( p- Obegin
- T3 l9 |) i2 {6 ]: x" V% a
- K- K1 y0 i. ~1 f; Y5 C    if(fsm_coin==2'b10)2 n% f6 B* w. `' |  G+ ^3 c, u' N

- e/ X4 _. N. r8 y4 X6 f! U7 T2 |8 f    begin3 m2 i) J: Z! X3 k

  F" p6 O# }% s! N; b8 P         fsm_newspaper=1'b0;
  E6 ?( D; l( R& Z0 h6 R7 x' a: m- c: S# y& Q
         fsm_NEXT_STATE=s15;9 k5 [: C9 T6 {
' b4 h0 \- x( p0 ]: i& [
       end. }- A. H- Y0 h1 ?. J. W
" A3 \% N$ N# e" A* v( |4 D0 e
        else if (fsm_coin==2'b01)
$ o) X. U& G' b/ c) d
  K1 x# u* K! I          begin
$ _- S( K' i% }4 y% L
. v4 Z" ]9 ?% G* ~9 F" |               fsm_newspaper=1'b0;
7 X" g$ m( P8 U+ ~( @' D& S
% H3 i- K1 ^' Z7 Z- q5 r$ q! h                fsm_NEXT_STATE=s15;
+ j: d! y/ X9 ^" @6 K$ M% Z  f( y; w
             end
* T* u/ n. C5 H# N$ }/ b$ |8 q
6 K2 n( }8 B6 Y        else% L. D/ q( B8 ]& l6 R# Y$ Q! O$ N
8 H- Y( ?9 q& U' v' X$ K
          begin4 z6 p: X+ ^3 X, S3 z% Q! b$ R# S

' a, v4 r8 u2 Q% X# j3 ?               fsm_newspaper=1'b0;
' j  w' k- x. n9 W7 t; B9 R/ d( K# ~
) o$ M/ L4 h( N+ C+ P0 E1 q                fsm_NEXT_STATE=s10;
) L4 G. j$ w# V& ^' K$ B4 A: Y/ |5 A) ]: z, J: A: O. O
             end
4 X' K! V& p0 i' B, x. c% A4 a# Z; b
end. s( i: o8 Y5 y  O9 B1 v- J

# l4 q  b) C# d8 E6 [s15:  // 状态为s15) G0 A: i- M5 y

4 o; Y* d+ ?8 N5 `0 a+ A  j* {  begin8 M+ q' s$ I' g3 u

. W4 |5 J  s5 Z+ t6 i* X1 E        fsm_newspaper=1'b1;! _  [1 N& l% w+ H. \3 y

' ]" N7 s0 [" @: y! \         fsm_NEXT_STATE=s0;' F7 {+ J5 h2 M7 z& y6 K
# ?" Y. x( ~1 F* V. I' ?' N
      end
* O. K% \. S+ `; R
( e- D: b& |8 l% H, t+ ^endcase
) m. v( ~* U4 z; K; E3 E' R8 n2 p' _& F+ y" H
fsm={fsm_newspaper,fsm_NEXT_STATE};
, i. y9 k' U, u. c( S  b" p* ]- T
end4 o; I. \1 }- P% a* W0 n

, h9 i: {& }* v1 c$ M- G" P: nendfunction2 D5 _8 \( T4 z3 h  ^* [

; A4 R# O* ?& m6 x3 I0 |; \# N//每当硬币放入或当前状态改变时,组合逻辑动作
+ Q+ \- \# R% a9 f7 w: D  h% b4 o
9 V! o6 b0 l7 T8 }9 N4 x# x7 Qassign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);" ~2 U! y* Y! V6 s

! v! q) i+ |( X3 a0 T3 x+ U& I//用同步复位、时钟正跳变沿触发的状态触发器
: x0 X/ H+ i+ y' b% c: Y( c3 N) a% v* V
always @(posedge clock)
' h, |# G" b1 J( z9 m/ d9 f% W' Y; l9 j
! B# v# F3 H. X! H% R$ {, }/ lbegin* @7 O. K6 v0 p# H5 i
8 I& T9 X, Z+ l
    if(reset==1'b1)4 Z7 D0 w4 K# w2 V
" v, y9 z, n0 T, F
      PRES_STATE<=S0;
7 @; e5 s/ C8 D" [, t
" @  o9 o- U  ?6 Z) C    else$ G  |* ]0 Y3 q- f+ U

( ?: d/ |1 @0 V3 y& v. B( b       PRES_STATE<=NEXT_STATE;& }; g) g2 i; d) u. ^
/ r$ ?8 D1 ?/ c7 V; [
  end# a% s- a/ M. j, z6 K

  q  Q$ Y, f: `" Bendmodule& u6 _. B* R7 N" {$ x  Z: U
8 e' {: @: v: V" \- X
4 u0 J% Z8 ?  l( u( t4 w
& b9 S" w# b/ g- K. U7 p
我的疑问在于这里:" a4 A6 I" r5 F" N

# c7 o, L& p! V" o' T5 ]//每当硬币放入或当前状态改变时,组合逻辑动作: S8 n4 I8 B8 a+ v! W8 A% o

4 ^% p1 P0 x( I7 Nassign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
# S4 D1 _$ H- T! s
" @' M/ P; J+ h5 x
$ d% F, A9 S/ {7 N4 o5 Y0 L
! A1 c# ^7 H4 }+ B0 \0 f8 I( |就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?
- A0 x. B, o+ P, c/ D1 G( n1 \9 P6 x& j& O+ g1 R  ]# A0 O! a
请问是不是我理解错了什么,初手还望各位指教。。。3 T+ M/ O' l. b, q7 R, `
ps:在别的论坛也发了,但是没人回,EDA365要给力啊。。。。

该用户从未签到

2#
发表于 2014-3-27 13:13 | 只看该作者
cion输入一般来讲应该是同步信号,也就是说是在clock的上升沿跳变的,所以不存在你所担心的情况。

该用户从未签到

3#
 楼主| 发表于 2014-3-27 15:44 | 只看该作者
lvsy 发表于 2014-3-27 13:13$ q; `% H7 M4 b: R6 ~5 e; v
cion输入一般来讲应该是同步信号,也就是说是在clock的上升沿跳变的,所以不存在你所担心的情况。
) k8 s4 V4 W7 r; i3 t# e; M
这是整个题目的网址:http://andrew810810.blog.163.com ... 763992007895125290/4 {6 c9 `' o! G

# q/ r1 l. z0 S) m! g7 o- X.2  电路要求5 J5 ?" ~6 G: C6 N8 V+ Y, A
必须为该数字电路设置一些要求,如下所示:! t7 o, W' w; }4 k
.当投入硬币时,一个两位的信号coin【1:0】被传送到数字电路。该信号在全局clock信号的下一个下降沿取值,并且准确地保持—个时钟周期.
$ H: u+ s% A( y! L/ X.数字电路的输出是一位的。每次当投入的硬币总数为15分或者超过15分时.输出信号newspaper变为高电平,并且保持一个时钟周期.售卖机的门也被打开。
; k4 n1 G5 o9 B7 E: @, V6 T) j8 P. W
.可以用一个reset信号复位有限状态机。假设为同步复位.1 c% r" [8 [! O

该用户从未签到

4#
发表于 2014-3-28 09:01 | 只看该作者
烂泥桑 发表于 2014-3-27 15:44. J+ e3 |, m. v% C2 h
这是整个题目的网址:http://andrew810810.blog.163.com/blog/static/51763992007895125290/' }0 x$ f/ U7 d/ U# P7 N2 _
  q$ ~) q6 P: E& Y5 u
.2  电 ...
! d: q) Q, g/ y* Z6 X: N# U
如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了,这样误导的人的书不看也罢!
3 |( y; u3 g/ N& S1 g& _; m$ Z0 i$ F9 n  J+ n+ O9 t6 Q/ G) v
多废话一句,通常在代码设计中,要尽量避免同时使用时钟的上下沿,这意味着你的电路是在倍频的时钟下工作的,如果时钟频率很高的话,可能会有timing的问题。如果非用不可的话,设计上要保证你的组合逻辑输出至少能保持一个时钟周期,否则可能有些结果时钟是采样不到的。

该用户从未签到

5#
 楼主| 发表于 2014-3-28 11:52 | 只看该作者
lvsy 发表于 2014-3-28 09:01
/ J1 a! Z0 Z) ?: c如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了 ...
9 J8 U' q, ^% L; Q
如果是有bug的题目设置,那实在有些出于意料,毕竟这本书不是很经典的吗,而且都到了第二版了。总之,感谢朋友你的回答。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-21 19:42 , Processed in 0.125000 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表