可重用设计--使用符号常量和parameter
好的设计习惯会在HDL代码中避免使用“魔鬼数字”,而是尽量采用符号常量。Verilog HDL中,使用关键字localparam声明符号常量
4位全加器的Verilog HDL描述
module adder_carry_hard_lit
(
input wire [3:0] a, b,
output wire [3:0] sum,
output wire cout //进位输出
);
// signal declaration
wire [4:0] sum_ext;
//body
assign sum_ext = {1'b0, a} + {1'b0, b};
assign sum = sum_ext[3:0];
assign cout= sum_ext[4];
endmodule
参数化的全加器描述
module adder_carry_local_par
(
input wire [3:0] a, b,
output wire [3:0] sum,
output wire cout // carry-out
);
// constant declaration
localparam N = 4, //定义总线位宽为N
N1 = N-1;
//内部信号声明
wire [N:0] sum_ext;
//程序主体
assign sum_ext = {1'b0, a} + {1'b0, b};
assign sum = sum_ext[N1:0];
assign cout= sum_ext[N];
endmodule
Verilog HDL提供了一种叫做parameter的机制,可以在模块实例时传递信息给模块。这种机制可以提高模块的通用性和可重用性。通过parameter模块内部参数值可以被修改,大大简化设计过程。通过使用参数,设计者可以设计出通用性更高的模块,提高设计的可重用性。
Verilog 2001,参数声明语法如下
module module_name
#(
parameter parameter_name1 = parameter_value1,//参数声明使用关键字parameter,
… //多个参数声明使用逗号(,)分隔
parameter_namen = parameter_valuen;
)
(
//端口声明
);
参数化的全加器电路
module adder_carry_para
#(parameter N=4)
(
input wire [N-1:0] a, b,
output wire [N-1:0] sum,
output wire cout // carry-out
);
// constant declaration
localparam N1 = N-1;
// signal declaration
wire [N:0] sum_ext;
//body
assign sum_ext = {1'b0, a} + {1'b0, b};
assign sum = sum_ext[N1:0];
assign cout= sum_ext[N];
endmodule
带参数模块的实例
module adder_insta
(
input wire [3:0] a4, b4,
output wire [3:0] sum4,
output wire c4,
input wire [7:0] a8, b8,
output wire [7:0] sum8,
output wire c8
);
//实例一个8位宽的加法器
adder_carry_para #(.N(8)) unit1
(.a(a8), .b(b8), .sum(sum8), .cout(c8));
//实例一个4位宽的加法器
adder_carry_para unit2
(.a(a4), .b(b4), .sum(sum4), .cout(c4));
endmodule
好的设计习惯会在HDL代码中避免使用“魔鬼数字”,而是尽量采用符号常量。Verilog HDL中,使用关键字localparam声明符号常量
4位全加器的Verilog HDL描述
module adder_carry_hard_lit
(
input wire [3:0] a, b,
output wire [3:0] sum,
output wire cout //进位输出
);
// signal declaration
wire [4:0] sum_ext;
//body
assign sum_ext = {1'b0, a} + {1'b0, b};
assign sum = sum_ext[3:0];
assign cout= sum_ext[4];
endmodule
参数化的全加器描述
module adder_carry_local_par
(
input wire [3:0] a, b,
output wire [3:0] sum,
output wire cout // carry-out
);
// constant declaration
localparam N = 4, //定义总线位宽为N
N1 = N-1;
//内部信号声明
wire [N:0] sum_ext;
//程序主体
assign sum_ext = {1'b0, a} + {1'b0, b};
assign sum = sum_ext[N1:0];
assign cout= sum_ext[N];
endmodule
Verilog HDL提供了一种叫做parameter的机制,可以在模块实例时传递信息给模块。这种机制可以提高模块的通用性和可重用性。通过parameter模块内部参数值可以被修改,大大简化设计过程。通过使用参数,设计者可以设计出通用性更高的模块,提高设计的可重用性。
Verilog 2001,参数声明语法如下
module module_name
#(
parameter parameter_name1 = parameter_value1,//参数声明使用关键字parameter,
… //多个参数声明使用逗号(,)分隔
parameter_namen = parameter_valuen;
)
(
//端口声明
);
参数化的全加器电路
module adder_carry_para
#(parameter N=4)
(
input wire [N-1:0] a, b,
output wire [N-1:0] sum,
output wire cout // carry-out
);
// constant declaration
localparam N1 = N-1;
// signal declaration
wire [N:0] sum_ext;
//body
assign sum_ext = {1'b0, a} + {1'b0, b};
assign sum = sum_ext[N1:0];
assign cout= sum_ext[N];
endmodule
带参数模块的实例
module adder_insta
(
input wire [3:0] a4, b4,
output wire [3:0] sum4,
output wire c4,
input wire [7:0] a8, b8,
output wire [7:0] sum8,
output wire c8
);
//实例一个8位宽的加法器
adder_carry_para #(.N(8)) unit1
(.a(a8), .b(b8), .sum(sum8), .cout(c8));
//实例一个4位宽的加法器
adder_carry_para unit2
(.a(a4), .b(b4), .sum(sum4), .cout(c4));
endmodule