找回密码
 注册
关于网站域名变更的通知
查看: 1207|回复: 4
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
各位,初来论坛。也不知道题目写的有没有问题,见谅。
1 b4 h! L4 @7 ~( Q( K7 }+ z8 G本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:
" ^7 z% [- X4 w6 x+ t* y5 ]
3 x0 z, B3 J1 b/ f. P4 |6 |  K8 R9 [- ~! y
这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/6 u  c. D0 r: {, ]1 u  L+ R

- V& |6 J  ~- L+ w% v+ `6 r" P
以下是一部分代码:
( J. y2 e- C3 d. p( C8 e/ |8 G. A  l* w! ~/ C
//用有限状态机的办法,设计报纸售卖机的投币器  h0 w* J: R& F1 z: [
3 t, C9 _5 P3 V3 |
module vend(coin,clock,reset,newspaper);
2 m. u6 @) y9 P# x2 ~
$ F6 n5 L2 ?/ d//声明输入输出端口
8 K, S- ]6 J0 l7 e4 ^% W8 ^/ ^- ?( T6 g9 r
input [1:0] coin;1 c+ K5 z- j' P

( g( ~/ H4 X1 r  N6 K( K1 Einput clock;
6 D5 ?/ `! z' |7 g) O* c! ^( i' R3 t; `( m5 ~' ^
input reset;
, V2 D& b/ q! |- V$ S3 y
' x  c. ?" a" voutput newspaper;
0 M2 R1 K7 @& r. v: {: F. G4 n3 l- [& l6 }
wire newspaper;1 I- @' t: e: G* m$ `
; _: m9 D: U8 R; W9 e
//声明有限状态机的内部状态1 _% b  ?6 A- }' b

0 M+ K6 d, j1 gwire [1:0] NEXT_STATE;
8 h! f4 I1 }; F% V4 @2 v$ u
# q' |( r" l8 O3 I, L" ?, Dreg [1:0] PRES_STATE;# G3 m- ^$ p$ V3 L& A% C! s5 n, |, G

& s" d& Q" U/ q9 L, v; H. h: T! T//状态编码* n4 o5 f3 b; k  L1 K- J$ Y+ \
4 a+ D- K6 g( Y
parameter s0=2'b00;8 y0 y+ n+ b2 s+ t$ t: k

! a' ^1 M9 _# v1 [2 v+ Lparameter s5=2'b01;
; ?6 X" B" V" k$ }/ S1 m
# C% s* s1 ~, R0 ^. tparameter s10=2'b10;
! v' C. O! z7 C; g5 A$ y9 p: u1 J* f+ i
parameter s15=2'b11;
5 n( ~5 t2 B- l# g6 l
8 `7 |- A0 H  J3 z7 \7 G' K//组合逻辑
. {% p. J& i: Q: }8 f, r' K0 ?- h' i9 ]  s0 g/ H9 e1 b+ y0 F# X
function [2:0] fsm;
+ O$ ?. y! Y! _3 D% ?/ B3 u; L5 X$ [" S/ v
input [1:0] fsm_coin;, d6 w: `  O1 ~2 w+ C$ J

+ W! d# ~9 n5 L2 @; Iinput [1:0] fsm_PRES_STATE;
0 g- ]* v  }2 @+ Z2 R4 J/ e( c
' f( n1 Q1 ^0 E, g3 Z" v7 ]reg fsm_newspaper;
/ h6 L/ K$ b9 W2 l$ C$ R
% _+ y6 K- H$ ~reg [1:0] fsm_NEXT_STATE;1 w1 S: p" O! N! P; ~# |9 W

; L. z" m8 M/ ?& |6 Obegin
' Z6 K) z5 _: `' E6 s' o; ?7 _$ P* _  t1 y  D2 A
  case (fsm_PRES_STATE), c$ `: J# v" L# b+ b

, U( E  n3 k6 W6 f# R  S0:  //状态为s07 d* T/ q$ U9 n( `' s# |

( ^' b7 M, e3 D4 y/ a& ?" e9 w  begin* S% Y5 N2 w# X, }' C

8 r; o  L) J2 m6 B; x8 ]    if(fsm_coin==2'b10)
- e: U+ `- X& Y2 n/ f. G+ }; U( p# l, E, E
     begin
% ]5 X5 z$ l6 W% O3 @* F- z0 h3 n! x$ M" I
        fsm_newspaper=1'b0;
, U$ q. r% y% u% a. U: h8 A7 S4 d/ E, M
         fsm_NEXT_STATE=s10;
/ e" m5 z0 q& q1 s
0 C! L  v! ]9 Z/ }; L8 l* t       end
! G' m4 E7 {) B% V6 o  B  d- ?8 \0 H- K( Y, U8 c' x9 J: F1 Q
   else if (fsm_coin==2'b01)
, W4 j* X* a# i& q2 P8 p# {- m
+ z" a, z- B  i- g& I' [      begin
+ m" @$ _5 L' @& E0 h- @- k" d- |0 [) @& W4 F) O2 l' L/ W; I
      fsm_newspaper=1'b0;0 T" n2 y8 l+ B$ ^0 ]

; P2 x2 q' d* v4 m0 C, m0 u$ M/ M         fsm_NEXT_STATE=s5;
4 T, B! {8 {  v$ n' g! _+ C
/ r# `8 x  Z5 U8 K+ [+ h( I* L      end8 @3 M% \& }- @2 S0 ?5 {; ~

% h7 l2 [1 X; Y" ]% ^& |    else6 B# {6 [; ~% n: z4 w

" n" j8 r  m( v" h, C+ V    begin0 e$ D- {, Z! |, G6 m$ V
4 ?0 N$ N* l! D8 U" t
         fsm_newspaper=1'b0;
3 ]) b% Z/ a0 {9 S7 g6 K
3 D! x* p- W. m0 R4 K* E  h8 ]         fsm_NEXT_STATE=s0;. V4 C  U3 v  Z

- h" \* o7 w2 ^/ `+ ^  v     end
$ c- v- {9 j9 \& P8 @) e
" }% M/ j- h" ]; \end1 K' t7 B7 ]2 L2 u

% e  Q+ U+ \9 j, A) C
* k) T, o5 {: X+ L0 e1 T6 |* K6 l1 q
s5:  //状态为s5
5 K. B4 j! U: c6 F2 T0 z3 R( ?
1 h9 j* b( r/ W( g, X9 _  begin0 R6 K; Z1 G) V/ M4 f$ n3 B1 D
6 K  G( J. y# p! o8 V8 o5 q  s: F
     if(fsm_coin==2'b10)
' h& O' M- h3 D  p, F. Y5 p; `1 M" I- e& w' P% t" s: @5 ~
        fsm_newspaper=1'b0;, ]8 s: R( d; z7 E% S

. x, R! }7 l0 x0 V8 S         fsm_NEXT_STATE=s15;
+ o' \4 s/ h/ _/ O' S, l+ m) p
7 Q( L2 ~6 W- E2 q: Z. N9 d      end1 i$ B$ i/ J! z% o9 e

5 ]( \6 U! D% |4 ^    else if(fsm_coin==2'b01): C- [% h. }; A4 S$ A# ?+ l: V5 G

. i* v+ Q& _( `' ~, ]+ L, n    begin * Y' j$ v$ I' d1 C3 I- z' k- x1 G4 c
- p8 Y. ?; @6 r& T& j2 o
        fsm_newspaper=1'b0;8 I' ^% H6 r( s- @% O

7 i# F: ]8 T9 o% o4 c2 s# O         fsm_NEXT_STATE=s10;
5 k6 @/ X4 q) `: G
+ d. q& F% a  T8 N      end+ e+ d6 L( }8 ?9 K; S2 Z
   else
  b. S9 }3 s1 a+ \9 H+ {
# a7 m+ \1 q1 S, F      begin
9 h, [" B. w3 W" J
: K9 B& h' k7 m7 N        fsm_newspaper=1'b0;
4 `9 u: g% Q) K- L
' R' h/ a( y2 Y         fsm_NEXT_STATE=s5;2 |  P; W* V2 y; r$ _

% D0 c& Q0 V+ l   end1 n' h) f8 H: H+ N# b9 `
) u' ^  y+ t5 J) ?2 j
end; n- d0 H* J6 K0 Y

- v+ ?3 D) w. E$ P& r& B. B8 Ls10: //状态为s10
$ y8 U3 d6 m: x, q$ S( C$ g
9 d& P. G, g' Z/ {0 Z) hbegin1 _# ~. w' R$ A, Y; l6 U# ^) E

' P8 h$ Y7 u9 B" }9 E& y! K    if(fsm_coin==2'b10)! W3 G' m3 A: @9 y' F, E9 x- P

/ w$ c4 G: S' O  _7 c6 v    begin' U& t. M# {7 m0 ?5 J5 L
) M+ M( h+ I6 ]; y/ F% P) A7 d- w
         fsm_newspaper=1'b0;
0 \/ @. d" _& J# W0 W. D  x/ b9 F) V/ S" n3 m5 v
         fsm_NEXT_STATE=s15;2 v3 Z' y, H. i8 [

' l) {% {* J$ C       end
+ h( b0 B6 l2 \* \: ~2 M% I
  F( S5 N! ~4 o) s        else if (fsm_coin==2'b01)$ f3 t3 t+ W6 P

4 \: U3 \2 Y* f" ^          begin
: I* v' t: Q: T9 f. y) N% ]7 i7 E9 p, [
               fsm_newspaper=1'b0;! M" }0 x; x( C5 w

; Z; O6 K6 H6 Q7 t$ x6 ^# o6 b                fsm_NEXT_STATE=s15;
7 e) _; r+ u! P+ I
% [8 K* A/ C+ M# g2 @             end7 m. z9 C% Q! S0 p+ w- T) w
. c' K, m' S2 _+ y  {
        else
4 u( o* H- C, u1 m6 G0 p+ L& E3 S- z8 B/ A; u
          begin
: Z0 \5 E6 e& l
6 J' M* k! G/ Q* V6 F7 _: k               fsm_newspaper=1'b0;- s( |, V* m' ]2 ~- g9 _; r/ F0 l

- f& Z& q" {& e  ~! \- o                fsm_NEXT_STATE=s10;
) M& H+ M5 R7 n& d; \
& g* y% s1 W, }" m- u             end
+ ?1 X0 y0 }9 d" ]& ?
$ e& c5 j! l! @# \end; T8 u( G2 q. J' m' U9 k

9 o# L* B4 v2 B, x/ Z# Us15:  // 状态为s15
; A3 Q/ [8 Y0 V( D
1 C2 d8 m% k+ G8 {/ f; N* I  begin
2 B0 x* q" _4 K: o. _
0 ?6 @+ p  @" }        fsm_newspaper=1'b1;
6 a* }; |$ Z, D) L( W9 g" {9 r9 M3 H* Y  M8 M0 f5 A+ B  J
         fsm_NEXT_STATE=s0;; b5 w! e# M/ A# ?. |* i6 H% |

; \5 X# |# r) N3 _* `2 o      end* o& F+ q, |) o/ j% X7 I( Z
, {& r1 E% W2 O8 Y) i
endcase
( p# W) _7 f% J* Q# {1 q2 ^1 G9 _5 Z& [6 ^2 D& f- B0 ]
fsm={fsm_newspaper,fsm_NEXT_STATE};' G) f8 W! X' e
! c7 ?/ q/ u& g/ }+ L3 O/ t
end4 z: x/ E# N# q: }1 z3 ?" `
" I7 G8 u* B5 t. A
endfunction- f8 P( k# J. N+ a4 x4 f

' v- t$ R8 Y5 l, |2 G//每当硬币放入或当前状态改变时,组合逻辑动作
. Y" a' c! V$ q  B7 M
, _3 V. H; L9 N- P9 [assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
7 o" s# C  h  Y' F! d
" T/ G; a: B8 |, v3 d//用同步复位、时钟正跳变沿触发的状态触发器
  A/ `& }$ |) R
# _" P; e  S  o" S/ A' Qalways @(posedge clock)" g4 ~8 g% b8 K/ v0 I

" h6 r: w0 S' M1 l+ @begin
6 V9 i- [1 E, T8 e# D) @( _+ e+ W" B
' m8 j# |2 U7 J9 T" }7 v& z5 J( {+ i    if(reset==1'b1)9 \3 J/ l9 i2 e

4 Y, B% m0 o9 j8 y      PRES_STATE<=S0;
) K' G, R1 D3 V- [3 b9 J' D6 V$ q: u( I
% O+ T9 X. f* t: {2 A    else
8 M7 |) `7 P+ Z6 j3 Y) l  j1 r
$ ]4 I- a, |6 S       PRES_STATE<=NEXT_STATE;- E9 B1 T6 {0 w% H+ Z

/ C4 r5 R1 w2 ?  end
. }& V9 l3 H1 [# t' P, h1 N* u; Q0 F* w
endmodule0 T" _8 q! R0 P/ b
- f. g3 G8 j& d) |( }# B1 C

3 m+ |9 b' n8 |& {9 r- K, b- W
  A8 K3 K" I+ D0 M我的疑问在于这里:3 E' q$ v# B. c( d8 Y# ^/ L
* v0 g, ^: m. _6 z+ J
//每当硬币放入或当前状态改变时,组合逻辑动作7 Z  G* G: t4 I6 k% v1 l
+ k' n- X7 k3 j; [% @1 w6 f
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);# M6 b- b; Q# r) g
# Z$ \8 H3 Z( z1 h, E: L8 K! ~
+ S  a' E$ f0 F% G! `
% ?/ r5 p' b9 K6 f4 n7 y# n
就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?
6 [0 K) o% E$ r- f  R1 s
; l: M! E: P9 l9 j6 M5 z  ?请问是不是我理解错了什么,初手还望各位指教。。。
% z2 Y  s) f) Tps:在别的论坛也发了,但是没人回,EDA365要给力啊。。。。

该用户从未签到

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

该用户从未签到

3#
 楼主| 发表于 2014-3-27 15:44 | 只看该作者
lvsy 发表于 2014-3-27 13:13
# Q; A2 s/ f. x7 h, g. e$ V, ncion输入一般来讲应该是同步信号,也就是说是在clock的上升沿跳变的,所以不存在你所担心的情况。
) s# Z+ a* p. l
这是整个题目的网址:http://andrew810810.blog.163.com ... 763992007895125290/
& u$ X1 F7 k% L5 j) g: U$ u, U
0 Q  E& V. ~+ N$ f- l3 k.2  电路要求: |; w8 O; T2 X' s0 n- X& A1 z
必须为该数字电路设置一些要求,如下所示:/ n5 [! I( C# E8 d1 q
.当投入硬币时,一个两位的信号coin【1:0】被传送到数字电路。该信号在全局clock信号的下一个下降沿取值,并且准确地保持—个时钟周期.2 y* a- O! N1 |( q
.数字电路的输出是一位的。每次当投入的硬币总数为15分或者超过15分时.输出信号newspaper变为高电平,并且保持一个时钟周期.售卖机的门也被打开。, }0 K+ t1 G. N7 h
: C2 v  z' a$ [8 E; b
.可以用一个reset信号复位有限状态机。假设为同步复位.
0 w  g4 }2 i9 n- z3 L

该用户从未签到

4#
发表于 2014-3-28 09:01 | 只看该作者
烂泥桑 发表于 2014-3-27 15:44
. W* m+ v4 d2 a7 Z, a1 V这是整个题目的网址:http://andrew810810.blog.163.com/blog/static/51763992007895125290/
9 g! c3 Z& ^* u& j2 L% @" y7 |8 \" A. |2 M% n3 E: e- F
.2  电 ...

. L* A1 }* _; Z9 j' X8 H6 P如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了,这样误导的人的书不看也罢!
% f! e) Y8 b" n9 @) ^
8 {: g$ d+ y# @6 z, Q  O4 H多废话一句,通常在代码设计中,要尽量避免同时使用时钟的上下沿,这意味着你的电路是在倍频的时钟下工作的,如果时钟频率很高的话,可能会有timing的问题。如果非用不可的话,设计上要保证你的组合逻辑输出至少能保持一个时钟周期,否则可能有些结果时钟是采样不到的。

该用户从未签到

5#
 楼主| 发表于 2014-3-28 11:52 | 只看该作者
lvsy 发表于 2014-3-28 09:01
# f7 @! m. b2 V4 ~如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了 ...

% }6 a$ _' {2 h* W) [, a如果是有bug的题目设置,那实在有些出于意料,毕竟这本书不是很经典的吗,而且都到了第二版了。总之,感谢朋友你的回答。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-5 17:55 , Processed in 0.140625 second(s), 24 queries , Gzip On.

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

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

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