时间:2024-08-02 来源:网络搜集 关于我们 0
“ 一个多年老硬件攻城狮,开始从0学FPGA......”
小编通过Vivado学习了几个例程,基本把软件环境搞通了,最大的体会是回到Verlilo的学习,只有把Verilog这门语言学会了,才能在实际的开发中得心应手。需求是输入,算法是核心、语言和开发环境是工具,真所谓“巧妇难为无米之炊”。数据类型是用来表示电路硬件中的数据储存和传送元素的。数据类型的参数就像其他语言一样,作为特定的关键词,在程序中取变量名的时候,应该避免使用这些关键词。Verilog HDL中总共有 19 种数据类型。
其中最基本是以下四种基本类型:reg 型、wire 型integer 型和 parameter 型。
其他数据类型是:large 型、medium 型、scalared 型,time 型、small 型、tri 型、trio 型、tril 型、triand 型、trior型、trireg 型、vectored 型、wand 型和 wor 型。这14 种数据类型除 time 型外都与基本逻辑单元建库有关,与系统设计没有很大的关系。后续接触到再逐步补充吧。01
—
常量
在程序运行过程中,其值不能被改变的量称为常量。Verilog中的常量主要几种。整数在 Verilog HDL 中,整型常量即整常数有以下 4 种进制表示形式:
1)二进制整数(b或B);
2)十进制整数(d或D);
3)十六进制整数(h或H);
4)八进制整数(o或O)。
数字表达方式有以下3种:
1)<位宽><进制><数字>;
2)在<进制><数字>;
3)在<数字>
第一种表达方式是最全面的表达方式,建议使用该表达方式。第二种表达方式省略了位宽,则默认是系统的位宽。第三种方式省略了位宽和进制标识,默认是十进制。
例如十进制数255用不同的进制表示:
8b11111111 //位宽为8位的二进制,b为二进制标识
8D255 //位宽为8位的十进制数255,D为二进制标识
8HFF //位宽为8位的十六进制数255,H为二进制标识
8O377 //位宽为8位的八进制数255,O为二进制标识
x和z值在数字电路中,x代表不定值,z代表高阻值。一个x可以用来定义十六进制数的 4 位二进制数的状态,八进制数的 3 位,二进制数的 1位。z 的表示方式同x类似。z还有一种表达方式是可以写作“?”。在使用 case 表达式时建议使用这种写法,以提高程序的可读性。
例:
4b11x0 //位宽为4的二进制数从低位数起第 2位为不定值
4’b101z //位宽为4的二进制数从低位数起第1位为高阻值
12dz //位宽为 12的十进制数,其值为高阻值
12d? //位宽为12 的十进制数,其值为高阻值
8h4x //位宽为8的十六进制数,其低4 位值为不定值
负数一个数字可以被定义为负数,只须在位宽表达式前加一个减号,减号必须写在数字定义表达式的最前面。
例:
-8d5 //这个表达式代表5的补数(用八位二进制数表示)
下画线(underscore_)下画线可以用来分隔开数的表达以提高程序可读性。它不可以用在位宽和进制处,只能用在具体的数字之间。
例:
16b1010_1011_1111_1010 //合法格式
8b_0011_1010 //非法格式
参数(parameter)型
在 Verilog HDL中用 的关键词parameter 定义常量,即用 parameter 来定义一个标识符代表一个常量,称为符号常量,即标识符形式的常量,采用标识符代表一个常量可提高程序的可读性和可维护性。parameter型数据是一种常数型的数据,其说明格式如下:
parameter参数名1=表达式,参数名 2=表达式,···,参数名 n=表达式;
parameter 是参数型数据的确认符。确认符后跟着一个用逗号分隔开的赋值语句表。在每一个赋值语句的右边必须是一个常数表达式。也就是说,该表达式只能包含数字或先前已定义过的参数。
例:
parameter msb=7; //定义参数msb为常量 7
parameter e=25,f=29; //定义两个常数参数
parameterr=5.7; //声明r为一个实型参数
parameter byte_size=8,byte_msb=byte_size-l; //用常数表达式赋值
02
—
变量
变量是一种在程序运行过程中其值可以改变的量,在 Verilog HDL 中变量的数据类型有很多种。这里只对上述提到的其中3种基本变量类型介绍。
wire 型wire 型数据常用来表示用以assign 关键字指定的组合逻辑信号。Verilog 程序模块中输入、输出信号类型默认时自动定义为 wire 型。wire 型信号可以用做任何方程式的输入,也可以用做“assign”语句或实例元件的输出。
wire 型信号的格式如下:wire[n-1:0]数据名1,数据名2,···数据名i ; //共i条总线,每条总线有n条线路
或 wire[n:1]数据名1,数据名 2,···数据名 i;wire 是 wire 型数据的确认符;[n-l:0]和[n:]]代表该数据的位宽,即该数据有几位;最后跟着的是数据的名字。如果一次定义多个数据,数据名之间用逗号隔开。声明语句的最后要用分号表示语句结束。
例:
wire a: //定义了一个1位的 wire 型数据
wire[7:0] b; //定义了一个8位的 wire 型数据
wire[4:1]c,d; //定义了二个4位的 wire型数据
reg 型寄存器是数据储存单元的抽象,寄存器数据类型的关键字是 reg。通过赋值语句可以改变寄存器储存的值,其作用与改变触发器储存的值相当。Verilog HDL 语言提供了功能强大的结构语句,使设计者能有效地控制是否执行这些赋值语句。这些控制结构用来描述硬件触发条件,例如时钟的上升沿和多路器的选通信号。在reg 类型数据的默认初始值为不定值 x。
reg 型数据常用来表示“always”模块内的指定信号,常代表触发器。通常,在设计中要由“always”模块通过使用行为描述语句来表达逻辑关系。“always”模块内被赋值的每一个信号都必须定义成 reg型。
reg 型数据的格式如下:
reg[n-l:0] 数据名 1,数据名 2,···,数据名 i;
或 reg[n;l] 数据名 1,数据名 2,···,数据名 i;reg 是 reg 型数据的确认标识符,[n-1:0]和[n:1]代表该数据的位宽,即该数据有几位(bit),最后跟着的是数据的名字。如果一次定义多个数据,数据名之间用逗号隔开。声明语句的最后要用分号表示语句结束。
例:
reg rega; //定义了一个1位的名为 rega 的 reg 型数据
reg[3:0] regb; //定义了一个4位的名为 regb的 reg 型数据
reg[4:1] regc,regd; //定义了二个4位的名为 rege和 regd 的 reg 型数据
memory 型Verilog HDL通过对 reg 型变量建立数组来对存储器建模,可以描述 RAM 型存储器ROM 存储器和 reg 文件。数组中的每一个单元通过一个数组索引进行寻址。在 Verilog 语言中没有多维数组存在。memory 型数据是通过扩展 reg 型数据的地址范围来生成的。其格式如下:
reg[n-1:0] 存储器名[m-1:0]:
或 reg [n-1:0] 存储器名[m:1];在这里,reg[n-1:0]定义了存储器中每一个存储单元的大小,即该存储单元是一个 n位的寄存器:存储器名后的[m-1:0]或[m:1] 则定义了该存储器中有多少个这样的寄存器:最后用分号结束定义语句。
例:
reg[7:0] mema[255:0];
这个例子定义了一个名为 mema 的存储器,该存储器有 256个8位的存储器。该存储器的地址范围是 0到 255。
----------------------------------------------------------参考书籍:【《Verilog数字系统设计教程》夏宇闻 】
----------------------------------------------------------【高清HDMI 2.0线】推荐淘宝店铺“电子eStore"所卖的这款,多种线材规格可供选择。
【淘宝】https://m.tb.cn/h.gZ7bXRf?tk=rDGhWr2rQ96 MF1643 「绿联hdmi线2.0清线4k视频传输线黄黑头黑色工程HDMI线」点击链接直接打开 或者 淘宝搜索直接打开
----------------------------------------------------------------
----------------------------------------------------------------
关注小编一起学FPGA......