[ch5]Verilog HDL 设计初步
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Verilog HDL 设计初步
电 子 信 息 通 信 学 科
5.1 Verilog HDL简介 简
• Verilog HDL是一种硬件描述语言,可以在算法级、门级 HDL是一种硬件描述语言 可以在算法级、 是一种硬件描述语言, 到开关级的多种抽象设计层次上对数字系统建模。 到开关级的多种抽象设计层次上对数字系统建模。 • Verilog HDL可以描述设计的行为特性、数据流特性、结 HDL可以描述设计的行为特性 数据流特性、 可以描述设计的行为特性、 构组成以及包含响应监控和设计验证方面的时延和波形产 生机制,用这种语言编写的模型能够使用Verilog HDL仿真 生机制,用这种语言编写的模型能够使用Verilog HDL仿真 器进行验证。 器进行验证。 • Verilog HDL从C语言中继承了多种操作符和结构,所以从 HDL从 语言中继承了多种操作符和结构, 形式上看Verilog HDL和 语言有很多相似之处。 形式上看Verilog HDL和C语言有很多相似之处。 • HDL: Hardware Description Language(硬件描述语言) Language(硬件描述语言 硬件描述语言) • Verilog HDL, VHDL
5
Verilog HDL语言的特点 语言的特点
•/ 户 义 语(UDP)创建 灵 / ) 。 户 义 逻辑, 逻辑: 组 逻辑, 可 时 逻辑: 可 过编 语 机 进 扩 Verilog HDL语 语 。 语可 口( 口(PLI) )
• Verilog HDL程序文件的后缀都是“.v”,假如为加法器 HDL程序文件的后缀都是 .v” 程序文件的后缀都是“ 建模时创建了一个名为adder的文件, adder的文件 建模时创建了一个名为adder的文件,那么这个文件就是 adder.v。每个.v .v文件里可以有一个或几个模块的描述程 adder.v。每个.v文件里可以有一个或几个模块的描述程 序。
21
Verilog HDL语言的特点 语言的特点
• <定义>是一段程序,用来指定数据对象为寄存器型、存储 定义>是一段程序,用来指定数据对象为寄存器型、 器型、线型以及过程块,诸如函数块和任务块( 器型、线型以及过程块,诸如函数块和任务块(说明这个 模块内部都有什么); 模块内部都有什么); • <模块条目>是说明这个模块要做什么的语句; 模块条目>是说明这个模块要做什么的语句; • 标识模块结束的endmodule之后没有分号。 标识模块结束的endmodule之后没有分号。 endmodule之后没有分号
20
Verilog HDL语言的特点 语言的特点
• module 模块名(端口1,端口2,端口3,端口n); 模块名(端口1,端口2,端口3,端口n 1,端口2,端口3,端口 • 定义> <定义> • 模块条目> <模块条目> • endmodule • <模块名>是模块惟一的标识符(模块的名称); 模块名>是模块惟一的标识符(模块的名称); • <端口列表>是输入、输出和双向端口的列表,这些端口用 端口列表>是输入、输出和双向端口的列表, 来与其他模块进行连接(不妨理解为集成电路的引脚, 来与其他模块进行连接(不妨理解为集成电路的引脚,是 用来和其他电路连接的); 用来和其他电路连接的);
14
主程序( 主程序(counter4.v)
15
调试程序( 调试程序(tb_counter4.v)
16
时序仿镇( 时序仿镇(time simulation)
17
延迟( 延迟(time delay)
18
5.3 Verilog HDL模块的结构 模块的结构
• 模块在语言形式上是以关键词module开始,以关键词 模块在语言形式上是以关键词module开始, module开始 endmodule结束的一段程序 结束的一段程序。 endmodule结束的一段程序。 • 模块的实际意义是代表硬件电路上的逻辑实体(即实现特 模块的实际意义是代表硬件电路上的逻辑实体( 定逻辑功能的一组电路), ),其范围可以从简单的门到整个 定逻辑功能的一组电路),其范围可以从简单的门到整个 大的系统,比如计数器、存储子系统、微处理器等; 大的系统,比如计数器、存储子系统、微处理器等; • 每个模块都实现特定的功能(一般来说最底层模块的功能 每个模块都实现特定的功能( 都比较简单); 都比较简单); • 模块的描述方式有行为建模和结构建模(或二者结合)之 模块的描述方式有行为建模和结构建模(或二者结合) 分;
NAND NAND1(in1, in2, w1); //调用(实例化)一个NAND子 模块 • NAND NAND2(w1, w1, out); //再调用(实例化)一个NAND 子模块 • endmodule // AND模块结束
26
• 这个AND模块含有两个NAND模块实例,分别是NAND1和NAND2,通过内 这个AND模块含有两个NAND模块实例,分别是NAND1和NAND2, AND模块含有两个NAND模块实例 NAND1 部连线w1连接起来,就可以实现与门的逻辑功能。 w1连接起来 部连线w1连接起来,就可以实现与门的逻辑功能。 • 调用模块实例的一般形式为: 调用模块实例的一般形式为: • <模块名><参数列表><实例名>(<端口列表>); 模块名><参数列表><实例名>(<端口列表>); ><参数列表><实例名>(<端口列表 • 其中,<模块名>是要调用子模块的名称,本例中要调用的是NAND;< 其中, 模块名>是要调用子模块的名称,本例中要调用的是NAND; NAND 参数列表>是传输到子模块的参数值, 参数列表>是传输到子模块的参数值,参数传递的典型应用是定义门 级时延,但是本例并未使用; 实例名> 级时延,但是本例并未使用;<实例名>是把子模块调用过来后对它的 命名,本例分别给两个子模块命名为NAND1 NAND2; 端口列表> NAND1和 命名,本例分别给两个子模块命名为NAND1和NAND2;<端口列表>是实 现子模块连接并实现高层模块功能的关键,如图1 所示,AND模块的 现子模块连接并实现高层模块功能的关键,如图1-3所示,AND模块的 两个输入in1 in2分别作为子模块NAND1的两个输入 AND模块内部连 in1和 分别作为子模块NAND1的两个输入, 两个输入in1和in2分别作为子模块NAND1的两个输入,AND模块内部连 w1成为子模块NAND1的一个输出和NAND2的两个输入 AND模块的输 成为子模块NAND1的一个输出和NAND2的两个输入, 线w1成为子模块NAND1的一个输出和NAND2的两个输入,AND模块的输 出端out作为子模块NAND2的输出。 out作为子模块NAND2的输出 出端out作为子模块NAND2的输出。
6
5.2 Verilog HDL设计举例 设计举例
reset
clk
4位计数器 位计数器
out
out <= out+1
7
4位计数器的 位计数器的Verilog HDL 编程 位计数器的
module counter4 (out, reset, clk); input clk; input reset; // input clk, reset; output [3:0] out; reg [3:0] out;
11
延 迟 (time delay)
12
RTL结果 结果
13
仿真程序( 仿真程序(test bench)
`timescale 1ns/1ns //`include “counter4.v” module tb_counter4; reg clk, reset; wire [3:0] out; parameter DELAY=100; counter4 CNT4 (.out(out), .reset(reset), .clk(clk)); always #(DELAY/2) clk=~clk; initial begin clk=0; reset=0; #DELAY reset=1; #DELAY reset=0; #(DELAY*20) $finish; end //initial $monitor ($time,,,”clk=%d reset=%d out=%d”, clk, reset,out); endmodule
3
Verilog 与C语 语
C语言 function If-then-else for while case break define printf int …
较
Verilog HDL语言 module, function If-then-else for while case break define printf int …
in1 in2 NAND out
//NAND模块结束
in1 in2 out
23
块调
• 在做模块划分时经常会出现这种情形:某个大的模块中包 在做模块划分时经常会出现这种情形: 含了一个或多个功能子模块。 HDL是通过 是通过“ 含了一个或多个功能子模块。Verilog HDL是通过“模块 调用”或称为“模块实例化” 调用”或称为“模块实例化”的方式实现这些子模块与高 层模块的连接的。 层模块的连接的。 • [例1-2] 为与门建模。通过将一个NAND门的输出连到另一 为与门建模。通过将一个NAND NAND门的输出连到另一 NAND门的两个输入上可得到一个与门 门的两个输入上可得到一个与门, 个NAND门的两个输入上可得到一个与门,可以把这个与门 看作“顶层”模块, 中的NAND NAND模块可以看作是本例 看作“顶层”模块,例1-1中的NAND模块可以看作是本例 的子模块。 所示为本例示意图。 的子模块。图1-3所示为本例示意图。
24
AND i 块
AND
in1 w1
NAND1 NAND2
out
in2
25
• module AND(in1, in2, out); // AND模块 • input in1, in2; // 两个输入端口in1和in2 • output out; // 一个输出端口out • • wire w1; // 一个模块内部连线wire
4
Verilog HDL语言的特点 语言的特点
• 既适 可综 可综 • 设计, 电 设计, 可胜 可胜 电 与系统 真
系统 个层 对 设计 系统加 传输级( 传输级(RTL) ) 为级 , 对设计规 加
,从开关级,门级 从开关级, 可 胜 , 时语
• Verilog HDLe 为 e 语句, 条件语句,赋值语句和循环 与软件高 件高级语 语句 , 类 与软件高级语 , 学习 • 内 各种 各种 逻辑门, 逻辑门, and, or, nand“ , 可 , , “ 进 门级结构 : 内 各种开关级 件, pmos, nmos, cmos 各种开关级 件, “ , 可进 开关级 建
22
( NAND i 块 )
module NAND(in1, in2, out); //NAND模块 input in1, in2; //两个输入端口in1和in2 output out; //一个输出端口out assign out = ~(in1 & in2); // //连续赋值语句 endmodule
19
Verilog HDL语言的特点 语言的特点
• 模块之间是并行运行的; 模块之间是并行运行 并行运行的 • 模块是分层的,高层模块通过调用、连接低层模块的实例 模块是分层的,高层模块通过调用、 分层的 来实现复杂功能; 来实现复杂功能; • 各模块连接完成整个系统需要用一个顶层模块(Top各模块连接完成整个系统需要用一个顶层模块(Topmodule)。 module)。 • • • • 系统的设计可以按下面3 步骤进行: 系统的设计可以按下面3个步骤进行: 进行 把系统划分成模块; (1)把系统划分成模块; 规划各模块的接口; (2)规划各模块的接口; 对模块编程并连接各模块完成系统设计。 (3)对模块编程并连接各模块完成系统设计。
always @(posedge clk) begin if (reset) out<=0; else out <= out+1; end endmodule
8
编 &功能仿真(function simulation) 功能仿真
9
设 计 clk, reset(hand make) (
10
时 序 仿 真 结 果 (time log HDL程序文件的后缀都是“.v”,假如为加法器 HDL程序文件的后缀都是 .v” 程序文件的后缀都是“ 建模时创建了一个名为adder的文件, adder的文件 建模时创建了一个名为adder的文件,那么这个文件就是 adder.v。每个.v .v文件里可以有一个或几个模块的描述程 adder.v。每个.v文件里可以有一个或几个模块的描述程 序。
电 子 信 息 通 信 学 科
5.1 Verilog HDL简介 简
• Verilog HDL是一种硬件描述语言,可以在算法级、门级 HDL是一种硬件描述语言 可以在算法级、 是一种硬件描述语言, 到开关级的多种抽象设计层次上对数字系统建模。 到开关级的多种抽象设计层次上对数字系统建模。 • Verilog HDL可以描述设计的行为特性、数据流特性、结 HDL可以描述设计的行为特性 数据流特性、 可以描述设计的行为特性、 构组成以及包含响应监控和设计验证方面的时延和波形产 生机制,用这种语言编写的模型能够使用Verilog HDL仿真 生机制,用这种语言编写的模型能够使用Verilog HDL仿真 器进行验证。 器进行验证。 • Verilog HDL从C语言中继承了多种操作符和结构,所以从 HDL从 语言中继承了多种操作符和结构, 形式上看Verilog HDL和 语言有很多相似之处。 形式上看Verilog HDL和C语言有很多相似之处。 • HDL: Hardware Description Language(硬件描述语言) Language(硬件描述语言 硬件描述语言) • Verilog HDL, VHDL
5
Verilog HDL语言的特点 语言的特点
•/ 户 义 语(UDP)创建 灵 / ) 。 户 义 逻辑, 逻辑: 组 逻辑, 可 时 逻辑: 可 过编 语 机 进 扩 Verilog HDL语 语 。 语可 口( 口(PLI) )
• Verilog HDL程序文件的后缀都是“.v”,假如为加法器 HDL程序文件的后缀都是 .v” 程序文件的后缀都是“ 建模时创建了一个名为adder的文件, adder的文件 建模时创建了一个名为adder的文件,那么这个文件就是 adder.v。每个.v .v文件里可以有一个或几个模块的描述程 adder.v。每个.v文件里可以有一个或几个模块的描述程 序。
21
Verilog HDL语言的特点 语言的特点
• <定义>是一段程序,用来指定数据对象为寄存器型、存储 定义>是一段程序,用来指定数据对象为寄存器型、 器型、线型以及过程块,诸如函数块和任务块( 器型、线型以及过程块,诸如函数块和任务块(说明这个 模块内部都有什么); 模块内部都有什么); • <模块条目>是说明这个模块要做什么的语句; 模块条目>是说明这个模块要做什么的语句; • 标识模块结束的endmodule之后没有分号。 标识模块结束的endmodule之后没有分号。 endmodule之后没有分号
20
Verilog HDL语言的特点 语言的特点
• module 模块名(端口1,端口2,端口3,端口n); 模块名(端口1,端口2,端口3,端口n 1,端口2,端口3,端口 • 定义> <定义> • 模块条目> <模块条目> • endmodule • <模块名>是模块惟一的标识符(模块的名称); 模块名>是模块惟一的标识符(模块的名称); • <端口列表>是输入、输出和双向端口的列表,这些端口用 端口列表>是输入、输出和双向端口的列表, 来与其他模块进行连接(不妨理解为集成电路的引脚, 来与其他模块进行连接(不妨理解为集成电路的引脚,是 用来和其他电路连接的); 用来和其他电路连接的);
14
主程序( 主程序(counter4.v)
15
调试程序( 调试程序(tb_counter4.v)
16
时序仿镇( 时序仿镇(time simulation)
17
延迟( 延迟(time delay)
18
5.3 Verilog HDL模块的结构 模块的结构
• 模块在语言形式上是以关键词module开始,以关键词 模块在语言形式上是以关键词module开始, module开始 endmodule结束的一段程序 结束的一段程序。 endmodule结束的一段程序。 • 模块的实际意义是代表硬件电路上的逻辑实体(即实现特 模块的实际意义是代表硬件电路上的逻辑实体( 定逻辑功能的一组电路), ),其范围可以从简单的门到整个 定逻辑功能的一组电路),其范围可以从简单的门到整个 大的系统,比如计数器、存储子系统、微处理器等; 大的系统,比如计数器、存储子系统、微处理器等; • 每个模块都实现特定的功能(一般来说最底层模块的功能 每个模块都实现特定的功能( 都比较简单); 都比较简单); • 模块的描述方式有行为建模和结构建模(或二者结合)之 模块的描述方式有行为建模和结构建模(或二者结合) 分;
NAND NAND1(in1, in2, w1); //调用(实例化)一个NAND子 模块 • NAND NAND2(w1, w1, out); //再调用(实例化)一个NAND 子模块 • endmodule // AND模块结束
26
• 这个AND模块含有两个NAND模块实例,分别是NAND1和NAND2,通过内 这个AND模块含有两个NAND模块实例,分别是NAND1和NAND2, AND模块含有两个NAND模块实例 NAND1 部连线w1连接起来,就可以实现与门的逻辑功能。 w1连接起来 部连线w1连接起来,就可以实现与门的逻辑功能。 • 调用模块实例的一般形式为: 调用模块实例的一般形式为: • <模块名><参数列表><实例名>(<端口列表>); 模块名><参数列表><实例名>(<端口列表>); ><参数列表><实例名>(<端口列表 • 其中,<模块名>是要调用子模块的名称,本例中要调用的是NAND;< 其中, 模块名>是要调用子模块的名称,本例中要调用的是NAND; NAND 参数列表>是传输到子模块的参数值, 参数列表>是传输到子模块的参数值,参数传递的典型应用是定义门 级时延,但是本例并未使用; 实例名> 级时延,但是本例并未使用;<实例名>是把子模块调用过来后对它的 命名,本例分别给两个子模块命名为NAND1 NAND2; 端口列表> NAND1和 命名,本例分别给两个子模块命名为NAND1和NAND2;<端口列表>是实 现子模块连接并实现高层模块功能的关键,如图1 所示,AND模块的 现子模块连接并实现高层模块功能的关键,如图1-3所示,AND模块的 两个输入in1 in2分别作为子模块NAND1的两个输入 AND模块内部连 in1和 分别作为子模块NAND1的两个输入, 两个输入in1和in2分别作为子模块NAND1的两个输入,AND模块内部连 w1成为子模块NAND1的一个输出和NAND2的两个输入 AND模块的输 成为子模块NAND1的一个输出和NAND2的两个输入, 线w1成为子模块NAND1的一个输出和NAND2的两个输入,AND模块的输 出端out作为子模块NAND2的输出。 out作为子模块NAND2的输出 出端out作为子模块NAND2的输出。
6
5.2 Verilog HDL设计举例 设计举例
reset
clk
4位计数器 位计数器
out
out <= out+1
7
4位计数器的 位计数器的Verilog HDL 编程 位计数器的
module counter4 (out, reset, clk); input clk; input reset; // input clk, reset; output [3:0] out; reg [3:0] out;
11
延 迟 (time delay)
12
RTL结果 结果
13
仿真程序( 仿真程序(test bench)
`timescale 1ns/1ns //`include “counter4.v” module tb_counter4; reg clk, reset; wire [3:0] out; parameter DELAY=100; counter4 CNT4 (.out(out), .reset(reset), .clk(clk)); always #(DELAY/2) clk=~clk; initial begin clk=0; reset=0; #DELAY reset=1; #DELAY reset=0; #(DELAY*20) $finish; end //initial $monitor ($time,,,”clk=%d reset=%d out=%d”, clk, reset,out); endmodule
3
Verilog 与C语 语
C语言 function If-then-else for while case break define printf int …
较
Verilog HDL语言 module, function If-then-else for while case break define printf int …
in1 in2 NAND out
//NAND模块结束
in1 in2 out
23
块调
• 在做模块划分时经常会出现这种情形:某个大的模块中包 在做模块划分时经常会出现这种情形: 含了一个或多个功能子模块。 HDL是通过 是通过“ 含了一个或多个功能子模块。Verilog HDL是通过“模块 调用”或称为“模块实例化” 调用”或称为“模块实例化”的方式实现这些子模块与高 层模块的连接的。 层模块的连接的。 • [例1-2] 为与门建模。通过将一个NAND门的输出连到另一 为与门建模。通过将一个NAND NAND门的输出连到另一 NAND门的两个输入上可得到一个与门 门的两个输入上可得到一个与门, 个NAND门的两个输入上可得到一个与门,可以把这个与门 看作“顶层”模块, 中的NAND NAND模块可以看作是本例 看作“顶层”模块,例1-1中的NAND模块可以看作是本例 的子模块。 所示为本例示意图。 的子模块。图1-3所示为本例示意图。
24
AND i 块
AND
in1 w1
NAND1 NAND2
out
in2
25
• module AND(in1, in2, out); // AND模块 • input in1, in2; // 两个输入端口in1和in2 • output out; // 一个输出端口out • • wire w1; // 一个模块内部连线wire
4
Verilog HDL语言的特点 语言的特点
• 既适 可综 可综 • 设计, 电 设计, 可胜 可胜 电 与系统 真
系统 个层 对 设计 系统加 传输级( 传输级(RTL) ) 为级 , 对设计规 加
,从开关级,门级 从开关级, 可 胜 , 时语
• Verilog HDLe 为 e 语句, 条件语句,赋值语句和循环 与软件高 件高级语 语句 , 类 与软件高级语 , 学习 • 内 各种 各种 逻辑门, 逻辑门, and, or, nand“ , 可 , , “ 进 门级结构 : 内 各种开关级 件, pmos, nmos, cmos 各种开关级 件, “ , 可进 开关级 建
22
( NAND i 块 )
module NAND(in1, in2, out); //NAND模块 input in1, in2; //两个输入端口in1和in2 output out; //一个输出端口out assign out = ~(in1 & in2); // //连续赋值语句 endmodule
19
Verilog HDL语言的特点 语言的特点
• 模块之间是并行运行的; 模块之间是并行运行 并行运行的 • 模块是分层的,高层模块通过调用、连接低层模块的实例 模块是分层的,高层模块通过调用、 分层的 来实现复杂功能; 来实现复杂功能; • 各模块连接完成整个系统需要用一个顶层模块(Top各模块连接完成整个系统需要用一个顶层模块(Topmodule)。 module)。 • • • • 系统的设计可以按下面3 步骤进行: 系统的设计可以按下面3个步骤进行: 进行 把系统划分成模块; (1)把系统划分成模块; 规划各模块的接口; (2)规划各模块的接口; 对模块编程并连接各模块完成系统设计。 (3)对模块编程并连接各模块完成系统设计。
always @(posedge clk) begin if (reset) out<=0; else out <= out+1; end endmodule
8
编 &功能仿真(function simulation) 功能仿真
9
设 计 clk, reset(hand make) (
10
时 序 仿 真 结 果 (time log HDL程序文件的后缀都是“.v”,假如为加法器 HDL程序文件的后缀都是 .v” 程序文件的后缀都是“ 建模时创建了一个名为adder的文件, adder的文件 建模时创建了一个名为adder的文件,那么这个文件就是 adder.v。每个.v .v文件里可以有一个或几个模块的描述程 adder.v。每个.v文件里可以有一个或几个模块的描述程 序。