《CPLD FPGA设计与应用基础教程》课件第二章.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《CPLD FPGA设计与应用基础教程》课件第二章.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CPLD FPGA设计与应用基础教程 CPLD FPGA设计与应用基础教程课件第二章 CPLD FPGA 设计 应用 基础教程 课件 第二
- 资源描述:
-
1、第2章 Verilog HDL 入门指南LOREM IPSUM DOLOR目 录CONCENT2.1 模块2.2 模块端口及声明2.3 注释2.4 数据流描述2.5 行为级描述2.6 结构体描述2.7 混合描述 2.1 模块GRADUATION THESIS2.1 模块Verilog HDL 是基于模块的设计。模块是 Verilog HDL 语言的基本描述单元。模块是用来描述某个设计的功能或结构及其与其他模块通信的外部端口,与高级软件语言的函数相似。模块的定义比较宽泛。大至可以描述一个系统,小至可以只描述一个基本的逻辑门。整个块的基本语法如下:2.1 模块module 模块名称(端口列表);/
2、端口定义声明;input,output,inout /内部变数和参数声明 wire,reg,function,task,parameter,define,等等 /模块功能实现 数据流描述:assign 行为级描述:initial,always 结构化描述:门级例化、UDP 例化、模块例化endmodule2.1 模块【可以看出,整个模块由关键词“moduleendmodule”包含。每个 module 关键词后紧跟着模块名称,并会注明整个模块对外的端口。模块内部首先会进行端口声明和内部变量和参数说明,当然,说明可以放置到模块内部的任何位置,但为了模块的描述清晰以及可读性,通常会要求端口声明和内
3、部变量及参数说明放到执行语句前。接着根据设计的需求,采用数据流、行为级或者结构化模型来对模块功能进行具体实现,也可能同时会使用到三种模型。最后,需要以 endmodule 结束,表示整个 module 设计完毕。【例 2-1】采用 Verilog HDL 实现一个二选一选择器module mux2to1(out,s,a,b);input s,a,b;output out;asssign out#2=s?a:b;endmodule2.1 模块任例 2-1 为采用 Verilog HDL 实现的一个二选一选择器,综合后生成的 RTL 电路如图 2-1所示。Mux2to1 为该模块的模块名称。该模块
4、共有四个端口:两个输入端口 a 和 b、一个选择信号端口 s 及一个输出端口 out。端口默认为 1 位位宽。整个模块没有对各个端口进行数据类型说明,因此默认为线网数据类型。整个模块通过一个连续赋值语句完成,描述该电路在选择信号 s 为高时,把输入信号 a传送给输出 out,否则传送输入信号 b 给 out。Verilog HDL 可以采用多种方式来实现一个模块的功能。如图 2-2 所示。2.2 模块端口及声明GRADUATION THESIS2.2 模块端口及声明在模块名之后,一般会有以小括号包围的一个端口列表,端口与端口之间用“,”隔开。端口列表结束后,在小括号外以“;”结束。需要注意的是
5、,并不是所有的模块都需要有端口列表,比如顶层仿真模块就不需要端口列表因为顶层仿真模块是一个封闭系统,端口已经在内部实例化。端口通常有三种类型:input输入端口,信号从该端口流入模块;output输出端口,该端口的信号由模块驱动输出;inout双向端口,该端口的信号既可以由外部驱动,也可以由模块驱动。端口信号通常需要声明位宽,如果没有声明,则默认为 1 位位宽端口。2.2 模块端口及声明【例 2-2】端口声明端口类型 信号宽度 信号名 示例input 4:0 a_in;/5b10101inout b;/1b1output 1:0 c_out;/2h3从 Verilog HDL 2001 标准开
6、始,为了简化端口声明,可以允许把端口声明写入端口列表中,并且可以针对每个信号进行注释。需要注意的是,端口列表中是不允许出现“;”。例 2-3为例 2-1 修改后的端口声明。【例 2-3】端口声明module mux2to1(input s,input a,input b,output out);2.2 模块端口及声明5.2.2 函数调用函数调用对于模块中的信号,包括端口信号,都需要进行变量声明。如果没有显式声明,则默认为 wire 线网类型。例 2-1 到 2-3 中的各端口信号,均没有显式进行变量声明,则暗示为 wire线网类型。线网类型的关键词为 wire。wire 型的线网是不具备数据存
7、储功能的,只能被连续赋值,用于数据流描述。reg 类型的信号类型可以用来存储最后一次赋给它的值。因而它一般用来做行为级描述。信号变量声明与端口类型声明相似,也是声明信号类型和位宽,如果没有声明位宽,则默认为 1 位。2.2 模块端口及声明【例 2-4】变数声明端口类型 变量类型 信号/变量宽度 信号/变量名 示例output reg 3:0 out_ff;/4hFoutput 3:0 out_ff;reg 3:0 out_ff;reg d;/1b1 wire 4:0 e;/4h1f例 2-4 中,前三行表示输出端口的变量声明,后面两行表示内部信号的变量声明。在前三行中,第一行把变量类型和端口类
8、型写在一起,其效果和第二、三行分开写的结果一样。但是代码会更加简洁。2.2 模块端口及声明注意:注意:1.Verilog HDL 对于关键词的大小写敏感。所有关键词必须是小写。如:reg 是关键词,但 REG 为普通的信号变量2.定义为 reg 类型的信号不一定会生成寄存器3.尽管信号和内部变量声明只要出现在第一次被调用的语句之前就可以,但代码风格一般要求在执行语句之前就定义好,提高代码的可读性。4.任何一个模块都必须以“endmodule”结束2.3 注释GRADUATION THESIS2.3 注释为了提高代码的可读性,CPLD/FPGA工程师通常在代码设计时会做一定量的代码注释,采用自然
9、文字说明以确保每一个关键代码的设计容易被理解或者注释部分代码以备用。Verilog HDL 提供了两种注释方式:行注释以“/”开始,注释一行中的余下部分;块注释以“/*”开始,以“*/”结束,中间的整个代码逻辑全部被注释,它可以用来注释一行或者多行代码。2.3 注释5.3.1 显示任务显示任务【例 2-5】二选一选择器module mux2to1(input s,/输入选择控制信号input a,/输入信号input b,/输入信号output out/输出信号);/reg out;/采用 always 语句实现二选一选择器 asssign out#2=s?a:b;/*always(s or
10、a or b)out#2=s?a:b;*/endmodule例 2-5 中,既采用了行注释,也采用了块注释。第 2-5 行,采用了行注释,用来说明每个信号的用途。第 6 行行注释主要是说明此 reg 类型寄存器的用途。第 8-10 行采用块注释,注释了一段功能代码,这段功能代码结合第 6 行的代码,可以实现第 7 行代码所能实现的功能。从例 2-5 中也可以看出,reg 类型的信号和变量类型,生成的不一定是寄存器。2.4 数据流描述GRADUATION THESIS2.4 数据流显示在数字电路中,信号经过组合电路逻辑时就像数据在流动,没有任何存储。当输入发生任何变化时,输出也会随着发生相应的变
11、化,该变化可能是立即发生,也可能会经过一定的延时后发生。Verilog HDL 对此数字电路的行为建模称之为数据流描述,采用的是连续赋值语句。【例 2-6】四选一选择器如图 2-3 所示,输入选择信号 s0 是第一级两个二选一选择器的选择信号,s0 是第二级也就是输出级二选一选择器的选择信号,通过 s0 和 s1 的组合,选择 a、b、c、d 四个信号之一输出到输出端口 o。2.4 数据流显示相应的 Verilog HDL 代码如下:timescale 1ns/100psmodule four_to_one_mux(input a,input b,input c,input d,input s
12、0,input s1,output o);wire m0,m1;/数据流描述,连续赋值语句assign m0=s0?a:b;assign m1=s0?c:d;assign o=s1?m0:m1;endmodule采用 Lattice MACH XO3 CPLD,基于 Synplify Pro 综合软件综合后生成的门级网表如图2-4 所示。可以看出,真实的逻辑功能与要达成的设计要求相一致,尽管生成的底层门级单元与图 2-3 不一致这与综合软件和 CPLD/FPGA 芯片有关系。2.4 数据流显示2.4 数据流显示2.4.1 连续赋值语句连续赋值语句从例 2-6 中可以看出,整个设计都是采用组合电
13、路,中间没有任何寄存器,也就是此电路没有任何记忆功能。连续赋值语句采用关键词 assign 来实现,其基本格式如下:assign Destination=Logical Expression;等号右边的逻辑表达式作为赋值的驱动和来源,一旦任何有任何变化,就会立即进行计算,并且把计算得出来的结果立即传送给等号左边的赋值对象。例 2-6 中 four_to_one_mux模块代码中,第 12 行是标准的连续赋值语句,任何 a 和 b 以及 s0 发生变化,会直接进行计算,并且把计算结果立即回馈给 m0。相似的,第 13 和 14 行也是同样的行为。第 12 到 14行的代码是并行的,不存在先来后到
14、的顺序。同样连续赋值语句和行为语句块、例化模块以及其他连续赋值语句是并行进行的,不会因为哪家语句的顺序改变而导致执行的时间改变2.4 数据流显示连续赋值语句有时可以作为线网类型声明的一部分,采用线网说明赋值,这样就省去了关键词 assign。如例 2-7 所示。【例 2-7】线网说明赋值wire out=in1&in2;等效于:wire out;assign out=in1&in2;连续赋值语句还经常采用有条件的连续赋值方式,其基本格式如下:assign Destination=Condition?1st_Expression:2nd_Expression;如果 Condition 为真,则把
15、 1st_Expression 计算的结果赋值给 Destination,否则就把2nd_Expression 计算的结果传送给 Destination。例 2-6 中的连续赋值语句就是采用这样的结果。条件连续赋值语句可以采用级联方式来设置多个条件,从而把多个表达式传送给赋值对象。其基本格式如下:assign Destination=Condition1?(Condition2?1st_Expression:2nd_Expression):(Condition3?3rd_Expression:4th_Expression);2.4 数据流显示一般不建议采用此结构来对赋值对象进行赋值,特别是级联
16、级数较多的情况,容易出错,同时在综合是容易出现冗余和无效代码。因此,在设计级联代码时,可以采用小括号来显示信号处理的优先级,提升代码的可读性同时,建议采用带有优先级的 case 语句来替换实现。Verilog HDL 语言中定义为 wire 型的连续赋值语句的赋值对象不能多重赋值。一旦出现,综合软件会直接报错,仿真软件会直接赋值 x。如例 2-8 把例 2-6 的 m1 错误地写成了m0,从而出现了多重赋值,这是一个错误的示范。在综合时Lattice Diamond 将会报出如图 2-5 的错误。【例 2-8】多重赋值错误示例wire m0;assign m0=s0?a:b;assign m0
17、=s0?c:d;2.4 数据流显示2.4.2 时延例 2-6 中没有在连续赋值语句中定义时延,那么右端的条件表达式计算出来的值会立即赋给左端表达式,时延为 0。例 2-1 和例 2-5 均采用了带时延的连续赋值语句。assign out#2=s?a:b;#2 表示为两个时间单位。该程序的意思是当输入选择信号 s 为高电平时,把输入信号 a延时两个时间单位再传送给输出端口 out,否则把输入信号 b 延时两个时间单位再传送给输出端口 out。这行代码模拟的是选择器输入和输出之间的延时,如图 2-6 所示。2.4 数据流显示如果输入信号的脉冲宽度没有时延长,则右端的输入信号会在发生时间的间隔里被过
18、滤掉。假设:assign out#4=in;从图 2-7 中可以看出,输入 in 有两个脉冲,一个是一个时间单位的脉冲,另外一个是四个时间单位的脉冲,但从输出信号 out 来看,第一个一个时间单位的脉冲来不及输出,便被过滤掉。这也是组合逻辑的特点之一。当信号脉冲宽度小于组合逻辑器件时延的时候,相应的脉冲会被过滤掉。有些电路设计也是采用组合逻辑这样的特性,来屏蔽相应的信号干扰。2.4 数据流显示时间单位与 CPLD/FPGA 的物理时间相关。因此,除了输入和输出时延外,信号跳变的时延也是各不相同。在 Verilog HDL 中,有四种时延模型来描述信号跳变:上升时延、下降时延、关闭时延以及变成
19、x 的时延。其中,变为 x 的时延为前三者中的最小值。其基本语法是:assign#(rise,fall,turn_off)Destination=Logical expression;【例 2-9】各种时延表示方式示例assign out=in1&in2;assign#5 out=in1&in2;assign#(4,8)out=in1&in2;assign#(4,5,6)out=in1&in2;在第一个赋值语句中,没有显式显示时延,因此时延为 0。第二个赋值语句中,只有一个时延参数,表示上市时延、下降时延、关闭时延以及变为 x 的时延相同,均为 5。第三个赋值语句,有两个时延参数,分别表示上升
20、时延为 4,下降时延为 8,关闭时延和变为 x 的时延相同,为上升时延和下降时延的最小值,即为 4。第四个赋值语句,有三个时延参数,分别表示上升时延为 4,下降时延为 5,关闭时延为 6,变为 x 的时延为三者的最小值,即为 4。2.4 数据流显示在现实世界中,即使是其中的某一个时延,也会因为制程工艺、布线布局等各种客观因素而有细微差异。在 Verilog HDL 语言中,为精确建模这种行为,会针对每个时延采用“min:typ:max”的格式来表示某个时延的最小值、典型值和最大值。如:assign#(1:2:3,4:5:6)out=in1&in2;该赋值语句中,最小上升时延为 1,最大为 3,
21、典型值为 2,下降时延最小值为 4,最大值为 6,典型值为 5 个时间单位。6,典型值为 5 个时间单位。在 Verilog HDL 设计中,有时会在变量声明中会显式定义时延,说明该变量的驱动源改变到该变量本身变化之间的时延。如:wire#2 out;若在后续的数据流描述过程中,对该变量进行赋值,如:assign#2 out=in1&in2;则表示为当右边表达式中 in1 和 in2 两个输入信号发生任何变化时,将立即计算并把计算结果延时 4 个时间单位(2+2)再赋值给输出端口 out,而不是两个时延单位。2.4 数据流显示以上的时延均只指定相应的时延量,没有涉及到时延单位和时间精度。在 V
22、erilog HDL中,使用关键词timescale 来定义时间单位及精度。如:timescale 1ns/10ps表示为时间单位为 1ns,时间精度为 10ps。如果把此指令定义在例 2-1 和例 2-5 模块之上,则表示为二选一选择器的输入输出延时为 2ns,抖动在 10ps 之内。该指令需要在模块描述前就定义。Verilog HDL 没有缺省的时间单位。如果没有显式定义,Verilog HDL 的仿真器会假设一个时间单位。时延不仅仅可以定义信号的输入与输出之间的逻辑延时。同时,针对信号跳变此时延只能用于模拟,不能被综合。2.5 行为级描述GRADUATION THESIS2.5 行为级描
23、述数字电路有两类基本逻辑电路,一类是组合逻辑电路,一类是时序逻辑电路。数据流描述只能用来描述组合逻辑电路。而要描述时序逻辑,需要采用行为级描述。采用行为级描述的 Verilog HDL 模块不会包含内部的结构细节,它用抽象、算法描述的方式简单定义硬件行为。Verilog HDL 中有两种行为级建模机制:initial 语句和 always 语句。一个模块可以包含一个或者多个 initial 语句和 always 语句。这些语句在 0 时刻不论先后顺序并发执行。一个initial 语句或者 always 语句中可能只有一条语句,也可能有多条语句,多条语句需要采用beginend 或者 forkj
24、oin 等限定符来进行限定。2.5 行为级描述initial 语句中所有的语句构成 initial 语句块。Initial 语句在模拟时刻 0 就可以执行,并且只能执行一次,语句块内的语句顺序执行。initial 语句通常用来生成波形以及信号的初始化。用符号“#”来控制语句的执行或者对变量进行赋值。其基本语法结构是:initial#time procedural_statement;其 中#time 为 可 选 项,如 果 没 有 显 示,意 思 是 仿 真 从 时 刻 0 立 即 开 始 执 行procedual_statement 过程语句或者过程语句块。过程语句可以是单条语句,也可以是多
25、条语句组成的语句块,包括阻塞和非阻塞语句、wait 语句、case 语句、条件语句、循环语句、并发语句块、时序语句块以及过程连续赋值语句等。2.5.1 initial 语句语句2.5 行为级描述【例 2-10】initial 赋值示例reg rst_n;reg clk;.initial begin rst_n=1b0;#10 rst_n=1b1;#1000$finish;end initial begin clk=1b0;forever#2 clk=clk;end此例含有两个 initial 语句,分别对 rst_n 信号变量进行赋值和生成时钟信号。两个 initial语句并行执行,都是从模拟
展开阅读全文