找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

15

主题

130

帖子

578

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

EDA365欢迎您!

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

x
各位,初来论坛。也不知道题目写的有没有问题,见谅。
: k' F! c/ U' b- H本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:
; v* X0 [) Y5 J1 ~) s1 z4 F# l3 _! X( r
0 R# X0 d5 x% W$ F2 {/ C% ~  H
9 c; D+ x1 {4 s这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/
( Q) B1 b  D4 c) [$ _$ x% h
- L/ M: c) d5 U5 A9 x1 |3 E. [* ^0 k% F" y8 x0 H% H
以下是一部分代码:
. q" b0 Z5 K5 u. M, q* a7 f6 t$ L, \. N
//用有限状态机的办法,设计报纸售卖机的投币器+ K+ l7 _: Q$ D& H
# t/ y& T9 g, C. n# k- T1 T
module vend(coin,clock,reset,newspaper);# G% B7 g  a4 j8 I5 D9 Q. c5 ?
0 i! f- r9 s7 `0 Q8 F5 K6 z! i
//声明输入输出端口: M4 B4 e  N  F; @, {: F
; {( q, R7 I: p5 g9 S$ }
input [1:0] coin;
9 d0 e" `* R6 i5 v- k* T- c" v, O) F
input clock;6 ^, ^7 V; i2 P8 E) G
1 t# o4 w- @( b, C" T
input reset;9 |2 C# X8 A5 g6 d' J

7 @. ~: d5 T7 Z% Loutput newspaper;
5 E) T4 r1 \4 Z6 Z2 W/ G0 w/ ^* |( }. E; H0 Y" n( d
wire newspaper;
3 d+ T3 y. U/ j( E8 Q
" V& M3 d) ]0 k9 Y7 p- ?, C//声明有限状态机的内部状态6 e2 e4 N& B# W, p

: E2 x7 ?: F2 \1 zwire [1:0] NEXT_STATE;
5 Z0 R$ H2 W# R3 e3 c3 I" ?) j( q/ v
, O! @' j+ l; F' E; s& ~9 x/ p# |- c2 Preg [1:0] PRES_STATE;
8 X+ q. Y, i/ v1 B+ Z0 L) k, V) h& z3 b4 b3 Y& s. N
//状态编码: r1 a, k+ p# b' v3 ]) y

0 [  N* D# D4 F' j8 |parameter s0=2'b00;0 @+ ^- z8 a( r2 |

  x% j' b5 ~1 eparameter s5=2'b01;; I* M0 c, o5 ^8 L: y' i. C' w) Y
7 W, t1 p& ]/ ]& T( h7 k4 a0 P, v
parameter s10=2'b10;; |  ?( I9 V$ ~/ ~* x/ s  Y5 p
5 o+ V( J" ]' \; W
parameter s15=2'b11;$ ~, ~  F% s3 U+ a; U
" z. s5 y/ S) X" E8 o3 U
//组合逻辑* f4 ^; V* @3 Q7 L: B, C5 `$ f6 g
( ]6 l; O7 _/ d
function [2:0] fsm;- g: R6 C4 r2 D
/ v* u; h5 W- s) }+ A0 Y
input [1:0] fsm_coin;# {$ Q0 {: N5 U3 P* a3 L

) Q9 F8 K4 F: K3 q4 L" Jinput [1:0] fsm_PRES_STATE;3 g+ t  z, x- u4 n- ~( C

# L8 @3 b( N! z' ]" Y# Breg fsm_newspaper;+ S5 V$ X( D0 ?3 L

