找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

15

主题

130

帖子

578

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

EDA365欢迎您!

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

x
各位,初来论坛。也不知道题目写的有没有问题,见谅。+ U2 e* X  ~1 v9 v! P
本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:
$ c) |8 s- ~9 g' d
: C9 j6 f+ k; Z9 _! t; a
" k; X$ ~& e1 G, t- `) D这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/
1 d7 m1 V5 ?8 t% _) J
- [( D: M; U; m5 U/ ]
& ]' M" m! W: t4 v  I2 s以下是一部分代码:
" f+ j# R, v0 T$ ~0 I/ X% d
! t2 v7 b. [  j$ Y: A6 v) H3 V//用有限状态机的办法,设计报纸售卖机的投币器9 C% O! \6 Z7 I: k7 L4 I  [4 r

/ d5 L+ F' g  E- a/ e. S8 Nmodule vend(coin,clock,reset,newspaper);
( _3 }8 Z; {1 d% a3 O7 p( ?
0 l( t4 l) w3 C, }5 d* s( A//声明输入输出端口
6 P4 i1 `- o! p# Y9 f
' y+ C1 P) Y, jinput [1:0] coin;
/ m( W7 g( }! G; {
; t; y5 T/ t, P. p4 ~input clock;" \0 }$ e) ^. B( d3 v# @; c

2 e/ @3 r( ~5 k! i5 [; o! Yinput reset;; m! m, V' D/ z9 Z5 C
; n( d# @) [, }  |% _1 h1 @
output newspaper;
3 b$ V7 s( D% ~* i. m
& `! q( C" B8 C$ n0 gwire newspaper;+ u- H5 n3 e. A0 {) Y8 S0 V
; J5 U/ a8 a8 O
//声明有限状态机的内部状态
( O, R6 X5 G" t: S2 C" j
5 |9 J( J: P3 r  N: Wwire [1:0] NEXT_STATE;
; I# h" I4 ]3 y; i
: W) V% x* Y; ]reg [1:0] PRES_STATE;. R- [, k3 l7 B+ ^9 K0 d& y
9 E' @: r& N) u& |; F
//状态编码5 r& V% h! P: Y- Y6 K

; s/ B7 `# H+ p3 V' d% [* Aparameter s0=2'b00;, [4 M+ O3 l, _+ F
: _, _4 I: i6 P6 m3 K- Q
parameter s5=2'b01;* R6 y3 q& P& K6 F+ Z" E( y/ O
1 U, _. m$ h  \% P6 Q
parameter s10=2'b10;# E' z! g. u$ ?6 ^2 K0 V/ x& D

& c' U. X: i5 V% X/ e, zparameter s15=2'b11;3 S: k+ ?) i( [' l" O
+ @& C2 }7 v7 g' E
//组合逻辑
5 \9 g9 U# a. S- P
4 Z- c1 i1 I! t/ E5 i8 A  W8 S7 ]3 |function [2:0] fsm;
  d5 G9 X# u' U  ~: N+ P
# e; h; D  b' I# y% G4 K4 {input [1:0] fsm_coin;$ K% H; P, B; y, d6 j) g
/ u5 l9 H/ R: I. N" ^4 q
input [1:0] fsm_PRES_STATE;
+ K5 U- \/ r) f; o. V7 {! [2 E5 c5 k, M
reg fsm_newspaper;
  P" i. P* h  o) S+ z4 v2 l2 `
1 ~$ y5 e6 O$ l3 O) c( g& U/ i6 Ureg [1:0] fsm_NEXT_STATE;
% B6 G6 W. D) i& U% @" ?4 @! R2 r/ f, ^5 f5 X
begin
+ f: E& T) \' M# N: v/ k* _1 m' e  {2 a- H0 I2 B
  case (fsm_PRES_STATE)9 O! a9 y4 X4 C+ h: }
' A7 ?/ @: i' V" X& v
  S0:  //状态为s00 _3 D3 w) B' f) h# |
. D; j; b$ L  [. g6 I
  begin2 q3 Z5 U. X8 J! }: @  [4 H
/ e5 K' X/ {$ b& u. B9 P
    if(fsm_coin==2'b10)/ C6 g/ m8 z# |8 p5 E) ^  ]
8 O2 R2 g. p$ b' q, E' V
     begin
2 U$ Q0 |: Q7 k, ?& r3 W$ p
4 x/ T7 B/ V7 {7 y# E. G: N        fsm_newspaper=1'b0;, O3 B' L$ x( Q$ h/ d% q( K! i

5 |! P8 h! y1 N0 a" ]* h9 q. e         fsm_NEXT_STATE=s10;/ d* O7 r, f% E8 P* S
+ i$ y+ X$ i! m
       end- d+ G( C9 P: ]$ C2 m1 _7 k3 W

6 e& r# v1 A1 b) G4 Q   else if (fsm_coin==2'b01)
9 N0 m& Z! j6 t# b$ U
# g& Z0 ~. C- r) m: x% d6 Z! }/ H      begin
5 j  D4 R+ \! I  U7 }2 i- a. z$ s1 u) w6 U! t/ B0 ?# }" c
      fsm_newspaper=1'b0;
+ Q1 `, c! y: B4 y) N+ W5 _* U0 I- V! r; |) r% H) s
         fsm_NEXT_STATE=s5;9 |/ A( {' x& T0 c
3 B9 o# U& G. O+ i
      end
/ |4 B+ r0 |! Q3 l, f
7 F. ~' w7 h  R+ L) r* u2 _    else
  R/ l* Z8 E# j% B, C2 m  v
9 ^9 a* m2 H+ q& m2 M    begin$ e' R/ P4 K" N

* x! L# }7 v1 ]4 g& R+ I         fsm_newspaper=1'b0;' p& G* l7 o' [! i* x% u  ~

8 }! v" t" M( _# v8 k: E         fsm_NEXT_STATE=s0;2 P+ D7 Z8 Z1 {; O; L
6 }9 n5 T& U! p4 s# X
     end
2 _) }% c: @7 F! v, g
0 Y7 J& G" w* [3 E8 T5 u3 o3 y/ M" vend4 n) r( h9 y; B

7 J* |( I& f* j, r3 Y7 A- ^2 v; W+ C: \8 O7 l( V& W% ^$ i

* T* V0 x+ N7 I( r+ |7 j0 |s5:  //状态为s53 R; G7 V& K4 E% V* M7 T1 _

% Y& F: B/ w5 U1 v" i2 U8 L  begin
1 f" k( {0 s  s7 U& q+ _; q+ ^
( _0 B; S  I* l/ I5 D     if(fsm_coin==2'b10)
6 O4 o3 o6 `# c4 h! L0 V" m; m  @; @! G! B
        fsm_newspaper=1'b0;
8 t  u6 \- M3 v3 S, r. _0 H9 L, Y: {5 I
         fsm_NEXT_STATE=s15;
( E0 N2 m! Z! E  m* g& O5 n& L7 ~4 A
      end
5 ^# p( K! |7 a1 m9 O/ M+ n! S
+ Q& Y+ O! @) F; Y3 L' ?( C    else if(fsm_coin==2'b01)" b/ b- d) y! s. E5 g" {

9 J. n+ a) ~$ ^' u6 x3 @9 D$ ]5 a    begin
/ ^: F9 Y+ K* a/ n, a+ I& O3 {, N4 e( \5 s7 {9 J9 ^
        fsm_newspaper=1'b0;/ r8 Z: ^) Q! B% `4 a4 c
9 a3 b$ b5 ~5 f/ i
         fsm_NEXT_STATE=s10;
0 I5 ]# p: S5 Q/ b- H: v" Z9 G2 E* I9 u+ ~- F4 w+ W- E# Q
      end
. H' {+ j- C6 J3 m0 x6 z  L# l' u   else
$ G+ j. B. _; r- ^5 R0 C: x9 S# V: @) v) ^$ N* x1 b) M
      begin- \$ z7 Z' ^' u) r) J
( |* L4 {1 a2 @5 J/ l; Q) u  t$ p
        fsm_newspaper=1'b0;
% n! o  F3 b9 ?5 O8 t
# H+ r; C" ]" Q% K* X6 X2 {         fsm_NEXT_STATE=s5;
. t/ w1 F9 p5 Q1 p9 s& }% D# N' L% m
   end
: S5 N% }/ u; C. @7 G+ S$ N  ^$ X' `4 w# w" w
end* z) R  ]) q2 l6 _) `/ g( B
0 A/ G& U( s* [# M$ m
s10: //状态为s106 @3 ^$ {: ?* U( V
! t& C7 }  J  k% n7 L
begin* i; t: M5 \' z. ?! X) c

- G( r# `# A; ?6 o5 U& {    if(fsm_coin==2'b10)
( h' J* ~: l8 D) s' E
" b$ `8 {" u) i    begin
0 P/ n6 K( v6 k9 s% ]
. H5 d1 O, p+ \' L1 `         fsm_newspaper=1'b0;
" W- W& ?: u* E4 H% q* s& e) k$ c7 |/ d
         fsm_NEXT_STATE=s15;
