*******私信博主请加V:FPGA_GO*******
///
1,FPGA_Verilog基础篇:Verilog发展进程-优快云博客
2,FPGA_Verilog基础篇:理解Verilog的四值逻辑-优快云博客
3,FPGA_Verilog基础篇:Verilog中数值的表示-优快云博客
4,FPGA_Verilog基础篇:信号声明类型-优快云博客
5,FPGA_Verilog基础篇:模块的端口声明-优快云博客
6,FPGA_Verilog基础篇:verilog语言的操作符-优快云博客
7,FPGA_Verilog基础篇:verilog基本逻辑运算-优快云博客
8,FPGA_Verilog基础篇:verilog关系操作的逻辑运算实现-优快云博客
9,FPGA_Verilog基础篇:veriolg算术运算-优快云博客
10,FPGA_Verilog基础篇:verilog移位操作-优快云博客
11,FPGA_Verilog基础篇:关系操作符简介-优快云博客
12,FPGA_Verilog基础篇:拼接运算符简介-优快云博客
13,FPGA_Verilog基础篇:verilog数值的位宽扩展规则-优快云博客
14,FPGA_Verilog基础篇:verilog移位与拼接实现-优快云博客
15,FPGA_Verilog基础篇:verilog双向inout接口表示_fpga inout端口-优快云博客
16,FPGA_Verilog基础篇:verilog之锁存器和触发器-优快云博客
17,FPGA_Verilog基础篇:verilog之for循环-优快云博客
18,FPGA_Verilog基础篇:verilog之函数用法-优快云博客
19,FPGA_Verilog基础篇:verilog之任务用法-优快云博客
20,FPGA_Verilog基础篇:verilog之任务与函数用法比较-优快云博客
21,FPGA_Verilog基础篇:verilog之宏define介绍-优快云博客
22,FPGA_Verilog基础篇:verilog之条件编译指令介绍-优快云博客
23,FPGA_Verilog基础篇:verilog之参数parameter介绍-优快云博客
24,FPGA_Verilog基础篇:verilog之本地参数localparam-优快云博客
25,FPGA_Verilog基础篇:verilog之generate生成块-优快云博客
26,FPGA_Verilog基础篇:verilog之常数规则-优快云博客
27,FPGA_Verilog基础篇:verilog中整数运算的位宽和符号规则-优快云博客
28,FPGA_Verilog基础篇:verilog中的字符串表示-优快云博客
29,FPGA_Verilog基础篇:verilog中带整数的算术表达式分析-优快云博客
30(结束篇),FPGA_Verilog基础篇:verilog中的数值运算规则总结-优快云博客
///
参数parameter的作用大体与宏定义类似,用来改变一个模块的局部参数,如信号宽度等。
参数parameter的声明有两种格式:一种是verilog-1995,在模块内部声明;另一种是verilog-2001新增的,在模块名字后面声明,这种方式更加友好。
使用参数时,这两者格式既可以任选其一,亦可以两种都用,但是推荐使用verilog-2001新增的格式。因此以后我们只说parameter的verilog-2001用法,verilog-1995的语法不再介绍。
parameter可以有一个类型(type: signed or unsigned)说明和一个位宽范围(range)说明,其标准格式为:
parameter [ type] [ range ] list_of_param_assignments
先举几个parameter声明的例子:
parameter msb = 7; // defines msb as a constant value 7
parameter e = 25, f = 9; // defines two constant numbers
parameter r = 5.7; // declares r as a real parameter
parameter byte_size = 8,
byte_mask = byte_size - 1;
parameter average_delay = (r + f) / 2;
parameter signed [3:0] mux_selector = 0;
parameter real r1 = 3.5e17;
parameter p1 = 13’h7e;
parameter [31:0] dec_const = 1’b1; // value converted to 32 bits
parameter newconst = 3’h4; // implied range of [2:0]
parameter newconst = 4; // implied range of at least [31:0]
结合上述例子,我们总结一下parameter的类型(type: signed or unsigned)和范围(range)应符合以下规则:
1,参数被赋值后,没有类型或范围定义的参数声明应默认为分配给该参数的值的类型和范围。
2,具有范围定义但没有类型定义的参数应为参数声明的范围且应为无符号。符号和范围不应受参数值覆盖的影响。
3,具有类型定义但没有范围定义的参数应属于声明指定的类型。在被赋值后,带符号的参数应默认为分配给该参数的值的范围。
4,具有类型定义和范围定义的参数声明的符号和范围都是确定好的,参数的符号和范围不受赋值的符号和范围影响。
5,没有范围定义的参数,无论是有符号类型定义还是没有类型定义,都应该有一个隐含的范围,其中 lsb 等于 0,msb 等于分配给参数的值的范围减1。
6,一个没有范围定义的参数,有符号类型说明或没有类型说明,并且分配给它的值的范围是不确定的,那么就应该有一个隐含的范围,lsb 等于 0,msb为 31。
下面举例子说明参数使用的方法,我们以后按照这个格式使用parameter即可:
parameter使用的例子1:
module AAAA#
(parameter MSB=3, LSB=0, DEPTH=4) // These parameters can be overridden
(
input [MSB:LSB] in,
input clk,
output [MSB:LSB] out,
output full, empty
);
……
endmodule
parameter使用的例子2:
module BBBB #
(
parameter A = 8'h11,
parameter B = 8'h08,
parameter C = 8'h00
)(
input axi_tclk ,
output Fifo_full,
output Fifo_empty,
output fifo_cmd_empty
);
……
endmodule
模块调用parameter的例子1:
AAAA #
(
.MSB(MSB3),
.LSB(LSB2),
.DEPTH(DEPTH5)
)
AAAA_inst
(
.in(in),
.clk(clk),
.out(out),
.full(full),
.empty(empty)
);
模块调用parameter的例子2:
BBBB #
(
.A (AAA),
.B (BBB),
.C (CCC)
)
BBBB_inst
(
.axi_tclk (axi_tclk),
.Fifo_full (Fifo_full),
.Fifo_empty (Fifo_empty),
.fifo_cmd_empty (fifo_cmd_empty)
);
在模块实例化时,参数传递同样需要遵循以下规则:
- 对于没有范围和类型的参数,默认使用模块实例时传进来数值的范围和类型
- 对于有范围但没类型定义的参数,就认为参数类型时无符号。模块实例传进来数值的范围和类型要转换成参数的范围和类型。
- 对于没有范围但有类型的参数,就使用参数的类型。模块实例传进来数值的类型要转换成参数的类型。对于符号数,默认使用模块实例传进来数值的范围。
- 对于有范围和类型的参数,模块实例传进来数值的类型和范围要转换成参数的范围和类型。
另外,参数传递还有一个关键字defparam,本来用它十分的简单明了和使用方便,但这个关键字如今被滥用了,所以基本上大家都不使用defparam做参数传递,如今该关键字已经过时,应该抛弃掉,以后就不要用了,相关的用法博主也就不介绍了。
点赞加关注博主(ID:FPGA小飞)的博文,咱们一起学习、一起进步吧~