4 g- g4 V3 d# a" Y7 {% }! wreg [1:0] fsm_NEXT_STATE;$ }& k: v- ]$ T- a5 V
! O6 X6 m7 ?3 b  R6 c( V
begin
5 A2 r, Q* m% x0 o# y( w6 _" m* U: I5 F8 H2 r5 c5 U
  case (fsm_PRES_STATE)' Z% w, {' `6 F6 N9 s8 C- X
5 x0 O1 V. g. u0 p7 ]4 A
  S0:  //状态为s03 M( [+ I, E( @6 ?* X
- b8 H  S3 V8 L. L& y* n
  begin
" u; Y1 l8 Z: w2 ]% m" p6 J! c2 B7 `' {+ J
    if(fsm_coin==2'b10)
, V/ K% @0 r4 t; p
, o' V( L7 c+ w     begin& l  F# o! C, o8 [! ~3 W( o
; Y1 R$ m% t' u6 V' _' O
        fsm_newspaper=1'b0;
( [9 Z# J  F- O# N# l# J; K+ F- e! Q( r) t( b! _
         fsm_NEXT_STATE=s10;! M7 B1 g; l4 S# y( Y+ D

- i  S/ G) R2 L. p0 B       end
4 b" m. h4 S  A( ^4 y7 e* X: R) X' a/ X- o( n
   else if (fsm_coin==2'b01)
& E1 U5 r) z) t( w9 q& z
6 c8 Q: U; F( `* n% Y  V6 f      begin7 o7 l2 s  i9 L( x
' o7 [% ]5 T3 F* X# F9 D  D
      fsm_newspaper=1'b0;
( |9 b1 g; H1 `& r; u' v/ `1 m
# \/ l' G. r4 g         fsm_NEXT_STATE=s5;
$ V3 @% m, H! Q: m, l
& ^. h6 n! N  H+ b( w      end
0 j$ [& X% n' ~3 o) z  }1 z; d, U) Z$ Z6 c5 T/ F, q3 Y) O& d
    else5 e- V( Q6 E7 o4 a9 |
$ t& _7 O: T& Y1 g0 l
    begin+ y1 O! V" i. A. h& M. Z' {

) p; W+ u1 M/ Y, G5 j- U* x) A         fsm_newspaper=1'b0;
0 S2 H; i" C2 f% @2 ^+ x
2 j) @8 a+ }( B: A2 `/ B         fsm_NEXT_STATE=s0;4 F, W% \1 C) |' [# g

7 S! s0 Y, `' M. n- c$ p1 a     end/ u3 O5 |. t( E; ^/ C( b* |

$ }: _/ u& m6 U; x6 l, Z  m& ^$ Send
: S3 ^, i: L2 ^7 H" Q
6 O& v' s8 ]5 X* A* T! Q1 A5 t# h- o: u8 ]. Y
' V) T" L5 ~7 M2 x/ `
s5:  //状态为s5
3 [" e2 ~/ P6 u% }+ P/ |; U5 d" W+ P; H- u
  begin
7 D; L  i# J& }0 N* M% C2 t( _9 j* L; Y
! w. W1 b( R. [5 f4 v     if(fsm_coin==2'b10)
  r  x3 h/ J/ Z) p4 n
9 R/ g) ]. I5 L        fsm_newspaper=1'b0;: r( l& U' q; }  c! Y
+ Y4 Q$ z5 }8 x
         fsm_NEXT_STATE=s15;
, p4 g+ _  E9 n4 S; f) `( l# l1 p0 l9 {7 K  P3 @
      end
, K# j  v: I# v$ V& W3 ]# u9 m. V8 ~: V# M
    else if(fsm_coin==2'b01)( A5 {9 n( l7 i3 h4 H
% O& x, [9 A  g* `" G
    begin " F2 A1 L3 X$ u: _. ?
+ m% _  W* l) T* U- b
        fsm_newspaper=1'b0;
5 b# d; X0 }, X3 b' @* R0 b# H2 h/ ~2 t
         fsm_NEXT_STATE=s10;
7 t; N  A0 m: R. x  P5 w7 G& I2 H" ^. f/ P. S+ F
      end- Y" Y: s7 H8 @+ ]
   else
