找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 797|回复: 4
打印 上一主题 下一主题

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

[复制链接]

15

主题

130

帖子

578

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

EDA365欢迎您!

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

x
各位,初来论坛。也不知道题目写的有没有问题,见谅。
$ R" G& V+ G0 L$ w1 O+ x本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:1 k1 ]7 s1 m* M4 Q

1 u! |' f7 f5 P
4 ^1 P! k7 N+ \$ b# D这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/3 m  f; T. W; \

3 l1 l% m' s) _4 o  I) l4 I, x
以下是一部分代码:6 e0 f# s$ H0 C
( o+ w' N& c8 l
//用有限状态机的办法,设计报纸售卖机的投币器
% J8 D0 v) F3 i+ a, u5 @' {* u( W. m# G/ u
module vend(coin,clock,reset,newspaper);/ E7 T3 w6 c4 i2 @1 |3 a; \
" {0 B/ U+ Y, f5 [- e
//声明输入输出端口
" \3 a: e3 @# `+ _% h# l
3 m' F5 o2 t; i4 y4 _% zinput [1:0] coin;
$ ^1 w; Q$ H& o7 i
+ b0 A. D0 m6 v9 i# Finput clock;
& z% ]8 ?! m* \1 q
$ |2 d/ w+ a1 E9 E* k/ o: oinput reset;
, O) E1 K+ N* y% R/ W$ m
- N/ q" c7 t0 E  I  soutput newspaper;
# b- W. u5 h; z/ l
3 Y. M* }( `9 E3 Twire newspaper;% I3 ]# L* N; F$ b$ H
2 c) [( a  x8 ?) M5 {+ n
//声明有限状态机的内部状态
" G; M" ^& u- L
- o3 C7 C+ T# t9 @wire [1:0] NEXT_STATE;
) a$ K8 I/ }3 I9 f# n; S: t: x) G/ X; D" n- z
reg [1:0] PRES_STATE;
' l' s1 X, y. T6 h  O
; m: Z* ^: x8 `+ f; U) _* d//状态编码, T: _4 u6 b( a
/ }; M6 p8 h$ O+ B: X# n# k* ~- x
parameter s0=2'b00;. v$ @3 `; P. b% ]. o7 E

