数字电子技术——Verilog

Verilog 概述

基础概述

HDL类似于高级程序设计语言,是一-种以文本形式来描述数字系统硬件电路的结构和行为的语言,用它可以表示逻辑电路、逻辑表达式,还可以表示更复杂的数字逻辑系统所完成的逻辑功能。
目前,广泛流行的有两种硬件描述语言: VHDL和Verilog HDL(简称Verilog)。VHDL是在20世纪80年代中期由美国国防部支持开发出来的;约在同- -时期, Gateway DesignAutomation[3]公司开发出了Verilog HDL。两种HDL均为IEEE标准。

HDL主要用于对数字逻辑电路建模及其对模型进行模拟(仿真)分析,设计者可以使用HDL描述自己的设计,然后利用EDA工具进行逻辑综合和仿真,最后变为某种目标文件,用ASIC或FPGA具体实现。基于HDL开发PLD的流程如图所示:

在这里插入图片描述

逻辑仿真是指用计算机仿真软件对数字逻辑电路的结构和行为进行预测。在电路被实现之前,根据仿真结果可以初步判断电路的逻辑功能是否正确。在仿真期间,如果发现设计中存在的错误,可以对HDL描述进行修改,直至满足设计要求为止。

所谓“逻辑综合”是指从HDL描述的数字逻辑电路模型中导出电路基本元器件列表以及元器件之间的连接关系(常称为门级网表)的过程。

Verilog基本结构

在Verilog HDL中使用了大约100 个预定义的关键词定义该语言的结构。Verilog HDL使用一个或多个模块对数字电路建模,一个模块可以包括整个设计模型或者设计模型的- -部分。模块的定义总是以关键词module开始,以关键词endmodule来结尾。模块定义的一般语法结构如下:

在这里插入图片描述

  • “模块名”是模块唯- - 的标识符,圆括号中以逗号分隔列出的端口名是该模块的输入、输出端口;
  • 在Verilog HDL中,“端口类型说明”为input(输入)、output(输出)、inout(双向端口)三者之一,凡是在模块名后面圆括号中出现的端口名,都必须明确地说明其端口类型;
  • “参数定义”将常量用符号常量代替,以增加程序的可读性和可修改性,它是一个可选择的语句;
  • “数据类型定义”部分用来指定模块内所用的数据对象为寄存器类型还是连线类型。

接着,要对该模块完成的逻辑功能进行描述,通常可以使用三种不同方法来描述电路的功能:
一是使用实例化低层次模块的方法,即调用其他已定义好的低层次模块对整个电路的功能进行描述,或者直接调用Verilog HDL内部基本门级元器件描述电路的结构(也称为门级描述),通常将这种方法称为结构描述方式;
二是使用连续赋值语句(assign)对电路的逻辑功能进行描述,通常称为数据流描述方式,对组合逻辑电路建模使用该方式特别方便;
三是使用过程块语句结构(包括initial语句结构和always语句结构两种)和比较抽象的高级程序语句对电路的逻辑功能进行描述,通常称为行为描述方式。行为描述侧重于描述模块的逻辑行为(功能),不涉及实现该模块逻辑功能的详细硬件电路结构。行为描述方式是学习的重点,设计人员可以选用这三种方式中的任意一种或混合使用几种方式描述电路的逻辑功能,并且在程序中排列的先后顺序是任意的。
除此之外,还有一种开关级描述方式,专门mos管构成的逻辑电路进行建模。

Verilog基本的语法规则

词法规定

  • 间隔符:空格符、tab键、换行符
  • 标识符:由英文+数字+$+下划线组成,并且由英文字母或者下划线开始,并且区分大小写,
  • 关键字:由小写字母组成的,具有特定意义
  • 注释符:单行注释://;多行注释:/**/

逻辑值集合

表示了数字逻辑电路的逻辑状态:0、1、x、z。

逻辑状态含义
0逻辑0,假逻辑
1逻辑1,真逻辑
x不确定的值(未知状态)
z高阻态

