编译预处理命令--define和ifdef的使用

这里将对常用的预处理命令进行学习。

一、宏定义  ·defined

格式:`defined     宏名      数值

或者 `define      宏名

注意:后面没有‘;‘,和单片机不一样;

二、文件包含处理 ·include

include 的格式在不同的编译器里是不一样的:

在quartus 中为:·include "defien.v"

在Primace中为:  `include "../src/define.v"

另外,一个include只可以指定一个被包含的文件;被包含文件名可以是相对的路径也可以是绝对的路径,如:·include"scr/define.v";

多个include可以出现在同一行,可以出现空格和注释行;

重要:如果文件1包含文件2,文件2要用文件3的部分内用,(方法一)则在文件1中可以用两个include命令分别包含文件2,和文件3,并且文件3出现在文件2之前。这样还有利用文件的包含可以嵌套的特性(方法二)。

图形表示为:

方法一:

方法二:

三、时间尺度 ·timescal

命令格式为: ·timescal    时间单位/时间精度

四、条件编译命令 ·ifdef、`elsif、`else  `endif

条件编译命令指只有满足条件的时候才能编译,也就是选择性对指定的一部分的内容进行编译。

分为两种形式:

(1)’ifdef   宏名 (标识符)

程序1

·endif

(2) `ifdef  宏名  (标识符)

程序段1

·elsif   宏名  (标识符)   (注意:没有e,不是elseif)

程序段2

.............

`else

程序段3

`endif

条件编译命令配合·define 使用,用·define 来定义宏名。注意:·define定义的宏名要在条件声明之前,否则默认为没有声明。

例程:通过·ifdef来改变 cnt_top的值来改变led闪烁的频率。

程序:

    /********************************Copyright**************************************
    **----------------------------File information--------------------------
    ** File name  :ifdef_test.v
    ** CreateDate :2015.05
    ** Funtions   : 测试`ifdef 的用法
    ** Operate on :M5C06N3L114C7
    ** Copyright  :All rights reserved.
    ** Version    :V1.0
    **---------------------------Modify the file information----------------
    ** Modified by   :
    ** Modified data :
    ** Modify Content:
    *******************************************************************************/

     `include "../src/define.v"

    module  ifdef_test(
                                     clk,
                                     rst_n,

                                     led
                                         );
     input          clk;
     input          rst_n;

     output         led;
     reg            led ;
     //---------------------------------------------//

//        `define    div_6

       reg    [7:0]   cnt;
        always @(posedge clk or negedge rst_n)
         begin
          if(!rst_n)
           begin
              cnt <= 0;
            end
          else if(cnt >= `cnt_top)
            begin
              cnt <= 0;
            end
            else  cnt <= cnt + 1;
          end

     always @(posedge clk or negedge rst_n)
     begin
      if(!rst_n)
       begin
          led <= 0;
        end
      else if(cnt == `cnt_top)
        begin
           led = ~led ;
        end
      end 

  wire   [7:0]   a;
  assign  a = `cnt_top;      //寄存`cnt_top的值更直接
    endmodule

用define.v来设置·ifdef

    /********************************Copyright**************************************
    **----------------------------File information--------------------------
    ** File name  :define.v
    ** CreateDate :2015.
    ** Funtions   : ifdef 的声明文件
    ** Operate on :M5C06N3L114C7
    ** Copyright  :All rights reserved.
    ** Version    :V1.0
    **---------------------------Modify the file information----------------
    ** Modified by   :
    ** Modified data :
    ** Modify Content:
    *******************************************************************************/

    `define    div_3      //要放在ifdef 的前面,佛则变异的时候判断为没有声明

  `ifdef      div_6
       `define  cnt_top  2
  `elsif      div_3               //elsif 没有‘e ‘
       `define  cnt_top  4
    `else
       `define  cnt_top  1
    `endif
    

仿真程序:

  module  testbench;

    reg        clk;
    reg        rst_n;

    wire       led;

    ifdef_test  ifdef_test(
                                     .clk,
                                     .rst_n,

                                     .led
                                         );

     parameter tck = 24;
     parameter t = 1000/tck;

     always
       #(t/2) clk = ~clk;

     initial
       begin
            clk = 0;
            rst_n = 0;

            #(15*t)  rst_n = 1;

         end

仿真图:

复合预期效果。

