VHDL数据类型与顺序语句
目录
1. 位数据和位矢量
位数据类型BIT的取值范围是逻辑位‘1’和‘0’。位矢量类型BIT_VECTOR是BIT的数组类型。
程序包STANDARD中定义的源代码如下:
TYPE BIT IS (‘0’, ‘1’);
TYPE BIT_VECTOR IS ARRAY (NATURAL RANGE<>) OF BIT;
例:SIGNAL X,Y:BIT;
SIGNAL A,B:BIT_VECTOR(3 DOWNTO 0);
...
X<=‘1’; --对BIT类型的信号X赋值
A<=“1101”; --赋值后A(3)、A(2)、A(1)、A(0) 分别为‘1’、‘1’、‘0’、‘1’
B(2 DOWNTO 1)<=A(3 DOWNTO 2); --B(2)=A(3),B(1)=A(2)
B(2 DOWNTO 0)<=X﹠Y﹠‘1’;-- B(2)=X、B(1)=Y、B(0)=‘1’
STD库符合VHDL语言标准,在定义BIT和BIT_VECTOR类型的程序中不必以显示打开STD库和STANDARD程序包。
2.STD_LOGIC所定义的9种数据
‘U’表示未初始化的; ‘X’表示强未知的; ‘0’表示强逻辑0;
‘1’表示强逻辑1; ‘Z’表示高阻态; ‘W’ 表示弱未知的;
‘L’表示弱逻辑0; ‘H’表示弱逻辑1; ‘-’表示忽略。
在使用STD_LOGIC_VECTOR中,必须注明其数组宽度,即位宽,如:
B : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ;
SIGNAL A :STD_LOGIC_VECTOR(1 TO 4);
3. 整数处理
在VHDL中,整数的取值范围是-214783647~+2147483647。VHDL仿真器将整数类型作为有符号数处理,VHDL综合器将整数 作为无符号数处理。使用整数时,综合器要求必须用RANGE子句为所定义的数限定范围,根据所限定的范围决定信号或变量的二进制的位数。
例:SIGNAL Q : INTEGER RANGE 15 DOWNTO 0;
–综合器自动将Q综合成4条信号线构成的总线方式信号:Q(3) 、Q(2)、Q(1)、Q(0)。
4. 布尔数据类型
布尔数据类型BOOLEAN在标准程序包STANDARD中定义的源代码:
TYPE BOOLEAN IS (FALSE,TURE);
布尔量不属于数值,不能用于计算,只能用于比较和判断,而且布尔类型是在数据比较中默认产生的。
5.SIGNED和UNSIGNED类型
在IEEE库中加入的程序包STD_LOGIC_ARITH中定义了如下数据类型:无符号型(UNSIGNED)、有符号型(SIGNED)和小整型(SMALL_INT)。这些数据类型使用前必须加入如下语句;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_ARITH.ALL;
在STD_LOGIC_ARITH中定义的UNSIGNED和SIGNED类型的源代码如下:
TYPE UNSIGNED IS ARRAY (NATURAL RANGE <>) OF STD_LOGIC;
TYPE SIGNED IS ARRAY (NATURAL RANGE <>) OF STD_LOGIC;
STD_LOGIC和STD_LOGIC_VECTOR类型的数据可以进行逻辑运算和关系运算,却不能直接进行算术运算;
而UNSIGNED和SIGNED类型的数据可以进行算术运算和关系运算,但不能进行逻辑运算
6.其他预定义类型
6.1 字符(CHARACTER)类型
通常用单引号引起来,字符类型区分大小写,如‘B’和’b’不同。字符类型定义在STANDARD程序包中。
6.2 实数(REAL)类型
也称浮点数,实属类型只能用于VHDL仿真器,综合器不支持实数。
6.3字符串(STRING)类型
字符串必须用双引号标明,综合器支持此类型,但不对应具体电路。
VARIABLE string_v : STRING (0 TO 7 ) ;
string_v := “01100101" ;
或string_v := B“0110_0101” ;
或string_v := X“65” ;
7.顺序语句
在用VHDL语言描述系统硬件行为时,按语句执行顺序对其进行分类,可分为顺序语句和并行语句。
顺序语句:每条顺序语句的执行顺序是与它们的书写顺序基本一致,它们只能出现在进程和子程序(包括函数和过程)中。
顺序语句:赋值语句、流程控制语句、等待语句、子程序调用语句、返回语句、空操作语句。
7.1赋值语句区别:
(1)赋值方式的不同: 变量 := 表达式;
信号 <= 表达式;
(2)赋值行为不同:变量赋值是立即发生的,而信号赋值有延时。
(3)硬件实现的功能不同: 变量代表电路单元内部的操作,代表暂存的临时数据;
信号代表电路单元、功能模块间的互联,代表实际的硬件连线。
(4)有效范围不同: 信号:全局量,(程序包、实体、结构体)。
变量:局部量,(进程、子程序)
7.2CASE语句属于顺序语句,必须放在进程PROCESS中使用。
CASE语句的结构如下:
CASE 表达式 IS
When 选择值 => 顺序语句;
When 选择值 => 顺序语句;
...
When OTHERS=> 顺序语句;
END CASE ;
7.3PROCESS语句
PROCESS语句结构的一般表达格式如下:
[进程标号: ] PROCESS [ ( 敏感信号参数表 ) ] [IS]
[进程说明部分]
BEGIN
顺序描述语句
END PROCESS [进程标号];
① 进程标号和[IS]不是必需的;
② 进程说明部分只能定义一些变量及数据类型;
③ 顺序描述语句是一段顺序执行的语句,描述该进程的行为。
④ 敏感信号参数表中只能列出信号,任一敏感参数的变化都能启动进程。
⑤ PROCESS语句本身是并行语句,PROCESS结构中的语句是顺序语句。
7.4 其他语句
(1)操作符&表示将操作数或数组合并起来形成新的数组。
(2)if语句
IF 条件句 Then
顺序语句
END IF ;
8.D触发器的VHDL描述
- 上升沿检测表达式和信号属性函数EVENT
上升沿检测常用表达式:CLK’EVENT AND CLK=‘1’
关键词EVENT是信号属性函数,VHDL通过以下表达式来测定某信号的跳变情况:
<信号名>'EVENT - 不完整条件语句与时序电路
完整的条件语句只能构成组合逻辑电路。不完整的条件语句是构建时序电路的关键。
【例】数据比较器
ENTITY COMP_BAD IS
PORT( a : IN BIT;
b : IN BIT;
q : OUT BIT );
END ;
ARCHITECTURE one OF COMP_BAD IS
BEGIN
PROCESS (a,b)
BEGIN
IF a > b THEN q <= '1' ;
ELSIF a < b THEN q <= '0' ;-- 未提及当a=b时,q作何操作
END IF;
END PROCESS ;
END ;
9.计数器更常用的VHDL表达方式
计数器由两大部分组成:
(1)完成加1的纯组合电路加法器;
(2)4位边沿触发方式锁存器,纯时序电路,计数CLK其实是锁存允许信号,并非想象中的计数信号。 缓冲模式BUFFER并非某种特定端口电路结构,它只是对端口具有某种特定工作方式的描述。
Q显示的波形是以总线方式表达的,其数据格式是十六进制,是Q(3)、Q(2)、Q(1)、Q(0)时序的叠加。
10. WAIT语句
WAIT ON 信号表; -- 第一种语句格式
格式1:称为敏感信号等待语句,将运行的进程挂起直至敏感信号表中的任一信号发生变化时结束挂起,再次启动进程。
WAIT UNTIL 条件表达式; -- 第二种语句格式
格式2:称为条件等待语句,此语句挂起的进程需要顺序满足如下两个条件,进程才能脱离挂起状态,恢复执行WAIT语句之后的语句。(1)在条件表达式中所含的信号发生了改变。(2)此信号改变后,且满足了WAIT语句所设的条件。这两个条件缺一不可,而且必须依照以上顺序来完成。
WAIT FOR 时间表达式; --第三种语句格式
格式3:称为超时等待语句,在此语句中定义了一个时间段,从执行到WAIT语句开始,在此时间段内,进程处于挂起状态,当超过这一时间段后,进程自动恢复执行。(常用于VHDL仿真)