学习使用Vivado和SDK进行Xilinx ZYNQ FPGA开发 | (十四)Verilog程序设计:Verilog HDL语言相关知识 | 2023.11.23/星期四/天气晴

系列文章目录

专栏系列文章:学习Xilinx ZYNQ FPGA开发



摘要

Verilog HDL的语言要素包括:

  • Verilog文字规则
  • Verilog数据类型
  • Verilog操作符
  • 编译器伪指令

一、Verilog文字规则

1.常量

Verilog程序运行过程中,其值不能被随意改变的量,称为常数或常量,主要有:整型常量、实数型常量、字符串常量。整型常量可以综合,实数型常量和字符串常量不可综合。
**整型常量:**有符号数,可以带“+”或“-”,写法:[size]'base value,例如:2’b01,5’o37,4’d15,8’haa。
**实数整型常量:**写法有两种:十进制数、科学计数法;如:1.00,2.3e+3等。
**字符串型常量:**双引号内的字符串,不能分开成多行书写。如:“my world”。

2.标识符

标识符用来定义端口、常量、参数、变量、子程序名等,以英文字母或下划线开头,由大小写英文字母、数字、“_”、“$”组成,英文字母是区分大小写的。
注意Verilog的关键词是一类特殊的标识符,作为保留字,不能再用作自定义标识符,如:always、and、assign、begin等。(因为Verilog区分大小写,所以and和AND不一样,AND是普通标识符,不过不建议这样写)

3.逻辑值

Verilog有4类逻辑值:

  • 0:逻辑0或假状态
  • 1:逻辑1或真状态
  • z:高阻态
  • x:未知状态

4.位选择

格式:vector_name[ bit_select ];
例如cnt[3],即cnt中的第3位。如果[ ]中的值是x、z、或越界,则位选择的值是x。

5.段选择

格式:vector_name[ msb_const : lsb_const ];
例如:cnt[2:1],若选择的范围位x、z、或越界,则选择的值是x。

二、Verilog数据类型

Verilog的数据类型主要用来说明存储在数字硬件或传送于数字组件间的数据类型,既支持整型、实型等抽象的数据类型,又支持物理数据类型来表示的真实硬件。
物理数据类型有连线型(wire、tri)、寄存器行(reg),这两种类型在定义时需要设置位宽,当缺省状态时,位宽默认为1。
抽象数据类型有整型(integer)、实型(real)、时间型(time)、参数型(parameter)。

1.连线型数据类型

连线型数据对应于硬件电路中的物理信号连线,需要由驱动源驱动,它有两种驱动方式,一种是在结构描述中把它连接到一个门或一个模块的输出端,另一种是用连续赋值语句assign对其进行赋值,在没有驱动源时,它将保持高阻态。
Verilog有多种连线型数据,包括:

  • 连线(wire)和三太线(tri)网络
  • 线或(wor)和三态线或(trior)线网
  • 线与(wand)和三态线与(triand)线网
  • trireg线网(可以存储数值,且可以用于电容节点的建模)
  • tri0和tri1线网(用于线逻辑的建模)
  • supply0和supply1线网(用于对低电平0和高电平1建模)

2.寄存器数据类型

寄存器数据:
寄存器数据对应于具有状态保持作用的硬件电路元件,如触发器、锁存器等。
寄存器数据未初始化的时候,值为x,赋值后寄存器的值保持最后一次的赋值。
寄存器数据的驱动可以通过过程赋值语句实现,而过程赋值语句只能出现在过程块中。
存储器数据:
存储器数据,实际上是一个寄存器数组,格式如下:
reg[ msb:lsb ] m1[ up1:low_1 ], m2[ up2:low2 ], …… mn[upn:lown];
如果不写[ up1:low_1 ],则说明是单个寄存器,如:
reg [7:0] cnt1[127:0],cnt2;
其中cnt1为128个7:0的寄存器数组,cnt2为单个7:0寄存器。
存储器不能像寄存器那样赋值,而是通过如下两种方式赋值:
对存储器(寄存器组)中的每个字(每个寄存器)分别单独赋值,如:
reg [7:0] seg[3:1];
seg[1] = 8’b00000001;
seg[2] = 8’b00000010;
seg[3] = 8’b00000011;
或者利用系统任务来为存储器赋值,这类系统任务有两种: r e a d m e m b (加载二进制值)、 readmemb(加载二进制值)、 readmemb(加载二进制值)、readmamh(加载十六进制值)。

