找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

15

主题

130

帖子

578

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

EDA365欢迎您!

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

x
各位,初来论坛。也不知道题目写的有没有问题,见谅。
' d9 \  J$ a( P( r  A- g4 w5 m本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:9 |/ h: A6 w! ?6 O4 u

: T) N1 K4 S" ]% _
- c% I( V' `& }1 Z1 c这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/
! G  p. f  K, I4 s& `; l2 H: s* ~. _' u

5 ?9 j& F1 M& u" m( \以下是一部分代码:3 z( ~# k9 q2 E& d9 s) W6 a! V

% X+ {2 N% g" w* Q//用有限状态机的办法,设计报纸售卖机的投币器
9 ]6 c1 X* J- d* l! ?$ s/ J9 e. x4 a3 R9 F( s2 y
module vend(coin,clock,reset,newspaper);
6 M3 o8 N# y/ C9 Y4 y9 r1 R! H7 d7 D3 o: }: U
//声明输入输出端口5 G, w: b( X$ T1 ^2 l0 U1 a/ g% T9 m7 K8 _
) V% ]( F9 S6 e3 c4 q  h2 W: E
input [1:0] coin;- b2 B" r% P1 D! k

0 q6 n3 o' H5 T3 r5 r1 zinput clock;
" L9 g6 h8 ?" N. r1 y, Y
. I5 M. F5 r6 n& \5 o% i) ginput reset;
) ]5 H/ t2 ~4 T% X
& C3 i; X, N+ i/ f$ B& |; b- Q$ p. xoutput newspaper;) m6 z! c. ]9 Q; r+ E" z# W

$ N6 Z+ k' }$ ^* N- b' xwire newspaper;2 C3 Y, T3 T' G5 b

  I$ h, A& a& w" K) F//声明有限状态机的内部状态
/ n3 k. c: ?$ q9 j
+ V2 n- r6 Z% y3 I  c) d4 B% ^wire [1:0] NEXT_STATE;
. d6 @  z- g, e
1 n- O& e0 B9 {* B6 z; @/ zreg [1:0] PRES_STATE;; t" D* ^; s( D! e% z/ R
$ q( |" a5 ^. C
//状态编码
: I7 @" U& e2 m/ B
4 Z; r$ i" H: t: L( L8 fparameter s0=2'b00;
' ?9 Z0 y9 ~$ n3 J+ [; o9 H* ^( \  G) U
parameter s5=2'b01;) j9 t+ n. h' Y8 z
" x  r7 \( e8 B) h' g
parameter s10=2'b10;$ A( [1 t5 @9 r+ N8 V

; D) l/ E( L5 [3 e% ^parameter s15=2'b11;% G$ ]8 W- k+ j. g. ~1 A) r
, C" o  O6 R( A. R0 n3 |* x. D' q
//组合逻辑
6 K! _5 S/ G  O; U# o6 Q* f
% [- K9 B( `3 K$ d9 s% w; d6 Z& {function [2:0] fsm;; J2 p  a6 U* Z1 }' f

, ^1 f3 y" v% X6 _; J3 I% B; ]input [1:0] fsm_coin;
& X# D8 W% C; Z
9 ^5 d; j1 c/ Y1 d: Y6 iinput [1:0] fsm_PRES_STATE;
8 o3 R9 w5 H6 r) u' S2 ~# @& ~6 m7 q( h: i" D1 T" Q
reg fsm_newspaper;. Q7 O' u% u% C1 x, n: [

  H( p, j% w, p9 @reg [1:0] fsm_NEXT_STATE;6 ?2 ?7 ~8 ~3 r* }# A
