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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
各位,初来论坛。也不知道题目写的有没有问题,见谅。- ~6 \, M9 S( _  l; f
本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:8 V) R- a, B" V/ \0 ^+ [6 V

2 i# H/ ]* k3 D# K6 y$ X* N) p
% Z* B) c# F% X" W" k0 o0 o" I这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/3 @- O# s8 h" S: _. t
4 O) R8 w' k; D. m

# D/ r1 r  T( K2 D! Y) R% [以下是一部分代码:1 g# n6 t: Z- ^/ ^; K
- O7 H9 H" t$ S* z1 D/ _
//用有限状态机的办法,设计报纸售卖机的投币器. H" I  o& P' s" s) q
+ i2 A! m$ ]; @
module vend(coin,clock,reset,newspaper);9 Y9 D4 G; w$ t5 B/ Y5 o# U1 R
7 z* X# Y! I/ c: m/ {% g
//声明输入输出端口
6 A5 T% {% |5 {2 {0 I, c
/ s2 `, s) R! Y! w; A; U6 Finput [1:0] coin;. m3 t: \+ s0 d% n4 S0 I: p, S
/ Z& ]$ ~7 e: L1 u6 ]
input clock;
* ]0 l4 l  v3 q' Z
' n" S( r1 Y  R* b; B# \2 u4 Ginput reset;) r1 b' i# Q5 `9 l7 l6 b& e& Q" _

3 p+ l1 g$ h: Q2 J* [output newspaper;
& ?7 n6 H3 |  X- S3 r* J
/ E, D! I5 }, I/ B7 Q9 V3 N6 k2 F  Cwire newspaper;
7 k! @5 T1 e. V$ J8 B/ {- z
0 v& U* E. q1 z" x- F7 Y//声明有限状态机的内部状态/ a( Q. \# H. n% `7 ]

2 b  l/ c# j! m. ]wire [1:0] NEXT_STATE;
( m! _* N* D+ [" @/ \8 D
; S: {' L, Q* `reg [1:0] PRES_STATE;; Z2 k8 P9 c, B5 A" n6 z: |5 z  |* v. E
9 v$ R. z/ A% h, E
//状态编码
5 j7 s) D* q  H
2 {: `8 ?7 W+ o0 K; cparameter s0=2'b00;
1 ~0 F5 }0 G3 h1 G2 @3 G9 j+ P" F; N& P
parameter s5=2'b01;
  h4 u0 H4 Q: J. b3 C! R
/ W8 s+ f% m9 s" S2 L, q+ Aparameter s10=2'b10;( i: ]% T9 J7 S/ W! A

: f& S2 u' E) |' M4 K: n- z- M2 v' Hparameter s15=2'b11;
# d+ V6 B5 ~2 s
& k: J" r4 l( j" D* s% }/ M//组合逻辑
6 N4 |0 R7 x% r5 W0 }1 M, y2 ?1 R2 g" ?' D" ~; n, k
function [2:0] fsm;4 o0 T+ U7 j. a& I% J$ B
* E; y) u  ~& h0 t; X
input [1:0] fsm_coin;7 ~3 s. q: U7 a2 |, x5 ^
2 J# M& L5 x- m& e+ A9 g8 p2 s
input [1:0] fsm_PRES_STATE;9 l2 m8 R% Y6 K, L  I7 G2 i( g

6 x8 x9 Z9 U2 T; h2 U+ sreg fsm_newspaper;: _0 F& ~& \9 H' @8 W* x# N' e# x
1 y8 l& b3 }! Q" R$ {
reg [1:0] fsm_NEXT_STATE;" u" L5 Q: O- `, P5 n) L3 U
) M: r- L, h, |/ T
begin  H  K* A5 \  w& V* j$ l/ h$ v

1 n$ o# M9 l, q/ P7 _" b" t  case (fsm_PRES_STATE): k1 L1 d* a+ b: Y0 _) a% e( r# D/ V; \
) \  a0 a! }: [8 _; z
  S0:  //状态为s0, ?! ]! i) C" D+ n- [3 d; i! r

5 s" F' ^% {, c; c2 D) c3 f7 n  begin
2 D) U8 j+ V& |* A3 x& I1 Y" b  k* d
    if(fsm_coin==2'b10)1 S3 z1 H, o" g& h
( Q0 h9 p( t6 h4 }# d5 L
     begin7 W$ j: w* o; p

/ ]6 ~2 Z/ f: P' l% j        fsm_newspaper=1'b0;8 v/ k) o7 t( d7 Q

# G6 s& \. t' }* R, t! W9 a2 p         fsm_NEXT_STATE=s10;8 V; [! z& X" a% y& R
! z' j: b/ I- o& {0 _
       end
! f1 n' {9 z* h" z
1 }/ C' m9 j' l9 \1 R   else if (fsm_coin==2'b01)
5 N" `( a# x7 q$ @+ z4 C1 Q  C6 T+ h" }8 p
      begin
# J5 _& [) B  S6 m/ d! S) a1 k* @& M1 h* i2 T+ V* m
      fsm_newspaper=1'b0;
+ N' T3 f# C5 O- U2 y8 H6 r3 r8 E6 z2 N6 |9 a
         fsm_NEXT_STATE=s5;& V9 R) _, O- @) R" v5 b9 m
+ l+ ]! }, H) C7 t
      end8 B, }& f4 g4 J% k1 f9 O
