一、參数映射
參数映射的功能就是实现參数化元件。所谓的”參数化元件“就是指元件的某些參数是可调的,通过调整这些參数从而可实现一类结构类似而功能不同的电路。在应用中。非常多电路都可採用參数映射来达到统一设计。如计数器、分频器、不同位宽的加法器以及不同刷新频率的VGA视频接口驱动电路等。
參数传递
參数传递就是在编译时对參数又一次赋值而改变其值。
传递的參数是子模块中定义的parameter,其传递方法有以下两种。
- 时钟”#“符号
在同一模块中使用”#“符号。參数赋值的顺序必须与原始模块中进行參数定义的顺序同样,并非一定要给全部的參数都赋予新值,但不同意跳过不论什么一个參数。即使是保持不变的值也要写在对应的位置。
module #(parameter1, parameter2) inst_name(port_map);
module_name #(.parameter_name(para_value), .parameter_name(para_value)) inst_name(port_map);
例:通过”#“字符实现一个模值可调的加1计数器
module cnt( input clk, input rst, output reg[15:0] cnt_o ); //定义參数化变量 parameter[15:0] Cmax = 1024; always @(posedge clk or negedge rst) begin if(!rst) cnt_o <= 0; else if(cnt_o == Cmax) cnt_o <= 0; else cnt_o <= cnt_o + 1; end endmodule
module param_counter( input clk, input rst, output [15:0] cnt_o ); //參数化调用。利用#符号将计数器的模值10传入被调用模块 cnt #10 inst_cnt( .clk(clk), .rst(rst), .cnt_o(cnt_o) ); endmodule
- 使用defparamkeyword
defparamkeyword能够在上层模块去直接改动下层模块的參数值。从而实现參数化调用。其语法格式例如以下:
defparam heirarchy_path.paramer_name = value;
这样的方法与例化分开,參数须要写绝对路径来指定。
參数传递时各个參数值的排列次序必须与被调用模块中各个參数的次序保持一致。而且參数值和參数个数也必须同样。
假设仅仅希望对被调用模块内的个别參数进行更改,所有不须要更改的參数值也必须按相应參数的顺序在參数值列表中所有列出(原值拷贝)。
使用defparam语句进行又一次赋值时必须參照原參数的名字生成成分级參数名。
例:通过”defparam“实现一个模值可调的加1计数器。
module param_counter( input clk, input rst, output [15:0] cnt_o ); //參数化调用,利用#符号将计数器的模值10传入被调用模块 cnt inst_cnt( .clk(clk), .rst(rst), .cnt_o(cnt_o) ); //同过defparam改动參数 defparam inst_cnt.Cmax = 12; endmodule
二、寄存器类型
寄存器变量,都有“寄存性”,即在接手下一次赋值前。将保持原值不变。寄存器型变量没有强度之分,且全部寄存器类变量都必须明白给出类型说明(无缺省状态)。寄存器数据类型这里仅介绍两种经常使用类型。
- reg:经常使用的寄存器型变量。用于行为描写叙述中对寄存器类的说明,由过程赋值语句赋值;
- Integer: 32位带符号整型变量
1、reg寄存器类型
寄存器数据类型reg是最常见的数据类型。寄存器能够取随意长度。reg型数据的缺省值是未知的,reg型数据能够为正值或负值。
但当一个reg型数据是一个表达式中的操作数时,它的值被当无符号值,即正值。
假设一个4位的reg型数据被写入-1,在表达式中运算时,其值被觉得是+15。比如:
reg [3:0] Comb;
Comb = -2; //Comb的值为14(1110),1110是-2的补码
2、integer寄存器类型
2、integer寄存器类型
整数寄存器包括整数值。
整数寄存器能够作为普通寄存器使用。使用整数型说明形式例如以下:
integer integer1, integer2,......integerN[msb:lsb];
integer Hist[3:6]; //一组四个寄存器
一个整数型寄存器可存储有符号数。而且算术操作符提供2的补码运算结果。整数不能作为向量訪问。比如,对于上面的整数B的说明,B[6]和B[20:10]是非法的。一种截取位值的方法是将整数赋值给一般的reg类型变量,然后从中选取对应的位。例如以下:
reg [31:0] Breg;
integer Bint;
Breg = Bint;
上例说明了假设通过简单的赋值将整数装换为位向量。类型转型自己主动完毕。不必使用特定的函数。
从位向量到整数的转换也能够通过赋值完毕。比如:
integer J;
reg [3:0] Bcq;
J = 6; //J的值为32‘b0000...00110
Bcq = J; //Bcq的值为4'b0110
Bcq = 4'd0101;
J = Bcq; //J的值为32’b0000...00101
J = -6; // J的值为32‘b1111...11010
Bcq = J ; //Bcq的值为4'b1010