找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

15

主题

130

帖子

578

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

EDA365欢迎您!

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

x
各位,初来论坛。也不知道题目写的有没有问题,见谅。, A2 ]6 b+ _9 U6 |' i) S  m
本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:* V. \8 ~. F  q% @6 f
- I% G8 }1 A; K' g  U9 H( |

! O( B2 c: @9 c7 P  w& V这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/3 ?4 \# L% g5 n% b

5 [% H7 x* D( k" `
8 r* e! ?0 [3 G以下是一部分代码:
. A! n8 N/ A$ l! q3 r7 v* n9 x5 {( S2 W! r- n
//用有限状态机的办法,设计报纸售卖机的投币器
# Q& {3 p- X& d/ ?2 R
' j* R7 ^3 R8 a( E/ ?4 G# w, i3 x% }module vend(coin,clock,reset,newspaper);
; ~2 ]+ I" Z! O7 G& A
# m) s& H6 K( ]//声明输入输出端口
% N% y! n. [. ?  d+ [8 g/ C) G% L! l9 a
input [1:0] coin;5 Y" a8 p( @* r6 q$ Z) p) Z! H3 H

9 ]7 b( K- m. m+ J* Q! K4 rinput clock;6 C8 F, q& |! G, l

( x7 \- V% C. d3 q; Ninput reset;
* }& M1 W7 w/ L$ ?! L- T7 F! A- V
output newspaper;5 O# R/ H( L, ~6 Q; r* }
) R  Q7 h1 A- ^4 a; @$ m
wire newspaper;
; e0 d3 \0 ]1 m) U2 `7 _
: w9 P5 @/ q- O- r. z//声明有限状态机的内部状态7 ?$ r5 U% y) V4 Q) w  n; h3 f
8 c3 V1 o2 M3 t0 t
wire [1:0] NEXT_STATE;+ S  a/ s; d" Z

& E/ _$ \" t/ |+ s  nreg [1:0] PRES_STATE;6 Y  [. ]$ F$ k- l

! V, y9 }; A4 }. `5 c6 N' m//状态编码7 L0 a  l" w4 P6 f( h3 y) I

& \, U  U3 V: a, z' qparameter s0=2'b00;
- z' P4 ~/ K& k$ g8 B* |, E8 _& w6 B% n+ p, _, T
parameter s5=2'b01;) W" u( A5 \' h, f5 C, I4 ~& f
5 w. R1 j9 r( Z( S
parameter s10=2'b10;, I4 f1 @: r& ?8 F5 K
3 q% |. x  `6 k' B3 f5 W$ l; t
parameter s15=2'b11;
! B0 R  q! h5 T7 S+ P, n: y4 a* l& E. O2 I/ j; @/ p
//组合逻辑
# P" d( W: z& p. t8 h+ b
* |# K& B2 h' pfunction [2:0] fsm;
5 r1 }3 r- @# U- h$ ^; {6 d# ^  W+ k9 G; [* b7 e
input [1:0] fsm_coin;
0 ^  o1 \' E# V7 E# W0 a8 I' A4 Z2 H" G* ]: S' L
input [1:0] fsm_PRES_STATE;
% o1 J3 r) R' v+ x" U8 ^" R$ v9 e) p& o% X8 B! A. {
reg fsm_newspaper;
- ~4 n% E+ {' K! {5 |9 L
2 A4 o+ ^: S  O& Jreg [1:0] fsm_NEXT_STATE;5 B! N/ q- a/ G- [5 ]# w

5 e( T. u7 J! f  @0 P* vbegin  q$ i' F0 R3 @& d# y8 l

. C! l1 B( w" e. |" O  case (fsm_PRES_STATE)
  Q' \* K! A6 f5 d8 e. W8 [9 W) B/ ^# C5 \; D6 \: M
  S0:  //状态为s0
) D* r4 h/ e1 h! h8 }4 ]( E. X: ?/ w0 M4 N
  begin. X9 {: [, c4 d1 b

. Z0 T! f) L2 V' z. N' f3 T6 B* o( T    if(fsm_coin==2'b10)$ h* C7 p$ W9 b+ C1 p% X: z7 ~' p

  T3 ~6 w; c/ }+ E. r     begin
* ?. Y" P3 ~# A
* T! L: n8 s& z        fsm_newspaper=1'b0;, X& [* C+ I/ p2 A. R

0 |+ c/ D; _7 p1 l% b         fsm_NEXT_STATE=s10;
5 X9 C( v/ F- v$ X# M7 }# O" }/ N
+ l, Z4 V9 W9 F       end( |  r  E( `* S* _# {2 n
+ q: g& P6 ]6 l
   else if (fsm_coin==2'b01)5 B2 M- R& z/ E; f# v2 W: }
" q; f  \8 Z% m' r0 r. i
      begin
9 j% Z0 k% o' w/ f( ?; n# l+ r/ K9 X. `! X" P
      fsm_newspaper=1'b0;
# X% P; V- H9 L/ M; F& Y' C0 T7 e0 G0 U9 k3 f& f
         fsm_NEXT_STATE=s5;
! K1 [/ M' y9 o
7 b! _* h1 V$ q      end% c- n2 {7 _) I$ _
+ v0 h3 b) L5 j+ h8 d3 G
    else; j* ~& @. B. I+ _; q3 e$ |
0 x! ]! @8 P. ?9 F  C8 J
    begin, F3 E2 N2 K! u  D, M  |
0 G, r4 \2 ?, `% N
         fsm_newspaper=1'b0;
; j' A, s$ O3 C6 N& N* ?  @* C/ l
1 |, b9 M; {$ \* f3 L         fsm_NEXT_STATE=s0;
$ G0 L& z/ l) [& P' U8 y  n' B
+ q5 o1 A9 _5 X     end
/ q3 A7 w' _" Y5 W' O- l( y! e
9 ^. U' ?6 N# r0 t* |" L4 P# cend& `$ M# h+ |: z1 K
! k1 u2 k$ F' R$ X% J; }6 n: w

1 z* \1 v+ F( M! [5 E7 j; }2 M: U1 |) ]% S
s5:  //状态为s5
/ \# P- z: {1 B. {
" w0 I  k# c: \$ [$ P  begin2 E2 h6 Z; b! Y+ X
" u; X8 a( `# A' s/ Z! z/ ]0 m; l
     if(fsm_coin==2'b10). |% u, ^- [1 r* v; i! B7 Z! |

! K7 w# x- x3 b1 f0 s7 Y) r+ z+ h& X( Q        fsm_newspaper=1'b0;
* B+ R& \* m8 u" H% y* r: X- w2 a3 M7 F4 h
         fsm_NEXT_STATE=s15;
2 P# N: g# H! ]% n
( U) }! g5 I$ o      end. ~9 T% S6 a- ]5 j6 V! ^
) ?% r" y( g3 p7 y3 D; y( u8 R
    else if(fsm_coin==2'b01)
2 W6 d! ]+ C- |1 p  ?* b* Y# d3 V' D5 w. s. X
    begin ; w  V1 |3 t- `1 r# F( g3 J

' J& E6 w; g3 d3 B5 G        fsm_newspaper=1'b0;1 A4 z' k: q/ |+ D6 W! K+ |5 Z
, p: X' X9 G8 L
         fsm_NEXT_STATE=s10;
0 @8 b) ?7 M0 ~5 d: O. g% ?# J: l% C. F4 Z. l' ~# o# x0 J6 j
      end
5 ~8 J- M4 E) u# ?" R   else' K  h1 J2 E% R% R/ n1 V1 U

8 z+ n8 p0 J* T0 V6 \      begin
7 [3 C# `! O/ {$ l
2 p% C3 H& m( ^        fsm_newspaper=1'b0;
; G( ?2 f( A) [  T2 \
6 E4 ~$ G1 e1 ?8 L# n2 `0 }# h5 ?         fsm_NEXT_STATE=s5;
! S; t4 y- Q9 D/ `& M
8 \" u- J0 o; {+ ^# K& z* ?   end" S* D% t/ M& O

5 m* L, i& Q  dend
) C% i* V7 a8 N7 w1 ^
$ p! O' ^4 P5 g) j% E& P) Ws10: //状态为s10' e* g* @: A# S+ ~/ ?7 U/ I$ V

/ G7 C0 T3 L7 _& ^+ k/ w7 Lbegin1 o/ Z4 v0 Z+ F' N# e/ j+ B
6 m0 i0 J" m" p4 \6 N% t
    if(fsm_coin==2'b10)
% H) ^6 S& n, K9 [  `* H/ e' w) J1 Y& v. B
    begin
' D( U0 ?, b8 C' V" m- J% g, _! \0 m/ ~7 J
         fsm_newspaper=1'b0;
4 ]# f+ o5 j8 I1 U( n0 \' u5 D- U$ @4 x
         fsm_NEXT_STATE=s15;
$ E+ b7 c8 A& f; r: N! y% q( a0 Q. Z2 P  p, R) V" p6 |
       end
1 {+ [& E- x/ H- J: m, q  s3 d) S( m
        else if (fsm_coin==2'b01)4 e. D' x4 [2 ]$ R2 @: M

5 e/ J7 |! y$ V; _- ]          begin4 O% r6 H  K! l- N, h* n
; o" h; k; _% p3 u0 [! j+ I
               fsm_newspaper=1'b0;# r- B% V" Y( w

8 O% [6 o% i  m7 T9 f                fsm_NEXT_STATE=s15;% V- J$ Z8 N7 P# q; h$ I
2 l+ v: L8 Z, S, C: c4 `: k
             end
/ F' k) H& s+ {& |  l
0 g+ q" X# @+ G% a+ F9 t        else5 N7 N# L6 {% s( v: Q/ K
. h$ H1 ]& H" k. M  _7 U
          begin
( r! F6 h' {$ p2 H8 m0 J4 w- w, \, }0 D* r1 [3 |. e" l0 {
               fsm_newspaper=1'b0;
1 d6 x# m2 ]2 W8 h3 o
. \& j1 z# y: B0 q                fsm_NEXT_STATE=s10;3 }# m1 L9 ]1 d: z+ }

" U3 O- i, E- P! X2 ~1 O             end
3 f' h1 o3 V' J$ C1 u! Y% d* `2 S7 {: L5 P$ h, z" A2 S
end
( v$ x) `6 m4 ]' [: M: J
/ ]7 U; F. i4 S0 b  Ds15:  // 状态为s15+ _  D  J) s  N0 K
  M9 p5 P" s3 E3 c+ z! H
  begin3 D  K, d" `3 L! ?
* D3 ^$ c/ ?& T+ n' q
        fsm_newspaper=1'b1;2 g2 C) A- L8 h6 F0 o% W6 {" h- h" X
5 ^1 ~3 w( P3 k. ]
         fsm_NEXT_STATE=s0;# h3 m, K% \. O9 ]% [
! X0 {9 @( M( k7 ~8 C3 U7 O
      end
+ V* f: Y, O* z: r4 ?8 ?3 u1 ]# V* u0 u. Z' Q
endcase
0 N9 j; D8 v. l; Q+ h8 L
/ x2 @' {4 L  M! k; m  x- wfsm={fsm_newspaper,fsm_NEXT_STATE};& P- {- F# ~0 R% I% Z

  f& n: Z6 o6 d/ ^- Nend) ], \6 E  Q! [. k1 [1 ], u, n

# Q# C/ B6 d, S9 Y: Zendfunction8 j; f6 K3 Y/ i) O7 {- |4 K( S

+ M( T" {/ S0 D, u' O+ s. k//每当硬币放入或当前状态改变时,组合逻辑动作
$ H# m9 b( S5 R: d! ~2 R
  t6 ?8 _, ~; |7 F5 Vassign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);3 Y/ H2 a6 C5 d0 D

+ v8 Q- O( O& ?//用同步复位、时钟正跳变沿触发的状态触发器4 u0 s  I% e/ B; P
2 s- g9 z1 P0 p
always @(posedge clock)7 {) X: v) p% W

3 e" g# l* h) l0 {/ q; f; Gbegin
3 G: ?# k5 ~6 T( T3 W$ n4 ?6 \8 f6 s6 i: M
    if(reset==1'b1)7 `( W- X; K+ ?. q0 Y8 v4 \

8 {6 F8 K! @0 j2 s      PRES_STATE<=S0;
2 l0 ^- ?- S& i) a) R/ S% R! j5 K: z+ b0 W: H2 W3 u
    else/ g4 v0 h- c/ Y* g! L" S/ ~; x

# ~, ^1 B' L0 ?/ A% h% ^       PRES_STATE<=NEXT_STATE;
" b" A* a: T$ ?2 t; J
( c2 Y: F) ]5 t" ~. |( d  end% A& C" A+ I* o2 c# G8 c
- c* f8 n' R' p0 j8 y6 h
endmodule% u6 J! Z3 h2 e! O; }3 ]  ~0 ?

1 }3 n3 W% y& w! P
! x. q/ G( `# f( v  H- U5 X! p: U5 R( y( A$ I* A7 ~6 L6 g# e2 d
我的疑问在于这里:- x9 E) p7 N$ z6 l" |
* l  {. V. H, Y- G! @2 a: ]6 U  s
//每当硬币放入或当前状态改变时,组合逻辑动作# b0 A8 E! i' Z5 g
; d1 y0 s3 A, m; }1 m+ u* y* V
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);' f3 T7 C2 G+ v$ g1 k7 o

' e$ ]6 b$ w* N* J- z4 V2 f  f+ y7 l+ D' j" L

: M: @' V7 r* d( q就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?: j6 j' {% \! {% x
  K0 {; ^9 J1 c% R
请问是不是我理解错了什么,初手还望各位指教。。。! v. V9 M7 o9 V0 H6 o' Y
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
9 S2 a# _) l) i! T7 r, r7 Q4 |7 dcion输入一般来讲应该是同步信号,也就是说是在clock的上升沿跳变的,所以不存在你所担心的情况。

: ]( X, m, @( w这是整个题目的网址:http://andrew810810.blog.163.com ... 763992007895125290/
: P2 ]2 g1 [0 r0 `( O: e. q7 {& U6 I6 x& E
.2  电路要求
& l: U/ P, S4 c; p必须为该数字电路设置一些要求,如下所示:
6 s/ i0 O  q: b1 U1 I) y* @7 H.当投入硬币时,一个两位的信号coin【1:0】被传送到数字电路。该信号在全局clock信号的下一个下降沿取值,并且准确地保持—个时钟周期.
9 T. C% S+ G1 ?  l8 N" \3 Z7 K0 J3 ].数字电路的输出是一位的。每次当投入的硬币总数为15分或者超过15分时.输出信号newspaper变为高电平,并且保持一个时钟周期.售卖机的门也被打开。0 Z' ~* O2 [' G0 }7 e  i( l: C
2 V, U/ X6 ?2 N& \6 o
.可以用一个reset信号复位有限状态机。假设为同步复位.( p% G, _/ f/ D# f& v7 P8 R

4

主题

43

帖子

913

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
913
4#
发表于 2014-3-28 09:01 | 只看该作者
烂泥桑 发表于 2014-3-27 15:44' t( S# c6 m# i6 f: x; x
这是整个题目的网址:http://andrew810810.blog.163.com/blog/static/51763992007895125290/7 `1 J8 c1 h* s) n0 a' @
; U. A& i; V  @, F" J1 O% \2 N
.2  电 ...

& d( W. ~0 U5 L6 i0 n如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了,这样误导的人的书不看也罢!
; z' g2 t, Q  A' O9 [. G( @9 d8 w/ d' c/ F1 F
多废话一句,通常在代码设计中,要尽量避免同时使用时钟的上下沿,这意味着你的电路是在倍频的时钟下工作的,如果时钟频率很高的话,可能会有timing的问题。如果非用不可的话,设计上要保证你的组合逻辑输出至少能保持一个时钟周期,否则可能有些结果时钟是采样不到的。

15

主题

130

帖子

578

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
578
5#
 楼主| 发表于 2014-3-28 11:52 | 只看该作者
lvsy 发表于 2014-3-28 09:01
1 g$ q" R) e4 z3 Q. V1 h' c7 [+ b如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了 ...

  s3 a/ I4 j9 q) @' F/ u( f如果是有bug的题目设置,那实在有些出于意料,毕竟这本书不是很经典的吗,而且都到了第二版了。总之,感谢朋友你的回答。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

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

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

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

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