• 编译预处理命令--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

    仿真图:

     

    复合预期效果。

      

  • 相关阅读:
    Python自学之乐-python中break continue exit() pass浅析
    Python自学之乐-Python字典实现简单的三级菜单
    Python自学之乐-浅析Python的深浅拷贝
    百度云服务器允许外网访问
    svg究竟是什么?
    基础知识之SQL
    基础知识之html/css/js
    vue基础知识
    数据库基础知识
    Windows 知识基础
  • 原文地址:https://www.cnblogs.com/fhyfhy/p/4549835.html
Copyright © 2020-2023  润新知