找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

15

主题

130

帖子

578

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

EDA365欢迎您!

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

x
各位,初来论坛。也不知道题目写的有没有问题,见谅。
0 A( a3 W2 Q' x* S* ?$ V本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:5 ~1 x( O- B* m* R2 C( v' S9 e& N
9 m. @0 d0 G/ O" Z9 u7 K
7 d7 Q8 x) X& W. w: D( p! ]1 l* K
这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/2 ?9 j, S, v- q. U4 x6 z8 |
6 {- P4 ~: B4 ]% ?

0 ~. e1 T  t9 a; [以下是一部分代码:& D3 k- Z$ {5 [% p# h6 f! Y
4 D+ c& c4 k1 r/ C7 d4 J
//用有限状态机的办法,设计报纸售卖机的投币器) h  v, R# }3 @7 u3 q
+ s" A' Z* B$ V, r7 L/ n
module vend(coin,clock,reset,newspaper);- P7 }; X; F9 Z7 _& w4 T
# P. _  W, b8 T
//声明输入输出端口, A% B  ?1 e4 N% ]; ]( M* y
* ~! T" d; ^6 H& H; F9 _
input [1:0] coin;$ M. t$ F- d5 t3 E" h0 m: S6 X# R* N

) ^1 J" X6 e5 |) d% I0 n: ]8 Q. E  Ainput clock;; r, G% j: o; p1 p
* p6 {/ p3 Y2 K% O7 B
input reset;
+ t4 J* t2 K8 A4 Z+ g, t  |8 S; r, n* j: j* N: a
output newspaper;- o% u3 r; ^: @1 C! q7 H8 ~; d# X

! y/ {2 K" R/ T- G/ t% Bwire newspaper;+ D- C# v6 B7 q/ u0 E2 h3 d

/ ^2 e0 q: K+ D% M//声明有限状态机的内部状态% R1 ^* I. I* A5 V; |
4 P1 `. \8 W0 R% u  g5 q$ [/ D
wire [1:0] NEXT_STATE;
& c  Z. f7 e# m$ y6 X  V5 n: ~$ Y! X
reg [1:0] PRES_STATE;
4 ~8 a3 m; F! i9 y6 S: X  ^& Q! X& g/ B8 K1 J, d4 X1 C
//状态编码8 t5 I- z/ k" v  l1 S6 g& I: h1 ]
, |2 r6 [+ g8 I. O, \! T3 @2 }
parameter s0=2'b00;% ~. b1 o6 o: p
' D1 p1 i0 w) g! F* Q
parameter s5=2'b01;
4 V: g5 b+ M0 \$ m8 _: K" Z$ Z( D; c: O. x( X/ ~
parameter s10=2'b10;
, p0 p4 i; q, V3 f. d$ O" w5 n0 b$ v* V, j, j+ t! O
parameter s15=2'b11;! A2 f$ L' a* ~3 I7 \9 I5 h' \0 t
; C3 z# t: Q, Y, |4 E5 J
//组合逻辑
# q" x* z% e. P- D% ~# j& F
+ n" |+ C& B6 m' ofunction [2:0] fsm;3 h" w5 [- C8 ^
+ r( F+ N% Q, |! [% Y; M
input [1:0] fsm_coin;
4 e* _8 f% B6 S, ~" P0 g
# H. D: X, f/ c( N4 \input [1:0] fsm_PRES_STATE;
3 n4 m+ i! {( D4 F5 K/ `) v' V; f( F  F( b- Y) Z
reg fsm_newspaper;
& J) ^& ?& S4 R; K/ }5 }; Q! X" l0 ^0 T8 ]: W* {' ?3 d
reg [1:0] fsm_NEXT_STATE;% R. }9 |  g: B# R7 c6 P: A
  I% R: Q. z* ?6 T
