赞
踩
Verilog HDL的语言要素包括:
Verilog程序运行过程中,其值不能被随意改变的量,称为常数或常量,主要有:整型常量、实数型常量、字符串常量。整型常量可以综合,实数型常量和字符串常量不可综合。
**整型常量:**有符号数,可以带“+”或“-”,写法:[size]'base value,例如:2’b01,5’o37,4’d15,8’haa。
**实数整型常量:**写法有两种:十进制数、科学计数法;如:1.00,2.3e+3等。
**字符串型常量:**双引号内的字符串,不能分开成多行书写。如:“my world”。
标识符用来定义端口、常量、参数、变量、子程序名等,以英文字母或下划线开头,由大小写英文字母、数字、“_”、“$”组成,英文字母是区分大小写的。
注意Verilog的关键词是一类特殊的标识符,作为保留字,不能再用作自定义标识符,如:always、and、assign、begin等。(因为Verilog区分大小写,所以and和AND不一样,AND是普通标识符,不过不建议这样写)
Verilog有4类逻辑值:
格式:vector_name[ bit_select ];
例如cnt[3],即cnt中的第3位。如果[ ]中的值是x、z、或越界,则位选择的值是x。
格式:vector_name[ msb_const : lsb_const ];
例如:cnt[2:1],若选择的范围位x、z、或越界,则选择的值是x。
Verilog的数据类型主要用来说明存储在数字硬件或传送于数字组件间的数据类型,既支持整型、实型等抽象的数据类型,又支持物理数据类型来表示的真实硬件。
物理数据类型有连线型(wire、tri)、寄存器行(reg),这两种类型在定义时需要设置位宽,当缺省状态时,位宽默认为1。
抽象数据类型有整型(integer)、实型(real)、时间型(time)、参数型(parameter)。
连线型数据对应于硬件电路中的物理信号连线,需要由驱动源驱动,它有两种驱动方式,一种是在结构描述中把它连接到一个门或一个模块的输出端,另一种是用连续赋值语句assign对其进行赋值,在没有驱动源时,它将保持高阻态。
Verilog有多种连线型数据,包括:
寄存器数据:
寄存器数据对应于具有状态保持作用的硬件电路元件,如触发器、锁存器等。
寄存器数据未初始化的时候,值为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(加载十六进制值)。
整型(integer)数据类型常用于对循环变量进行说明,在算术运算中被视为二进制补码形式的有符号数。除了寄存器型数据被当做无符号数处理之外,整型数据与32位寄存器型数据在实际意义上相同。
整型数据的声明格式为:integer <寄存器型变量列表>;
整型数据可以是二进制、八进制、十进制、十六进制,可以有如下三种书写形式:
实型(real)数据类型可以是常量或变量,在机器码中用浮点型数值表示,可以用于计算 延迟,实型数据的声明格式如:real a;
实型数据可以用十进制或科学计数法表示,小数点的两边都必须是数字。
时间型(time)数据与整型数据类似,只是它是64位无符号数,主要用于模拟时间的存储与计算,常与系统函数$time一起使用。时间型数据的声明格式如:time start_time;
参数型(parameter)数据是被命名的常量,数据的具体类型由所赋的值来决定的。可以用参数型数据来定义变量的位宽、延迟时间等,从而增加程序可读性、易修改性。
参数型数据的声明格式为:parameter <赋值列表>
如:parameter width = 8;
操作符包括:
使用编译器预处理命令是为了使Verilog程序具有更好的可维护性,是编译综合Verilog程序能够更高效,编译器预处理指令通常用左上撇“ ’ ”连接一个关键词,它们可以出现在模块的任何地方。
在编译过程中,将内含数据类型声明或函数的Verilog程序文件内容插入另一个Verilog模块文件中,以增加设计者编程的方便性。
'define用来将字符串指定给一个宏变量,这一句书写时,结尾不要加分号“ ; ”,'undef用来取消先前定义的宏变量。
'timescale用于定义模块中仿真时间单位及精度,可以在相同的设计中以不同的时间单位去仿真,也可以在同一设计的两个不同模块中设定不同的延迟时间。
语法格式:'timescale <时间单位> / <时钟精度>
'resetall用于将所用的编译器预处理命令复位到默认值。
条件编译,根据’ifdef的情况选择编译其中一块语句。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。