时间: 2024-08-26 01:28:25

编译预处理命令--define和ifdef的使用的相关文章

预处理命令[#define]说明

宏定义 宏定义是对一些常见的变量.字符串等进行定义,被定义的数据在编译会进行自动替换.有时一些变量或字符串被多次使用,当需要修改时,就需要对源文件中它们出现的地方一一修改,效率比较低,而通过宏定义,只需要对定义进行一次修改,就可以实现批量修改,提高效率,或者有时有些数字或字符需要多次输入,而数字或字符又不是很规律时,输入就会比较繁琐且容易出错.通过宏义将为输入和维护带来便利. 定义的格式 #define 标识符 字符串 其中的“#”表示这是一条预处理命令.凡是以“#”开头的均为预处理命令.“de

【C++】预处理指令#define,#ifdef,#ifndef,#endif ...

C/C++预处理指令#define,#ifdef,#ifndef,#endif… https://www.cnblogs.com/zi-xing/p/4550246.html 原文地址:https://www.cnblogs.com/gdut-gordon/p/10922812.html

有预处理命令#define声明一个常数,用以表明1年中有多少秒

#define SECOND_PER_YEAR(60*60*24*356)UL (1)#define 不能以分号结束,括号这使用 (2)这个表达式将使一个十六位机的整型数移出,因此要用到长整型符号L,高速编译器这个常数是长整型的 (3)UL(表示无符号长整型)

编译预处理和动态存储分配(1)

1 编译预处理 C语言中,凡是以“#”号开头的行,都称为“编译预处理”命令行.C语言的预处理命令有:#define, #undef, #include, #if, #else, #elif, #endif, #ifdef, #ifndef, #line, #pragma, #error. 1.1 宏替换 1.1.1 不带参数的宏定义 (1)不带参数的宏定义命令行形式如下: #define 宏名 替换文本 在#define.宏名和宏替换文本之间用空格隔开.例如: #define SIZE 100

C预编译, 预处理, C/C++头文件, 编译控制,

在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征.依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的. 其格式一般为: #Pragma Para 其中Para 为参数,下面来看一些常用的参数. (1)message 参数. Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输

C/C++预处理指令#define,#ifdef,#ifndef,#endif… (转)

本文转自博文C/C++预处理指令#define,#ifdef,#ifndef,#endif….这篇博文写得特别好,特转载. 本文主要记录了C/C++预处理指令,常见的预处理指令如下: #空指令,无任何效果 #include包含一个源代码文件 #define定义宏 #undef取消已定义的宏 #if如果给定条件为真,则编译下面代码 #ifdef如果宏已经定义,则编译下面代码 #ifndef如果宏没有定义,则编译下面代码 #elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码 #en

volatile,可变参数,memset,内联函数,宽字符窄字符,国际化,条件编译,预处理命令,define中##和#的区别,文件缓冲,位域

 1.volatile:要求参数修改每次都从内存中的读取.这种情况要比普通运行的变量需要的时间长. #include <stdio.h> #include <stdlib.h> #include <time.h> void main() { time_t start, end; double res = 0; time(&start);  //获取时间,传递给start //volatile强制每次从内存读取 volatile int i; for (i =

C语言第十一回合:预处理命令的集中营

  [学习目标]   1.         宏定义 2.         文件包括"处理 3.         条件编译 预处理命令:能够改进程序设计的环境.提高编程效率. 其功能主要有三种:宏定义.文件包括.文件编译. ANSI标准定义的C语言预处理指令预览表 A: 宏定义 (a)不带參数的宏定义 格式:#define标识符 字符串 如:#define PI 3.1415926 *标识符被称为:宏名 *在预编译时将宏名替换成字符串的过程为:宏展开. *#define 是宏定义命令 //求圆周长

C++预处理命令

预处理语句是由一系列和预处理相关的命令符组成的.预处理语句以#作为起始标记,其后紧跟预处理命令关键字,之后是空格,空格之后是预处理命令的内容.C++提供多种预处理功能,如宏定义,文件包括,条件编译等. #define 在这个教程的开头我们已经提到了一种预处理指令: #define ,可以被用来生成宏定义常量(defined constantants 或 macros),它的形式是: #define name value 它的作用是定义一个叫做name 的宏定义,然后每当在程序中遇到这个名字的时候