begin. `: R* V/ R9 ?, `: a  j8 G
$ j8 M9 x- ?6 V  R# U
  case (fsm_PRES_STATE), f. v6 h: [. Z' k$ k
1 }) J% z( x3 E3 s' A
  S0:  //状态为s0
+ h1 U- K+ K/ b$ P  F: {1 U7 |& u9 g& g# u! \$ e
  begin
1 D0 t. ?1 H. J# m% e1 I, t
6 P2 W' d! w4 B9 m    if(fsm_coin==2'b10)8 \$ A( n$ `5 ~
1 x' `3 u  e8 |
     begin
# @1 U- w" i5 {
% i8 A- _; Y# j! l# c, ]        fsm_newspaper=1'b0;
: ?) o4 b, T* C& e% U" q9 I- a  f/ p5 f5 {8 P/ ~6 n  ^
         fsm_NEXT_STATE=s10;! R0 @) W' w% M

' @' Q( B9 T6 M3 ?       end+ }3 p( ^; j) @+ h

. W4 I+ O, x4 C9 q$ Q   else if (fsm_coin==2'b01)
* D" W4 b7 G$ C& _& n; i( U" L: F" E" R% z5 r5 L' A
      begin
4 [) V+ c" r* O; u2 @7 J2 ^: _2 `
      fsm_newspaper=1'b0;3 E' H8 K  f6 ~* `) X6 l3 N

& P4 o  C2 ^. a( X! V) ^# G: E         fsm_NEXT_STATE=s5;9 g; y, F6 K5 O5 F) Q  V
& C$ k2 Y1 _7 e, l* M
      end
5 s/ ~/ u' g; e+ C) e/ O$ d9 P
    else* f" \  t( [" E" L
5 {1 e; Q# K$ T5 Z  A
    begin
5 V1 z4 f# A) a: V% Q. ^0 n* L9 c$ g; `) R, I, @
         fsm_newspaper=1'b0;* p  T- }$ m2 ]; \& r