3 C/ A( P0 q% }$ x6 A5 T
- }$ F; I; D( s      begin
  d' X" G/ [* l& {& Q; a
5 L1 u( h) G( v. T' e* Q        fsm_newspaper=1'b0;9 H' |, @3 X, R) L5 N8 E1 ]$ y) c
( x( m) F, G4 `3 o1 c* F& {, V; {
         fsm_NEXT_STATE=s5;5 z0 m" T8 H7 E: r( z- S$ C
- \# U' J2 ?- a0 d+ G4 w
   end9 m4 Z6 t% T, I0 T
' B) T: n0 c9 c
end2 m6 c8 K# w# ~3 Z( ]1 Z

7 h& _; l# z" t- E5 ~3 @s10: //状态为s10% K) Q/ m& N- Z
! L  Q8 m: n4 }, r
begin
. f  y% o0 m' G6 j% q
3 U% Y  W) K4 C: s    if(fsm_coin==2'b10)  s! o0 I5 X) H% |  R
' Z1 k, o  v0 Y, t9 F
    begin
  ?" `' _1 p- F. H* @, }, n
' L8 f) U$ H/ y, L( a         fsm_newspaper=1'b0;
- u& _( d2 C) ~$ t( V! G
8 Y2 P% \5 ~  S6 z  `7 o         fsm_NEXT_STATE=s15;
+ e/ N7 u6 ^, \( {% h# n& y- \. U  T4 r* P% A
       end0 H" s% y' o/ T# W

0 V+ F% V- J7 o) j) R7 ?( \. P/ L        else if (fsm_coin==2'b01). J5 \1 U; E; {

8 Z) C' I7 P' L: M4 D/ X  X          begin' [4 e' {) u& j

% K/ p0 O% f8 j: s; t               fsm_newspaper=1'b0;
5 B/ S8 s0 Q, {5 C6 A  z
5 }) e1 I0 M- q                fsm_NEXT_STATE=s15;. R/ E8 y+ P+ u% f. q7 k: [

4 c, _$ r  h. q& T: T  m% b9 }4 {             end
$ Y. V5 V. ?0 ~4 [: p" _% q
' L- V2 e! }) t! n7 `        else( T  F( B4 z- M& m  [% P
0 \8 _9 _" ^+ c; g* c) o
          begin$ Q& Z& |9 k- ]& Q5 S

- _2 a+ k  [) O$ i$ G               fsm_newspaper=1'b0;8 Y( d) k2 c/ B' v! X

5 @2 u& T3 e2 u4 F4 S2 e* K0 r1 @                fsm_NEXT_STATE=s10;
. ^! Q  A: V+ d" a9 N+ G& k
, G6 _, `( Y6 P% G2 @             end9 Z. A$ I( A& U
+ e2 L1 j: y  v* t8 \0 M# F
end
9 B& k! [2 ], _3 w" T# v% k) u( O" b
4 f; b6 _; E! y& d' j$ N5 p9 os15:  // 状态为s15
/ J2 N6 O2 {7 y9 A+ B5 }# T) c9 M  `6 }* {, M
  begin
. Z# l0 x( v3 G; l# U8 w& A
$ q6 ^0 l% e$ m        fsm_newspaper=1'b1;
, Q( M0 `4 D6 t) b- x0 A& h0 D/ |) K) M, t* c
         fsm_NEXT_STATE=s0;
+ g1 a( v0 I! M3 `1 B
0 S' ]( w8 a4 x) |2 ^      end% U2 x' A( W8 v9 s. n% O
8 D, C2 C& y3 c4 z# U
endcase
4 t- H  t5 h, P6 }( z: ]& \7 [, X; i' B2 c
fsm={fsm_newspaper,fsm_NEXT_STATE};
" i$ h2 }0 O; t  c# c6 ]) N2 _* V9 [0 W4 l4 \( V
end' x9 o; u! k9 C) n8 q
  n) d1 y6 Y2 E! I
endfunction
( O9 _7 ~. t  x: T( i
" \7 Y6 q% l, d5 p//每当硬币放入或当前状态改变时,组合逻辑动作
- O5 @  \% u: p# b! u8 p$ V' n8 T5 T. k1 v
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
1 O' `0 d( ?; J2 {( c  n6 m; G' S1 ^+ K$ M( V5 F3 M$ a
//用同步复位、时钟正跳变沿触发的状态触发器
  w" n4 {& Z1 T. t; F- Q+ A1 t% {* I& [9 A
always @(posedge clock)+ z) G" v. C( x5 A' X: ?$ ^

* \- y# @( j  ?, U2 [4 e& Jbegin1 Q" D: f! ~8 E% f' _& ~# `9 A

0 C5 S! F' P( \% e% V7 d    if(reset==1'b1)7 l9 b; a# R8 c, ], C+ d' Z
  G1 I" V8 S& E
      PRES_STATE<=S0;
) {8 L  r  a- Y# a* ^
6 b8 d- L5 Y" q! s    else
# H  R2 r) P$ ^' ^. B; e$ g# j8 o2 n. m9 d7 |+ y1 X/ t9 E1 n2 J
       PRES_STATE<=NEXT_STATE;7 u5 @5 y- j! n3 U4 d) ^% [
1 Q* z% }6 o: e
  end
0 ~! J* a. z- e! X0 R
7 ^- O5 X; U3 f+ \+ vendmodule
. e' {* ]& T- U2 u. I4 M% }! c1 z, \5 |

2 B2 D( j- B* ^- T
  |$ o. s* u; u2 X4 p0 ?; Q6 t我的疑问在于这里:+ v5 ^! M, P  q+ Z# G

" ]% c) Z: V5 A# p9 o. P//每当硬币放入或当前状态改变时,组合逻辑动作& G8 H. c- Y: _4 j& v
5 }3 o4 r' \8 A% H. n
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
: k& i5 u3 \  H8 Y. |4 i; h' f' r% ?$ J8 z# f4 O9 E7 |+ k. o: H% b/ n% O1 I

6 S5 n, @2 V4 n, H: i' _
, {+ g/ ~8 m) `% K/ G就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?
$ v: m2 N# Z2 P- a4 g
# F$ ]1 h8 y, r8 \3 q请问是不是我理解错了什么,初手还望各位指教。。。# t7 M  D6 }8 v; w( U% e) X
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
/ D4 F3 U1 J% A7 ?cion输入一般来讲应该是同步信号,也就是说是在clock的上升沿跳变的,所以不存在你所担心的情况。
* b+ Z" |  o" `. u- T
这是整个题目的网址:http://andrew810810.blog.163.com ... 763992007895125290/
1 m. I$ j2 o$ v0 H" a
5 u- X9 X5 P- K1 V. C.2  电路要求; \6 \6 {8 Y& ~2 ~( `! O
必须为该数字电路设置一些要求,如下所示:
% e9 ^3 }( I. s0 p9 Y; c.当投入硬币时,一个两位的信号coin【1:0】被传送到数字电路。该信号在全局clock信号的下一个下降沿取值,并且准确地保持—个时钟周期.
0 H+ P0 R" y, @.数字电路的输出是一位的。每次当投入的硬币总数为15分或者超过15分时.输出信号newspaper变为高电平,并且保持一个时钟周期.售卖机的门也被打开。
3 N& A6 A/ Z% H! K/ d( d
- f$ t$ h. n* c: j3 ]" k$ E0 c6 H, E.可以用一个reset信号复位有限状态机。假设为同步复位.1 d- V% x8 d2 O( z

4

主题

43

帖子

913

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
913
4#
发表于 2014-3-28 09:01 | 只看该作者
烂泥桑 发表于 2014-3-27 15:445 Z+ H2 |0 Y* U- @
这是整个题目的网址:http://andrew810810.blog.163.com/blog/static/51763992007895125290/0 ?3 g8 ]% n1 q( S

( P% X4 Q# j5 M8 n.2  电 ...
7 i, B0 b) M3 `  \: a7 G# m
如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了,这样误导的人的书不看也罢!+ o" b! c+ l) a( S, b2 w

! Z/ r! x" L& o& ^) G多废话一句,通常在代码设计中,要尽量避免同时使用时钟的上下沿,这意味着你的电路是在倍频的时钟下工作的,如果时钟频率很高的话,可能会有timing的问题。如果非用不可的话,设计上要保证你的组合逻辑输出至少能保持一个时钟周期,否则可能有些结果时钟是采样不到的。

15

主题

130

帖子

578

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
578
5#
 楼主| 发表于 2014-3-28 11:52 | 只看该作者
lvsy 发表于 2014-3-28 09:01  j: R- Q! X* e# _* z
如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了 ...
9 O7 I2 W6 ?  q. J' o& @( w( I
如果是有bug的题目设置,那实在有些出于意料,毕竟这本书不是很经典的吗,而且都到了第二版了。总之,感谢朋友你的回答。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-2-19 06:21 , Processed in 0.066478 second(s), 33 queries , Gzip On.

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

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

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