找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

15

主题

130

帖子

578

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

EDA365欢迎您!

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

x
各位,初来论坛。也不知道题目写的有没有问题,见谅。# V4 e. X, k+ S" b* u# g* M
本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:3 z5 `$ J5 P3 p; e
+ a$ i* [, U/ l; f3 E/ P' D6 T- F

! I0 x. k4 t5 v: |这是整个问题的网址:http://andrew810810.blog.163.com ... 763992007895125290/  |) q8 k% U/ j

. W( X% Z+ P9 y/ q- F6 O4 H4 V# X! r  w1 q1 S0 f5 [
以下是一部分代码:
* q7 E6 D. @3 }/ U8 \+ Q5 O9 B* g9 c) s4 G# B( f
//用有限状态机的办法,设计报纸售卖机的投币器
# a8 D! s% h3 b$ u5 f% E; n. G* ^' b# u
module vend(coin,clock,reset,newspaper);9 T' @2 ~6 g7 a' _* A
- t; [: ~9 z- @; c4 F. v
//声明输入输出端口
# V1 i4 [! i! I& B1 y0 q- ~
3 G+ ?0 E2 W, _; X1 B7 z' X5 vinput [1:0] coin;
  ]( h& K# B5 q9 F! }
6 ^( D9 v  J! x6 b1 Rinput clock;
6 V1 O% H( [2 c$ d7 ?* _
6 W% Z6 t; J" N: w& Sinput reset;
* W) B+ l, f4 Q. G4 L: ?0 x& U3 T* R5 U. c2 \. c6 C. J- d
output newspaper;
5 s  u  |0 R" ^. c8 ], \8 F3 ]: x) Z6 E- Q9 M$ t
wire newspaper;
3 K! L" l) V9 o4 Q" g- c' }: w4 X* j
//声明有限状态机的内部状态
/ H/ r3 t6 C5 X/ ^8 {( X& \" q/ ~, \( t+ H6 V2 q7 `
wire [1:0] NEXT_STATE;7 g% Q* a! u8 X) m  r0 c: n1 u