# k  A; _' @. L- R' a
    else
7 @- ^7 d! i3 P! P9 W
% d4 B* @" R% U; x! o% {    begin5 \2 p/ ]$ N1 r- c7 J* N
* V- u, z0 u& Q) _' D
         fsm_newspaper=1'b0;: H( T% i: D/ n  |
7 d0 Y/ z0 s, y; F0 ]- @' t
         fsm_NEXT_STATE=s0;4 ]5 l' i9 S0 D
6 g, t' r1 [2 D6 \5 `  `; A
     end! E3 l9 S4 Q' V( U4 K; B& o

- Y8 t+ f- B+ }7 A5 O9 E7 Qend! M6 b% i. {$ ]6 S

" ~( W6 [& r4 v1 v7 i( t3 d
1 W, p) _/ D' e: Z, z/ b5 @
* g! @2 p& ]) Is5:  //状态为s5$ Z0 z) f% S) E% s( I/ w. y
1 B' r% \4 R$ x
  begin$ X4 e* b! }! F8 h
! C# U6 u4 \& a3 G9 E& h% g* I* ~
     if(fsm_coin==2'b10)
+ A. a- \/ @' N& F0 `) ?* F: ]; n4 v) r, O, {
        fsm_newspaper=1'b0;; ]$ y% F% s8 P
; x; H' e  y, s3 ?0 ?$ N. k* R; n+ t2 }
         fsm_NEXT_STATE=s15;- o! O* W5 {) ]8 v
" h; r: q; }8 n! ]
      end
4 J2 ^/ c1 F6 i* P1 B! o+ t# U, p8 g! i
    else if(fsm_coin==2'b01), M! M$ m, r+ S/ o" I5 k

4 x9 G0 t7 J% G# a3 R9 \/ c    begin & x( H5 b8 O3 W

& ^2 s! P- ?( \0 M' S1 @) S        fsm_newspaper=1'b0;& ]' b* k, n' }( Q6 l: D3 o5 n

- a5 m4 u  b* B8 s; A         fsm_NEXT_STATE=s10;# s+ H$ g8 u: @, q1 r
! c. n5 A8 @0 G1 j- L. Z) a2 K
      end0 \% i5 W/ g6 I: A: ~
   else
- r) b4 Z# t/ L9 i, s6 ^$ }& L
      begin% T; T8 t. r1 f: C