7 |) u* p! R- w* `" ^
         fsm_NEXT_STATE=s0;
" s7 Y; y' S7 b6 _, o( g" _7 o4 E
. F* ?6 B: n, O7 I$ c' _     end) Q+ _1 _4 L! m7 g

8 P; N( d5 z- q% E( send1 z+ w6 m! H' J' r8 S2 f* f' F7 a

( K" K! L  s/ m" g
2 ]" t$ p( A% w  }) `& d* I( j4 R0 f9 a; M3 a# r5 @) c; L& H
s5:  //状态为s59 R! @6 ]! u% H" B9 O2 D5 J

0 w: _$ {6 v4 V7 G  begin7 j3 }6 [! [9 q, V+ [5 O

2 [  l& H( D' o0 T     if(fsm_coin==2'b10)
8 n, x4 L- X5 `) \8 D1 y/ e! \1 b, `! P8 E" ~  [
        fsm_newspaper=1'b0;+ B, t0 j2 _( c$ Z0 o2 ]$ t; r8 K6 d

9 i$ R' e! G- _9 ]         fsm_NEXT_STATE=s15;9 J) B. u" S6 E

( M3 w& N; L3 m- }3 I      end" u# M# P* {( C4 Y6 x6 @7 W

( I0 L1 k. M( @+ P7 x    else if(fsm_coin==2'b01)  C0 T' L' s+ G
/ Y7 d$ h; M5 n3 L3 i9 s2 R/ u
    begin % h; T8 c8 y* v

5 ?/ h' {, {3 t: ^& x        fsm_newspaper=1'b0;3 Q, a5 t+ A# S1 v5 T

7 E6 z0 }- t) q         fsm_NEXT_STATE=s10;+ V9 K% O2 j" P. G! f
: m* Q: t* I. S% d
      end. z1 e6 B! S" E7 N% V/ p$ @
   else  s& Z5 q& X, ]  t! n
3 D( q; ~+ w9 Y& s
      begin
) ^' L7 ^. ?- o  ~, D* ~2 ]: D- H' ?7 V+ l5 A
        fsm_newspaper=1'b0;
9 V( [8 Y: z5 J7 `
; c! c0 M5 k/ b% p' h5 I         fsm_NEXT_STATE=s5;
& ?9 Y1 r/ F! ~
! v9 c8 V  W$ V  Y9 ~7 D( K   end
; M' O# B8 `$ a5 f( O7 p# N, [( j% }7 `
end
! B! T/ Q- n9 E* X* j* i* z$ V; A/ n* L! |
s10: //状态为s10! q9 B) V9 c, M+ N' K/ c2 f
! ^9 t# ^7 e% r7 V" C
begin
+ [8 r* z8 C& ]( v2 d8 Y& a" ?! c" J& x- f) X. }5 s9 J' ]5 k
    if(fsm_coin==2'b10), J, N5 N& N7 h6 d! }

  N" H- m; w% f  \$ c7 }    begin) w% y/ ~% @9 p, F, z& N4 Z
: Y- R( r/ c9 [) ]6 _
         fsm_newspaper=1'b0;
4 K$ J- H2 x9 _; P
* |6 A6 s6 q' T. M         fsm_NEXT_STATE=s15;" U+ P0 i' K. [) @2 P* j
, f( ^6 T2 A. V# i
       end
& `1 e6 c/ b4 N) V
6 D6 j: }# {- [" c" [        else if (fsm_coin==2'b01)- e: r4 z1 l3 J4 g1 s
$ r* g0 k" K" P* p8 H; G3 w, t% d
          begin1 m2 p& G: [- [( f% n

$ @3 W# E. s1 \4 B8 p6 k1 h* z6 L               fsm_newspaper=1'b0;
1 ]" j& L( R, [$ N; c( f4 J2 R: w" }" \0 }: g
                fsm_NEXT_STATE=s15;
0 @3 y6 O+ l* M$ A* e7 g* F* H- S/ p9 E
             end
6 o% J7 g8 X& Y! ~4 Q# ]* _) p2 ^- f" \! w% \3 r3 @
        else
# u: J4 H* |8 ?2 U9 S. z  K# d5 h2 b( K' @8 v3 G4 Z
          begin8 `  j0 z3 w3 q! d  S( C$ |* a

  h- o! g7 z: E" B. L               fsm_newspaper=1'b0;
8 J. C9 f4 a, z- n
$ [: x5 r3 }7 {' }& s3 @3 J                fsm_NEXT_STATE=s10;
* Q2 i; B7 j- |2 J3 K. }# H( M6 Z6 C* s
             end
# c3 [0 ?  t; d% H3 G2 P! |" |8 I, n5 I  y
end
: c' q( ]7 u! \: e. r
. w. R4 N8 L7 t5 H) \. m' Ws15:  // 状态为s15
: D: R% b% |( Q8 r$ O6 t7 V+ u) }2 S/ a9 S
  begin- c  Z0 L' P  ]3 |5 t) A* u: r

8 o2 f7 M* }/ ], Z1 N        fsm_newspaper=1'b1;
# o: i# z* P4 G4 Y5 t1 ~& E
" U) J3 q% N& f- h; ^         fsm_NEXT_STATE=s0;, a; Q6 r( w" K" y0 G# p+ N; y

: z& a# C1 a: t8 [% D      end4 u' ~; L6 [; v6 ~; y6 b

  e0 I! u# l, G5 L8 I! K, xendcase5 A" J4 r# {9 y5 A1 t
/ i9 a" Y& M; W$ \: [7 o# ~
fsm={fsm_newspaper,fsm_NEXT_STATE};
9 N8 t( d) t" j* n- C; Y( N, ~; g' {0 g5 w
end" F$ s9 C; B  T# q% _' A

* M* ?! g$ M0 _& Lendfunction
3 D+ Y, m9 J( A$ T) f4 `8 q5 _5 b- C6 x/ t4 z9 p7 `
//每当硬币放入或当前状态改变时,组合逻辑动作" y/ N& S+ v5 g$ _3 P! b

9 u  J- e+ ^6 Q9 Qassign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);  q( O5 L9 d( y$ u; G; j

( Z. ?, E" T+ u2 n% V& z/ x& w//用同步复位、时钟正跳变沿触发的状态触发器) a$ T9 G) m4 `: W6 W8 C$ U

3 s+ u3 e7 p% ]! |/ Nalways @(posedge clock), n8 V( |' M; @5 r

* f$ V4 a/ R$ g" _' w, B# J( Abegin
& C7 J5 Z' Y: C$ N5 Z- D& W9 R) Y9 ~1 z- ~
    if(reset==1'b1): ], W: G( s" l
- y1 r, ]* T9 ~; C, W. k
      PRES_STATE<=S0;
' L" h- N9 K! ]% e0 ?) p  B& ~5 V# n6 t3 Y6 r
    else
6 q3 B) b" h5 W- c+ u2 I4 z7 u2 n& O* m' y# o5 M- b
       PRES_STATE<=NEXT_STATE;
1 ^+ x! K- ?2 H, @* _3 L6 @  C9 \; j6 ~0 r7 u
  end
) g- v+ e6 H& L: U9 n. `$ v. k$ ]3 W: p7 |: A% a+ J
endmodule
$ `- M( @7 Y  g, B9 d$ b/ I
. Y3 t- F8 g5 s3 ^7 X/ O2 T& ?  K0 O" i7 C8 ^' ^  L& L. ]

: N' J0 N+ i7 v) n+ `! o我的疑问在于这里:
5 K* t6 |+ y, U; i3 T4 a9 c, X7 F( k4 L. y# L% w
//每当硬币放入或当前状态改变时,组合逻辑动作5 p( b. {$ [3 @) X

! S5 v! Q- }/ m4 lassign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
1 w4 j/ l9 K9 f/ y4 b
9 l. R8 u2 y6 W: Q  B
  P! g0 ~, l' T/ h3 c" i. v/ u$ {" }9 @' \6 V" J* b
就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?2 F. f3 _0 q( g/ W
: |) X2 S" Q  O4 E+ y; S
请问是不是我理解错了什么,初手还望各位指教。。。
3 I' \" c$ M: o* [8 l" Aps:在别的论坛也发了,但是没人回,EDA365要给力啊。。。。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

4

主题

43

帖子

913

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

15

主题

130

帖子

578

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
578
3#
 楼主| 发表于 2014-3-27 15:44 | 只看该作者
lvsy 发表于 2014-3-27 13:13# O* ?1 l3 }5 L5 ~" M/ g
cion输入一般来讲应该是同步信号,也就是说是在clock的上升沿跳变的,所以不存在你所担心的情况。
: H  Q) O) r* K: o) e
这是整个题目的网址:http://andrew810810.blog.163.com ... 763992007895125290/4 U  U5 I8 q, _

3 M3 p  D. A) j4 ?.2  电路要求
: g+ a1 D2 O6 J2 Z! Z/ e, G5 k必须为该数字电路设置一些要求,如下所示:# L+ ], v7 F6 C" ^. Q1 ]+ d8 X% B7 t
.当投入硬币时,一个两位的信号coin【1:0】被传送到数字电路。该信号在全局clock信号的下一个下降沿取值,并且准确地保持—个时钟周期.
! G, D6 d6 ]& c& [.数字电路的输出是一位的。每次当投入的硬币总数为15分或者超过15分时.输出信号newspaper变为高电平,并且保持一个时钟周期.售卖机的门也被打开。3 K3 {" F8 l$ R
3 D. ~6 i' I+ D' ^: B- K8 ~
.可以用一个reset信号复位有限状态机。假设为同步复位.9 J# u) N% H8 i# s1 `0 {6 j7 X

4

主题

43

帖子

913

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
913
4#
发表于 2014-3-28 09:01 | 只看该作者
烂泥桑 发表于 2014-3-27 15:44
3 X3 Y: E5 T  r8 _6 t6 U' Q这是整个题目的网址:http://andrew810810.blog.163.com/blog/static/51763992007895125290/  u6 b8 z- r! y2 ], T8 y
: ?2 _) _4 Y0 }& o/ w8 E
.2  电 ...
: H4 q! W# y5 E  h) b# ]6 y% v
如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了,这样误导的人的书不看也罢!
4 w7 X2 Q  l- I2 a5 ]6 _4 U) S3 i6 t
; U  P7 @9 _" c/ O" Y多废话一句,通常在代码设计中,要尽量避免同时使用时钟的上下沿,这意味着你的电路是在倍频的时钟下工作的,如果时钟频率很高的话,可能会有timing的问题。如果非用不可的话,设计上要保证你的组合逻辑输出至少能保持一个时钟周期,否则可能有些结果时钟是采样不到的。

15

主题

130

帖子

578

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

, w0 g+ Z# k, q# K7 @; [$ `如果是有bug的题目设置,那实在有些出于意料,毕竟这本书不是很经典的吗,而且都到了第二版了。总之,感谢朋友你的回答。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-2-19 05:56 , Processed in 0.061818 second(s), 32 queries , Gzip On.

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

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

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