常量及表示

程序运行中数值不变的部分叫做常量,verilog中的常量有两种:实数型与整数型常量。

整数型常量有两种表示方法:

  • 简单的十进制表示;
  • 使用基数形式表示常量。格式:
    < + − > < s i z e > ′ < b a s e f o r m a t > < n u m b e r > <+ -><size>'<base format><number> <+><size><baseformat><number>

size:表示数字的长度;
base format: 表示数字的后面数字的进制,如下所示:

项目Value
b二进制
o八进制
d十进制
h十六进制

number:表示具体的数值。

几点注意:

  • 为了增加数字的可读性,可以在数字间加入下划线。
  • 在二进制表示中,x、z表示相应位的逻辑状态,八进制与十六进制同样。

实数型常数的表示方式:

  • 简单的十进制表示方式,例如:

0.1、2.0、5.67

  • 科学记数法表示方式

变量的数据类型

程序运行过程中可以改变的值成为变量,一般有两类:线网类型与寄存器类型。

  • 线网类型

线网类型(net type)是硬件电路中元件之间世纪连线的抽象,当线网类型被定义以后,如果驱动型好没有实际的电路信号的输入,线网的输出为高组态,定义格式如下:

wire[m-1:0] 变量1,变量2,变量3,…;

  • 寄存器类型

寄存器类型(register type)表示一个抽象的数据存储单元,他具有保持状态的作用。寄存器类型的变量只能在initial与always内部被赋值。寄存器变量在没有被赋值以前,他的默认值时x。

寄存器类型功能说明
reg用于行为描述中对寄存器变量的说明
integer32位带符号的整型变量
real64位带符号的实属ll.ll,型变量
time64位无符号的时间型变量

定义格式:
reg [m-1:0] 变量名1,变量名2,变量名3, …;

其余三种类型都不具备实际的硬件电路。

  • 存储器类型

这里的描述仅仅用于仿真实现,如果要综合实现存储器,还需要调用厂家提供的存储器宏单元实现存储器。

数字电路仿真中,常常需要对rom、ram建模,verilog常常会将存储器看作一组寄存器阵列构成的单元,阵列中的每一个元素称为一个字,每个字可以是以为或者多位,定义结构如下:
reg[msb:lsb] memory1[upper1,lower1],memory2[upper2,lower2],…;

思考:wire与reg定义的wire变量类型有什么不同?

Verilog 运算符

常用符号如下:
在这里插入图片描述

在这里插入图片描述

位拼接如下所示:
在这里插入图片描述

门级建模

门级描述如下:
在这里插入图片描述

  • 多输入门:
    and a1(out,in1,in2,…,inm);
  • 多输出门:
    buf(out1,out2,…,outm,in);
    not(out1,out2,…,outm,in);
    三态门:
    门后的1表示高电平有效;0表示低电平有效。
    在这里插入图片描述

门级描述的实例

moudle _2tomux(a, b, sel, out);

input a, b, sel;
output out;
tir out;
bufif1(out, b, sel);
bufif0(out, a, sel);
endmoudle

practice:

module circuit(A, B, L);

input A, B;
output L;
and(a1, A,B);
and(a2, Anot, Bnot);
not(Anot,A);
not(Bnot,B);
and(L,a1,a2);
endmodule

该程序的的门及电路结构如下所示:

在这里插入图片描述

行为级建模

对于简单的电路:使用门级电路描述十分方便,但是对于复杂电路可以采用较高级别的电路逻辑功能的建模方式——数据流模式与行为级模式。

数据流建模方式:

实际上,数据流是介于门级与行为级的一种建模方式。
主要使用连续赋值语句对wire型变量赋值。

用法如下:
在这里插入图片描述

注意在assign语句中等式右边使用的变量必须是wire类型的。

行为级建模基础

  • always结构说明语句

  • 顺序语句块

  • 条件语句

  • 多路分支语句

  • 循环语句

    • forever建模语句

行为级建模

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值