9 U/ `3 w6 C& C9 v  I( y
begin+ K- a; e0 n2 [& y
) Q* n- J# p* a9 c3 h0 q8 l) T: ~$ r
  case (fsm_PRES_STATE)8 H" \- ~% S; @6 }+ i" A5 g( |) A
8 r+ _9 O  E" M3 j: z
  S0:  //状态为s0# m+ G- K5 ^/ C$ t+ C9 d

/ O/ g. {3 q8 o  p1 u5 x; r; C  begin! F2 v: e0 ~5 a

% d/ |; E6 Z; f( }6 l0 v. Q    if(fsm_coin==2'b10)
- p  u0 f: Y6 ^7 r; u( @$ T* i$ [( k1 J5 I! X- @' ]4 Z0 Q
     begin) [, Y; [" J* V! c3 Y
" E8 H* A# ]+ @  u% k8 b$ A
        fsm_newspaper=1'b0;2 U) S1 \6 B" r2 k

4 L- R6 T/ E$ E, }) _  A         fsm_NEXT_STATE=s10;
! ^8 D; s5 n, e: U' C4 G
+ b& B: ?" U( ^& ?       end
7 G& \3 v! b! m+ y+ E; c
) F% B( l- k/ i7 a' A- `! C   else if (fsm_coin==2'b01)
( @7 H2 _* h, `. [( O
5 b; x" e: i9 f+ U$ ^3 {      begin. Y+ r6 O7 p0 S0 E2 q
4 X; h; c2 P+ S# r$ J1 u
      fsm_newspaper=1'b0;
8 {5 s' i3 V9 S* V' i6 s
. B- Y7 b( Z& q; V( i         fsm_NEXT_STATE=s5;
& H  r; B' k! ~8 J3 ^" ?, @7 s' i0 w7 V# j. @
      end
) l3 U" G9 h5 Q" k. s& L4 ~- T) q' Z. L9 w1 s; @* A
    else
: N8 k: e6 t& E+ ^9 F0 Q0 B# j- M6 Q; S2 @4 [0 V8 S! p; Y
    begin
2 x  m" @* x+ J5 G5 ~8 r+ }4 F* h$ z( m9 f/ C2 `. `& x1 `
         fsm_newspaper=1'b0;
6 x, |5 I) N% Q. G- [& @8 Q- o' Q' K2 E  G/ }) M' N. ~2 B
         fsm_NEXT_STATE=s0;' P1 U( `0 ^  r
# w5 ]+ l5 y& T5 @
     end$ v7 T, H; ?4 d1 w7 k' ]
8 t) A% q+ @- G) o
end
& m* i' U! p/ ^3 P% F  m" ^, R
  P$ @) y  b1 V, t$ S) {' D1 ~0 y% C5 Q/ v

+ c  s/ a* ]# [s5:  //状态为s58 d2 ^) W6 `% J' K) z" Q

' M! `2 b) {/ k" A5 Y6 e6 {  begin
* J8 ~7 r5 |% f2 t8 t& I# `& |: g) w! l. n: {! @) _
     if(fsm_coin==2'b10)
! I7 m6 T/ A  `" d& Y+ a: P2 g
' g2 {9 F* i7 s" J        fsm_newspaper=1'b0;/ `# _7 d$ z" H3 R

! r6 _7 @  z" H         fsm_NEXT_STATE=s15;
. k! k  ^4 Z1 i6 j; O, I: \) M, `# \0 d3 w; @! \  ]1 j; d
      end
: B* y8 Q$ u- \5 d3 L* E! o/ `. U+ U
    else if(fsm_coin==2'b01)
4 F/ Y' o/ @+ S. [. ]% m& E. h6 m; n+ `7 h: I
    begin % j+ G3 u; \0 P; I) _  ^- @( G

) n& H- o- I+ W        fsm_newspaper=1'b0;
( p  T# r3 T$ j7 g1 Y4 }9 l2 }* p( s' b0 ]0 \0 k" J) ?9 a( [
         fsm_NEXT_STATE=s10;% V: Y5 D  a" F) }/ ^

1 E6 w* R7 ~; D& j) X' |# C% X      end% O7 `. T3 ?$ @
   else; t5 v, n9 t2 o/ U