9 e& m; g  I- H* W) Q& e% greg [1:0] PRES_STATE;
( L5 h0 ~* @% j$ p1 U/ a
: r6 K  ^6 i5 @$ F1 l2 K6 m2 q% t//状态编码
, `4 W4 T5 h1 L1 i" K) x/ J0 }$ O1 Q! _6 o" H5 r4 Z
parameter s0=2'b00;$ E+ v! u; c; Z9 h7 e
: I) O) y% X0 u3 e
parameter s5=2'b01;
+ F) _6 t9 t( r1 @, H! c
8 E& e% {" Q" H, K7 j3 Vparameter s10=2'b10;
) N# K) d3 X4 @  E! R& F# b- y0 @7 c0 W; M
parameter s15=2'b11;1 U8 \0 [5 E, u) a! g. `9 h
2 ?9 {" v& H& `# ]) G
//组合逻辑
9 G, P% ]( e6 u- D0 e; k1 ]- I8 F* J3 X. g& ?5 k5 C
function [2:0] fsm;9 N( |+ X; j' F+ @  @+ B

' p0 Z( `# A/ }input [1:0] fsm_coin;
; Q$ V% F6 N1 A4 g& ?
0 b& y8 ~+ T3 ^" E  d: binput [1:0] fsm_PRES_STATE;
. h% ~4 B1 @+ C, [, j1 G' F2 o5 r' x% U. s7 f3 y
reg fsm_newspaper;
: r, ?$ _  E, G. T2 F. V3 b1 I# @/ d* C- k
reg [1:0] fsm_NEXT_STATE;
) h; B# s3 j0 f4 a# o# ^4 b' b$ k1 f2 g4 a+ {; N" o
begin
! R+ f5 L7 i5 w* V6 U
4 r' Q, q% {* @( ?+ M1 |% o  y  case (fsm_PRES_STATE)
; v0 l2 l( w! k9 ?4 z
) V" \# L. b( [) P  ]  S0:  //状态为s0
7 u, H* f- r' l  G
, b, t5 X- C& S2 A3 b" X, P! l2 n' M  begin0 [$ c8 s7 Y6 Z1 R
- I( Q5 J; z& F0 }5 ~2 \3 _. j
    if(fsm_coin==2'b10)- }6 y6 `1 U, v- v- i, g- C

5 n4 F; ]- K0 }; m: J9 s( `/ T$ b     begin7 j  e& h1 O2 p4 T, G
. a& ~! o# t& |8 `' Q$ k
        fsm_newspaper=1'b0;" O' H8 w* @" I% a7 N3 Y; w' J0 d& L

, ?! O2 s! v3 b" C         fsm_NEXT_STATE=s10;
5 j3 F0 a7 }# n3 Q; v( G
1 h+ e% L- l, @5 t  G       end
- _2 e. g( b( _; M
& B1 v# B1 z0 D3 u6 S+ d   else if (fsm_coin==2'b01)
  K" ]' _9 X8 Q& E) [% S6 Y
4 }" M) u# C& c3 v! g: x4 P" }      begin
3 K. p' V7 q' l- _! b& B2 f& |: {+ a
      fsm_newspaper=1'b0;
& K+ d4 Z4 s0 `8 u  k( }4 W
+ E/ W' h  r, |% a         fsm_NEXT_STATE=s5;& M1 [  b' u( x% ^1 U) ^  _: C" e
' {4 |5 _6 E8 D9 @# Y
      end
! `$ j6 v/ v: t7 h3 S- c
, E* t, Y9 Q. L4 `) B/ b    else
, E# n8 p' ^6 d9 P& I" j
" w: I- k  k0 P% j5 d6 ]3 z3 ]    begin9 R3 }' Z, V+ p0 f) L

0 C, {9 U9 e/ E! H+ q* @1 ^& g% q$ Y         fsm_newspaper=1'b0;0 @) u' D. r* ^4 B" Z% {6 ]

' O3 j/ O1 v9 m( x  F# ~* L         fsm_NEXT_STATE=s0;7 h$ Q, I* x0 A; P5 V

: `* h! v2 K+ I6 |5 B     end- U& B) G( i$ T7 j; j  M& {

6 a" _0 j( Q+ S6 o# }( M% y' f# Bend5 ~! y( ]7 y' a; c, A) F6 b
1 x! g1 I# q; d7 r

' w$ k8 L' M$ l- ~+ ~6 W# e& D4 e7 l
7 t4 W* X8 N) o2 A" {! S4 ns5:  //状态为s5. }3 s2 D; W  b7 E. s
' m' `0 r0 e, {& {" y; s- ]# W
  begin4 C) ~& ^& C8 ]% I" c

7 D0 k$ n$ K& m4 I+ K6 O     if(fsm_coin==2'b10)
5 c; g& Y. t1 ^& c8 G  E
0 i7 m# D0 S& J6 V9 y0 b+ B        fsm_newspaper=1'b0;7 B3 k" i' F" A: j' }+ W3 _( c+ p

: ~" ^0 m/ X' O" x& n# j         fsm_NEXT_STATE=s15;4 X5 F, h, y; N( V4 U2 M$ X+ O

7 I; E' a" B. i2 D      end
. @# y4 `1 D, c* @. Q! G0 w( P# Z0 e8 k$ ]* I" Q
    else if(fsm_coin==2'b01)5 r$ H2 B0 E# x% }4 J: n7 e

$ I( v$ Y; l5 \( y4 z    begin ; \: E! J7 u* j  Z9 q% E' O2 \
5 J; j5 x8 t1 d5 s
        fsm_newspaper=1'b0;$ h5 L: x; r* t! }! j3 n

8 b- v" t3 a  G6 S$ W         fsm_NEXT_STATE=s10;
( m6 C5 ^0 ]# I0 |" ^% T  _, ]: t7 W; d3 H
      end2 c2 d' \3 y: b
   else
1 K8 P. u/ P& `$ p/ S( k& y& |* y# I9 G' Z% U) ^% q! ]" ^4 Q' B
      begin, D4 d6 ?" K! Z2 H% n9 X0 G

. G' V1 ~; r/ ]6 g        fsm_newspaper=1'b0;) T; a- b# h7 Q- @

' x- _: v: V  S, w1 [- C) y: w, x         fsm_NEXT_STATE=s5;
1 m, c+ N3 |2 ~& T" M; K
- d, G( x1 [2 w6 k6 b9 q   end) a9 ]5 V# H5 C8 ^1 `

1 }" d4 m0 Q- c6 j$ t. [end5 G1 V5 o0 w+ v$ J

- {+ V  _. T  S- I- H2 X, P2 Is10: //状态为s10
3 d& F0 d4 H7 I* }9 u# s+ x3 d! v/ I1 p9 J) `* E  |! y) H: `
begin
8 U9 R8 P! _( Z) x5 R0 N$ Q  I  N9 ]7 M- L+ g% S8 g+ K4 B+ A/ }$ f
    if(fsm_coin==2'b10). T/ g( p# o- p- M% s7 d

. o0 z7 Q1 [. H7 r' d: U" c    begin- Y2 D& d# J1 W# y

0 O4 R7 e( Q. @" ~$ g" M         fsm_newspaper=1'b0;5 J# n- u9 j5 f
$ l8 I/ e" j* a4 w% o" |8 i* v/ B
         fsm_NEXT_STATE=s15;
0 u  Z) ~4 |8 O9 H  ?$ A- `+ U; L* ?( T0 W6 M9 b' Z1 @
       end- S! R' A$ d1 C2 l* b
# E  b8 {- t; M1 C# x* w7 |
        else if (fsm_coin==2'b01)* _/ Q6 m' z- Q4 `! i) M7 H
- V+ |$ D, \2 r: e. _8 n. J
          begin. c7 v6 G" u0 O% o& \9 z; L
' {: X3 S% _' w8 w5 m2 A6 x$ e
               fsm_newspaper=1'b0;3 E$ Q. c, L% D- K
) _9 {$ H; n7 ]$ F9 T9 k
                fsm_NEXT_STATE=s15;
8 b0 z5 v& T+ O( v! G6 r% l3 U1 Y* ^5 P# ?1 q* t0 J
             end
. F( Q8 w! o$ Y9 Y# [+ T% n7 u9 f' z
        else6 A* M1 [: D5 C# ?( r2 M* J

( q; t1 x& b7 O; C/ S  _          begin! Q. ?& G' G: `1 l5 ?# U3 F6 n% N* a0 d$ D

6 m2 M' `9 S) P  X+ B( B               fsm_newspaper=1'b0;2 g6 M( ?$ P$ O. h% T
5 l$ a% U: @% Y) D8 |& `
                fsm_NEXT_STATE=s10;  R8 k: `# s+ O8 V9 {

6 w4 B- Y! L' e7 w8 c1 T- [             end
0 f( C/ q2 M: c" a' x+ W# E' b) K0 m6 N' [8 N* W) n
end
( W; h% [4 U. r; S$ N! V
& V, b" H: O- H- _4 L6 ]s15:  // 状态为s15
/ p' k8 i5 J- i9 ~1 @
) h7 t1 P0 e1 p, b0 U$ _/ @' I  begin$ h# ], ^- `- P/ R9 N" t

( z' \8 ]# Q' @; d8 Z        fsm_newspaper=1'b1;' R( V# x- X* n! `0 H' L7 N" c0 `
: c9 ]6 x7 h  {4 j% D5 p+ X
         fsm_NEXT_STATE=s0;
. F2 B4 C( K/ H; k
. [5 [. V0 a. f      end
9 s, T7 p: w" Z: D) N$ W2 m8 r$ V( p4 t* U: O" q
endcase
7 m2 q; Q% X8 G+ w3 Q: W2 S0 m# F9 T7 {9 \9 L
fsm={fsm_newspaper,fsm_NEXT_STATE};. I" k  h- q, M6 F

0 R& r- B( n6 J+ iend  U, p# C0 L# z+ N

! Q! [" s% B, \6 X' `3 Wendfunction
7 [6 Z% D# [# g! b! L7 A7 _4 R% r' n1 n/ R& _0 e& a+ f; N, f
//每当硬币放入或当前状态改变时,组合逻辑动作
2 D; u( O/ g$ o8 w' W6 N+ ~+ d4 j* |5 b# ~, o# }8 U9 R% Z  k
assign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
, p) }8 @) M4 X
6 L) a2 [8 G0 b  g6 l//用同步复位、时钟正跳变沿触发的状态触发器
- L5 v* y& z# S+ S* v) l
7 _2 J+ D1 V4 J) X1 zalways @(posedge clock)
+ [0 y' ]0 E: h4 M9 C' X: {) [( x1 [. F- O# `/ G' `# q
begin' Y+ C" \- e8 i+ K9 `

7 \" m2 ~2 c& n* ~0 P    if(reset==1'b1)
; O# N, L; G' q3 Q! a3 T7 ~" Z$ d  R/ j. R) n7 J- f% K" G
      PRES_STATE<=S0;
( g  R3 C" `. d0 h8 @% Q+ H
# }7 J7 m0 u& K* L    else
" y. i. A6 \# ~! Y5 U$ t  I% I3 }4 Y7 x1 L$ g$ Z1 B
       PRES_STATE<=NEXT_STATE;+ C3 ]+ p7 C/ x  f9 y

7 [! t; i$ E9 N  end
& }2 n% N1 Z9 k$ s! a0 l+ Q6 l+ d1 S0 D+ Z/ ?* N! H8 i2 y
endmodule
5 X. W3 H( K6 _9 i" Y5 S( ~+ x
+ r/ j5 z4 f. Z3 S8 ~# e, \, U5 U, e

" R: k! _% |7 `2 |7 N8 V我的疑问在于这里:
8 c- h% s8 k4 c2 S1 o/ ^1 r+ ~7 @! T0 ^# q* z% ^6 k' h7 d  g0 Z" k
//每当硬币放入或当前状态改变时,组合逻辑动作3 i1 ~2 M7 ^  w* V

, q  z" H) r) p( t4 T, G; U0 o$ qassign {newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);# c. d* @% z: f+ o' o  L9 K' e$ o! c0 r

( ~4 j9 }: x" D6 t7 ?
8 t6 {/ O2 a+ o; f" q! P. O# U; _1 W( ]7 v
就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?  I9 |+ @' N" O- c- O# n, a- V

5 ~' u2 X: h" G请问是不是我理解错了什么,初手还望各位指教。。。  y: L1 Z: t) w1 F( j) c9 d6 T( A
ps:在别的论坛也发了,但是没人回,EDA365要给力啊。。。。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

15

主题

130

帖子

578

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
578
5#
 楼主| 发表于 2014-3-28 11:52 | 只看该作者
lvsy 发表于 2014-3-28 09:01
& X% D& F* M* |7 `3 c1 j8 K如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了 ...
" _# e" ^$ @) U$ w/ Z/ n* W/ c
如果是有bug的题目设置,那实在有些出于意料,毕竟这本书不是很经典的吗,而且都到了第二版了。总之,感谢朋友你的回答。

4

主题

43

帖子

913

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
913
4#
发表于 2014-3-28 09:01 | 只看该作者
烂泥桑 发表于 2014-3-27 15:44' O0 ~" Z/ m/ K, A" ]" n
这是整个题目的网址:http://andrew810810.blog.163.com/blog/static/51763992007895125290/( Y) a6 y/ X1 W, H1 l! f" \

; r0 ?6 t: ?3 z.2  电 ...

" A0 Z  b6 Z4 H' w如果cion跟时钟下降沿对齐的话,这个设计是有问题的,NEXT_STATE会在一个时钟周期内改变两次。不去管它了,这样误导的人的书不看也罢!% m7 o( p) A( i4 e6 k' H

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

15

主题

130

帖子

578

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
578
3#
 楼主| 发表于 2014-3-27 15:44 | 只看该作者
lvsy 发表于 2014-3-27 13:134 B7 _4 t" a; L" w
cion输入一般来讲应该是同步信号,也就是说是在clock的上升沿跳变的,所以不存在你所担心的情况。

, N9 L; j4 v8 J4 v/ u1 V, T6 Y' D这是整个题目的网址:http://andrew810810.blog.163.com ... 763992007895125290/
) p8 N( {; K$ _' Y# W+ R* t0 W' E" D8 P& B& q+ n( T/ c
.2  电路要求- {9 l8 B; C. D( _& w/ n7 V  Y1 I
必须为该数字电路设置一些要求,如下所示:- ]: F8 I5 y$ o6 }; u
.当投入硬币时,一个两位的信号coin【1:0】被传送到数字电路。该信号在全局clock信号的下一个下降沿取值,并且准确地保持—个时钟周期.) g6 Z9 Y9 c1 _" ?4 F
.数字电路的输出是一位的。每次当投入的硬币总数为15分或者超过15分时.输出信号newspaper变为高电平,并且保持一个时钟周期.售卖机的门也被打开。6 [! G/ v5 \$ e& s( t1 l

; u) Z. S- R+ D" ?6 b* W, i.可以用一个reset信号复位有限状态机。假设为同步复位.
; c' h6 ^' w) a

4

主题

43

帖子

913

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
913
2#
发表于 2014-3-27 13:13 | 只看该作者
cion输入一般来讲应该是同步信号,也就是说是在clock的上升沿跳变的,所以不存在你所担心的情况。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-2-19 06:35 , Processed in 0.057874 second(s), 34 queries , Gzip On.

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

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

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