[Verilog硬件描述语言]语言要素、数据类型、运算符及其表达式
目录
- 一、Verilog语言要素
- 1.1 标识符
- 1.2 关键字
- 1.3 数值
- 1.3.1 整数及其表示
- 1.3.2 实数及其表示
- 二、数据类型
- 2.1 连线型
- 2.2 寄存器型
- 2.3 连线型和寄存器型数据类型的声明
- 2.3.1 连线型数据类型声明
- 2.3.2 寄存器型数据类型声明
- 2.4 存储器型
- 2.5 抽象数据类型
- 三、运算符
- 3.1 算术操作符
- 3.2 相等关系运算符
- 3.3 逻辑运算符
- 3.4 按位运算符
- 3.5 规约运算符
- 3.6 连接和复制运算符
一、Verilog语言要素
1.1 标识符
Verilog HDL中的标识符(identifier)被用来命名新号名、模块名、参数名等。它可以是任意一组字母、数字、$符号、_符号的组合。标识符的字母区分大小写,并且第一个字符必须是字母或者下划线。
若要用非法的标识符可以在前面加\(反斜线)
\a+b=c
1.2 关键字
关键字不能被用户使用(也称保留字)它是Verilog HDL语言内部的专用词,是事先定义好的确认符,用来组织语言结构。所有关键字都是小写的。
ALWAYS不是关键字(是标识符),always是关键字
1.3 数值
Verilog HDL有四种基本的逻辑符号:
状态 | 含义 |
---|---|
0 | 低电平 |
1 | 高电平 |
x或X | 不确定 |
z或Z | 高阻态 |
1.3.1 整数及其表示
+/-<size>'<base_format><number>
+/-都是以补码形式存在
size是几个bit
base_format是数值表达形式(二进制B、八进制O、十进制D、十六进制H)一般是使用二进制或是十六进制
状态 | 含义 | 合法表示符 |
---|---|---|
二进制 | b或B | 0、1、x、X、z、Z、?、_ |
错误的表达式
4'd-4 // 数值不能为负,符号应该在最左边
3' b001 // '和基数b之间不允许出现空格
(4+4)'b11 // 位宽不能是表达式形式
1.3.2 实数及其表示
- 十进制表示法:小数点两侧必须都有数字
- 科学计数法:564.2e2的值为56420.0(E是10的幂次方)
二、数据类型
物理数据类型:连线型、寄存器型、存储器型数据类型
2.1 连线型
连线型数据类型 | 功能说明 |
---|---|
wire(0、1、不定)、tri(0、1、不定、高阻态——三态) | 标准连线(缺省为该类型) |
wor(有两个信号对一个线驱动——增加了或门),trior | 多重驱动,具有线或特性的连线型 |
wand,trand | 多重驱动,具有线与特性的连线型 |
tri1 | 上拉电阻 |
tri0 | 下拉电阻 |
supply1 | 电源线,用于对电源建模,为高电平1 |
supply0 | 电源线,用于对地建模,为低电平0 |
两个驱动强度相同的驱动源驱动wire变量时的输出结果:
如果wire型变量没有定义逻辑强度,同时有两个相同驱动源驱动wire变量,逻辑值会发生冲突,产生不定值
wire/tri的真值表
wire [2:0]c;
2.2 寄存器型
reg型是数据存储单元的抽象类型,其对应的硬件电路元件具有状态保持作用,能够存储数据,如:触发器、锁存器
reg型变量常用于行为级描述,由过程赋值语句对其进行赋值
reg型变量的简单例子:
reg a; // 定义了一个一位的名为a的reg变量
reg [3:0] b; // 定义了4位名为b的reg变量
reg [8:1] c,d,e; // 定义了三个名称分别为c、d、e的8位reg型变量
reg型变量一般是无符号数,若将一个负数赋值给reg型变量,则自动转化为其二进制补码形式
reg signed[3:0] rega;
rega = -2; // rega的值为1110(14)是2的补码
2.3 连线型和寄存器型数据类型的声明
2.3.1 连线型数据类型声明
缺省的连线型数据的默认类型为1位(标量)wire类型。Verilog HDL禁止对已经声明过的网络、变量或参数再次声明。连线型数据类型声明的一般语法格式如下:
<net_declaration> <drive_strength><range><delay>[list_of_variables];
其中,drive_strength、range、delay为可选项,而list_of_variables为必选项。
(1) net_ declaration:表示网络型数据的类型,可以是wire、tri、tri0、tri1、wand、triand、trior、wor、trireg中的任意一种。对于trireg类型,其声明还有一个charge_strength(电荷强度)的可选项。
(2) drive_strength:表示连线变量的驱动强度。
(3) range:用来指定数据为标量或矢量。若该项默认,表示数据类型为1位的标量,超过1位则为矢量形式。
(4) delay:指定仿真延迟时间。
(5) list_of_variables:变量名称,一次可定义多个名称,之间用逗号分开。
2.3.2 寄存器型数据类型声明
reg型数据类型声明的一般语法格式:
reg<range><list_of_register_variables>;
其中,range为可选项,它指定了reg型变量的位宽,缺省时为1位。说明:list_of_register_variables:变量名称列表,一次可以定义多个名称,之间用逗号分开。
2.4 存储器型
存储器型(memory)本质上还是寄存器型变量阵列,只是Verilog HDL语言中没有多维数组,所以就用reg型变量建立寄存器组(数组)来实现存储器的功能,也就是扩展的reg型数据地址范围。存储器型变量可以描述RAM型、ROM型存储器以及reg文件。数组中的每一个单元通过一个数组索引进行寻址。
存储器型变量的一般声明格式:
reg <range1><name_of_register><range2>;
其中,range1和range2都是可选项,缺省时都为1。
reg[7:0] mem1[255:0] // 定义了一个有256个8位寄存器的存储器mem1,地址范围是0~255,前者是数据位宽,后者是地址位宽
//256个单元,每个单元8位的mema存储器
一个n位的寄存器可以在一条赋值语句中进行赋值,而一个完整的存储器不行
rega = 0; // 合法
mema = 0; // 非法
mema[3] = 0; // 合法:不是给一个完整的存储器赋值,而是给mema中的第三个存储单元赋值为0
如果相对mema中的存储单元进行读写操作,必须指定该单元在存储器中的地址
reg[15:0] mem[127:0], reg1, reg2;
// 定义了一个具有128个16位寄存器的存储器mem 和 2个16位的寄存器reg1和reg2reg[n-1:0] a;
// 表示一个n位的寄存器areg mem[n-1:0];
// 定义了一个存储器mem共有n个单元,每个单元1位
2.5 抽象数据类型
抽象数据类型主要包括整型(integer)、时间型(time)、实型(real)及参数型(parameter)
整型:
integer<list_of_register_variables>;
integer index; // 32位有符号整数
integer i[31:0] // 定义了整型数组,有32个元素
整型数据常用于对循环控制变量的说明
算术运算中被视为二进制补码形式的有符号数
双精度带符号浮点变量可以用于对延迟时间的计算
实型数据的声明格式:
real
real stime; // 定义了一个实型数据
主要用于对模拟时间的存储与计算处理,常与系统函数$time一起使用
时间型数据的声明格式:
time a, b; // 定义了两个64位的时间型变量
参数型数据类型声明:
参数型数据类型为常量,在仿真开始前就被赋值,在仿真过程中保持不变
采用参数定义的方法可以提高程序的可读性和维护性,参数常用于定义延迟时间和变量的位宽
参数的定义:
parameter length=32, weight=16;
parameter PI=3.14, LOAD=4'b1101;
parameter DELAY=(BYTE+BIT)/2;
parameter 参数名 = 表达式;
对于同一个模块来说,参数一旦被定义就不能通过其他语句对他进行重新赋值
若要改变参数的值,可通过模块之间的参数传递来实现
三、运算符
3.1 算术操作符
算术表达式结果的长度由最长的操作数决定,在赋值语句下,算术结果的长度由操作左端目标长度决定
reg[3:0]A,B,C;
reg[5:0]D;
A = B + C; // 4位
D = B + C; // 6位
若操作数长度不同,则长度短的操作数应在左边用0补齐。例如:
'b1001>='b101100等价于’b001001>='b101101,结果为假(0)。
3.2 相等关系运算符
==
和!=
称为逻辑等式运算符,其结果由两个操作数的值决定,由于操作数中某些位可能是不定值x和高阻态值z,所以结果可能为不定值x。
===
和 !==
运算符则不同,它是对操作数进行按位比较,两个操作数必须完全一致,其结果才是1,否则为0。但是,若两个操作数对应位出现不定值x和高阻值z,则可认为是相同的。===
和!==
运算符常用于case表达式的判别,所以又称为“case等式运算符”。
==和!=:其结果由两个操作数的值决定。结果可能为不定值x
=== 和 ! == : 在对操作数进行比较时对某些位的不定值x和高阻值z也进行比较,返回结果只可能是1或者0。===为全等,两数相同为1,否则为0
=== 和 ! ==:常用于case表达式的判别,所以又称为"case等式运算符"
3.3 逻辑运算符
若操作数中存在不定态x,则逻辑运算的结果也是不定态,例如:a的初值为4’b1100,b的初值为4’b01x0,则 !a=0,!b=x,a&&b=x,a||b=x。
逻辑与 运算符(&&):双目运算符
逻辑或 运算符(||) :双目运算符
逻辑非 运算符(!):单目运算符
结果只可能为1或是0
3.4 按位运算符
按位取反 ( ~ )、按位与( & )、按位或( | )、按位异或( ^ )、按位同或( ^~ )
~是一个单目运算符,用来对一个操作数进行按位取反运算
rega = 4'b1010;//rega的初值为'b1010
rega = ~rega;//rega的值进行取反运算后变为4'b0101
always #10 clk = ~clk;//生成周期20时间单位的时钟方波
3.5 规约运算符
单目运算符,结果是产生1位逻辑值,又称为缩位运算符
reg [3:0] B;
reg C;
C = &B; // C =( (B[0]&B[1]) &
归约操作符只有一个操作数,它对这个向量操作数逐位进行操作,最终产生一个 1bit 结果。
A = 4'b1010;
&A; //结果为 1 & 0 & 1 & 0 = 1'b0,可用来判断变量A是否全1
~|A; //结果为 ~(1 | 0 | 1 | 0) = 1'b0, 可用来判断变量A是否为全0
^A; //结果为 1 ^ 0 ^ 1 ^ 0 = 1'b0
3.6 连接和复制运算符
{ } :连接运算符
{ { } }:复制运算符
[Verilog硬件描述语言]语言要素、数据类型、运算符及其表达式相关推荐
- c语言常数-ox6a是什么意思,C语言第2讲-数据类型运算符和表达式.pdf
C语言第2讲-数据类型运算符和表达式 高级语言程序设计 (C Programming) 丁嵘 第二讲:数据类型.运算符和表达式 本章目录 2.1 基本符号 2.2 C语言的数据类型 2.3 ...
- c语言程序计算p q真值表,C语言程序设计第2章数据类型﹒运算符和表达式.ppt
C语言程序设计第2章数据类型﹒运算符和表达式 教学目标 掌握C语言标识符的组成 理解C语言的基本数据类型 掌握变量定义的方法 掌握常用的运算符的使用 掌握混合运算的数据转换方法 2.1 C语言的数据类 ...
- 二进制补码求值用c语言,C语言程序设计第2章数据类型.运算符与表达式.ppt
C语言程序设计第2章数据类型.运算符与表达式 教学目标 掌握C语言标识符的组成 理解C语言的基本数据类型 掌握变量定义的方法 掌握常用的运算符的使用 掌握混合运算的数据转换方法 2.1 C语言的数据类 ...
- 数据类型,运算符和表达式02 - 零基础入门学习C语言03
第二章:数据类型,运算符和表达式02 让编程改变世界 Change the world by program 整型变量 整型变量的分类(注意:这里占多少个字节跟系统和编译器规定有关!可以在编译器上自己 ...
- c语言程序设计课件第二章,c语言程序设计课件张元国 ISBN9787566300386 PPT第二章数据类型 运算符与表达式...
1.第2章 数据类型.运算符与表达式,语言的数据类型 常量与变量 运算符与表达式 不同类型数据间的转换,2.1语言的数据类型,数据是计算机程序处理的所有信息的总称,数值.字符.文本等都是数据,在各种程 ...
- 数据类型,运算符和表达式03 - 零基础入门学习C语言04
第二章:数据类型,运算符和表达式03 让编程改变世界 Change the world by program 字符型数据 字符型数据包括字符常量和字符变量 字符常量: 是用单引号括起来的一个字符. 例 ...
- 51单片机c语言除法符号,51单片机之C语言-4.4运算符及表达式
原标题:51单片机之C语言-4.4运算符及表达式 4.4 及 前面三节实际是讲如何定义一个数据类型,所谓数据类型其实就是不同存储空间的形状,也就是不同单元格的组合方式.既然定义了数据类型,我们的目的当 ...
- 信工干货||C语言中的运算符和表达式
C语言中的运算符和表达式 1算术运算符及表达式 (1)算术运算符包括: ,-,*,/,%. (2)*,/,%同级,比 ,-高. (3)"%"运算符两侧的运算分量必须为整型数据,且运 ...
- c语言表达式用法,C语言开发之运算符、表达式用法
C语言中运算符和表达式数量之多,在高级语言中是少见的.正是丰富的运算符和表达式使C语言功能十分完善.这也是C语言的主要特点之一.C语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性.在 ...
最新文章
- WPF中Auto与*的差别
- 卷积神经网络要点解析
- docker 镜像修改的配置文件自动还原_Docker 基础与实战,看这一篇就够了
- 1047. Student List for Course (25)
- 【Python】简单的apscheduler定时任务
- token验证_如何利用 C# 爬取带 Token 验证的网站数据?
- 多用途bootstrap后台管理系统模板企业统计管理界面模板
- 正则解析多重循环模板
- android模拟点击webview,的Android的WebView点击模拟
- 安全防范报警系统产品质量监督检测测试中心(上海)
- c语言牛顿法求整数平方根,牛顿法求平方根-编程练习
- iOS微信分享服务器设置,ios微信分享设置title怎么弄?
- mysql ctrl+y_mysql操作
- 深入理解Linux内核第3版--笔记-1.pdf
- 信用卡和借记卡、储蓄卡
- CSS3的transform之3d转换、CSS3动画
- Unity中初步使用Navmesh寻路系统
- 计算机文档添加书签,小学计算机——制作可以跳转的书签教案
- 如何倾听客户之声?你需要的不仅仅是调研
- 如何用java判断手机号运营商?