$ ~* H8 j0 |; |- C5 p- e7 e! E2 a- s2 P& k) o, Q
       end* j1 ^4 X- l0 [, b: q
2 S- Q, {! s/ w/ P5 t7 N
        else if (fsm_coin==2'b01)
, x! B7 N; t5 Z0 N. \- C7 @& ?( p; }& _2 Q+ _5 K6 L$ m
          begin
0 ~" m0 F/ c' ?* ~" Z
# _4 R3 a" q) b& t               fsm_newspaper=1'b0;
; P0 h4 m8 \, B: k( n( [
+ }; e* O. E* G7 D$ x                fsm_NEXT_STATE=s15;
: ]* D/ F9 q7 A
" h& P8 V( P3 V% K( ?# O             end
$ ^3 f' G# K) Z% c1 W/ A
* o2 V6 B1 a+ \        else8 K: j0 v: G( N* r# B4 q3 k

. U" h9 D; F4 m* p7 @4 B( R          begin6 j! g  s  R! Z2 l
& O0 ~# `: D$ t% g& }; j* w
               fsm_newspaper=1'b0;0 h8 P8 X  F4 j. z- Z

) n! D/ F0 s0 T& u: n/ I( u/ @                fsm_NEXT_STATE=s10;6 ~2 T+ _- t) G9 E4 C
3 j+ U6 D& @1 O- _
             end
; J5 w8 a5 Q0 F+ S9 d. f* f# I4 A7 G# |$ S& Y9 B+ z" a+ J9 M% H' C
end: R" A4 k+ v" Z8 P5 G# I: j
+ n/ i/ z0 L" j& X' e
s15:  // 状态为s153 B, v9 E" r, f' a5 p/ d% s% }
2 z, ]& W+ U. O2 \
  begin9 m* l. w9 O" w( t+ N% Y
8 ]& _7 W7 q2 J" v' c
        fsm_newspaper=1'b1;
, {$ r  L* E/ _! p+ N8 ?  t0 N3 k6 z' o: H* v$ o
         fsm_NEXT_STATE=s0;/ C* E, D" b0 u$ W& c
9 s6 `+ G: I$ ]2 B2 F9 S
      end
5 @6 ^* Q) L6 `3 X7 P" k% n7 w+ K5 C4 j( T
endcase
$ F( a+ L% s+ `, a( x
$ z% N' Y( q3 n2 L; c, i% nfsm={fsm_newspaper,fsm_NEXT_STATE};
7 E+ J  l/ J6 h  g" L# a& n0 V$ s5 w9 x- c9 b
end) _( }! V2 l- O& R9 I5 n3 ?: j) ?

+ R/ U, B5 J) x$ ]endfunction
9 s4 }6 p, o7 G. n# r
$ z; H- i# N- y0 E! D' C6 P1 P' v//每当硬币放入或当前状态改变时,组合逻辑动作- G  K. `& {4 c" }1 V$ i

4 w1 E) [2 N" k& l# u1 U' F, `% `assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);; ~% P' g( a, p2 y0 z* f

# C  J* ^$ e! b# P2 C  [0 F//用同步复位、时钟正跳变沿触发的状态触发器- m. G$ m- c* \/ m

5 x* H, o+ _4 u# W2 galways @(posedge clock)3 G4 h0 _" {7 }& p1 a9 W! o
) W  D- k7 o0 N- l/ _3 |6 e7 T
begin* L0 @6 h. X! Q- S: z
. Z$ B5 m9 @- {$ u) b
    if(reset==1'b1)
; e7 l9 o/ k6 v. M' I6 T, f9 p
1 F7 ]' d$ V% g      PRES_STATE<=S0;, Q. R& c5 n; G: @

4 V) [( X6 M0 L7 b+ ^& z8 F    else
& s) R# Y% ^# F; u6 J
! a. F% k, r5 X8 V% L, X       PRES_STATE<=NEXT_STATE;
- o' I! T2 \5 W* \: d: l& ]# S+ N1 q( w8 U$ Z% A+ D
  end# i( j/ \! k3 y) l! e( f1 u0 q

. _3 u7 K& E# z: |0 W$ J2 q" a3 {endmodule( \0 s' U2 V% m- \2 }
. R; M* L$ m( h9 P- [
5 @0 R3 k5 G! U( _- c" W6 X
1 K. N* k7 h" d; N# g
我的疑问在于这里:
: @$ ^# U' w+ d, d( b/ b, S+ Q. a& D( |. V4 l4 Y3 B
//每当硬币放入或当前状态改变时,组合逻辑动作4 d5 \! A' \3 l, B& D
, _$ A( f$ d4 w' s6 i
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);2 V! v) s$ x7 X: _: a

# v4 a7 y0 K. e! T" T, G5 ~* h) s9 a2 h# Y8 `
/ ?7 l7 R. a4 Z) u+ |9 H0 S6 m
就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?
6 T$ `8 J# p2 d3 n9 R: E/ M( G' B" n2 i2 @/ j8 e
请问是不是我理解错了什么,初手还望各位指教。。。
% S7 h/ [1 d! ?, Q3 H! xps:在别的论坛也发了,但是没人回,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, s5 J3 n/ |" K% n% i
cion输入一般来讲应该是同步信号,也就是说是在clock的上升沿跳变的,所以不存在你所担心的情况。

4 F7 h: B. e7 Z. H+ v. f9 X2 w这是整个题目的网址:http://andrew810810.blog.163.com ... 763992007895125290/9 ?7 Y  g$ ]9 r& S7 s
: O( [! A3 Q6 {0 L
.2  电路要求6 e: k( B% ^$ _6 m- S7 w- C
必须为该数字电路设置一些要求,如下所示:
1 z1 V& X8 S* Q% X& G.当投入硬币时,一个两位的信号coin【1:0】被传送到数字电路。该信号在全局clock信号的下一个下降沿取值,并且准确地保持—个时钟周期.1 ^  j/ N" l6 {( [7 f- c
.数字电路的输出是一位的。每次当投入的硬币总数为15分或者超过15分时.输出信号newspaper变为高电平,并且保持一个时钟周期.售卖机的门也被打开。
$ k! t7 `1 W* B6 e+ u
% O" B  x! f- w% ?8 [0 z1 ]% A# N% |: x.可以用一个reset信号复位有限状态机。假设为同步复位.: K: ]' ~+ E/ g8 x' `1 ^

4

主题

43

帖子

913

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
913
4#
发表于 2014-3-28 09:01 | 只看该作者
烂泥桑 发表于 2014-3-27 15:44" f, J8 X" Z; e& W) X) [
这是整个题目的网址:http://andrew810810.blog.163.com/blog/static/51763992007895125290/
1 I, n/ K) _$ W5 Y( h
- S4 H  r% f$ i3 R& D, e8 G.2  电 ...

/ Q& v3 X8 }# l: N  R/ J如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了,这样误导的人的书不看也罢!2 K8 Q; a) X" a/ C) I

3 B0 R* t+ J" [8 s( i7 y/ z多废话一句,通常在代码设计中,要尽量避免同时使用时钟的上下沿,这意味着你的电路是在倍频的时钟下工作的,如果时钟频率很高的话,可能会有timing的问题。如果非用不可的话,设计上要保证你的组合逻辑输出至少能保持一个时钟周期,否则可能有些结果时钟是采样不到的。

15

主题

130

帖子

578

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

: I1 S2 C1 A/ q8 K( i- M如果是有bug的题目设置,那实在有些出于意料,毕竟这本书不是很经典的吗,而且都到了第二版了。总之,感谢朋友你的回答。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-11-27 18:19 , Processed in 0.063159 second(s), 33 queries , Gzip On.

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

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

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