系列文章目录专栏系列文章学习Xilinx ZYNQ FPGA开发文章目录系列文章目录摘要一、Verilog文字规则1.常量2.标识符3.逻辑值4.位选择5.段选择二、Verilog数据类型1.连线型数据类型2.寄存器数据类型3.整型数据类型4.实型数据类型5.时间型数据类型6.参数型数据类型三、Verilog的操作符四、编译器伪指令includedefine、undeftimescaleresetallifdef、else、endif摘要Verilog HDL的语言要素包括Verilog文字规则Verilog数据类型Verilog操作符编译器伪指令一、Verilog文字规则1.常量Verilog程序运行过程中其值不能被随意改变的量称为常数或常量主要有整型常量、实数型常量、字符串常量。整型常量可以综合实数型常量和字符串常量不可综合。**整型常量**有符号数可以带“”或“-”写法[size]base value例如2’b01,5’o37,4’d15,8’haa。**实数整型常量**写法有两种十进制数、科学计数法如1.00,2.3e3等。**字符串型常量**双引号内的字符串不能分开成多行书写。如“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_time6.参数型数据类型参数型parameter数据是被命名的常量数据的具体类型由所赋的值来决定的。可以用参数型数据来定义变量的位宽、延迟时间等从而增加程序可读性、易修改性。参数型数据的声明格式为parameter 赋值列表如parameter width 8三、Verilog的操作符操作符包括算术操作符加、减-、乘*、除/、取模%逻辑操作符逻辑与、逻辑或|、逻辑非!关系操作符大于、小于、大于等于、小于等于相等操作符相等 、不等!、全等 、非全等! 按位操作符按位与、按位或|、按位非 ~ 、按位异或 ^ 、按位异或非^~归约操作符归约与、规约与非~ 、规约或|、规约或非|~ 、归约异或^ 、规约异或非^~移位操作符左移、右移条件操作符条件?:连接操作符连接{}复制操作符复制{{}}操作符后面跟操作数操作符会将操作数按照所定义的功能做计算产生新的值。操作符分为单目操作符和双目操作符等单目操作符使用一个操作数双目操作符使用两个操作数条件操作符使用三个操作符连接操作符可以使用任意个数的操作数。四、编译器伪指令使用编译器预处理命令是为了使Verilog程序具有更好的可维护性是编译综合Verilog程序能够更高效编译器预处理指令通常用左上撇“ ’ ”连接一个关键词它们可以出现在模块的任何地方。include在编译过程中将内含数据类型声明或函数的Verilog程序文件内容插入另一个Verilog模块文件中以增加设计者编程的方便性。define、undefdefine用来将字符串指定给一个宏变量这一句书写时结尾不要加分号“ ”undef用来取消先前定义的宏变量。timescaletimescale用于定义模块中仿真时间单位及精度可以在相同的设计中以不同的时间单位去仿真也可以在同一设计的两个不同模块中设定不同的延迟时间。语法格式timescale 时间单位 / 时钟精度resetallresetall用于将所用的编译器预处理命令复位到默认值。ifdef、else、endif条件编译根据’ifdef的情况选择编译其中一块语句。