1 i( g- V, ~6 p% w# ~& ~7 R$ f
        fsm_newspaper=1'b0;2 h6 w9 K, X$ F+ v$ U! ^
& n+ G. A& Z4 s9 ^0 a  R
         fsm_NEXT_STATE=s5;' B4 T0 J) t* N2 Z( b: M$ J
  a) d/ n3 o; d6 `' W4 n3 Y
   end
; N( w4 L* a- g# e) ~- B- T2 K5 u
0 w; {0 h7 M& K+ ^7 W4 s! O& i+ Z: iend' ?  j7 E# j/ F& }
: }! C" }" c5 |
s10: //状态为s105 P8 z" T5 l5 y! \
4 {% i! z4 F8 g8 S
begin- f3 s; l' Q8 G: f

9 K% X; E# T$ y! B6 v" h    if(fsm_coin==2'b10)
/ j1 p  u4 {) Q& D: d
  Y! N6 Z3 ?1 i# q    begin
: r8 z& l) Z5 r; W, X# V" d& |3 c- Q2 b- [
         fsm_newspaper=1'b0;9 T. j; G) g5 I; o' @4 u

, d: n: h. v( [4 X. ?9 o; [6 q         fsm_NEXT_STATE=s15;
# @% u% C/ d* F1 K2 a$ W. u% y$ c% F4 S, V9 W0 L! K' U2 A
       end
7 ]0 ~2 q. j9 R- Q; \& n# O+ F4 D5 N9 P2 v
        else if (fsm_coin==2'b01)& Q5 G5 U/ v9 Q! v! A0 z

  Z: F) D8 v. k: q$ x5 B) V0 z0 Z          begin0 ^9 G0 v" l/ E+ l- ]

# J/ ~$ i0 W8 r               fsm_newspaper=1'b0;
+ t8 y. F5 v& A' S  u$ Y: O$ c4 P+ p& x5 N* ?0 K4 G
                fsm_NEXT_STATE=s15;
8 ]% X3 i0 s: k4 V- D2 k7 i9 b+ h: q/ j+ b% s& e' M' a4 E8 Q
             end0 i2 h& M2 B/ J& b; X# v2 b/ e
, {0 ?( \# \3 t3 z6 i0 |
        else- O9 L6 ^9 v) X% ^) `# E

" Y# q' h$ j, x& N          begin" b* V% B( F# Q3 x# N% B+ i/ g
" y5 t# a9 n. Z6 a& Q
               fsm_newspaper=1'b0;' ^- p" t& s% i8 g. Q
9 X0 m; i4 N$ L- c
                fsm_NEXT_STATE=s10;7 ^8 S- ?/ {0 m1 C7 n- ~

" a, T4 a/ U( o% p  T/ v' p) o             end+ ?, ^# B$ ^' a! A* k9 m4 ]
  x8 @( k5 t# z! w% Z
end
3 y0 l0 I9 D8 c% I, x3 B; x& P! s6 J& n  ]9 A
s15:  // 状态为s15
# X( M. A; B% A4 q( ?6 y7 H0 o4 n$ {: w
  begin
7 T8 _- l! X" f" D) k' b3 \$ x+ {$ s8 B& s+ b3 ]
        fsm_newspaper=1'b1;5 o# r7 [5 z0 _: j( S% S. v& l
+ G5 }& ~$ ]: E7 q3 c' Q
         fsm_NEXT_STATE=s0;
- B2 {+ j5 f$ j3 E( U) v
/ E6 A7 O7 n9 Q, y+ Q      end8 x/ a; J# Z" z: |9 x$ S! L
8 t  z, i8 V7 \& z" ]& W# M. r
endcase% O4 ?# D# p0 v$ G4 w

" x1 l! _! p: g* Ffsm={fsm_newspaper,fsm_NEXT_STATE};
  p* z# @" A/ G. M+ _
2 S3 ^" s: f+ s. T" g: Xend: b! ~1 N* A$ g  \
8 ~) z  T) Z$ M) x" ^
endfunction
* m) w* `* f' ?: M
' u) l/ d& t! H+ H" L  l//每当硬币放入或当前状态改变时,组合逻辑动作4 N4 A& g4 M* R$ D

* @4 b: ]3 f+ Q* L5 [+ v" Yassign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
) t  x$ a5 w$ N% e6 m# ~+ P
. |) O: P, x5 J& o+ N% _//用同步复位、时钟正跳变沿触发的状态触发器
; c$ [: ^% N- O8 c; k! m4 A
5 @, r" H' ~: a6 Z5 ~; ualways @(posedge clock); e. d% {% r. Y0 I: F7 X4 b
* f# a9 q3 P' w4 F) c
begin5 Q0 U3 }, U0 i/ L! z

5 H, {" B  _$ e    if(reset==1'b1)3 H7 j$ d+ v/ O- p

% P2 l9 B/ ]* \      PRES_STATE<=S0;
( _2 u# ^& o5 F) T0 [
5 z. w8 C/ m) T7 R  K8 m    else
: r( x) h( U/ {& \" j+ _5 S1 ?& d1 j3 A
       PRES_STATE<=NEXT_STATE;# v0 p  d3 m7 a  i$ z$ N

" M$ o( r/ [+ V$ O  end
" `4 V: k& o( d8 k3 `9 x9 _! y" n/ y9 v4 E4 L; b0 G6 j
endmodule
; [& z4 y9 {, D: o
3 \* J& G+ F6 v; q4 E
7 b5 Z1 ^- r* M% ^
4 H) ~8 @; D+ b) ?5 `我的疑问在于这里:' z. }+ n3 B  f6 ~( a# h
6 ]( F& S9 ^; n% K! v
//每当硬币放入或当前状态改变时,组合逻辑动作
  Z' H1 z* w4 |- W" T- S9 ~6 w" t) {/ _
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);; C/ H7 v. O& T