7 D! v& e( O0 [# G( _8 j
      begin
4 Z4 M! B: I) B6 V4 U# v" B! s* C2 I
        fsm_newspaper=1'b0;
' R0 _2 T$ B: c/ O8 q  d7 L/ \  K5 h/ a7 ~% V
         fsm_NEXT_STATE=s5;+ a1 S$ ^1 I: \8 u( P( Z
* ^/ v  q& M- Q
   end0 L7 {  r" v4 o" V4 E
4 Z* g6 C: m# R0 {4 e2 \$ f
end
$ S# k8 y3 m# ]& e- {& e# E
$ a4 O  Z0 E) b% x, x! l- ds10: //状态为s101 O5 X6 G4 U6 G: A% I/ Y0 M7 ~
6 t% i0 o7 {( f2 }# g9 p7 R8 a
begin, W" o7 k/ _" |" T

7 ?1 A$ P# O0 K/ K$ C5 u    if(fsm_coin==2'b10)- e# m; B2 B! O7 M" y* A5 e

9 I0 P2 v! @( P5 A    begin9 f9 ^! ?# P0 u4 F! U& Z* Q
+ b; E7 n5 K1 y/ o# N1 t6 b( E  C- B
         fsm_newspaper=1'b0;
& u# _7 H5 |1 `0 P2 l# ]6 a4 K4 ]$ I3 ?# l! M$ b
         fsm_NEXT_STATE=s15;2 x# N! _' F; T0 I, g" A

% B: m7 u; ^. A0 I       end
+ S3 i: G; C7 `3 f, w- d; [4 k1 a0 y
        else if (fsm_coin==2'b01)
1 D& q. V, @, U. K5 X
6 Q' t: r8 H! p          begin, s1 s+ n5 |/ q0 |

# [( h& r4 d2 g& U  G! E" `               fsm_newspaper=1'b0;
% g5 X. x; k5 P; D  ?3 {- S
+ U9 @: z, l1 ?$ k                fsm_NEXT_STATE=s15;
. D* I) B& L% s4 w
6 A3 ?$ R0 V6 t             end4 ?: y  g  H5 m# w. E5 w

- l# \  Y; U1 L# g! f        else
- N3 o" N7 G: v* V3 O* [2 B
2 B0 t4 i; l% K6 y7 z          begin
! R* }, f9 w8 r/ }6 |1 }6 a+ F4 i8 s1 G/ y, W' B
               fsm_newspaper=1'b0;  x) G9 `. E3 z

* ^7 C! v+ W! _7 A3 S                fsm_NEXT_STATE=s10;0 E6 u  K; y  ~) e) O6 Y2 _

) r& v2 q+ j) Q* E             end- N8 D, ^5 A; r3 g+ Z: E- R* ?

, X4 `. P1 H; O: m5 @7 \# |end
& \, }, F! A" l9 q9 M5 r/ N
/ P' v: w& p; [s15:  // 状态为s15
! Q+ S& t  H; U0 q* I5 h2 G
  ~& n) K4 G; R( G  begin
, K# W) k- h1 Q2 t  c3 ?$ \( \; {) [. m, G8 ^3 H+ w
        fsm_newspaper=1'b1;
# T( {& h, d8 ?1 C  ]* M9 _' @) Z2 ~( _, [  X; y
         fsm_NEXT_STATE=s0;  l  U1 ^. Q, V) b& N" A+ `
7 }- C1 H# F4 p+ {
      end
" c" r1 U) n+ s8 ~% K$ X" u  \: ^9 N
7 v8 Z8 a/ q+ h  [+ K& M7 E1 {+ G$ yendcase
* m0 D. H$ N! Q9 [( s' u2 |6 `/ ^5 {! }: A: r( @
fsm={fsm_newspaper,fsm_NEXT_STATE};
6 q0 z, v6 _  ]# G: s& |9 a
* a9 ]; Z5 ?5 A7 M& T5 xend+ |/ N; f- T5 i3 g1 p
) }: f+ v9 I- ?, ^) t& n
endfunction7 f, c7 T+ N- V3 c5 B/ I2 F

2 a, g1 q, O5 b: l0 ?! ?//每当硬币放入或当前状态改变时,组合逻辑动作
7 I/ L1 E7 O& L5 [, D/ k3 i$ m8 `. o. {3 d; x
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
1 Q9 {" J1 }6 v1 N9 A
8 Z9 \1 X) J4 n% D//用同步复位、时钟正跳变沿触发的状态触发器
0 O: Z$ o! c/ Q- R
1 g, K! m! X* Q) ]always @(posedge clock)) k/ Z3 Z0 M+ D' n( q& [6 W% U
: J: Q% G: z1 q' K
begin$ ~# d/ G  W! W6 T% b" n: W
' l" w+ g5 X4 t" P
    if(reset==1'b1)) i" o" a2 B- q3 S0 W: I" M" F
# D; k3 a. a! Q3 H# {& I
      PRES_STATE<=S0;& G( q6 B$ P/ ]1 V2 U
! ~; X: `& J% T5 y9 \
    else
& p0 A$ B4 E; C/ l* n' F& ^5 s) y* F
       PRES_STATE<=NEXT_STATE;
; G/ Z4 F- e8 }6 v+ s, N) u4 F* j# \9 e. j4 ?
  end- @- y' }; M+ u7 H) Q

