Verilog语法入门 (一) 数值表示,数据类型及运算符

您所在的位置:网站首页 zynq入门 Verilog语法入门 (一) 数值表示,数据类型及运算符

Verilog语法入门 (一) 数值表示,数据类型及运算符

2023-07-09 15:29| 来源: 网络整理| 查看: 265

0.前言

强烈推荐一个学习Verilog的刷题网站,HDLBits,从基础语法到一个比较完整的模块设计,提供了完整的练习过程,把上面的题刷完之后基本就可以完成大部分的Verilog程序设计了。不过网站是全英文的,需要一些英语基础。

HDLBits (01xz.net)

1.逻辑值

Verilog中存在四种逻辑值

逻辑0:表示低电平,对应GND逻辑1:表示高电平,对应VCC逻辑X:表示未知,有可能是高电平,也可能是低电平逻辑Z:表示高阻态,外部没有激励信号,是一个悬空状态。'?'是Z的另一种表达形式。 2.进制格式

Verilog 数字进制格式包括二进制(b)、 八进制(o)、 十进制(d)和十六进制(h),一般常用的为二进制、 十进制和十六进制。

书写格式:[换算成二进制后位宽总长度]['][数值进制符号][与数值进制符号对应的数值]

例如:

二进制: 4’b0101 表示 4 位二进制数字 0101十进制: 4’d2 表示 4 位十进制数字 2(对应二进制 0010)十六进制: 4’ha 表示 4 位十六进制数字 a(对应二进制 1010)

注意进制前的数值表示该数换成二进制后对应的位数

位宽与进制默认32位10进制。

用下划线可增加程序可读性不会影响计算机识别数值,如16'b1001_1010_1010_1001 = 16'h5AA5。

换算成二进制后的位宽总长度是非必须的,Verilog会为常量自动匹配合适的位宽。例如, 4’ha 写做 ‘ha 是合法的。

当总位宽大于实际位数,则自动在高位补0或X或Z,总位宽小于实际位数,则自动截断高位超出的位数。

最高有效位MSB(most significant bit)在左边。

3.数据类型

Verilog中数据主要分寄存器和连线两种类型,区别在于驱动方法(赋值方式)、保持方式、硬件实现。

3.1寄存器类型(reg)

寄存器是具有状态保持作用的硬件电路元件,通常会是一个触发器

驱动方式:

        过程赋值只能出现在过程语句(initial和always)之后,及reg类型的数据只能在always语句和initial语句中被赋值

        如果该过程语句描述的是时序逻辑,即always语句带有时钟信号,则该寄存器变量对应为触发器;

        如果该过程语句描述的是组合逻辑,即always语句不带时钟信号,则该寄存器变量对应为硬件连线;

        未赋值前,认为处于不定状态X

保持方式:

        在下一次赋值前保持不变

硬件实现:

        触发器和锁存器等(reg类)

寄存器数据类型有很多种

reg,行为描述,过程赋值integer,32位带符号整形变量real,64位带符号实性time,63位无符号时间变量

integer,real,time均为过程中数学描述,不对应具体硬件电路,即无法综合

最常用的是reg型,刚开始接触Verilog时,只需要记住reg即可

reg key; //声明一个1位的寄存器 reg [31:0] cnt; //声明一个32位的寄存器 reg [7:0] cnt1,cnt2; //可以一次声明多个相同位宽的寄存器,用‘,’隔开 //可以通过以下形式对寄存器进行位选或片选 cnt[0] //cnt寄存器的最低位 cnt[7:0] //cnt寄存器的低8位 3.2连线类型(wire)

连线数据类型表示结构实体(例如门)之间的物理连线

驱动方式:

        连到门或模块的输出,或连续赋值语句assign赋值,信号连线不能出现在过程语句(initial和always)中

        无驱动时处于高阻态Z(trireg为X态)

保持方式:

        没有电荷保持作用(trireg除外)

硬件实现:

        物理信号的连线

连线类型的变量不能储存值,它的值是由驱动它的元件所决定的。

连线数据类型有以下几种

wire,tri,标准连线,缺省类型wor,trior,多重驱动,线或特性wand,triand,多重驱动,线与特性trireg,电荷保持特性tri1,上拉电阻(pullup)tri0,下拉电阻(pulldown)supply1,电源线,逻辑1supply0,底线,逻辑0

最常用的是wire型,刚开始接触Verilog时,只需要记住wire即可

wire data; //声明一个一位的线网类型 wire [7:0] data; //声明一个8位的线网类型 wire [31:0] data1,data2; //可以同时声明多个相同位宽的线网类型,用,隔开 //对线网类型的位选与片选 data[0] //线网类型数据data的最低位 data[7:4] //线网类型数据data的高4位 3.3参数类型

参数其实就是一个常量,在VerilogHDL中用parameter定义或用localparam定义,通过localparam定义的参数只能在本模块内使用,不能被其他模块调用或覆盖。

可以一次定义多个参数,参数与参数之间需要用逗号隔开。

每个参数定义的右边必须是一个常数表达式。

parameter a=1,b=2; //可以一次定义多个参数 parameter a=x+y; //参数定义的右边必须是一个常量表达式,即x+y必须是一个定值 3.4数组

在 Verilog 中允许声明 reg, wire, integer, time, real 及其向量类型的数组。

reg [3:0] cnt [3:0] //由4个4bit寄存器构成的数组 wire [7:0] add [3:0] //由4个4位宽的线网构成的数组 wire data[3:0][7:0] //数组的维数没有限制,可以声明高维的数组 //对数组的赋值操作 cnt[3] = 4'hF; //将cnt中第四个元素(即第四个4位的寄存器)赋值为十六进制的F data[0] = 1'b1; //此处赋值是违法的,不能省略第二个访问符号,应该为data[0][1] = 1'b1; 3.5注意事项

变量声明时不要对变量进行赋初值操作。赋初值操作应该在复位状态下完成,也建议寄存器变量都使用复位端,以保证系统上电或紊乱时,可以通过复位操作让系统恢复初始状态。

复位时语句块中所有的信号都应该赋予初值,不要漏掉相关信号。

4.运算符 4.1算术运算符 符号用法说明 + a+ba加b-a-ba减b*a*ba乘b/a/ba除b%a%ba模除b

如果操作数某一位为 X,则计算结果会全部出现 X。

a = 2'b10; b = 4'b100x; c = a+b; //位数不同时可以相加,结果为c=4'bxxxx;

利用FPGA实现乘除法运算十分浪费逻辑资源,因此通常会用移位运算代替,后面会结束具体用法。

4.2关系运算符 符号用法说明>a>ba大于b=ba大于等于b


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3