EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1、概述 `define:作用 -> 常用于定义常量可以跨模块、跨文件; 范围 -> 整个工程; parameter: 作用 -> 常用于模块间参数传递;
" r& m& {( F' s- X) d% U' f 范围 -> 本module内有效的定义; 1 G0 x9 F& j0 @. n0 x e
localparam 作用 -> 常用于状态机的参数定义;
8 {& @! K, D1 P 范围 -> 本module内有效的定义,不可用于参数传递; localparam cannot be used within the module port parameter list.
3 [7 r8 Y9 t: ^" k/ T+ f' p* o
4 T; V. z) y+ U0 `; Y1 u2、应用举例 (1) `define$ k( o- A2 ]& Q) x% k
概念:可以跨模块的定义,写在模块名称上面,在整个设计工程都有效。
+ x1 x. W$ m/ o: I& R 一旦`define指令被编译,其在整个编译过程中都有效。例如,通
1 A& B2 `9 t' Y0 P7 D X) O 过另一个文件中的`define指令,定义的常量可以被其他文件调用,
d* C; p4 T0 \6 @) d4 E$ L 直到遇到 `undef;9 r- W) Q! h+ q9 a+ U5 p c
举例:定义 `define UART_CNT 10’d1024( _1 [* u7 f: K$ }. P! Z& y
使用 `UART_CNT4 ~8 A$ l W) x2 M" n4 ]
) [. {, R6 \3 R# O2 M/ q+ I(2) parameter
9 l" l& P& H" I 概念:本module内有效的定义,可用于参数传递;
- f, I1 p% v& W- Q& t7 v: Q6 G 如果在模块内部定义时无法进行参数传递,
5 w9 L0 _2 Q2 s8 F0 Y9 ]( Z 若在模块名后照下面这样写则可以进行传递
% _9 f4 Z7 H6 U* } 举例:定义-> 3 A( ~$ m7 g# S( L5 b% a6 g
0 }6 J( g# g. B, h$ o
1 e, p$ V, c, u' |7 J7 U% umodule video_in
3 B2 a$ s" F9 R3 @4 Q; F# o7 T) R- V" m# h
! o' M. F' ?2 Q6 V. n% H+ U7 @, G" R/ m+ _- k
#(
: E7 z3 ~3 @6 j# |/ c$ M8 F; K
/ Z/ `/ @1 F% O8 B/ b
, ~% l9 h: j: y% G+ q4 H! {3 U |5 O
1 T O% e5 I; [ T |4 p parameter MEM_DATA_BITS = 64,
# ^* j q C% c; o1 s9 s( `2 m' ]! z8 u
# C, y, f; M& Y* O8 D3 S
2 w; F1 P9 d- P2 ~; U6 u7 f parameter INTERLACE = 1 // 07 C0 \4 K0 S1 e6 b: U0 n1 X
. C! e7 K( w+ Q- [3 Q3 {( K& U. w' g5 \# V
W, q) p# |4 E( a& L6 M )% G+ d H; b( Z0 d' `
- G1 Q; `9 d: T2 a/ J
( X L, ]# P' P* _% D! H& ~
9 P/ a- o. ?1 F1 k5 X/ q5 C+ N2 A( u (! q5 I+ o8 @* ^" R& V
1 U$ }* o) P8 G$ ^: ?
' t2 N3 d% r& W4 ? I
% S# V/ l& y. p% t input clk,
) @! V8 A% ? Z) s
) x8 K+ n) Y o' l- % D, ]* g2 z0 O p7 @- Y. C
* Z% h' U* S; k$ b6 u) T& z input rst_n,: @; _+ u. w9 a% p5 b8 K- \$ G
& v h: `1 j: ^. F
- 1 |, X4 Y9 a6 k" M1 A
$ [9 B+ a x# k: D: A
! o* w/ t" p7 ?3 F
; B; O1 ?3 N, c1 n) o* \& u
x' E: n* H0 _( g. j1 H' B- d
/ G4 \1 D- ?6 G3 V0 i output burst_finsh1 I/ c" G$ G* {+ d- t; t
7 T5 t: s, K5 h- : y! X& N8 R5 B
) }9 l9 W5 g' L1 b A
);$ m# m+ Q0 V0 Y6 G
8 _( l* B0 c8 Q7 D
$ e1 `3 Q, c0 L
- 1
) s' @- W& D( w& ~& {9 ]3 m6 S/ e: { 使用 -> 调用此模块的时候可以像端口信号传递一样进行参数传递
9 L0 ], b. n& K; T _3 ]
& M) l) n L! k# `. Q$ ~video_in
" i0 Y( S9 {! u+ {: M% ~8 m
( d" m% q- J9 C% M1 I0 O
( z. t/ Q5 p; g' }. h, H$ I. X$ {
#( .MEM_DATA_BITS ( 64 ),3 Q( }8 E: n) W. W5 v1 I
. v" `! w$ @, e6 d# o
- 6 A8 I2 J& N! ~% u
! O1 m' f" m9 Q( O1 c$ @* D
.INTERLACE ( 1 ): O+ P5 X$ C& V: j% o9 @$ N0 e
1 n0 k2 f' Z& C6 K: |
( A& }8 I' w. i6 H3 q" y( T* S2 r* s/ F E! ^/ x0 h
)
9 c! Y7 y# Q" w' D
% E0 e: C- N \
0 x; y$ [7 P/ x5 T' a% ~1 W3 P/ z: t/ B* e; S2 n' ^& K7 \
u_video_in (- G6 d9 O* j; @7 ?
2 Y( T, v7 T# s
% k a0 Y) b6 d( N
% R5 F2 m; R% c! J% Y1 y .clk (clk_50m),% }. I# L$ o7 `! J" M. D" s9 t( h
, B0 f* w$ a5 D/ \6 r
( m& W6 {: m. n$ e P" v7 a2 @" q9 y: b) d1 V
.rst_n (rst_n),
. u) X1 K2 P6 n8 P* A1 _% S1 d S) \0 l3 R# s
- ) [' P9 ?" c% M& \9 X. H+ h" x- m
; e+ M) u4 z. x' V4 k# z! ^: g
, e3 B; a `1 z) L+ J" r/ J# ]+ w, m1 ~0 a0 P: m* @9 h( {- S' S
- E- X6 c5 C. R* L9 U) B& E
, n* n5 C ]6 R; `- m0 G
.burst_finsh (burst_finsh)
- h% x4 ^3 W/ i( O2 V4 g7 B7 T7 n9 ]" @; ]
9 h, S l: V; v; h2 H% g! D
% p6 Y) t( K3 s3 ?* u2 P! _ );2 O$ `) M: Y/ J! k _1 ^
" y6 U. D6 F7 Y9 h. x+ @0 K1 ]) E' j$ b! y/ G
(3) localparam:
" ^7 a2 _0 x" Y& Q9 a) Y 概念:本module内有效的定义,不可用于参数传递;; b& {$ ~; k i X C4 d
localparamcannot be used within the module port parameter list.
; B5 f8 }5 j3 g) P7 j& k 一般情况下,状态机的参数都是用localparam的。
! g' P0 _, U, F2 T; j/ |: D: {* ~! z1 P
举例:
+ E# V/ [9 ~( J
+ k2 R; B) h3 q; j' f$ ]) r9 b, K4 `7 D9 h* }4 e* @1 F9 ]% x
localparam BURST_LEN = 10'd64; /一次写操作数据长度 /" S" l# q) u" H9 w8 o$ ]6 ]
5 L/ m- f7 k7 ]/ S+ \1 w8 ?0 e
- ) _* q1 E: ~5 ]( q! }
/ J0 _5 q6 F9 p8 e8 l7 b, ^ N- d( g
) j" s9 e! X2 a' S3 u5 r" A/ w0 c
- ) G! v. _3 v6 r" w4 |2 g
7 M+ ?7 n1 G8 f& P localparam BURST_IDLE = 3'd0; /状态机状态:空闲 /
) y4 @ [9 A* M1 m( n
. p/ @7 c* H, i' }1 a
. ^: T9 k3 M" p! t2 Q
# x/ ?, ~# |7 v1 g localparam BURST_ONE_LINE_START = 3'd1; /状态机状态:视频数据一行写开始 /$ I# `# ?! E J3 ~
- {2 T4 h; O3 o: E
- ! @8 T, g- M1 w& H+ ^5 j. H
/ K4 k% X/ e2 K, ^& o) \ localparam BURSTING = 3'd2; /状态机状态:正在处理一次ddr2写操作 /
6 Q8 I' M5 y0 E! p4 E" b% Y, S' J' U" u9 G/ ^$ O
4 d! _% ]; T; R7 ]% O" p
0 D+ w, F7 n$ y2 {9 D/ i7 [$ w localparam BURST_END = 3'd3; /状态机状态:一次ddr2写操作完成/! k( I6 @' `2 X- F2 F0 T' k$ Q4 w
) l" H4 Q' x3 m" b# t
- / ?4 b# I% @7 g* y+ O
) ~7 q4 S& G x6 e
localparam BURST_ONE_LINE_END = 3'd4; /状态机状态:视频数据一行写完成/
' L$ M' s: g+ d
# ?) I# |9 B( _# c" i - 3 n% S7 n( z8 n: u
/ j( A, N% G m* ^/ d5 z' @
" Z) S, c6 I6 M9 b3 S
1 P# Z5 z# X7 P% z% V Q
& u& F0 D" w. o+ W2 n) b1 f
0 U0 @2 Y3 `" K2 j reg[2:0] burst_state = 3'd0; /状态机状态:当前状态 /
4 p2 ~* k' ]5 W" a/ g* t- D* i1 ~9 r, c* d8 ?- u( ?2 |
9 P3 C# I5 |$ [, U8 E0 _1 \
# X. r* F+ \7 i reg[2:0] burst_state_next = 3'd0; /状态机状态:下一个状态/
1 [$ P7 S4 c. u- t! F0 p6 E
( [& a* O3 j1 r5 a; g' m5 }5 Q+ `2 t
& q! E. y- o. U. ~+ S
|