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

时间:2021-07-02 19:39:08

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

一、宏定义  ·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的使用

方法二:

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

三、时间尺度 ·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 [:] cnt;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
cnt <= ;
end
else if(cnt >= `cnt_top)
begin
cnt <= ;
end
else cnt <= cnt + ;
end always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
led <= ;
end
else if(cnt == `cnt_top)
begin
led = ~led ;
end
end wire [:] 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
`elsif div_3 //elsif 没有'e '
`define cnt_top
`else
`define cnt_top
`endif

仿真程序:

  module  testbench;

    reg        clk;
reg rst_n; wire led; ifdef_test ifdef_test(
.clk,
.rst_n, .led
); parameter tck = ;
parameter t = /tck; always
#(t/) clk = ~clk; initial
begin
clk = ;
rst_n = ; #(*t) rst_n = ; end

仿真图:

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

复合预期效果。