编译预处理命令--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之前。这样还有利用文件的包含可以嵌套的特性(方法二)。

图形表示为:

 方法一:

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

方法二:

编译预处理命令--define和ifdef的使用第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

仿真图:

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

复合预期效果。

  

免责声明:文章转载自《编译预处理命令--define和ifdef的使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇kafka 开机自启动HBase的bulkLoad下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

(转)用Eclipse编译你的ROS程序

原地址: http://blog.csdn.net/sujun3304/article/details/18572017 好了,理解了系统各个组件的含义后,还是直接进入程序真刀真枪的从实践中学习吧! 不过首先呢,公欲善其事必先利其器,如果你向我一样不是vim和emacs的粉丝,喜欢eclipse的图形界面的话,这篇文章就是为你准备的。 第一步: 首先确保...

Linux路径名和文件名最大长度限制

UNIX标准对路径名和文件名最大长度限制做出了说明,但其上限值在实际应用长过小,Linux在具体实现时提升了该上限,该限制在Linux的 /usr/include/linux/limits.h 中做出了说明,具体如下: 1 #ifndef _LINUX_LIMITS_H 2 #define _LINUX_LIMITS_H 3 4 #define...

Linux根文件系统分析之init和busybox

Hi,大家好!我是CrazyCatJack。今天给大家讲解Linux根文件系统的init进程和busybox的配置及编译。 先简单介绍一下,作为一个嵌入式系统,要想在硬件上正常使用的话。它的软件组成大概有这三部分:1)bootloader 2)嵌入式系统kernel 3)根文件系统 。这其实非常好理解,类比于PC上的操作系统,首先我们需要类似BIOS的东东...

wait,waitpid学习测试

wait,waitpid学习测试 任务详情 1 用man wait, man waitpid学习wait waitpid的使用 2 写出wait 的测试代码,要能说明你理解了wait 的返回值的每一位的含义 实验步骤 1.用man wait, man waitpid学习wait waitpid的使用 使用man 2 wait可以看到函数原型,其中可以看到在2...

ATL中使用CString

在stdafx.h 中的 #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将是显式的 下添加一下代码即可: #define _WTL_NO_CSTRING #include <atlstr.h> #define _WTL_NO_WTYPES #include <at...

Java虚拟机解释器与JIT编译器

一、JAVA编译相关概念 1、动态编译(dynamic compilation)指的是“在运行时进行编译”;与之相对的是事前编译(ahead-of-time compilation,简称AOT),也叫静态编译(static compilation)。 2、JIT编译(just-in-time compilation)狭义来说是当某段代码即将第一次被执行时进...