% `- j5 G- g* D. D  Q- Dparameter s5=2'b01;2 G8 m" n+ d9 l, u
# [' g' v4 e/ w; w* P+ N
parameter s10=2'b10;- M# ]+ \- [* v
- o8 \- x( h2 T
parameter s15=2'b11;
1 z6 X& \- Y' Z/ j. c( d+ X! G5 v2 ~
//组合逻辑) \2 _( r* b2 n" o% P- U

3 U% [4 r1 U; M; o! ~) p1 i9 jfunction [2:0] fsm;9 g( B6 b# P! G: K$ e2 p$ d+ [

, F  d! I& z# d, j$ y3 @input [1:0] fsm_coin;" t' L/ c: {6 C4 [  r1 L9 x

7 |' {( y. [2 ]3 binput [1:0] fsm_PRES_STATE;$ `' n. J/ p8 f& {) l' Y
( N; r( B+ P1 b
reg fsm_newspaper;/ t2 u( N3 ?* |! I1 t4 p% j) G9 y3 q

" V5 u! y; S- V8 G5 {reg [1:0] fsm_NEXT_STATE;
" V2 n, b! L. W! x2 t; ?: w; h1 P/ f+ @: c0 [! ~
begin
; \) s4 |! {2 O, t# x$ x& j  s6 Y+ V! l7 i
  case (fsm_PRES_STATE)
9 @7 p0 x- o% O8 s; A
5 @( @, Z& `2 o2 A. k" [! N  S0:  //状态为s0) `+ X: M( r7 Z% f* B$ F

; V4 y; O# q; \. g  begin
# v0 |  V$ U9 m7 `/ @' O# Y. v2 G2 W4 p5 z$ ~
    if(fsm_coin==2'b10)* F" A" a% Y. b/ ?! u, [6 ?% ~" i( \
  n8 @% j9 S/ x6 m
     begin/ K  t( a4 [+ s& R

  \$ R% A* J4 f        fsm_newspaper=1'b0;2 J9 j# ~% Y5 \8 e. x! P2 c
- F% ]% V  |2 e7 W# w
         fsm_NEXT_STATE=s10;
+ G7 }+ I5 C0 V  W+ |( z8 l/ O! t8 `4 P- U" R
       end2 C8 N5 m" G7 V9 k1 V

. C/ ~9 s* i0 k/ P  @; \   else if (fsm_coin==2'b01)& {" }/ C$ X7 B# l( {
) a: B3 t4 J9 _+ V1 `# D5 g* j
      begin
4 p( N+ ^2 b. S1 u6 P, `) C$ o
      fsm_newspaper=1'b0;+ U0 C/ ~7 t! Z1 X- W0 ]  r+ b0 t) Y
" Y0 b2 j4 b+ ?* ]* s! q1 j1 Z
         fsm_NEXT_STATE=s5;! F2 E' q" q1 ^9 F( }2 S- K$ {
- p8 r) d8 ~: z2 W
      end" T) n2 f3 b! k$ [- S$ l
7 l+ u! e7 A" x/ B" b
    else1 U, B# R0 j. X% g( J

6 a2 R1 F, y/ X, l% Z/ z    begin2 Q  f& Z5 m7 q# A

2 G/ ~* v  C# A' R         fsm_newspaper=1'b0;6 L! V% t* A0 `: r. Z
& F/ u% `9 Y& N
         fsm_NEXT_STATE=s0;! w  c1 b$ M$ z% J/ n" M
' @6 S+ S! v0 k- j1 I
     end! a  Z! D5 R# J& O: A9 W  z

' E/ s$ B: M) N1 |end: i' A0 a( U* u" d7 r7 t

) m. ^7 ]( ~$ S6 n+ c) z0 |5 k( K9 m- x1 d- H7 M* U
& |# ?% b' A7 g: l
s5:  //状态为s5
$ ^9 d: s# f( M( H( h
6 E2 a- W5 X3 Z5 o  begin9 w. @4 h, e! X# P7 R( W

8 I2 y7 k  l' s) w8 }; m3 {     if(fsm_coin==2'b10)  ?4 @1 ]) c) o" ?

+ K& H+ ~1 {  k$ G% T0 G        fsm_newspaper=1'b0;
$ ~, x3 a, o1 E* W% D" ?% F
7 v, [2 z' P2 W7 @0 N6 A% B- C         fsm_NEXT_STATE=s15;
! w, C1 ^3 v# n
: c0 @) F# e- n* Z      end5 \* z5 j4 b' C% ~
' x- D1 o( j  A9 V* E) s# |  R
    else if(fsm_coin==2'b01), s2 s% T$ r: X5 e& K
3 n# A  A: C/ S0 h5 o
    begin
+ H' G+ B) r% S9 c
- [. Q: p' V( ]* K# p8 l/ E' u        fsm_newspaper=1'b0;! S( Q2 g) r( I, n
( y7 R  \$ @, i0 _6 Z
         fsm_NEXT_STATE=s10;/ t- I* f6 d( c# y8 d. n

4 N9 W+ L3 t9 n' n3 V  {      end
. @: U+ l: M+ p6 R1 {   else0 n) ]4 m$ r" k7 }8 L) i. R$ L
0 x* q  I6 `* t* w- ?: g, b
      begin
1 z8 E$ B0 D% A/ j
7 a$ c6 C. C; `9 C7 L$ Q; c+ h        fsm_newspaper=1'b0;- o/ w9 O; X& r+ c3 O
7 j# Z3 }6 i% `  K
         fsm_NEXT_STATE=s5;
# y9 v$ p8 n4 `3 c% p' D
5 Y  C; ?5 ^9 i' ]$ C# r3 h   end
& R. z1 O9 {& S- S, f  u2 y) a5 o; b8 i' }
end4 k1 {$ H3 ]- u; M* g

# e  ^$ C- M/ J; r0 As10: //状态为s101 a6 m. k( w3 n- |/ X! ~# k
* J1 b$ J+ B% x: w( `3 W9 K% _
begin
+ g' G3 }; o6 ]- n; G  z% |; g! @# ]6 W& t$ C
    if(fsm_coin==2'b10)$ X/ {8 O- X4 ?) s( ~

5 U, w* G' t+ Y7 g+ Q- |9 l    begin
0 W* p9 U3 I/ R! t/ L+ X& H. ]4 N
% _% \( f% i0 P7 K1 O8 I         fsm_newspaper=1'b0;
0 E6 Q4 P' M- z- V5 p) [0 N$ [* S0 U# X7 W; g5 D; f
         fsm_NEXT_STATE=s15;9 f1 M+ O( I0 h* f7 |  g% x

) g5 x2 D: Y( a' s9 T4 b; ?$ c5 R       end
0 d& X3 |% q6 g+ M& ?' s1 [6 j$ ~" h0 C/ @' W% k3 h* ^1 Q
        else if (fsm_coin==2'b01)
8 l' `; e' Q4 c% _- q2 ^( G# m% ~5 B
          begin2 ]" t5 Q3 c/ g& T6 B/ u. T
" h+ r$ I! B  d0 W, q1 S5 v' B& l
               fsm_newspaper=1'b0;
3 b7 T, W+ w4 o3 s) E! @0 E5 e4 ?$ Y! d8 S, g: v1 Q) y. D
                fsm_NEXT_STATE=s15;7 R) p4 A( [& J

. Z9 a' ~! m( k. w3 E             end
' A( N: s# ]# C1 }0 j2 U! ]/ Y, U& D4 d# m! j: ]) P, p) Z
        else  _' \6 }7 S; W, g4 s- U
) Q7 L# ~7 Z9 ^# Z3 P2 f
          begin
3 w0 Z5 t6 @" s+ E. G  O# \) o* M
               fsm_newspaper=1'b0;8 d5 y1 Q( o, X7 \* ~- Q  \

" S4 `. p. R1 R' O( @  L                fsm_NEXT_STATE=s10;
8 ^; j* F& f# h' E' x4 B4 n$ h4 n# R: e7 r9 p( W2 B( z9 I
             end
+ E# E! E% ?5 W* H8 z; u
) i& Y1 Y- h+ `$ ]end" \2 ]3 i9 d) Y+ s) |

2 j+ m& o5 b! a' k8 Q6 [7 F7 d$ p1 O6 hs15:  // 状态为s15
6 M/ N* E3 x& b( ]" N0 F" a  p& E9 }$ O) I% [! n- C- g
  begin, w" u- R8 L, I: V; c5 ?. U
  P; a: P: D, g( z! C+ s! H
        fsm_newspaper=1'b1;
0 Q0 c: i2 D. Q
: S& N1 A1 y8 z6 \# E. z         fsm_NEXT_STATE=s0;
9 H/ k, y# z1 x) d7 t
& ?& l/ H9 |# R; J7 `7 E% E      end
3 V$ \. N8 c3 q& T5 s
# P! Y. q+ Y3 zendcase
# R9 c  R5 F1 E; e9 M7 F3 p, \* }& T0 g( x4 B( v
fsm={fsm_newspaper,fsm_NEXT_STATE};
/ ^- f( K7 R( F+ q( m5 B  q" e9 z
1 _5 j3 Q# @6 F, f! g, Nend
1 x3 R1 z6 m5 W; u8 }3 n7 m7 g# P5 b" |& ~* g- s  X
endfunction
' O" F1 _# N# B8 ]' l3 Y
) Z. T1 W/ q9 O2 |6 m+ J- Z& D//每当硬币放入或当前状态改变时,组合逻辑动作
& Q7 {1 w! [( R2 F  |8 S
8 E$ f5 y8 i+ I- ?; \7 w3 Wassign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);5 P% D* @6 l, ]  n+ \8 _& }- |9 w
/ d- p: \5 k: B; q. A: ~
//用同步复位、时钟正跳变沿触发的状态触发器
6 p/ p0 \& w0 X- @$ v0 G! i. O+ f3 i* n0 S
always @(posedge clock)- v( b9 E) j/ }5 \5 h

2 N7 n% S/ A- l5 i6 V) m2 G- c6 Mbegin* G. ?6 H" I- C3 U# q

/ L" U. b6 I& @: t1 s; C    if(reset==1'b1)3 L* C$ Z. B3 a

1 ^1 ^# H, a, f) u- k- O3 R      PRES_STATE<=S0;
- J, w! a+ ?5 G" G: C! z, s  o# C: y, X% p. _6 D' Q2 d3 }
    else# E9 `$ T  o( f4 L

! S- Z9 v' M) z# R" B3 s# _0 g       PRES_STATE<=NEXT_STATE;
' o- d2 O: P7 C: ^3 i+ W. D
4 n* [% \* b" i% c/ _  end
# P; R. i* A- y/ x: t; L/ B3 p2 T' a2 K
endmodule. X1 |. I6 r/ X" U

& Y$ i: T3 A- {/ \
/ f! A# ?0 U: R6 v# ?4 X
+ h9 G6 W* n( E0 S我的疑问在于这里:
5 T- s; i, D! p; e2 _; X# u- [% k' N; {; O
//每当硬币放入或当前状态改变时,组合逻辑动作  H* ~/ W8 h) O  A
: m4 k" j; H2 Q+ I+ f# c
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);* Z- E9 }4 Z( @' l1 S
5 `% K0 }0 }: x

' V. C) U) N/ i$ E& a; w' M- p# U! u" h
就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?& e, H0 c, ?/ V9 a! S1 K/ h

4 }( ~# ]  e& L$ B请问是不是我理解错了什么,初手还望各位指教。。。
; X5 e) j& N2 }+ hps:在别的论坛也发了,但是没人回,EDA365要给力啊。。。。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

15

主题

130

帖子

578

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
578
5#
 楼主| 发表于 2014-3-28 11:52 | 只看该作者
lvsy 发表于 2014-3-28 09:01- K7 a* i+ Z, m+ p) f# j! y; T, N( N( H
如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了 ...
( t1 s3 D" o3 X! I
如果是有bug的题目设置,那实在有些出于意料,毕竟这本书不是很经典的吗,而且都到了第二版了。总之,感谢朋友你的回答。

4

主题

43

帖子

913

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
913
4#
发表于 2014-3-28 09:01 | 只看该作者
烂泥桑 发表于 2014-3-27 15:44& [$ T: _6 ^3 p$ z: k
这是整个题目的网址:http://andrew810810.blog.163.com/blog/static/51763992007895125290/$ A: t; k; u# L( ~* O: u% G
2 D" a% u0 D, t8 V
.2  电 ...
; Y1 y+ s: _% Z
如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了,这样误导的人的书不看也罢!( A' c0 v  |( j

( `: n. j( R4 e; V9 \8 Y# O多废话一句,通常在代码设计中,要尽量避免同时使用时钟的上下沿,这意味着你的电路是在倍频的时钟下工作的,如果时钟频率很高的话,可能会有timing的问题。如果非用不可的话,设计上要保证你的组合逻辑输出至少能保持一个时钟周期,否则可能有些结果时钟是采样不到的。

15

主题

130

帖子

578

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
578
3#
 楼主| 发表于 2014-3-27 15:44 | 只看该作者
lvsy 发表于 2014-3-27 13:13
  o, w; `# V9 t# s. i; Mcion输入一般来讲应该是同步信号,也就是说是在clock的上升沿跳变的,所以不存在你所担心的情况。

" a* k  B3 @6 O这是整个题目的网址:http://andrew810810.blog.163.com ... 763992007895125290/, G* y+ o, ?4 w* h: [# E

3 T4 Z) E6 H$ w* C" Y.2  电路要求' x- o' k& N/ H
必须为该数字电路设置一些要求,如下所示:
! G( h9 P* s. e5 u8 N# I.当投入硬币时,一个两位的信号coin【1:0】被传送到数字电路。该信号在全局clock信号的下一个下降沿取值,并且准确地保持—个时钟周期.* I5 d* o& j' r6 L
.数字电路的输出是一位的。每次当投入的硬币总数为15分或者超过15分时.输出信号newspaper变为高电平,并且保持一个时钟周期.售卖机的门也被打开。7 R2 X9 d# H8 r' u! r1 n% z& A
( |6 y3 S' i# v: w
.可以用一个reset信号复位有限状态机。假设为同步复位.
' X5 u; o3 m$ A

4

主题

43

帖子

913

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
913
2#
发表于 2014-3-27 13:13 | 只看该作者
cion输入一般来讲应该是同步信号,也就是说是在clock的上升沿跳变的,所以不存在你所担心的情况。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2024-11-24 08:00 , Processed in 0.059865 second(s), 33 queries , Gzip On.

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

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

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