找回密码
 注册
关于网站域名变更的通知
查看: 863|回复: 1
打印 上一主题 下一主题

FPGA --- Verilog基础知识(`define、parameter、localparam三者的区别及举例)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-8-2 15:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-12 17:04 , Processed in 0.156250 second(s), 24 queries , Gzip On.

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

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

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