. D$ a1 K- J) X; F) Hendmodule
1 ^- }" t# ?( a. m
+ h& \8 R' o) C# l/ N
/ y9 r+ g% }, I+ c' o
0 W" }' e) g( M) ~7 @, X4 L我的疑问在于这里:) Q! m0 R$ I7 m" I; X. U# i+ J6 A
2 i" v8 U8 b; l. N8 C7 x- e0 h
//每当硬币放入或当前状态改变时,组合逻辑动作) |$ z, K! o/ i( g! ]

. y! s. h; L4 ?7 n+ Rassign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
: h" \) q# _/ A' m  C' k9 ?3 A, `' H- v, K# N( m
' Q0 \5 j1 `' h5 t; Y2 ]

4 f  s: v' a# Q# Q就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?
4 z5 ]  g' s+ s) h) y/ I2 }# u" p. ^* l
请问是不是我理解错了什么,初手还望各位指教。。。* e, D. u; v$ I9 v3 A
ps:在别的论坛也发了,但是没人回,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! U( v! G/ ^/ b( _2 k* u2 U' r8 ?
cion输入一般来讲应该是同步信号,也就是说是在clock的上升沿跳变的,所以不存在你所担心的情况。

; S( r9 j, Y9 B# h: j这是整个题目的网址:http://andrew810810.blog.163.com ... 763992007895125290/
) |+ f5 L) x, @) f: J3 j* F8 D1 B: c! s9 m2 b3 H5 t
.2  电路要求
5 l1 e$ X6 K1 ^% E必须为该数字电路设置一些要求,如下所示:6 ], Y% i( B; ]3 y
.当投入硬币时,一个两位的信号coin【1:0】被传送到数字电路。该信号在全局clock信号的下一个下降沿取值,并且准确地保持—个时钟周期./ B; w, i8 d9 S: t+ @6 L) B
.数字电路的输出是一位的。每次当投入的硬币总数为15分或者超过15分时.输出信号newspaper变为高电平,并且保持一个时钟周期.售卖机的门也被打开。
5 Z0 b. b+ ?0 w7 B( w1 i7 e" G
' q1 ]9 g( u9 U8 t.可以用一个reset信号复位有限状态机。假设为同步复位.# @1 Z) n) n) `/ @. o& z

4

主题

43

帖子

913

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
913
4#
发表于 2014-3-28 09:01 | 只看该作者
烂泥桑 发表于 2014-3-27 15:44
/ }3 V& `& ~7 G0 ^5 _; l" K这是整个题目的网址:http://andrew810810.blog.163.com/blog/static/51763992007895125290/
& j' v# S- f" e- Y
( Q# p! [4 k3 X7 J.2  电 ...
" o# U: v: w$ x. I7 e3 S' [1 V  g
如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了,这样误导的人的书不看也罢!
$ G$ ]+ o/ Z( a$ g9 }& N2 |" u& r8 n
多废话一句,通常在代码设计中,要尽量避免同时使用时钟的上下沿,这意味着你的电路是在倍频的时钟下工作的,如果时钟频率很高的话,可能会有timing的问题。如果非用不可的话,设计上要保证你的组合逻辑输出至少能保持一个时钟周期,否则可能有些结果时钟是采样不到的。

15

主题

130

帖子

578

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
578
5#
 楼主| 发表于 2014-3-28 11:52 | 只看该作者
lvsy 发表于 2014-3-28 09:01: t! W: M+ a8 g1 u: z  N4 b* `
如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了 ...
# f- k! u; u% e/ X
如果是有bug的题目设置,那实在有些出于意料,毕竟这本书不是很经典的吗,而且都到了第二版了。总之,感谢朋友你的回答。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-11-24 02:11 , Processed in 0.059362 second(s), 32 queries , Gzip On.

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

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

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