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

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

[复制链接]

该用户从未签到

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

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 u

2、应用举例

(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
  • 1
    ; ^) A! P9 t9 F! C
(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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-19 17:38 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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