verilog语言及程序设计
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
hwadee
2019/5/13
33
if条件语句
if条件语句 3种格式
• if (表达式) 语句;
• if (表达式) 语句1;
不要在同一个always块里面混合使用“阻 塞赋值”和“非阻塞赋值”
hwadee
2019/5/13
4
Verilog的特点
Verilog易学易用(与C语言相似),功能强大,使 用 广泛。
可以在不同层次描述数字系统
开关级描述 寄存器传输级描述 门级描述
基本设计单元是“模块”(block)包括:
*/
是多行注释
hwadee
2019/5/13
12
格式
Verilog HDL 区分大小写,即大小写的标识 符是不同的。
源程序书写格式自由,可跨越多行编写,也 可在一行内编写。
hwadee
2019/5/13
13
系统任务和函数
以字符开始的标识符表示系统任务或系统函 数。任务提供了一种封装行为的机制。这种 机制$可以在设计的不同部分被调用。任务 可以返回0个或多个值。函数除只能返回一 个值以外与任务相同。
hwadee
2019/5/13
9
模块的描述方式
Verilog HDL模块代表硬件上的逻辑实体,其 范围可以从简单的门到整个电路系统.
模块可以根据所采用的不同描述方式而分为 行为描述和结构描述两类,也可采用两种方 式的组合。
hwadee
2019/5/13
10
Verilog 语言要素
标识符(identifier)
用来表示各种变量、参数或构件的名称,可以是任
意一组字母、数字、$符号和_(下划线)符号的组合, 但第一个字符必须是字母或下划线,区分大小写
转义标识符
可以在一条标识符中包含任何可打印字符。转义标识符以
“\”(反斜杠)符号开头,以空白结尾(空白可以是一个空格、一 个制表符或换行符)
hwadee
• $time,$stime,$realtime
hwadee
2019/5/13
15
常用任务和函数
概率分布函数
• $ramdom[(seed)]
其它
• $setup, $hold, $setuphold, $width, $period, $skew, $recovery, $nochange, $rtoi, $itor, $realtobits, $bitstoreal, $printtimescale, $timeformat等
(2)多输出门 • buf, not
(3)三态门 • bufif0, bufif1, notif0, notif1
(4)上拉、下拉电阻 • pullup, pulldown
(5)MOS开关 • cmos, nmos, pmos, rcmos, rnmos, rpmos
(6)双向开关 • tran, tranif0, tranif1, rtran, rtranif0, rtranif1
寄存器
• 表示一个抽象的数据存储单元 • 有reg,integer,time,real,realtime 等类型。
hwadee
2019/5/13
23
表达式中的运算符
(1)算术运算符(+,-,×,/ ,%)
(2)位运算符(~,&,|,^,^~)
(3)逻辑运算符(&&,||,!,)
(4)关系运算符(>,<,>=,<= )
函数在0时刻执行,即不允许延迟,而任务 可以带有延迟。
hwadee
2019/5/13
14
常见系统任务和函数
显示任务
• $display,$write,$strobe,$monitor, $monitoron,$monitoroff
模拟控制任务
• $finish, $stop
模拟时间函数
接口描述 逻辑功能描述
hwadee
2019/5/13
5
Verilog HDL程序基本结构
Verilog的基本设计单元是“模块”(BLOCK) 模块由两部分组成:一部分描述接口,另一部分描
述逻辑功能。 按照模块接口的描述,一个模块可以在另一个模块
中使用;逻辑功能的描述可以使用连续赋值语句 (描述数据流行为)、过程结构(时序行为)、开 关级原语、门级原语和用户定义的原语等方式。
• 例:always @(a or b)
c=a^b;
hwadee
2019/5/13
31
语句块
顺序语句块
• 格式:begin [标识符] 语句1; … ;语句n; end
•
其中[标识符]是可选项
• 语句块中的语句按给定次序顺序执行
并行语句块
• 格式:fork [标识符]语句1; … ;语句n; join
hwadee
2019/5/13
25
连续赋值语句
连续赋值语句用于数据流行为建模,适用于 组合逻辑电路,主要用于对线网wire类型变 量的赋值。
语法格式
• assign [驱动强度] [#时延值] 线网标识符=表 达式
hwadee
2019/5/13
26
连续赋值语句
连续赋值语句没有保持的概念,只要右端表 达式中操作数的值发生变化,表达式即被重 新计算;如果结果值有变化,新结果就赋给 左边的线网。
以使用参数定义语句或通过在模块初始化语句 中定义参数值。
hwadee
2019/5/13
22
数据类型
Verilog HDL有两大类数据类型 线网
• 表示结构化元件间的物理连线 • 有wire,tri,wor,trior,wand,triand,trireg,tri1,
tri0 ,supply0 ,supply1等类型。
hwadee
2019/5/13
7
模块的基本结构说明
<模块名>是模块惟一的标识符; <端口列表>是 由模块的输入、输出和双向端口组成的端口列表, 这些列表用来与其他模块进行连接;
数据类型定义部分用来指定模块内所用的数据对象 为寄存器型、存储器型或连线型;
过程块包括initial过程块和always过程块两种,行 为描述语句只能出现在这两种过程块中;
•
其中[标识符]是可选项
• 语句块中的语句并行执行
hwadee
2019/5/13
32
过程性赋值
它是在initial语句或always语句内的赋值, 只能对寄存器数据类型的变量赋值
阻塞性赋值 (=)
• 阻塞性赋值是指立即赋值
非阻塞性赋值 (<=)
• 非阻塞性赋值是在语句块结束后,块内的非阻 塞性赋值语句同时进行赋值
hwadee
2019/5/13
2
非阻塞语句在verilog中的应用
非阻塞语句,顾名思义,本条语句不影响下一条语 句的作用,更能体现硬件电路的特点。这正是非阻 塞语句广泛应用于时序逻辑电路的原因。
如果在一个时钟沿触发的always进程里面, b<=c,a<=b那么就不可能直接在进程里面赋值 a<=c.因为c的值要经过两个时钟延迟才传到a里面, 如果c为1,b为0,a为1的话,那么在在非阻塞语 句的进程里面,
连续赋值语句之间是并发的,与书写的先后 顺序无关
hwadee
2019/5/13
27
行为建模语句
行为建模有以下内容:
• 过程结构 • 时序控制 • 语句块 • 过程性赋值 • 条件语句 • 循环语句
hwadee
2019/5/13
28
过程结构
以下两种语句是为一个设计的行为建模的主 要机制
hwadee2019/5/13 Nhomakorabea16
编译指令
以’(反引号)开始的某些标识符是编译器 指令。
在Verilog 语言编译时,特定的编译器指令 在整个编译过程中有效(编译过程可跨越多 个文件),直到遇到其他不同的编译程序指 令。
hwadee
2019/5/13
17
一些编译指令
’define , ’undef ’ifdef , ’else, ’endif ’default_nettype ’include ’resetall ’timescale
Verilog语言及程序设计
四川华迪信息技术有限公司 Version1.1
阻塞语句在verilog中的应用
阻塞语句,顾名思义,即本条语句具有影响 下一条语句的作用,如果该条语句没有执行 完,那么下条语句不可能进入执行状态的
阻塞语句最能体现verilog HDL和C语言之 间的血缘关系,比如,在时钟沿触发的 always进程里,若先执行b=c,再执行 a=b,那么本质上,在一个时钟沿触发里面, a=c成立,即是说,不要b变量,直接在进 程里赋值a=c,结果是一样的。这和c语言 中b=c,a=b性质相同
hwadee
2019/5/13
18
值集合
Verilog HDL有四种基本的值
• 0:逻辑0或“假”; • 1:逻辑1或“真”; • x:未知; • z:高阻。
hwadee
2019/5/13
19
说明
在门的输入或一个表达式中为“z”的值通常 解释成“x”,此外x和z是不区分大小写的。
下划线符号(—)可以随意用在整数或实数 中,它们就数量本身没有意义,仅用以提高 可读性。唯一的限制是下划线不能用做首字 符。
hwadee
2019/5/13
20
常量
整型
• 十进制数格式 ,如100 • 基数表示法 ,如4’b1101
实数型
• 十进制计数法 • 科学计数法
字符串型
• 双引号内的字符序列,不能分成多行书写
hwadee
2019/5/13
21
参数
• 参数是一个常量。 • 经常用于定义时延和变量的宽度。 • 使用参数说明的参数只被赋值一次。 • 参数说明形式如下(见P233) • 参数值也可以在编译时被改变。改变参数值可
(5)相等关系运算符(==,!=, ===,!==)
(6)移位运算符(<<,>>)
(7)连接和复制运算( | | )
(8)归约运算符(&,|,~&,~|,^,~^)
(9)条件运算符(?:)
(10)优先级别(见P237表11.6)
hwadee
2019/5/13
24
内置基本门
(1)多输入门 • and, nand, or, nor, xor, xnor
hwadee
2019/5/13
6
模块的基本结构
Module<模块名>(<端口列表>);
端口说明(input,out,inout)
参数定义<可选>
数据类型定义
连续赋值语句(assign)
过程块(initial和always)
行为描述语句
低层模块实例
任务和函数
延时说明块
endmodule
第一个时钟沿到来,a为0,第二个时钟沿到来,a为1
(注:在一次触发进程里,无论是阻塞和非阻塞语 句,每条语句只能执行一次)
hwadee
2019/5/13
3
阻塞语句与非阻塞语句使用注意事项
阻塞语句是顺序执行的,而非阻塞语句是同 时执行的
大体原则:阻塞语句运用于组合逻辑电路设 计,非阻塞语句运用于时序逻辑电路设计
延时说明块用来对模块各个输入和输出端口间的路 径延时进行说明。
hwadee
2019/5/13
8
模块调用
调用模块实例的一般格式: <模块名><参数列表><实例名>(<端
口列表>); Verilog HDL程序是由模块组成的,每个模
块的内容都包含在“Module”和 “endmodule”之间。 每个模块都要进行端口定义,说明输入、 输出端口。
• initial语句 • always语句
一个模块中可以包含任意多个initial或 always语句
所有的initial和always语句在0时刻开始并 行执行
hwadee
2019/5/13
29
时序控制
时延控制
• 表示在语句执行前的“等待时延”。 • 使用格式有两种:
1. # 时延值 2. #(最小时延:典型时延:最大时延)
• 例:#3 c = a;
hwadee
2019/5/13
30
事件控制
边沿触发事件控制
• 主要有正边沿(posedge)和负边沿(negedge)两种
• 例:always @(posedge clk)
count<=count+1;
电平敏感事件控制
• 进程语句或进程中的过程语句一直延迟到列出的控制信号 有变化才执行
2019/5/13
11
Verilog 语言要素
关键字
• Verilog HDL定义了一系列保留字(关键字)。
• 在编写Verilog HDL程序时,变量的定义不要与 关键字冲突。
• 注意只有小写的关键字才是保留字。
注释
在 Verilog HDL里有两种形式的注释:
• //
是单行注释
• /*