目录
1.VHDL语言基础
1.1.标识符 (Identifiers)
关键字(保留 字):
1.2.数据对象(Date Objects)
常量 Constant
变量Variable
信号Signal
1.3.数据类型
VHDL的预定义数据类型
IEEE预定义标准逻辑位与矢量
用户自定义
1.4数据类型转换
属性
运算符
运算符的优先级
VHDL 概 概 述:
VHDL的优点:
标 识符用来定义常数、 变量 、 信号 、 端口 、 子程序或参数的名字,由字母 母(A~Z,a~z) 、数字(0~9)和下划线 线(_)字符组成。
要求 :
注意:注释由两个连续的虚线( -- )引 导
关键字((keyword))是 是VHDL中具有特别含义的单词 , 只能做为固定的用途 ,用户不能用其做为标识符。
如: ABS, ACCESS , AFTER , ALL , AND , ARCHITECTURE, ARRAY , ATTRIBUTE , BEGIN, BODY , BUFFER , BUS , CASE , COMPONENT , CONSTANT , DISCONNECT , DOWNTO , ELSE, ,ELSIF , END , ENTITY , EXIT , FILE , FOR , FUNCTION, GENERIC , GROUP , IF , INPURE , IN ,INOUT , IS , LABEL, LIBRARY , LINKAGE , LOOP , MAP , MOD , NAND , NEW , NEXT, ,NOR , NOT , NULL , OF , ON , OPEN , OR , OTHERS , OUT, PACKAGE , , POUT , , PROCEDURE , PROCESS , PURE , RANGE , RECODE , REM , REPORT , RETURN , ROL , ROR , SELECT, SHARED , SIGNAL , SLA , SLL , SRA , SUBTYPE , THEN, TRANSPORT , TO , , TYPE , UNAFFECTED , UNITS , UNTIL , USE, VARIABLE , WAIT , WHEN , WHILE , WITH ,XOR , XNOR。
数据对象包括常量 、变量 、信号和文件四种类型 。
常量是对某一常量名赋予一个固定的值 ,而且只能赋值一次 。通常赋值在程序开始前进行, 该值的数据类型则在说明语句中指明。
Constant 常数名 :数 据 类 型 : =表达式
例子:
Constant Vcc :real:=5.0; -- 定义Vcc的数据类型是实数, 赋值为为5.0V
Constant bus_width: integer := 8; --定义总线宽度为常数8
注意事项:
变量只能在进程语句、函数语句和过程语句结构中使用。 变量的赋值是直接的,非预设的, 分配给变量的值立即成为当前值 , 变量不能 表达“ 连线” 或 存储元件 ,不能设置传输延迟量。
变量定义语句:
Variable 变量名 : 数据类型 := 初始值
例子:
Variable count: integer 0 to 255:=20;
解释:定义count整数变量 , 变化范围0 ~255, 初始值为20。
变量赋值语句:
目标变量名 := 表达式;
例子:
x:=10.0; -- 实数变量赋值为10.0
Y:=1.5+x; -- 运算表达式赋值 , 注意表达式必须与目标变量的数据类型相 同
A(3 to 6):=(“1101”); -- 位矢量赋值
信号表示逻辑门的输入或输 出 ,类似于连接线, 也可以表达存储元件的状态。 信号通常在构造体 、程序包和实体中。
信号定义语句:
Signal 信号名: 数据类型 := 初始值
例子:
Signal clock :bit := ‘0 ’; -- 定义时钟信号类型 ,初始值为0
Signal count :BIT_VECTOR(3 DOWNTO 0); -- 定义count 为4位矢量
信号赋值语句:
目标信号名 <= 表达式;
例子:
x<=9;
Z<=x after 5 ns; -- 在5ns 后将x的值赋予z
在 VHDL标准程序包STANDARD中定义好 ,实际使用过程中, 已自动包含进VHDL源文件中,不需要通过USE语句显式调用。
TYPE BOOLEAN IS (FALSE, TRUE); -- 取值为FALSE 和TRUE,不是数,不是数值 ,不能运 算,一 般用于关系运算。
TYPE BIT IS (‘0’,’1’); -- 取值为0 和1,用于逻辑运算。
TYPE BIT_VECTOR IS ARRAY (Natural range<>) OF BIT; -- 基于Bit类型的数组 ,用于逻辑运算。
例子:
SIGNAL a :Bit_Vector(0 TO 7);
SIGNAL a :Bit_Vector ( 7 DOWNTO 0);
TYPE CHARACTER IS (NUL, SOH,STX, …, ‘ ’, ‘!’,…); --通常用‘’ 引起来 , 区分大小写。
VARIABLE string_var: STRING (1 TO 7);
string_var:=“A B C D” ; -- 通常用“” 引起来 , 区分大小写;
取值范围 -(2^31 -1) ~ (2^31 - 1) ,可用32位有符号的二进制数表示。
例子:
variable a :integer range -63 to 63
注意:
取值范围值范围 -1.0E38 ~ +1.0E38, , 仅用于仿真不可综合。
例子:
1.0 --十 十 进制 浮 点数
8 #43.6 #e+4 --八 八 进制 浮 点数
43.6E-4 --十 十 进制 浮 点数
物理量数据 ,完整的包括整数和单位两个部分 ,用至少一个空格隔开 , 仅用于仿真不可综合 ;
单位:fs,ps,ns,us,ms,sec,min,hr
表示系统状态, 仅用于仿真不可综合 ;
例子:
TYPE severity_level IS (NOTE 、WARNING 、ERROR 、FAILURE);
U | Uninitialized (未初始化的) |
X | Forcing Unkown (强制未知的) |
0 | Forcing 0 (强逻辑0) |
1 | Forcing 1 (强逻辑1) |
Z | High Impedance (高阻态) |
W | Weak Unknow (弱未知的) |
L | Weak 0 (弱逻辑0) |
H | Weak 1 (弱逻辑1) |
— | Don’t care (忽略) |
使用 Std_Logic和 Std_Logic_Vector要 调用IEEE库中的Std_Logic_1164程序包; 就综合而言,能够在数字器件中实现的是“ -、 0 、1 、Z”四种状态。
方法一:
TYPE 数据类型名 IS 数据类型定义 OF 基本数据类型 或
TYPE 数据类型名 IS 数据类型定义
例子:
数 组: type value_type is array (127 downto 0) of integer;
type matrix_type is array (0 to 15, 0 to 31) of std_logic;枚举: type states is (idle ,decision ,read ,write);
type boolean is (false ,true);
type bit is (‘0’ ,‘1’);
方法二:
SUBTYPE 子类型名 IS 基本数据类型定义 RANGE 约束
例子:
subtype digit is integer range 0 to 9;
VHDL为强定义类型语言,不同类型的数据不能进行运算和直接赋值 。
Variable A: integer; Variable B: real;
A= integer (B); B=real (A);
Conv_interger (A) ;-- 由std_logic转换为integer型,在std_logic_unsigned包。
Type conv_table is array(std_logic) of bit;
Constant table: conv_table:=(‘0’|’L’=>’0’, ‘1’|’H’=>’1’, others=>’0’);
Signal a: bit; signal b: std_logic;
A<=table(b); -- 将std_logic型 型 转换为 为bit型
在“STD_LOGIC_1164” 、“STD_LOGIC_ARITH”和 “STD_LOGIC_UNSIGNED” 的程序包中提供的数据类型变换函数。
属 性提供的是关于信号 、类型等的指定特性 。
‘event : 若属性对象有事件发生,则生成布尔值“true”,常用来检查时钟边沿是否有效。
上升沿: Clock’ EVENT AND Clock=‘1’
’range : 生成一个限制性数组对象的范围
’left : 生成数 据 类 型 或数 据 子 类 型 的 左边界 值;
’right , ’high, ’low, ’length
’range: “0 to n” ; ’reverse_range :“n downto 0”
并置操作符 &
SIGNAL a : STD_LOGIC_VECTOR (3 DOWNTO 0) ;
SIGNAL d : STD_LOGIC_VECTOR (1 DOWNTO 0) ;
...
a <= '1'&'0'&d(1)&'1' ; -- 元素与元素并置 , 并置后的数组长度为为4
...
IF a & d = "101011" THEN ... –- 在IF条 条 件 句中可以使用并置符
优先级从到高,如下所示:
逻辑 、算术运算符 : NOT, ** ,ABS
乘法运算符 : / , MOD, REM, *
正负运算符 : +, -
加减、 并置运算 符 : +, -, &
关系运算符 : =, /= , <, > , <=, >=
逻辑运算符 :AND ,OR ,NAND ,NOR ,XNOR ,NOT ,XOR
注意事项:
1.移位运算符的左边为一维数组 , 其类型必须是BIT或BOOLEAN, 右边必须是整数移位次数为整数的绝对值,
例子:
“1100”SLL1 =“1000” “1100”SRL1 =“0110” “1100”SLA1 =“1000”
“1100”SRA1 =“1110” “1100”ROL1 =“1001” “1100”ROR1 =“0110
2.取余运算(a REM b) 的符号与a相同, 其绝对值小于b的绝对值
例子:
(-5 )REM 2= (-1) 5 REM 2= (1)
3.取模运算(a MOD b) 的符号与b相同, 其绝对值小于b的绝对值
例子:
(-5 )MOD 2=1 5 MOD (- 2)= (-1)