当前位置:首页 > Verilog HDL重新整理
Verilog HDL
一、verilog HDL设计模块的基本结构包括:模块端口定义、I/O声明、信号类型声明、功能描述。一个完整的建模结构如下:
Module 模块名(端口1,端口2,端口3……); I/O声明; 信号类型声明; 功能描述; Endmodule 说明:
①模块端口定义用来声明设计模块名称及相应的(输入/输出)端口。
②I/O声明用来声明模块端口定义中各端口数据的流动方向,包括input、output、inout。 ③信号类型声明用来声明设计电路的功能描述中所用的变量的数据类型,常用的有:wire型、reg型、integer型、parameter型。
④功能描述用来描述设计模块的内部结构和模块端口之间的关系,在电路上相当于器件的内部电路结构。功能描述可以用assign语句、元件例化、always语句块、initial语句块等方法来实现,通常把确定这些设计模块描述的方法称为建模。
(1) 用assign语句建模
用assign语句建模的方法较简单,只需要在assign后面再加一个表达式即可。Assign语句一般适合对组合逻辑进行赋值,称为连续赋值方式。 (2) 用元件例化方式建模
元件例化方式建模是利用Verilog HDL提供的元件库实现的。 (3) 用always块语句建模
Always块语句可以用于设计组合逻辑和时序逻辑,但时序逻辑必须用always语句来建模。
(4) 用initial块语句建模
Initial块语句与always语句类似,不过在程序中它只执行一次就结束了。Initial块语句主要用于设计电路的初始化操作和仿真。 二、Verilog HDL的基本词法
1、常数 Verilog HDL中的常数包括数字、未知x和高阻z 3种。完整的数字程式为:
<位宽>’<进制符号><数字>
2、Verilog HDL数据对象 常量
常量是一个恒定不变的数值,一般在程序前部定义,格式为: Parameter 常量名1 = 表达式,常量名2 = 表达式,…….
变量是在程序运行时其值可以改变的量,在Verilog HDL中,变量分为网络型
变量
和寄存器型两种,网络型变量wire型,寄存器型变量 reg型和 integer型。Wire型变量在assign语句和元件例化语句中赋值,而reg型变量是在always、initial等过程语句中定义,并通过过程语句赋值。 3、Verilog HDL运算符
算术运算符:+(加)、-(减)、*(乘)、/(除) 逻辑运算符:&&(逻辑与)、||(逻辑或)、!(逻辑非)
位运算:~(按位取反)、&(按位与)、|(按位或)、^(按位异或)、^~(按位同或) 关系运算符:<、>、<=、>= 等值运算符:==、===
缩减运算符:&(与)、~&(与非)、|(或)、~|(或非)、^(异或)、^~(同或) 移位运算符:》(右移)、《(左移) 条件运算符: ?: 位拼接运算符:{} 4、Verilog HDL的基本语句 (1)持续赋值语句
持续赋值语句的关键词是assign,赋值符号是“=”,赋值语句的
格式为:assign wire型变量 = 表达式;“=”两边都应该是wire型。持续赋值语句一般用来描述组合逻辑电路。 (2)过程赋值语句
过程赋值语句有阻塞赋值语句(“=”)和非阻塞赋值语句(“<=”),
主要是运用于reg型变量的赋值操作。
注意:非阻塞赋值“<=”不能用于assign持续赋值语句中,而只能用于对寄存器型变量进行赋值,即在always和initial等过程块语句中;阻塞赋值“=”则既能用于assign持续赋值语句中,也能用于initial和always等过程赋值语句中。 (3)块语句
块语句有串行块语句begin-end和并行块语句fork-join。begin-end块
内的语句是顺序执行的,而fork-join块内的语句是同时并行执行的。 (4)过程语句
Verilog HDL有两过程语句:initial和always过程块。一个程序模块
可以有多个initial和always过程块,它们都是同时执行的。Initial语句不带触发条件,但在程序中只执行一次就结束,多用于初始化和仿真;always过程块通常带有触发条件的,当满足条件时,执行一次always过程块,always语句的格式如下:
Always @(敏感信号表达式)
上式的敏感信号可以分为两种类型:一种为边沿敏感型(关键字posedge表示上升沿,negedge表示下降沿),一种为电平敏感型。每个always过程最好只由一种类型的敏感信号来触发,而不要将边沿敏感型和电平敏感型信号列在一起。 (5)条件语句 (6)循环语句 while、for。
Forever:连续执行语句;多用于initial块中以生成时钟等周期性波形。格式如下: Forever 语句;或Forever begin 多条语句;end
Repear:连续执行语句n次;格式:repeat(循环次数) 语句; While:执行循环体语句,直到某个条件不满足;
较常用的有:’define、’include、’ifdef、’else、’endif、’timescale
条件语句有if条件语句和case条件语句两种,它们都是顺序语句。 Verilog HDL中用来实现循环的语句有以下四种:forever、repeat、
(7)编译向导语句
(8)任务(task)和函数(function)说明语句
任务(task)说明语句定义格式如下:
Task<任务名>;
端口及数据类型声明语句; 其他语句; Endtask
任务调用格式:
<任务名>(端口1,端口2,端口3,…….)
函数(function)说明语句定义与调用格式如下:
Function<返回值位宽或类型说明>,函数名; 端口声明; 其他语句; Endfunction
<返回值位宽或类型说明>是一个可选项,如果默认,则返回值为一位寄存器
的数据。
调用格式:函数名(<表达式><表达式>);
主要用于仿真,比如实时显示当前仿真时间($time)、
(9)系统任务与系统函数
显示信号的值($display、$monitor)、暂停仿真($stop)、结束仿真($finish)。 三、Verilog HDL的描述方式
Verilog HDL程序主要有结构描述、行为描述和数据流描述三种描述方式。 (1)结构描述方式
可以通过调用verilog内置门元件(门级结构描述)、调用开关级
元件(开关级结构描述)、用户自定义元件UDP(也在门级)等方式来描述电路的结构。
(2)数据流描述方式
数据流描述方法是使用持续赋值语句(assign)描述数据的
运动路径、运动方向和运动结果。
(3)行为描述方式
行为描述主要反映该电路输入、输出信号之间的相互关系,
行为描述方式一般采用initial语句或always语句来描述逻辑功能。
共分享92篇相关文档