3.整型数据类型

整型(integer)数据类型常用于对循环变量进行说明,在算术运算中被视为二进制补码形式的有符号数。除了寄存器型数据被当做无符号数处理之外,整型数据与32位寄存器型数据在实际意义上相同。
整型数据的声明格式为:integer <寄存器型变量列表>;
整型数据可以是二进制、八进制、十进制、十六进制,可以有如下三种书写形式:

  • 简单十进制格式,如:123,+456,-789。
  • 缺省位宽的基数格式,如:'d10,'h22。
  • 指定位宽的基数格式,如:8’d255,4’b1101。

4.实型数据类型

实型(real)数据类型可以是常量或变量,在机器码中用浮点型数值表示,可以用于计算 延迟,实型数据的声明格式如:real a;
实型数据可以用十进制或科学计数法表示,小数点的两边都必须是数字。

5.时间型数据类型

时间型(time)数据与整型数据类似,只是它是64位无符号数,主要用于模拟时间的存储与计算,常与系统函数$time一起使用。时间型数据的声明格式如:time start_time;

6.参数型数据类型

参数型(parameter)数据是被命名的常量,数据的具体类型由所赋的值来决定的。可以用参数型数据来定义变量的位宽、延迟时间等,从而增加程序可读性、易修改性。
参数型数据的声明格式为:parameter <赋值列表>
如:parameter width = 8;

三、Verilog的操作符

操作符包括:

  • 算术操作符:加(+)、减(-)、乘(*)、除(/)、取模(%)
  • 逻辑操作符:逻辑与(&)、逻辑或(|)、逻辑非(!)
  • 关系操作符:大于(>)、小于(<)、大于等于(>=)、小于等于(<=)
  • 相等操作符:相等(= =)、不等(!=)、全等(= = =)、非全等(!= = )
  • 按位操作符:按位与(&)、按位或(|)、按位非( ~ )、按位异或( ^ )、按位异或非(^~)
  • 归约操作符:归约与(&)、规约与非(&~ )、规约或(|)、规约或非(|~ )、归约异或(^ )、规约异或非(^~)
  • 移位操作符:左移(<<)、右移(>>)
  • 条件操作符:条件(?:)
  • 连接操作符:连接({})
  • 复制操作符:复制({{}})
    操作符后面跟操作数,操作符会将操作数按照所定义的功能做计算,产生新的值。
    操作符分为单目操作符和双目操作符等,单目操作符使用一个操作数,双目操作符使用两个操作数,条件操作符使用三个操作符,连接操作符可以使用任意个数的操作数。

四、编译器伪指令

使用编译器预处理命令是为了使Verilog程序具有更好的可维护性,是编译综合Verilog程序能够更高效,编译器预处理指令通常用左上撇“ ’ ”连接一个关键词,它们可以出现在模块的任何地方。

'include

在编译过程中,将内含数据类型声明或函数的Verilog程序文件内容插入另一个Verilog模块文件中,以增加设计者编程的方便性。

'define、'undef

'define用来将字符串指定给一个宏变量,这一句书写时,结尾不要加分号“ ; ”,'undef用来取消先前定义的宏变量。

'timescale

'timescale用于定义模块中仿真时间单位及精度,可以在相同的设计中以不同的时间单位去仿真,也可以在同一设计的两个不同模块中设定不同的延迟时间。
语法格式:'timescale <时间单位> / <时钟精度>

'resetall

'resetall用于将所用的编译器预处理命令复位到默认值。

'ifdef、'else、'endif

条件编译,根据’ifdef的情况选择编译其中一块语句。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值