目录

  • 一、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 实数及其表示

  1. 十进制表示法:小数点两侧必须都有数字
  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硬件描述语言]语言要素、数据类型、运算符及其表达式相关推荐

  1. c语言常数-ox6a是什么意思,C语言第2讲-数据类型运算符和表达式.pdf

    C语言第2讲-数据类型运算符和表达式 高级语言程序设计 (C Programming) 丁嵘 第二讲:数据类型.运算符和表达式 本章目录  2.1 基本符号  2.2 C语言的数据类型  2.3 ...

  2. c语言程序计算p q真值表,C语言程序设计第2章数据类型﹒运算符和表达式.ppt

    C语言程序设计第2章数据类型﹒运算符和表达式 教学目标 掌握C语言标识符的组成 理解C语言的基本数据类型 掌握变量定义的方法 掌握常用的运算符的使用 掌握混合运算的数据转换方法 2.1 C语言的数据类 ...

  3. 二进制补码求值用c语言,C语言程序设计第2章数据类型.运算符与表达式.ppt

    C语言程序设计第2章数据类型.运算符与表达式 教学目标 掌握C语言标识符的组成 理解C语言的基本数据类型 掌握变量定义的方法 掌握常用的运算符的使用 掌握混合运算的数据转换方法 2.1 C语言的数据类 ...

  4. 数据类型,运算符和表达式02 - 零基础入门学习C语言03

    第二章:数据类型,运算符和表达式02 让编程改变世界 Change the world by program 整型变量 整型变量的分类(注意:这里占多少个字节跟系统和编译器规定有关!可以在编译器上自己 ...

  5. c语言程序设计课件第二章,c语言程序设计课件张元国 ISBN9787566300386 PPT第二章数据类型 运算符与表达式...

    1.第2章 数据类型.运算符与表达式,语言的数据类型 常量与变量 运算符与表达式 不同类型数据间的转换,2.1语言的数据类型,数据是计算机程序处理的所有信息的总称,数值.字符.文本等都是数据,在各种程 ...

  6. 数据类型,运算符和表达式03 - 零基础入门学习C语言04

    第二章:数据类型,运算符和表达式03 让编程改变世界 Change the world by program 字符型数据 字符型数据包括字符常量和字符变量 字符常量: 是用单引号括起来的一个字符. 例 ...

  7. 51单片机c语言除法符号,51单片机之C语言-4.4运算符及表达式

    原标题:51单片机之C语言-4.4运算符及表达式 4.4 及 前面三节实际是讲如何定义一个数据类型,所谓数据类型其实就是不同存储空间的形状,也就是不同单元格的组合方式.既然定义了数据类型,我们的目的当 ...

  8. 信工干货||C语言中的运算符和表达式

    C语言中的运算符和表达式 1算术运算符及表达式 (1)算术运算符包括: ,-,*,/,%. (2)*,/,%同级,比 ,-高. (3)"%"运算符两侧的运算分量必须为整型数据,且运 ...

  9. c语言表达式用法,C语言开发之运算符、表达式用法

    C语言中运算符和表达式数量之多,在高级语言中是少见的.正是丰富的运算符和表达式使C语言功能十分完善.这也是C语言的主要特点之一.C语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性.在 ...

最新文章

  1. WPF中Auto与*的差别
  2. 卷积神经网络要点解析
  3. docker 镜像修改的配置文件自动还原_Docker 基础与实战,看这一篇就够了
  4. 1047. Student List for Course (25)
  5. 【Python】简单的apscheduler定时任务
  6. token验证_如何利用 C# 爬取带 Token 验证的网站数据?
  7. 多用途bootstrap后台管理系统模板企业统计管理界面模板
  8. 正则解析多重循环模板
  9. android模拟点击webview,的Android的WebView点击模拟
  10. 安全防范报警系统产品质量监督检测测试中心(上海)
  11. c语言牛顿法求整数平方根,牛顿法求平方根-编程练习
  12. iOS微信分享服务器设置,ios微信分享设置title怎么弄?
  13. mysql ctrl+y_mysql操作
  14. 深入理解Linux内核第3版--笔记-1.pdf
  15. 信用卡和借记卡、储蓄卡
  16. CSS3的transform之3d转换、CSS3动画
  17. Unity中初步使用Navmesh寻路系统
  18. 计算机文档添加书签,小学计算机——制作可以跳转的书签教案
  19. 如何倾听客户之声?你需要的不仅仅是调研
  20. 如何用java判断手机号运营商?

热门文章

  1. 眼前一亮!古装男神张博现代装帅气依旧,不愧是网红教授
  2. 【C语言初阶】初识C语言(上)
  3. R 的用户界面(适用于 Windows)
  4. 微信公众平台测试账号
  5. 树莓派实现拨号上网(充当路由器)
  6. 来谈谈程序员的生活日常
  7. 小程序获取用户当前位置计算距离最近的地铁站并获取对应地区的商品(可手动切换地铁线路及地铁站)
  8. 使用shell获取IP归属地与运营商信息
  9. git与github之降龙十八掌
  10. SQLAlchemy教程(三)复杂查询