在FPGA中,parameter与define都可以用来定义常量,但他们也有区别。
define定义常量涉及到define的作用域问题,不同的仿真编译器、综合工具的解析方式不同。在ISE中,define的作用域为当前文件,但是ISE可以将某个文件的属性设置为global,一旦文件设置为global,则其中的define也会被赋予全局属性。在QUARTUS中没有设置global的操作,但是如果在顶层文件中使用define,则该define也将具有全局属性。所以可在一个文件中所有的default变量都需要在该文件的结尾处进行undef,以确保define的作用域仅限于该文件。
parameter的作用域仅限于在当前文件,所以可以放心使用。
由于鄙人只使用quartus软件,就用quartus写个例子。
module compare(
input clk,
input rst_n,
output out
);
`define a 1
d_ef d_ef1(
.clk(clk),
.rst_n(rst_n),
.D(),
.Q(out)
);
endmodule
module d_ef(
input clk,
input rst_n,
input D,
output reg Q
);
always@(posedge clk or negedge rst_n)
if(!rst_n) Q <= 1'd0;
else Q <= `a;
endmodule
在上面的例子中,compare是顶层文件,d_ef是底层文件,通过输出可以看出,顶层定义的常量a能在底层被调用,所以在顶层使用define定义的常量a具有全局性。此处就不列出parameter的用法了。总之,在定义常量时,使用parameter很可以放心的。