Verilog语法入门 (一) 数值表示,数据类型及运算符 |
您所在的位置:网站首页 › zynq入门 › Verilog语法入门 (一) 数值表示,数据类型及运算符 |
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 |