- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Verilog HDL 语言
2.2 层 次 建 模
【例2-3】 实现一个1位全加器。
1位全加器的Verilog HDL实现代码如下:
/*以下为全加器顶层模块*/
module f_adder(ain,bin,cin,cout,sum);
output cout,sum;
input ain,bin,cin;
wire ain,bin,cin,cout,sum;
wire d,e,f;
h_adder u0(ain,bin,d,e);
h_adder u1(e,cin,f,sum);
or2a u2(d,f,cout);
endmodule
/*以下为半加器模块*/
module h_adder(a,b,co,so);
output co,so;
input a,b;
wire a,b,co,so,bbar;
and and2(co,a,b);
not not1(bbar,b);
xnor xnor2(so,a,bbar);
endmodule
/*以下为或门模块*/
module or2a(a,b,c);
output c;
input a,b;
wire a,b,c;
assign c=a | b;
endmodule
程序说明:
(1) 语句assign c=a | b; 中,“|”是按位或运算符,其功能是将a与b按位或的结果赋给信号c。
(2) 语句wire a,b,c; 中,wire是线网数据类型,表示a、b、c是线网,是硬件单元之间的连接。
(3) 一个Verilog HDL模块内部的实现方式有多种。本例中,在或门模块内部使用了数据流语句assign;在半加器模块内部调用了基本逻辑门原语;在全加器模块内部调用了半加器模块和或门模块。
(4) 在全加器模块中有两处调用了半加器:h_adder u0(ain,bin,d,e);和h_adder u1(e,cin,f,sum);。每次调用均给出一个唯一的实例名,而且调用时端口列表名称不同。在Verilog HDL设计中,在模块调用的时候,可以按顺序将模块定义的端口与外部环境中的信号连接起来,这种方法称为“按顺序连接”。h_adder u0(ain,bin,d,e);调用将ain、bin、d、e分别与模块定义中的端口a、b、co、so连接;h_adder u1(e,cin,f,sum);调用将e、cin、f、sum分别与模块定义中的端口a、b、co、so连接。
【例2-4】 二选一数据选择器示例。
module mux21a(a,b,s,y);
input wire a,b,s;
output reg y;
always @(a,b,s)
if(s==1) y=b;
else y=a;
endmodule
程序说明:
(1) 在模块中,输入端口只能为wire类型,输出端口可以为wire类型,也可以为reg类型。通常情况下,如果输出端口在always语句中使用,则必须声明为reg类型。
(2) ?if(s==1) y=b; else y=a;为条件语句结构,表达的意思是当s为1时y=b,否则y=a。条件语句只能用在always语句中。
【例2-7】 设计参数型N位加法器。
module add_N( X, Y, sum, co);
parameter N=4;
input [N-1: 0] X, Y;
output [N-1: 0] sum;
output co;
assign { co, sum } = X + Y;
endmodule
//16位加法器只需要调用参数型N位加法器即可
module add_16(X, Y, s, c);
input [15 : 0] X, Y;
output [15 : 0] s;
output c;
add_N #(16) add16(X, Y, s, c);
endmodule
//8位加法器只需要调用参数型N位加法器即可
module add_8(X, Y, s, c);
input [7 : 0] X, Y;
output [7 : 0] s;
output c;
add_N add8(X, Y, s, c);
defparam add8.N=8;
endmodule
程序说明:
(1) 在调用add_N模块时,可用#(16)使参数N的值变为16,从而使模块功能变为16位加法器,具体实现语句为add_N #(16) add16(X, Y, s, c);。
(2) 也可以使用defparam来改变参数。用后缀改变引用模块的参数要用被引用模块的实例名作为参数的前缀,如add8.N=8,从而使被引用模块的功能变为8位加法器。具体实现语句为:add_N a
文档评论(0)