EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1、概述 `define:作用 -> 常用于定义常量可以跨模块、跨文件; 范围 -> 整个工程; parameter: 作用 -> 常用于模块间参数传递; - I7 C g3 Z1 [9 ]3 c
范围 -> 本module内有效的定义;
2 a5 Z+ a; |+ F: P/ }) } localparam 作用 -> 常用于状态机的参数定义; ( k) A: ?- P) ^" P" h* m7 Q
范围 -> 本module内有效的定义,不可用于参数传递; localparam cannot be used within the module port parameter list. 8 R5 x! C& f1 y, ^" R% s5 d6 S
& ?" X7 E0 @% Z; z+ Z( H+ y' _2、应用举例 (1) `define: C/ b6 A0 j/ t" W3 k
概念:可以跨模块的定义,写在模块名称上面,在整个设计工程都有效。
1 ?; h4 J! F4 R- G/ L, s 一旦`define指令被编译,其在整个编译过程中都有效。例如,通
7 k3 W4 J2 G/ Z7 M0 Z1 i0 } 过另一个文件中的`define指令,定义的常量可以被其他文件调用,
# ?; O# C; q5 @7 G5 K# o 直到遇到 `undef;3 J6 Z8 ]& Q& `& z- A: r5 o
举例:定义 `define UART_CNT 10’d10245 G5 x4 H! z f
使用 `UART_CNT
; m- f8 E4 ]6 {" `& C' j, T/ {: V4 s + K8 s" `" C. V( a8 Q- K/ _0 y
(2) parameter: l8 u% f+ q. W8 z1 V) a ~
概念:本module内有效的定义,可用于参数传递;$ |+ d8 K7 a' h
如果在模块内部定义时无法进行参数传递,2 _! M i! m8 l) n# ^5 R0 G6 b
若在模块名后照下面这样写则可以进行传递- b- U, _7 h O$ U: g" p
举例:定义->
u2 f$ g: \! j" `5 Y& R
6 f5 [8 l& n& ?2 z1 z: w7 Z6 I
6 K, ?, ^: w0 P9 Q( Z0 Imodule video_in
3 N4 ? l8 C% k F# k+ J7 P$ n4 L; \/ n: ]' I& t1 m1 l M
8 B! Q) B& U0 k7 [0 a# z6 O/ m5 M$ `
#(
0 C7 z: j& c( R, z0 a8 n8 _# j2 x
- ; f; ~! ^; M5 J9 }# g6 a6 e
t- h( d, [+ ]$ l1 `3 Z& m parameter MEM_DATA_BITS = 64,
1 ~) Y1 U6 n+ M3 z5 J7 n+ ~6 u: E% x
) `( ]) B8 u1 t/ e - ( \- A: p1 q& R
A+ R% p. ]6 f8 C# W8 Q% o parameter INTERLACE = 1 // 0
1 ]" C/ n' y% W
/ [( Z# o2 r. |/ Q( b" Z - ) p9 }) w2 l* D# n
. h% x( v) o/ t6 z+ o `$ Q! _9 M )& ^0 ~! I* X$ m
7 R( w( o8 F. q0 A: W: D - - G: a: A. x% ]0 \& H' h+ c+ _1 W; V
2 e) P% x( a/ G$ {8 m; W( [9 V
( J9 m: i6 Z* P# `- |: ], ]
* _" `( Z9 x: v% d* { - ( L9 D9 ` I: C4 Z
7 I1 ]. I4 A3 v% D: I input clk,
3 T! r9 e4 k1 ~1 l+ t' d4 J3 E! r+ c+ ]$ ~( ]$ m
" i" h; e1 x3 W' U! f2 z
* e3 g1 r9 D+ c/ i6 x' A input rst_n,
9 V- @ d8 a- ^' B" G' q1 V+ u( @( g1 ~9 v
* ^6 T( z5 Z+ q6 L' t. w0 u2 \5 y, U% I2 }4 H$ V' i6 Q) T
3 E4 X5 \0 o4 ]; K) `
" T! v# o9 L3 k
- * X1 E2 R0 C: P+ c1 G
, n4 l2 h! C" Y( U output burst_finsh* R% e% a. F# @* ~. W" m7 `8 y. V+ u
" h; T# ^( _/ a7 L# R- N - ' d3 a& i6 }3 Z* \2 x4 ?
# T& _, c* }+ r9 ^* |8 a, {- b );( q$ o/ v3 n1 @; @; P
1 u, f$ l0 w/ a0 O) g, \0 }" E& w$ I8 A9 A
- 1
k. y3 _; i* Z5 F: h* o: B 使用 -> 调用此模块的时候可以像端口信号传递一样进行参数传递- 1 Z, R+ [9 T2 E- i, B7 Q
# H1 j' ?; e. c2 B5 t) s
video_in
$ K0 c3 n1 [7 Z6 d/ ~' d+ Q# {* o, r+ b
9 j0 y9 n" B2 {3 ^
0 ~; K, X- Q/ l #( .MEM_DATA_BITS ( 64 ),
* p+ q$ O- {/ }8 [+ u: B2 H- X* c. a- e
- : T9 p, Q) d0 w/ D
) a4 g+ g/ p: ]% L# B3 g" P
.INTERLACE ( 1 )+ O- Z7 g+ @! Z+ x1 O! m6 Z5 o: ]1 \
1 z/ [. M% P1 ?3 O2 N. u1 d0 c
! O" s! Z& M$ Z% W, E. Y' M8 {, y! ^/ i
)
! c/ Y4 {8 \6 q( q
5 i& |$ U4 p) I$ ^
8 O) ^+ F; w' k7 U$ E* v+ t
M2 p# o1 N. b+ q* a6 E4 Q1 W u_video_in (' e h, B7 i% S3 y
: |" S. h" o1 [* r
- v) l2 S: Z3 T6 c
+ n. ~$ m' L, m+ Q
.clk (clk_50m),$ e, O8 x. J1 w) V& U. k) J
: J; H: W2 L0 h( i. `8 g* ? - & ]- W9 N- P- ]4 Y+ X
7 z4 r% h% w. R8 M* } .rst_n (rst_n),9 K! v* R) j6 D2 ~. m: \9 m- X
. P. O5 d9 {7 M! q' T8 m6 B& V9 k$ b% q
- 1 ~8 n) \$ ?4 c6 ?' [5 D
% p, j7 L1 F7 O5 {$ p ' `, Z: e3 Z0 g" ?
3 K2 E6 l6 H0 R# l3 t
- 7 u6 K8 |! n! w+ z! [3 D' Y
/ v' }4 c& V5 _8 s- n; d .burst_finsh (burst_finsh)' n* P/ e; I- [7 G& T
0 L# f e4 V; B6 P7 u
! o& j. Z0 U& V7 w$ p+ Y2 `" \
* Y# P( a* @8 I! _ );
3 ` w7 I! {/ y7 X, U5 p
3 n" }) a) M3 p( g$ F5 r
1 B# a- F0 C' k
- 1+ B6 W& A. `8 b" G6 l4 U: H' ]
(3) localparam:
" N9 I- I& ?$ X, @% n4 l2 u 概念:本module内有效的定义,不可用于参数传递;: z, A: \$ ~! R7 K" H6 T
localparamcannot be used within the module port parameter list.
# Q2 W1 f/ W h R' ]% \ 一般情况下,状态机的参数都是用localparam的。" T: P0 y/ L2 F8 A5 O9 K* W
2 K1 f* T, v, W- e) C4 q9 f 举例:: G4 j, Y" h; _) S
% F( i4 _4 f+ o9 Q
/ D% s; ~. V* b$ P localparam BURST_LEN = 10'd64; /一次写操作数据长度 /
3 v" f A% g x
! I2 R. v' G8 r- |! x- ! d% ~/ C$ S8 b# {( F
1 c9 ~, L) a( r4 R2 d% H
: k7 I& p W1 E; n7 e. i" G
/ g7 { |& l6 j
7 }' K" {5 p7 W7 z, h3 Y7 r) R+ H7 p7 j1 {3 j8 A; s
localparam BURST_IDLE = 3'd0; /状态机状态:空闲 /5 Q4 [( F$ V, p9 Q: k
! y/ [0 Z! W ^
. q, Z2 B. R) K7 l. d! H
4 m% O6 Z+ k# D- J localparam BURST_ONE_LINE_START = 3'd1; /状态机状态:视频数据一行写开始 /
3 K" V" Q) e ], c+ W* X$ V) E% v3 h
- ( Q8 e+ k' u2 e# m0 N5 F
! C2 P/ N2 [8 U2 ~1 B. q- O localparam BURSTING = 3'd2; /状态机状态:正在处理一次ddr2写操作 /
1 R7 O1 ]" m- |6 n6 @- `% m% t8 j# X2 Y
! h' G+ d- J3 T) ?1 \0 J% v# \: o$ L) {8 g) C
localparam BURST_END = 3'd3; /状态机状态:一次ddr2写操作完成/
- @6 F* G1 \8 e9 E: y- g) `
0 \( x0 l, C5 \1 X0 L2 s" B- " A( w) s; ]! j* `1 ^0 ?
6 }8 Q& y) C0 S/ y/ u# a f* Z* _
localparam BURST_ONE_LINE_END = 3'd4; /状态机状态:视频数据一行写完成/
4 L& @" h& y+ k( i# L" w0 K
' K2 r% B# m7 P' O - : E% q& s; f: q4 U4 k
1 p- ?, C. v2 ~, x# ~
* J0 K) b: S/ R( @+ j
2 \) i- s3 y' p4 C: }) h* |
- $ b1 Q$ `0 S$ g3 v( N* x
8 \5 J# h2 F& @4 D& B
reg[2:0] burst_state = 3'd0; /状态机状态:当前状态 /% y; E3 k6 G0 @
" o! I; c1 t8 C5 G* P7 D% [ - $ C3 q0 f4 D0 V: |2 Q% Y
S, [8 [( O" R Y* z+ s% R6 p
reg[2:0] burst_state_next = 3'd0; /状态机状态:下一个状态/- }4 q' D. _ a } A
. g p6 E: U! G
" S {- Z1 P/ F7 y8 a" ?
2 V4 N( p* B! i0 n% w% Q" J |