找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

15

主题

130

帖子

578

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

EDA365欢迎您!

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

x
各位,初来论坛。也不知道题目写的有没有问题,见谅。0 {/ n/ R, f2 M# I. e. x
本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:
3 x  ?, E# h8 q* e$ E6 g% ?- w3 c, P# E

5 _6 w5 |) x, Z) [1 A% o6 x- `2 J这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/
9 d! v2 w4 U* e* ^) P0 O: e$ }+ \' o2 s/ y! v

. P8 L, D8 t/ u& I! g1 X以下是一部分代码:
2 {( S; B; v# G* G% T) V( X& d- u
//用有限状态机的办法,设计报纸售卖机的投币器
$ j& h' a. m. ?' U% r
5 X. A# L5 O# D9 L. C" _7 ~module vend(coin,clock,reset,newspaper);
1 s0 t$ Q0 d& A; `; c9 Z
  n6 L3 N2 L; `" H# B2 Q//声明输入输出端口; {. G, G  j- T$ ?# A' |

% |" g  Q% M) d7 Linput [1:0] coin;/ [0 ^2 a" Z' L
8 i& J  g( j% ?- d3 W% {
input clock;7 R7 w0 r' W* t1 t& Q$ P) s
6 x/ u5 [8 ?& T/ _( e+ e2 V
input reset;- X) }$ ]% O9 g* ?6 S, M

" `: I' G5 C' {* H, Ioutput newspaper;, \6 D; t9 [* d4 v* i. N

7 h" d' T9 B6 }+ |+ |! }4 Xwire newspaper;
& s  V( _/ w- Z. y% g4 s8 x6 X8 q7 b" B
//声明有限状态机的内部状态7 [! v" Q, A6 [+ o

$ \; E7 X& b4 D. F: Iwire [1:0] NEXT_STATE;
6 e  E3 u- i0 Y$ l
7 c% C) S7 J" S! u. Z+ A9 [) J: wreg [1:0] PRES_STATE;
1 C; N3 [- B. x# ]4 L) W, _
2 V$ ]2 m) F8 _  C" v! X# y$ B//状态编码
4 c  c* j/ H" J" k+ g" ~/ {( D/ c4 G; e4 Z
parameter s0=2'b00;4 [$ r& q( o/ S* L7 z

/ ]9 B+ Z0 X# w* N8 ~( Y3 bparameter s5=2'b01;
4 ]' d0 S& A6 I; S. f( u4 }" }) ?( T4 v5 {' ?4 t# n
parameter s10=2'b10;
: ^7 b( n/ j4 s' x& U# ]
7 l9 W5 u$ b# s& yparameter s15=2'b11;
0 d  G" r: w8 r" j4 p0 T! j! H  g$ N; e: z4 W  b4 y7 D. A
//组合逻辑1 [$ m+ c! _0 _+ u# H
) \- a- q, B5 i7 a  k8 K: @* q
function [2:0] fsm;
: R0 Y5 d2 x+ l/ c; w3 ?/ E
! p0 N4 r+ J; [4 ~/ g1 Y7 f2 [1 Dinput [1:0] fsm_coin;
1 d- x4 ]( w' r/ C8 w; @1 A8 b) x! j$ o) I6 a
input [1:0] fsm_PRES_STATE;
; g+ \2 a( b$ S- ?; M& J, b6 g* H" P4 H3 u7 r
reg fsm_newspaper;5 e: c9 v# H: ]3 A7 o9 F
- `+ r# `  ~0 P% E
reg [1:0] fsm_NEXT_STATE;
9 a* W5 r) ?0 d; O/ d* x" @* N" T$ z" j
begin
  E. p  V! w: y# c5 \% k3 p# h' c+ [$ x2 p) z8 e% d
  case (fsm_PRES_STATE), U* Q4 v+ c) _2 ]" n9 X/ j6 e