6 O$ l( W& @" R% R- G8 |# Q0 x4 g2 B, ]4 p5 ?+ Y" Q

7 F# p% \3 n7 A就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?4 @7 O& M1 S  ^% p

+ k3 j" F* h, H; W请问是不是我理解错了什么,初手还望各位指教。。。: Q9 p. i% z! k* U+ {
ps:在别的论坛也发了,但是没人回,EDA365要给力啊。。。。

该用户从未签到

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

该用户从未签到

3#
 楼主| 发表于 2014-3-27 15:44 | 只看该作者
lvsy 发表于 2014-3-27 13:13
: a" ?( D% [% t1 u9 h) X1 Zcion输入一般来讲应该是同步信号,也就是说是在clock的上升沿跳变的,所以不存在你所担心的情况。
& h; G  z5 \- @9 @7 p) [7 S) Q
这是整个题目的网址:http://andrew810810.blog.163.com ... 763992007895125290/  I" g7 `: f# q+ ^1 m5 X
: U$ R2 t4 f% o% D& F3 k, f4 p5 E  Q
.2  电路要求2 u! B0 s$ j8 m* H7 V
必须为该数字电路设置一些要求,如下所示:* c) E( h$ I  ]4 }8 R! q. \2 V# t
.当投入硬币时,一个两位的信号coin【1:0】被传送到数字电路。该信号在全局clock信号的下一个下降沿取值,并且准确地保持—个时钟周期.
7 Z3 g+ w1 ^1 N+ W+ d2 L4 G.数字电路的输出是一位的。每次当投入的硬币总数为15分或者超过15分时.输出信号newspaper变为高电平,并且保持一个时钟周期.售卖机的门也被打开。
; @& Z7 l& z) A6 S% x0 q
  ^) v9 v# a- y0 S4 K3 }# n( ]# |.可以用一个reset信号复位有限状态机。假设为同步复位.
; B0 v" K! u0 d0 d, p

该用户从未签到

4#
发表于 2014-3-28 09:01 | 只看该作者
烂泥桑 发表于 2014-3-27 15:440 `( i" Q: n8 @( K  Q
这是整个题目的网址:http://andrew810810.blog.163.com/blog/static/51763992007895125290/, R; A  z& `7 E$ |& r5 M5 N

1 @# {4 N' S$ ~" U8 ^.2  电 ...

( c  W5 P5 H$ W. J5 Q: N$ {如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了,这样误导的人的书不看也罢!
% Y5 N* ~* S. ?- T4 z8 Z2 o! z' }/ V+ a/ G; ~. d4 e, v+ w
多废话一句,通常在代码设计中,要尽量避免同时使用时钟的上下沿,这意味着你的电路是在倍频的时钟下工作的,如果时钟频率很高的话,可能会有timing的问题。如果非用不可的话,设计上要保证你的组合逻辑输出至少能保持一个时钟周期,否则可能有些结果时钟是采样不到的。

该用户从未签到

5#
 楼主| 发表于 2014-3-28 11:52 | 只看该作者
lvsy 发表于 2014-3-28 09:01( S+ k; P1 t% v, ~8 \
如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了 ...

) n! q$ o/ f6 H如果是有bug的题目设置,那实在有些出于意料,毕竟这本书不是很经典的吗,而且都到了第二版了。总之,感谢朋友你的回答。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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