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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
各位,初来论坛。也不知道题目写的有没有问题,见谅。& D* o( v$ o" f0 \0 A6 x$ q
本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:
  r( D4 T' X' V9 S! G, R3 {+ F2 Y  o! h6 |+ j9 \  |5 f7 |  K
: f, u+ m$ [# F$ d
这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/* f* R1 }- Q/ w3 ?1 D
$ f# ]+ C$ H+ L4 `6 b  b
' s& p, s3 P% [; P3 j  W
以下是一部分代码:: b2 h. n1 E6 y1 F" p9 c

$ T7 E: x8 `# L: a" C* s//用有限状态机的办法,设计报纸售卖机的投币器
% U5 P/ {# I) T
6 X% o5 W+ z. g$ zmodule vend(coin,clock,reset,newspaper);
" K  y3 ]. i1 h* ]. \+ r& y" s, E" e' I7 b
//声明输入输出端口1 b4 q0 _8 P- @9 f  j  n. E

  `3 r' a, ^! s  F1 f8 h& B  linput [1:0] coin;
) x% }- B+ e7 `4 a! m
6 {# n  k) o9 O7 Z& d* a* @, m) Minput clock;
) ?5 I: I# h, w/ e0 v( y
1 D; i: O6 h9 X6 M, vinput reset;  w* }$ U$ i3 M. @  A
3 {% h9 \. w- g$ `  t+ S
output newspaper;3 x" n6 s! B/ C+ V) P
" ?- ^4 M4 ~$ f' K: ?4 s0 W
wire newspaper;
* J: T4 \1 d3 B0 U  a' }* C0 k
% Y5 F2 p. ^3 {//声明有限状态机的内部状态# q% M, B- O* u) r/ H- K1 t

! G! Z0 |+ H  y! l) E& S7 dwire [1:0] NEXT_STATE;( J) [; S; F$ f- |/ c  n' ~

/ g. k8 L" e' ?/ W* q  X6 preg [1:0] PRES_STATE;' k" V4 _0 M9 T+ N( _' u

6 _6 u! e: C. [/ C( L( I! |" g//状态编码
* S+ I+ M/ D: g
! D0 K' ?4 P. I, G5 T8 K6 yparameter s0=2'b00;$ }2 J5 g  T& [3 x
5 w' X5 J" M: @. u
parameter s5=2'b01;
1 E0 w; y0 T, i) r+ O  c
: y# m  b0 ^" i$ n# Hparameter s10=2'b10;
  c+ j+ A1 R1 n0 x
9 m" b) \' Z+ `3 bparameter s15=2'b11;3 R: c3 h- f2 X" X0 d
0 C' r  k) T: P  v9 i
//组合逻辑' j, ?4 F# j  _3 z8 {! }3 ]

1 m) W( ?- b4 r. o6 lfunction [2:0] fsm;( _0 D6 X5 M* k) p6 a' K* U
0 b" z& v3 ]3 R* g; O
input [1:0] fsm_coin;
9 R7 v- W6 L; h8 P2 P% _9 t; |% x; b. G' r% y) v3 I3 V
input [1:0] fsm_PRES_STATE;; U1 f" P/ i8 d1 U, R

0 X* y7 f) u+ {reg fsm_newspaper;4 p% j  c) P) p, G' c0 f0 a4 W

- J& B; p& K4 r0 T4 f- Greg [1:0] fsm_NEXT_STATE;
3 o% }: C% L3 p. l1 U
% P& Q( z- {! n- {0 x: P7 s7 U/ Fbegin0 c* z* }2 t% m$ z- m# H( |9 T' O4 A

3 l2 I# n/ [; x: d( c/ g3 I3 G9 }  case (fsm_PRES_STATE)" B9 X0 _# Z) |  a' B/ p, k$ X6 O

$ q1 U! J3 x. l  j' T- M+ i! O  S0:  //状态为s02 ^4 {( s% r; h6 |$ _8 W8 o- H

0 Y, L6 B) I8 t: ~  begin  @2 f- Z" n2 @. ~. r7 `5 l3 \
$ x# W9 r8 O7 v& ^7 Y3 H" N" e
    if(fsm_coin==2'b10)  u# X7 z$ u9 H" E: g1 y
. j' u0 j, ?1 y4 p" L/ U0 |$ o
     begin0 Z1 M' Z0 Z, o& x6 B% A
4 L( S& Y( l' h5 @. j4 F5 ?
        fsm_newspaper=1'b0;* q. ]5 |  n5 a  M% N
( Q2 q  v7 k3 O. W( u9 T
         fsm_NEXT_STATE=s10;
; C) i& h* L  k5 }/ X( n% [# j9 w* V8 X$ m
       end; K8 J& {9 }: p2 c  S
( e7 @  P- ?  H, n
   else if (fsm_coin==2'b01)
" O5 M2 B  H. V2 N3 c* h+ ]7 i  x% B  u" A
      begin4 k) F9 c$ p3 _
# J& x; A: g/ s1 N/ j
      fsm_newspaper=1'b0;$ O8 m4 U2 |/ e7 R: f
  Y7 C5 R- F0 w( M/ }1 ~: m9 G9 `
         fsm_NEXT_STATE=s5;
8 N9 g% ?, A5 S; `! M7 _& e5 Y$ x; V2 a
      end
$ V& }; @/ a9 n2 c+ A& H. b# d' }$ s, \/ Z/ W" U
    else4 o* X% D* A: k- \: l

, ?8 A( l- h) Y( ]5 c$ }    begin$ N2 U# L7 Y% @- J% `: _
! N2 S3 b1 G7 p. x" {
         fsm_newspaper=1'b0;2 p( P8 L. S" J, t
- {& s3 m1 T4 O6 A, O6 Q
         fsm_NEXT_STATE=s0;/ ?+ N* _: l/ R! h8 R+ d
7 p- C' e1 L# B5 \8 F% V7 ]) u
     end
$ G% x7 L0 G" Q0 {0 `! F
# ~: `* c% {  }& aend
+ Z2 h' E& h4 I# ~: H3 Q1 `/ _4 H: S1 R, k) q7 ?

3 R/ w7 z% L: L; p  a. A+ p) j# P0 w
s5:  //状态为s5+ W! o, X% b. @0 _( r# `: H: W& @

2 z/ m: K- `6 R, \' y  begin2 \0 s) A. Z( C0 e
# `* A7 C" V- z# B% g' u
     if(fsm_coin==2'b10)
* a- Y, n  j: m. \4 b9 S/ n# C
/ W+ W# B2 o% r+ R- N1 F# ^        fsm_newspaper=1'b0;
: D  z, f4 Y, B, T5 f/ E0 F% ^6 I8 a% P6 l7 V1 X7 S/ d9 ?- Q
         fsm_NEXT_STATE=s15;
% K  N0 X( s, o: K+ R' T, C) \" Z' I! A. P6 W, o/ `- V" D% y3 ?
      end
3 U6 L5 K& \  t& S- S) Z
! K, Y3 b$ b1 B5 }& Z    else if(fsm_coin==2'b01)" K5 ^9 F- n& L3 H* C: k& c
, ?& t, }7 n* W2 N! S
    begin
+ t$ M# h% V2 ]7 ]% V) s9 N: K0 g8 r) @, A
        fsm_newspaper=1'b0;
. O. H6 S: {, q. A" l6 v& q$ H4 \' h  a( r1 u- N
         fsm_NEXT_STATE=s10;
( K9 \& }* P2 p( K- q. W/ K$ F: e0 s* \. G9 ?; _2 p/ E
      end
1 U& X0 K5 \) V2 B% g   else
& G6 a" P$ `/ r; s* q3 d2 R7 S& f4 h* o
      begin
4 f' y8 d) I, D, Q+ R- B
. m7 H5 y7 Y, s! s' O        fsm_newspaper=1'b0;
9 z# P' N% R# b% U2 e" o, W0 T1 B2 s( `* O5 w/ _& t
         fsm_NEXT_STATE=s5;
: I6 h9 M! d- w8 H3 ^& Y+ [. [# O- B7 x1 z: p, d
   end; \( Z: v# H2 x: S
4 W, B1 u8 s$ q- u8 p. |
end5 {* D4 u/ ~0 v1 l& s: Z' Z# S" }

! B7 y4 k8 c3 J9 Us10: //状态为s10
% a- x' V# X8 A& F1 D6 x7 p) ?' M: w- R% I' K0 p5 Z, J) E; t
begin$ |# I# A/ A& {3 _0 c2 s% L  r
6 |( }. [( P. r( g2 ]3 h
    if(fsm_coin==2'b10)
  I% `. ?& T+ z0 b; N& x6 H7 p
- G9 J/ d$ I7 ?- D5 j2 A    begin/ ^& ]% ], K' i
7 ^$ H- m! ]2 o* O. ^2 }, [6 S+ k
         fsm_newspaper=1'b0;2 g* z1 W. |3 f, U
( c. {# Z6 w+ d+ o& `
         fsm_NEXT_STATE=s15;
2 b( P/ Z2 [; e* P% v% r: {$ p! p
2 K% Y. v) U* _       end+ g& B% y, [0 c3 G  F/ s9 n) y

7 i. h* H' s' Z. J- \        else if (fsm_coin==2'b01)
- J+ T8 t# S: Z, D* u6 d
) U! B9 \3 `9 @" u! Y# ^$ w0 A          begin- H5 u( m: y% v% n% d

6 }% f; i  E1 u4 c9 Y0 `9 x& w               fsm_newspaper=1'b0;
* e& K' r7 j% Y. [  e) H) C- `" v0 S2 j  g! k. ^1 f  f
                fsm_NEXT_STATE=s15;% f* d# s# I4 D3 l) b1 K- Y- P
2 R& o8 E# ^1 o% B3 s
             end
3 l) i4 I) H3 g) c/ g
$ y2 ~- h5 w( G7 S8 B: s  W' L        else
! b1 Z7 _5 h6 }9 y" t" I$ Y. F' n. G3 T4 |( J; {# e- R8 V$ D
          begin& H/ ^+ K! E' A: ?8 T

3 P  F, b$ n* @8 p& Q               fsm_newspaper=1'b0;
8 Z$ G1 x0 i8 r- `5 @+ i  L; f# m+ N+ G6 R
                fsm_NEXT_STATE=s10;
- x% M6 h% L/ @7 O# C& F
7 N0 F6 n9 G  l6 R; l  r  _; d& v             end" ?, h( k5 z4 `  k) I# D5 I

! g. U6 D* B( D9 Cend
6 d2 S. z; \4 U& ^. P: }6 }* s1 k$ r! W# r* R% c
s15:  // 状态为s15: i  r& Y9 h- A5 k
5 ^3 ^! A5 \6 E4 _# }
  begin
; g0 I( j! w2 V6 B; c& c( s5 y  I* @/ a: P1 N
        fsm_newspaper=1'b1;
+ `* f0 w1 Q" [: H
) V3 i, G5 f9 }" y* u0 c         fsm_NEXT_STATE=s0;
) a3 s  @4 Q, H3 h$ a
/ P+ M4 F' D& T: ?9 y4 ^      end
3 o0 g; R6 ?! c( n! n/ Z5 S
6 p2 {' S5 f2 Y2 Q* t! i) gendcase1 d4 S4 y2 K) N# R1 s7 ]: j& D
7 {7 T, l- [+ @
fsm={fsm_newspaper,fsm_NEXT_STATE};
  e2 b; Y3 U% a6 U5 x) E/ L; T) t$ l7 o6 ]. \7 _6 X8 q, g. P
end4 Y) G% K" Y% |; g( Y

4 R, ?! O! P  S6 Z& ^endfunction
1 _) j" i# v1 W
0 E2 ?0 r" p! Y; c//每当硬币放入或当前状态改变时,组合逻辑动作
3 A; f, o8 o9 |7 N5 `" W: Q$ o. S9 Z7 y
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);7 n6 P& g# V' F% ]0 p
9 D7 Y6 ]: d9 a, p& z  m
//用同步复位、时钟正跳变沿触发的状态触发器
& e- u+ f! A6 Y# f. b, W2 M0 b; Z2 x0 o" L
always @(posedge clock)
. f% Z( u% U( S. L$ V
$ O4 l. p9 K$ Qbegin
# |# a. U( a) s" `2 b; @7 R$ k: T: T; Q2 j% N5 h
    if(reset==1'b1)7 [; d" F$ m- ~
6 b+ s* ^+ d/ G7 \1 y6 F& d  n
      PRES_STATE<=S0;' Y3 `6 J$ {9 M

" w+ B  _0 @4 A7 h    else! H% J: Z. j& ~2 w+ p5 H# }, L
0 B" `4 y2 y3 i
       PRES_STATE<=NEXT_STATE;
- Q  S! |% c+ o5 H2 C
0 z, |  n1 z/ Y3 J5 c9 x  end3 x/ B& j. t( d5 h9 r: L

& M1 a8 e; H5 @! W5 E5 oendmodule; z' A! }- U9 S" G3 X4 _
; T0 A! U  F, |3 o7 r
: @" }6 Y& e) g: f! H( x* P- U
# m& ?  j9 V# W8 H
我的疑问在于这里:
; ~- r* B2 Z6 o7 T
5 h% {* A1 l1 Z8 q5 B//每当硬币放入或当前状态改变时,组合逻辑动作
. I) x/ i/ }" A. x& u1 Z5 J6 `( A2 @9 R, g4 v; c+ F" Y" T7 k) k
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
! o+ d7 m: j2 Y! J7 C0 r  d- D4 B. w1 q5 o3 K& r3 R; l# y
" ^  R% E! \1 J" H7 p# ^, U7 L

4 E) }) K: S. [' `6 N就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?( U# C# h/ a7 c# e4 E
: t( S$ N2 ?3 ~2 F
请问是不是我理解错了什么,初手还望各位指教。。。
. u4 f& v3 k2 D+ |" y! lps:在别的论坛也发了,但是没人回,EDA365要给力啊。。。。

该用户从未签到

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

该用户从未签到

3#
 楼主| 发表于 2014-3-27 15:44 | 只看该作者
lvsy 发表于 2014-3-27 13:13
0 x( `. K9 U* ncion输入一般来讲应该是同步信号,也就是说是在clock的上升沿跳变的,所以不存在你所担心的情况。
4 d4 I3 g# l3 e8 n. L9 n
这是整个题目的网址:http://andrew810810.blog.163.com ... 763992007895125290/+ }' a, g7 y- X: |
0 s/ o0 J! S1 o6 Y  Y& S
.2  电路要求
& B9 @- K' ~) P, Z0 _必须为该数字电路设置一些要求,如下所示:* G- e! @  _5 A/ Z+ U3 j- E% V
.当投入硬币时,一个两位的信号coin【1:0】被传送到数字电路。该信号在全局clock信号的下一个下降沿取值,并且准确地保持—个时钟周期.
1 ?7 Y- q" @( [/ x+ [8 I3 y.数字电路的输出是一位的。每次当投入的硬币总数为15分或者超过15分时.输出信号newspaper变为高电平,并且保持一个时钟周期.售卖机的门也被打开。- ?! @+ k( j4 I5 ]4 M  S; y

, a  E+ \4 L& j  A- B. Z/ E/ b.可以用一个reset信号复位有限状态机。假设为同步复位.
" z( @! R4 o* m* L- p

该用户从未签到

4#
发表于 2014-3-28 09:01 | 只看该作者
烂泥桑 发表于 2014-3-27 15:446 P. E- z7 j8 s- ]
这是整个题目的网址:http://andrew810810.blog.163.com/blog/static/51763992007895125290/2 b9 ]+ Q7 f# d  m  |; r. l
: ~2 w- ]. D6 C
.2  电 ...

) L" E1 @0 {# ]7 y6 Z7 N7 F4 B如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了,这样误导的人的书不看也罢!
) U! h0 r+ L! J  U: u/ `4 w! r& m" D: ~" t) m
多废话一句,通常在代码设计中,要尽量避免同时使用时钟的上下沿,这意味着你的电路是在倍频的时钟下工作的,如果时钟频率很高的话,可能会有timing的问题。如果非用不可的话,设计上要保证你的组合逻辑输出至少能保持一个时钟周期,否则可能有些结果时钟是采样不到的。

该用户从未签到

5#
 楼主| 发表于 2014-3-28 11:52 | 只看该作者
lvsy 发表于 2014-3-28 09:01
7 K, z  X  e1 [3 E如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了 ...

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-31 04:26 , Processed in 0.125000 second(s), 24 queries , Gzip On.

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

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

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