% k% }, a% v( u  S0:  //状态为s0
2 N& Z; R4 ?( ^0 D( J$ @7 X& O; ~; x: C6 N3 L3 b
  begin
$ H$ y3 O7 f% m! i% _/ m8 f# V0 K. K& }9 i
    if(fsm_coin==2'b10)- h+ e0 w8 j6 Y1 n3 f

1 \( |! I. C' r! D+ E: O/ \0 |     begin4 l& b. l% X0 f. T

( y" l. d; n0 a+ `+ Z        fsm_newspaper=1'b0;/ J/ P# O( V* n# z. m. d% q9 T

. W5 y  J1 N' f5 ?7 C         fsm_NEXT_STATE=s10;8 m: }! ]# x: B: i1 U
8 g  G: r5 X9 u6 I, I
       end. E' D: H6 m) a9 o5 X7 u7 x9 ^! k! x

5 D6 [' M: m. \   else if (fsm_coin==2'b01)
7 C* O7 Q- n5 f
  O: o1 v" [3 ]6 x      begin
; b$ o5 @! L8 r6 Q5 v; o& |
9 `; l# o3 b! ~      fsm_newspaper=1'b0;. y- m) ~) `4 w3 a; j* V! j% [

  f$ y: Z# r4 t! Q# b( I( W/ M8 {         fsm_NEXT_STATE=s5;
, r1 p7 T* G. B7 k" H- D; i9 ?% U# K7 L0 ]8 L, y) k) f
      end8 e% ]! r8 @) @) N" x' [# Q2 C
& ]5 q& b( w# r) P, f
    else  ]+ _1 I* F" K( V3 d! n
0 [+ y! W/ v( ?; d' t
    begin
2 J) \" I3 N0 N8 @% ^# M* t. F3 ?/ b8 x1 o- q7 L0 `
         fsm_newspaper=1'b0;
5 k1 o7 {+ q0 [$ [+ n
5 c8 d! f2 M) S( u. d         fsm_NEXT_STATE=s0;# ?: [) K( Q: y8 I! K; J
; ^! V; I: M5 C; A( D* d; B7 M2 t5 a
     end( f1 H# h. J2 J/ a
5 c- k* B) m/ A. u  U  T2 p
end6 ?0 A3 L# o. g* W8 y9 A( k

, e) e7 `7 o9 ~( H) Z$ n% C, b& @, F# y& H0 t

# B7 g2 t/ b6 \1 q* Os5:  //状态为s54 S% I- S# e2 a

/ \$ s: ~7 E2 N  begin
9 X$ R) O) |, ~8 G2 @
( ]- \0 P8 W4 p     if(fsm_coin==2'b10)- ~* Z2 N# z$ C6 l; o( Q( d' q

, W  d; r1 m; p' t' h7 D( m" c$ }        fsm_newspaper=1'b0;
( I9 }8 z* Y6 s; F" _" J  f0 s$ x  ^8 j1 K# N5 G
         fsm_NEXT_STATE=s15;7 _" A% h0 y8 m4 C3 W  `4 _7 M
6 T, H" o' P! v6 ~9 a, A  U# \# U; r
      end
9 O! P, p( E# z7 n' S* c6 d3 r# y
8 z; x! e0 R/ {( A7 [. z+ ]$ D4 n    else if(fsm_coin==2'b01)
9 {! C2 l- K. E; |/ S9 j, x6 m! ]- x, G- I; a
    begin 6 y( K3 k( Z2 j6 |' f

# d( r+ ]& p% D1 s' _9 a" H, H, {        fsm_newspaper=1'b0;# F2 N! c+ Q- y1 A

& S2 W3 y5 O1 X$ o         fsm_NEXT_STATE=s10;( s" n. P  L) `; H; g

, [2 N6 w( s" R/ O0 g: I! f( A3 C      end
. A# }  Y$ P( ~5 A. \: O   else
  ?. N7 x8 i" V$ J" m2 t% Z% M% [) b6 C! e! _
      begin( Y$ U' I* ]% i; W8 c' U: p6 i* J6 r

1 M" J( n2 @4 `) D6 E) o9 O        fsm_newspaper=1'b0;
6 `+ ^: {& V* f2 V; n$ T4 D+ r
" u3 V% r4 I% f         fsm_NEXT_STATE=s5;3 V- T5 `/ a* b% y: d8 E
! A1 m- s8 `0 |$ S1 @+ r& n3 q' U
   end
5 V- |1 ?" O$ Z# J9 @* K, k4 @
( C& Y" a3 {2 z) I4 D. send
/ K1 }  }! l. c8 {* R8 o
5 O# D/ ^* X1 G, \' P% l; d: M( b4 Is10: //状态为s10
5 x- w) V2 q2 r6 r# V( f1 ]0 G" ~' Q2 ?2 N
begin) b/ U) N$ Q1 _# R
  n8 [+ a# _$ @6 ^0 _
    if(fsm_coin==2'b10)7 I9 i( O; j( \! w

8 Q8 w" f! H0 X  }" e9 m    begin1 j5 T) A0 T9 I# [2 ?3 P& B4 R: ~
7 `+ h, k0 ?7 r* S$ d
         fsm_newspaper=1'b0;
" t& C' `7 t: T
- f- {" H9 l( g/ X$ |9 x' }         fsm_NEXT_STATE=s15;
( {; T& \% s% f: \3 d- U! c' e$ l9 ]) `
       end! L: }6 y. S. G2 A, {0 f" I- b5 Z

% M8 j. d- z+ J6 X3 m9 h- `        else if (fsm_coin==2'b01)
4 |. B; ]/ V4 p3 n4 k$ X5 ~$ C
5 m3 `; P+ J- c0 a, N          begin
( v+ l7 K; e& _) K5 `+ O! Y9 v3 u0 L
               fsm_newspaper=1'b0;
/ w/ K/ g  G2 I$ W5 Y. O" E* E+ j! l3 G# \+ o- V7 a1 |
                fsm_NEXT_STATE=s15;
; k! i  `/ ]7 J0 M3 j1 U7 e& v0 ?1 L4 u, V4 K
             end% O' M/ }! V; x1 W, ~
) V; ]0 w% K& B: L" r1 g) H
        else
( V0 {7 ~: }% e4 _9 j6 l- s& R
3 c9 }2 s5 u% [1 @7 x4 v4 Z& H          begin% t7 y1 Z3 E4 R9 }% g
) m! B9 b6 w. P5 v. _& B. F% |: R
               fsm_newspaper=1'b0;
' p, R! |4 Q  h; Y$ _$ H/ o6 I: ?! I3 ]1 h( T" m. E1 V
                fsm_NEXT_STATE=s10;
# Y: v" w- w/ e( z! X' p$ s' A
; ?. e2 b# ]! j+ X0 K             end; ~+ U& u( N- k2 Y" r" N
1 Q" g; w5 P+ ~% K: Z3 N" u5 K
end. ^5 ]; @+ j/ W  b) u( l* r
$ |) p0 k! Q- P8 Y5 a/ Z: [
s15:  // 状态为s15
$ [7 L! K8 _$ V( M( L. \# _& b8 `2 l( a4 o6 j2 n
  begin
8 _+ V6 I8 ~: m4 G0 B. C& V- R
6 n0 T# I4 X+ d5 z( v! p        fsm_newspaper=1'b1;: H9 q; N: m4 N7 E
& w5 C7 O4 Z# ~
         fsm_NEXT_STATE=s0;
4 X" A$ u* O% x% J& `* y% ^' N2 q. w- }( V. B0 D7 b& P2 A! O; P
      end4 S$ X0 V" }# E# D' ]

3 ?8 z) @0 o) Y0 Hendcase/ h% C6 J: Y6 J1 u# b7 s0 U
5 T" L6 ?% O; A# ~# e
fsm={fsm_newspaper,fsm_NEXT_STATE};
3 X& z! Q0 p1 _7 q. g" y$ L/ S5 ?( w$ P: q' y
end
3 W7 J3 T) u6 }! u* X+ U3 x5 h9 q
0 \5 n% {8 N3 a6 |& L3 b# H9 Qendfunction) ?% C- H8 c) R& ?, O7 V
. o( M; w7 p  e7 X
//每当硬币放入或当前状态改变时,组合逻辑动作
6 O$ O, K# Y. r6 T% A" P& h0 S. p. G; |
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
% b+ y# w0 Y& X' S& f  h
- r/ J, o# a1 o" c, P9 r# Q//用同步复位、时钟正跳变沿触发的状态触发器
) @5 w, V0 ?4 D$ c! r
/ A$ L( q0 w% `5 k# u# nalways @(posedge clock), f5 Q8 K% U4 ^/ Y4 g! y, k# \

0 b" y6 m2 h+ u9 R) Mbegin
4 x, s5 L) C3 [
) c9 v# M- K5 u8 g6 j8 M$ H8 I    if(reset==1'b1)( Q5 R4 L; N( L
$ U+ ]) Z* K( @. p
      PRES_STATE<=S0;
8 J/ Y1 z5 D. Z: k8 U" h, b7 ?
    else3 R! _7 s- u; I1 Q
3 ?* \! V: O+ M/ K4 ?  C1 x& ]
       PRES_STATE<=NEXT_STATE;
! ?+ s' l7 l* c$ w1 T  |) A/ Z" l$ Z' v9 c% K3 N# `" W9 h6 ~
  end% |2 p+ D: h1 b. h% b# O. d. D1 o5 s

7 ?( Y" x# S0 g" Yendmodule! {% u+ v$ M4 Z/ Z; R2 q* h( W

' v# b6 x# b! c' M; i5 t: [5 K5 ~( @) _

7 t! G' ~3 ^+ A6 h我的疑问在于这里:
2 L- I  |6 U% U0 y/ @: @* Y, m  Z+ M
//每当硬币放入或当前状态改变时,组合逻辑动作* E, ?) ]" j8 y2 ~6 l

- V8 [, f' `" e$ Q2 v- g- F4 I8 N) Bassign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);' T6 t+ \5 s  N0 {5 h
! U4 ^! ~- m2 T. d! P2 \/ u
+ n# t( j: C, v* n# q! X" f

. j9 n( N8 ?5 O就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?
2 `! O$ {0 W: S8 B- n* |
3 F4 y% z3 G  i. E- g请问是不是我理解错了什么,初手还望各位指教。。。
' ~! @  c( I( i0 tps:在别的论坛也发了,但是没人回,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- Y7 W# E. Z; r. B* r6 e5 j8 X. _
cion输入一般来讲应该是同步信号,也就是说是在clock的上升沿跳变的,所以不存在你所担心的情况。
  P, A# N2 J) z3 |
这是整个题目的网址:http://andrew810810.blog.163.com ... 763992007895125290/& k. h( A( ~0 m2 K8 ~
' v; n& g. c; f" u' i4 \
.2  电路要求
9 ?' {/ Z% m& l5 c) E0 L必须为该数字电路设置一些要求,如下所示:
5 l/ D& `- J% C9 f9 a.当投入硬币时,一个两位的信号coin【1:0】被传送到数字电路。该信号在全局clock信号的下一个下降沿取值,并且准确地保持—个时钟周期.. V. H) t4 z: b6 K7 D* G9 U
.数字电路的输出是一位的。每次当投入的硬币总数为15分或者超过15分时.输出信号newspaper变为高电平,并且保持一个时钟周期.售卖机的门也被打开。
2 i& G7 H4 k. O& |) D
% t/ x% B0 }. N, N7 X0 b) E2 V+ u.可以用一个reset信号复位有限状态机。假设为同步复位.2 j5 [- |, Z8 e9 d$ g

4

主题

43

帖子

913

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
913
4#
发表于 2014-3-28 09:01 | 只看该作者
烂泥桑 发表于 2014-3-27 15:446 U9 p' g! G! v; `0 t
这是整个题目的网址:http://andrew810810.blog.163.com/blog/static/51763992007895125290/1 L+ J+ L9 |- f) R  v0 [9 B
0 {1 w8 n# @. K7 R% ]
.2  电 ...
7 l* Q, O$ t- Z- [+ c
如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了,这样误导的人的书不看也罢!
$ K5 s; `$ K/ f) C6 K8 {3 B: _) A6 w) v
多废话一句,通常在代码设计中,要尽量避免同时使用时钟的上下沿,这意味着你的电路是在倍频的时钟下工作的,如果时钟频率很高的话,可能会有timing的问题。如果非用不可的话,设计上要保证你的组合逻辑输出至少能保持一个时钟周期,否则可能有些结果时钟是采样不到的。

15

主题

130

帖子

578

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
578
5#
 楼主| 发表于 2014-3-28 11:52 | 只看该作者
lvsy 发表于 2014-3-28 09:01" r2 D6 h4 g1 o9 v$ Z
如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了 ...

) Z7 }6 q0 e& Z9 i; U0 g如果是有bug的题目设置,那实在有些出于意料,毕竟这本书不是很经典的吗,而且都到了第二版了。总之,感谢朋友你的回答。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

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

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

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

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