1
第十一章 VHDL
2
一,硬件描述语言 ( HDL)
1.VHDL:VHSIC Hardware Description Language;
VHSIC,Very High Speed Integrated Circuit;
2.Verilog-HDL
可以描述硬件电路的功能、信号连接关系及定时关系的语言。它可以比电原理图更有效地表示硬件电路的特性。
IEEE(Institute of Electrical and Electronics
Engineers)的工业标准硬件描述语言,
11.1 概述
3
1.IEEE1076-1987(VHDL-87)
VHDL-93相对于 VHDL-87没有什么大变化,主要是增加了针对 VHDL模型的新的 VHDL命令和属性。
二,VHDL的发展概况
2.IEEE1164-1993(VHDL-93)
4
在行为描述阶段并不真正考虑实际的操作、算法、用什么逻辑电路来实现,其目的是通过对系统行为描述的仿真来发现设计中存在的问题,检查该数学模型能否达到系统设计规格书的要求。
1.行为描述,对整个系统的 数学模型进行描述。
三,用 VHDL设计硬件电路的过程
5
3.逻辑综合利用逻辑综合工具,将 RTL描述的程序转换成用基本逻辑元件(宏单元)表示的文件(门级网表、原理图)。即把布尔函数转换为门并实现最小化。
2.RTL描述(寄存器传输描述或数据流描述)
系统只有采用 RTL方式进行描述,才能导出系统的逻辑表达式,才能进行逻辑综合,从而得到具体的逻辑器件。
6
用 VHDL设计系统硬件的过程规格设计行为级描述行为级仿真
RTL级描述
RTL级仿真逻辑综合门级仿真、定时检查输出门级网表
7
11.2,VHDL基本构件实体 ( Entity),描述所设计的系统的外部接口信号;
构造体 ( Architecture),描述系统内部的结构和行为,即电路的具体描述;
包集合 ( Package),存放各设计模块都能共享的数据类型、常数和子程序等;
配置 ( Configuration),用于从库中选取所需单元来组成系统设计的不同版本;
库 ( Library),存放已经编译的实体、构造体、
包集合和配置;
8
1.实体( Entity)
ENTITY 实体名 IS
GENERIC(类属表 ) --将信息参数传输给实体
PORT(端口表 ) --实体的输入输出信号及其模式
END 实体名;
用来定义实体与外部的连接关系以及需传给实体的参数
9
端口模式模 式 含 义
IN 输入
OUT 输出(构造体内部不能再使用)
INOUT 双向
BUFFER 输出(构造体内部可再使用)
LINKAGE 不指定方向,无论哪一个方向都可连接,只用在文档中。
③ 类型指定:在逻辑电路设计中,常用 BIT和
BIT_VECTOR两种。
10
例 1,对 Black-Box实体 的描述
ENTITY Black_Box IS
PORT(rst,clk:IN std_logic;
d:IN std_logic_vector(7 DOWNTO 0);
q:BUFFER std_logic_vector(7 DOWNTO 0)
co:OUT std_logic);
END Black_Box;
D[7,0] q[7,0]
Rst co
CLK
Black-box
11
例 2:对 半加器的实体 描述,
半加器a
b
c
s
ENTITY half_adder IS
GENERIC(tpd:time:=2ns);
PORT(a,b:IN Bit;
s,c:OUT Bit);
END half_adder;
12
2.构造体( Architecture)
作用,通过若干并行语句来描述实体的逻辑功能或内部电路结构,从而建立实体输出与输入的关系。
格式为:
ARCHITECTURE 构造体名 OF 实体名 IS
说明语句;
BEGIN
END 构造体名;
并行语句;
13
例 11.6.2 一个构造体的实例。
LIBRARY IEEE
USE IEEE.Std_logic_1164.all;
ENTITY logic IS
PORT( a,b:IN std_logic;
w,x,y:OUT std_logic);
END logic;
ARCHITECTURE behavior OF logic IS
BEGIN
y<=a and b; w<=a or b; x<=?1?;
END behavior;
14
VHDL语言构造体的描述方式
1.行为描述方式无需包含任何结构信息,只是对输入信号和输出信号关系的描述。
行为描述方式是对系统数学模型的描述,其抽象程度比其它两种描述方式更高。
在 VHDL语言中存在一些专门用于描述系统行为的语句。
15
ARCHITECTURE beh1_ha OF half_adder IS
BEGIN
c1:PROCESS(a,b) --PROCESS为进程语句,括号
--内的信号是进程的激活条件
BEGIN
IF a='1' AND b='1' THEN
c<='1';
ELSE
c<='0';
END IF;
END PROCESS c1;
半加器的真值表为:
abcs
00
01
10
11
00
01
10
16
c2:PROCESS(a,b)
BEGIN
IF a='0' AND b='0' THEN
s<='0';
ELSIF a='1' AND b='1' THEN
s<='0';
ELSE
s<='1'
END IF;
END PROCESS c2;
END beh1_ha;
说明,1)进程语句属于并行语句;
2)进程语句内部由顺序语句构成;
17
ARCHITECTURE beh2_ha OF half_adder IS
BEGIN
PROCESS(a,b)
BEGIN
IF a='0' AND b='0' THEN
c<='0'; s<='0';
ELSEIF a='1' AND b='1' THEN
c<='1';s<='0';
ELSE
c<='0'; s<='1';
END IF;
END PROCESS;
END beh2_ha;
半加器构造体的另一种行为描述方式:
18
2.寄存器传输 (RTL)描述方式 (数据流描述方式 )
反映了从输入数据到输出数据之间所发生的逻辑变换,一般采用与寄存器硬件一一对应的直接描述。
&
=1
a
b
c
s
由半加器的真值表可导出输出函数:
19
ARCHITECTURE rtl_ha OF half_adder IS
BEGIN
s<=a XOR b ;
c<=a AND b ;
END rtl_ha;
&
=1
a
b
c
s
20
3.结构化描述方式采用结构化描述方式,其结构清晰,且能做到与电原理图中所画的器件一一对应。
给出实体内部结构,即所含的元件及其互连关系以及实体与外部引线的对应关系
21
对半加器的结构描述:
ARCHITECTURE struct_ha OF half_adder IS
COMPONENT and_gate PORT(a1,a2:IN Bit;a3:OUT Bit);
--元件说明语句 。
END COMPONENT;
COMPONENT xor_gate PORT(x1,x2:IN Bit;x3:OUT Bit);
END COMPONENT;
BEGIN
g1:and_gate PORT MAP(a,b,c); --元件例化语句
g2:xor_gate PORT MAP(a,b,s);
END struct_ha;
22
COMPONENT 语句一般格式
COMPONENT 元件名 -- 实体名
[GENERIC(类属关联表 ); ] -- 参数说明
PORT(端口关联表 ); -- 端口说明
END COMPONENT;
例如,COMPONENT and2
PORT (a,b:IN BIT; c,OUT BIT);
END COMPONENT;
23
COMPONENT_INSTANT 语句一般格式:
标号名:元件名 PORT MAP (信号,…);
例如,u1:inv PORT MAP (sel,nsel);
1.位置映射方法
PORT (a,b:IN BIT; c,OUT BIT);--and2端口定义
u2:and2 PORT MAP (nsel,d1,ab);
2.名称映射方法
PORT (a,b:IN BIT; c,OUT BIT);--and2端口定义
u2:and2 PORT MAP (a=>nsel,b=>d1,c=>ab);
24
ENTITY mux2 IS
PORT(d0,d1,sel:IN BIT; q:OUT BIT);
END mux2;
ARCHITECTURE struct OF mux2 IS
COMPONENT and2
PORT (a,b:IN BIT; c,OUT BIT);
END COMPONENT;
COMPONENT or2
PORT (a,b:IN BIT; c,OUT BIT);
END COMPONENT;
例,分析下列 VHDL语言描述的逻辑功能。
25
BEGIN
u1:inv PORT MAP (sel,nsel);
SIGNAL aa,ab,nsel:BIT;
COMPONENT inv
PORT (a:IN BIT; c,OUT BIT);
END COMPONENT;
u2:and2 PORT MAP (nsel,d1,ab);
u3:and2 PORT MAP (d0,sel,aa);
u4:or2 PORT MAP (aa,ab,q);
END struct;
26
二选一数据选择器的电路原理图
&
&
≥1
1
d0
d1
sel
q
aa
abnsel
u1
u2
u3
27
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
ENTITY exercise IS
PORT(A,B,Carry_in:IN std_logic;
AB,Carry_out:OUT std_logic);
END exercise;
ARCHITECTURE structure OF exercise IS
Signal Temp_sum,Temp_carry1,Temp_carry2:std_logic;
COMPONENT half_adder
PORT(X,Y:IN std_logic;
sum,Carry:OUT std_logic);
END COMPONENT;
试分析下述 VHDL语言描述的电路功能:
28
COMPONENT or_adder
PORT(IN1,IN2:IN std_logic;
OUT1:OUT std_logic);
END COMPONENT;
BEGIN
U0:half_adder PORT MAP
(A,B,Temp_sum,Temp_carry1);
U1:half_adder PORT MAP
(Temp_sum,Carry_in,AB,Temp_carry2);
U2:or_gate PORT MAP
(Temp_carry1,Temp_carry2,Carry_out);
END structure;
29
3.配置( Configuration)
作用:一个实体可以有多个构造体,当对某实体进行仿真或综合时,需将该实体与它的一个构造体连接起来;当某实体被其他实体 引用时,
需指定所生成的例元与该实体的哪个构造体相对应。
CONFIGURATION 配置名 OF 实体名 IS
语句说明
END 配置名;
30
ENTITY rsff IS
PORT (set,reset,IN BIT;q,qb:BUFFER BIT);
END rsff ;
ARCHITECTURE netlist OF rsff IS
COMPONENT nand2
PORT ( a,b:IN BIT;c:OUT BIT)
END COMPONENT;
BEGIN
U1,nand2 PORT MAP(a=>set,b=>qb,c=>q);
U1,nand2 PORT MAP(a=>reset,b=>q,c=>qb);
END netlist;
例 11.6.3 关于 RS触发器的实例。
31
ARCHITECTURE behave OF rsff IS
BEGIN
q <= not (qb AND set);
qb <= not(q AND reset);
END behave;
CONFIGURATION rsffcon1 OF rsff IS
END rsffcon1;
FOR netlist;
END FOR;
32
4.包集合( Package)
用来单纯地罗列 VHDL语言中所要用到的信号、
常数、数据类型、元件语句、函数和过程等。
它是一个可编译的设计单元。
PACKAGE 包集合名 IS
[说明语句 ]
END 包集合名 ;-- 包头
PACKAGE BODY 包集合名 IS
[说明语句 ]
END 包集合名 ;--包体
33
例 11.6.4 关于包集合的实例。
PACKAGE logic IS
TYPE three_level_logic IS (?0?,?1?,?Z?);
CONSTANT
Unknow_value:three_level_logic:=?0?;
FUNCTION Invert (input,three_level_logic)
RETURN three_level_logic ;
END logic;
34
BEGIN
CASE input IS
WHEN?0? => RETURN?1?;
WHEN?1? => RETURN?0?;
WHEN?Z? => RETURN?Z?;
END CASE;
END Invert;
END logic;
PACKAGE BODY logic IS
FUNCTION Invert (input:three_level_logic)
RETURN three_level_logic IS
35
说明:
A、在包头说明中,除定义数据类型和常量外,还需对包体单元中的子程序作出说明。因为只有包头中说明的标识符在程序包外才是可见的,仅在包体中说明的标识符在程序包外是不可见的。
B、子程序体不能放在包头中,只能放在包体中。
C、若程序包中不包含子程序,则包体可以省略。
调用格式:
USE 库名,程序包名,项目名
36
LIBRARY IEEE;--打开 STD_LOGIC_1164包所在的库
USE IEEE.STD_LOGIC_1164.ALL;
--调用包中的所有项
USE WORK.logic.Unknow_value;
--使用包中的 Unknow_value项
USE WORK.logic.ALL;
--使用包中的所用项
37
5.库( Library),存放已经编译的实体、构造体、包集合和配置,是经编译后的数据的集合。
( 1)库的种类
① IEEE库
STD_LOGIC_1164 --IEEE正式认可的标准包集合
STD_LOGIC_ARITH --SYNOPSYS公司提供包集合
STD_LOGIC_UNSIGNED--SYNOPSYS公司提供包集合
LIBRARY 库名表; --库名表为一系列,,,分割的库名 。
38
② STD库,VHDL的标准库
STANDARD
--VHDL的标准配置,调用其中的数据,可不加说明
TEXTIO
--调用其中的数据,必须先说明
--LIBRARY STD;
--USE STD.TEXTIO.ALL;
③ 面向 ASIC的库,用于门级仿真
39
④ WORK库:现行作业库,使用该库时无需说明
⑤ 用户定义库,使用该库时需先说明
( 2)库的使用
① 库的说明
USE LIBRARY_NAME.PACKAGE_NAME.ITEM_NAME;
LIBRARY 库名;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
40
② 库说明作用范围从一个实体说明开始到它所属的构造体、配置为止。
例 5 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY and1 IS…
END and1;
ARCHITECTURE rtl OF and1 IS…
END rtl;
41
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY or1 IS…

END s2;
CONFIGURATION s1 OF and1 IS
END s1;

CONFIGURATION s2 OF or1 IS…
42
五、子程序( Subprogram)
1.函数( Function)
定义:便于在程序中重复使用的一组顺序语句。
不是独立的编译单元,只能放在实体(被该实体专用)或程序包中(可被多个实体共用)。
作用是求值,若干参数输入,只有一个返回值作为输出
43
一般格式:
FUNCTION 函数名 ( 参数表 ) RETURN 数据类型 IS
说明语句; --说明函数体内引用的对象和过程
BEGIN
顺序语句; --函数体定义函数的功能
END 函数名;
说明:
A,参数表中需说明参数名,参数类型 ( 信号或常量 ) 及其数据类型 。
B,RETURN之后的数据类型表示函数返回值的类型 。
44
ELSE
RETURN y;
END IF;
END Min;
例 11.6.5 函数举例 --返回两数中的较小数。
FUNCTION Min(x,y:INTEGER )
RETURN INTEGER IS
BEGIN
IF x<y THEN
RETURN x;
45
2.过程( Procedure)
作用:通过参数进行内外信息的传递,与其它高级语言中的子程序相当。
PROCEDURE 过程名 [(参数 1;参数 2; … ) ]IS
说明语句
BEGIN
顺序处理语句
END [过程名 ];
46
q:=0;
x_flag:=FALSE;
FOR i IN z?RANGE LOOP
q:=q*2;
例 11.6.6 过程举例 —向 量转换成整数类型。
USE IEEE.STD_LOGIC_1164.ALL;
PROCEDURE vector_to_int
BEGIN
(z:IN STD_LOGIC_VECTOR;
x_flag:OUT BOOLEAN;
q:INOUT INTEGER) IS
47
IF z(i)=?1? THEN
q:=q+1;
ELSEIF z(i)/=?0? THEN
x_flag:=TRUE;
END IF;
END LOOP;
END vector_to_int;
--该过程调用后,如果 x_flag=TRUE,则说明转换失败,不能得到正确的转换整数值。
48
11.3 VHDL语言元素
1.VHDL语法规则与标识符
(1)注释( Comment),--
(2)标识符( Identifier)
① 用户自定义
② VHDL语言预定义:如 ENTITY,SIGNAL。
※ 标识符的第一个字符必须是英文字母;
※ 标识符不能以下划线结束,如 MUX_;
※ 标识符中不允许出现两个连续的下划线;
49
(3)数( Number)的表示
0,987E6 -- 十 进制整数
0.5,2.72,12.4E-6 -- 十 进制实数
2#11000100# -- 二进制数,等于 十 进制数 196
16#C4# -- 十六进制数,等于 十 进制数 196
4#301#E1 -- 四进制数,等于 十 进制数 196
16#F.FF#E2 -- 十六进制数,等于 十 进制数 4095.0
50
2.数据对象和数据类型
(1)数据对象( Object)
① 常数( Constant)
CONSTANT Vcc:REAL,= 5.0;
② 信号( Signal)
SIGNAL 信号名,数据类型,= 表达式 ;
SIGNAL sys_dk:BIT,=?0?;
SIGNAL tem:STD_LOGIC;
③ 变量( Varible)
VARIABLE x,y:INTEGER;
51
信号和变量的区别:
ⅰ 信号是全局量,可以进行进程之间的通信;
而变量是局部量,只能用于进程或子程序
(即函数和过程)中;
ⅱ 对变量的赋值是立即发生的,对信号的赋值须经一段时间延迟才会发生;
ⅲ 对变量的赋值用,:=”,对信号的赋值用,<=” ;
ⅳ 信号可以比拟为硬件端口之间的连接,而变量则与硬件之间没有对应关系;
52
(2)数据类型
① 标准数据类型
53
数据类型 标 识 说 明整数 INTEGER -(231-1) ~ +(231-1)
实数 REAL -1.0E+38~ +1.0E+38
位 BIT 逻辑‘ 0? 或‘ 1?,单引号标出位矢量 BIT_VECTOR BIT的组合,以双引号标出字符 CHARACTERS ASCII 字符,单引号标出布尔量 BOOLEAN 逻辑“真”或“假”,TRUE or FALSE
时间 TIME 时间单位:fs,ps,ns,us,ms,sec,min,hr
错误等级 SEVERITY LEVEL NOTE,WARNING,ERROR,FAILURE
自然数 NATURAL 整数的子集,0~ 231-1
正整数 POSTIVE 整数的子集,1~ 231-1
字符串 STRING 字符矢量,以双引号标出表 11.3.1 VHDL标准数据类型
54
② 用户自定义数据类型
ⅰ 整数、实数类型
TYPE 数据类型名 IS 数据类型 定义约束范围
TYPE digit IS INTEGER RANGE 0 TO 9;
ⅱ 枚举类型
TYPE 数据类型名 IS (元素 1,元素 2,… )
TYPE arith_op IS ( add,sub,mul,div) ;
TYPE color IS ( red,green,blue) ;
55
ⅲ 数组和记录
TYPE big_word IS ARRAY (0 TO 63) OF BIT;
TYPE arith_op IS ( add,sub,mul,div) ;
TYPE instruction IS RECORD
-- 一维数组
TYPE matrix_1 IS ARRAY (0 TO 15,0 TO 31) OF BIT;
-- 二维数组
-- 枚举 类型
Operator:arith_op ;
56
Op1:INTEGER ;
Op2:INTEGER ;
END RECORD ;
VARIABLE inst1,inst2:instruction ;
inst1.operator:=add ;
inst2.operator:=sub ;
inst1.op1:=10 ;
inst1.op2:= inst1.op1 ;
57
ⅳ 子类型( SUBTYPE)
SUBTYPE 子类型名 IS 父类型名 RANGE 范围例,TYPE arith_op IS ( add,sub,mul,div) ;
SUBTYPE add_op IS arith_op RANGE add TO sub;
SUBTYPE mul_op IS arith_op RANGE mul TO div;
58
3.预定义属性表 11.6.3 标量类型预定义属性属性 说 明 举例( TYPE bit_pos IS INTEGE RANGE 15 DOWN TO 0)
T?LEFT T的左边界 Bit_pos?LEFT = 15
T?RIGHT T的右边界 Bit_pos?RIGHT = 0
T?LOW T的下限 Bit_pos?LOW = 0
T?HIGH T的上限 Bit_pos?HIGH = 15
59
属性 说 明 举例 (TYPE arith_op IS (add,sub,mul,div))
T?POS(X) T中 X的位置 arith_op?POS(add) = 0
T?VAL(N) T中位置是 N的值 arith_op?VAL(1) = sub
T?LEFTOF(X) T中 X成员左边的值 arith_op?LEFTOF(sub) = add
T?RIGHTOF(X) T中 X成员右边的值 arith_op?RIGHTOF(sub) = mul
T?PRED(X) T中比 X前一个位置的值 arith_op?PRED(sub) = add
T?SUCC(X) T中比 X后一个位置的值 arith_op?SUCC(sub) = mul
表 11.6.4 物理、离散类预定义属性
60
属性 说 明 举例 (TYPE t_d IS ARRAY (8 DOWN TO 0,0 TO 4))
A?LEFT 下标左边界 t_d?LEFT(1) = 8; t_d?LEFT(2) = 0;
A?RIGHT 下标右边界 t_d?RIGHT(1) = 8; t_d?RIGHT(2) = 0;
T?LOW 下标下边界 t_d?LOW(1) = 0; t_d?LOW(2) = 0;
T?HIGH 下标上边界 t_d?HIGH(1) = 8; t_d?HIGH(2) = 4;
T?RANGE 下标范围 t_d?RANGE(1) =8 DOWN TO 0; t_d?RANGE(2) = 0 TO 4;
T?REVERSE_RANGE 下标反向范围 t_d?REVERSE_RANGE(1) =0 DOWN TO 8; t_d?REVERSE_RANGE(2) = 4 DOWN TO 0;
T?LENGTH 数组的长度 t_d?RANGE(1) =8 DOWN TO 0; t_d?RANGE(2) = 0 TO 4;
表 11.6.5 数组类预定义属性
61
4.运算符( Operatou)
分 类 运算符 功 能二元算术运算符
+
-
*
/
mod
rem
**
加减乘除求模求余乘方一元算术运算符
+
-
abs
正号负号绝对值表 11.3.2 VHDL 运算符
62
分 类 运算符 功 能关系运算符
=
/=
<
>
<=
>=
相等不相等小于大于小于等于大于等于二元逻辑运算符
and
or
nand
nor
Xor
与或与非或非异或表 11.3.2 VHDL 运算符(续)
63
分 类 运算符 功 能一元逻辑运算符 not 求反并置运算符 & 连接赋值运算符
<=
:=
=>
信号赋值变量赋值结合表 11.6.6 VHDL 运算符(续)
64
11.4 VHDL常用编程语句
(1)并发描述 (CONCURRENT)语句
① 进程 (PROCESS)语句
[标号,]PROCESS [(信号 1,信号 2,…)]
[说明语句 ]
BEGIN
顺序处理语句
END PROCESS[标号 ];
65
进程语句的特点:
ⅰ 构造体中多个进程之间是并发运行的,而进程结构中的语句按顺序执行;
ⅱ 为启动进程,在进程结构中必须包含一个显式的敏感信号量表或者包含一个 WAIT语句;
ⅲ 通过存取构造体或实体中所定义的信号,实现进程之间的通信。
66
② 块 (BLOCK)语句
[标号,]BLOCK
[说明语句 ]
BEGIN
并发处理语句
END BLOCK [标号 ] ;
67
③ 赋值语句
ⅰ 并发信号赋值语句
(实际上是一个进程的缩写)
ARCHITECTURE behav OF ab_signal IS
BEGIN
Output <= a+b;
END behav;
目标信号 <= 表达式;
68
ARCHITECTURE behav OF ab_signal IS
BEGIN
Output <= a+b;
END behav;
PROCESS (a,b)
BEGIN
END PROCESS;
69
ⅱ 选择信号赋值语句目标信号 <= 表达式 1 WHEN 条件 1,
WITH 表达式 SELECT
表达式 2 WHEN 条件 2,…
表达式 n WHEN 条件 n;
注意:必须指明所有的互斥条件。
70
LIBRARY IEEE;
例 11.4.5 四选一数据选择器的实现。
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY mux4 IS
END mux4;
PORT (a,b,c,d:IN STD_LOGIC;
s:IN STD_LOGIC_VECTOR(1 DOWN TO 0);
x:OUT STD_LOGIC);
71
ARCHITECTURE archmux OF mux4 IS
BEGIN
WITH s SELECT
x<= a WHEN,00”,
b WHEN,01”,
c WHEN,10”,
d WHEN,11”,
X? WHEN OTHERS;
END archmux;
72
ⅲ 条件信号赋值语句目标信号 <= 表达式 1 WHEN 条件 1 ELSE
表达式 2 WHEN 条件 2 ELSE…
表达式 n ;
表达式 n-1 WHEN 条件 n-1 ELSE
73
LIBRARY IEEE;
例 11.4.6 四选一数据选择器的实现。
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY mux4 IS
END mux4;
PORT (a,b,c,d:IN STD_LOGIC;
s:IN STD_LOGIC_VECTOR(1 DOWN TO 0);
x:OUT STD_LOGIC);
74
ARCHITECTURE archmux OF mux4 IS
BEGIN
x<= a WHEN,00” ELSE
b WHEN,01” ELSE
c WHEN,10” ELSE
d WHEN,11” ELSE
END archmux;
X?;
75
④ 生成 (GENERATE)语句
GENERATE 语句用来产生多个相同的结构,有两种使用形式。其典型应用场合是生成存储器阵列和寄存器阵列(如移位寄存器)。
ⅰ [标号,]FOR 变量 IN 不连续区间 GENERATE
并发处理语句
END GENERATE [标号 ];
ⅱ [标号,]IF 条件 GENERATE
并发处理语句
END GENERATE [标号名 ];
76
(2)顺序描述 (SEQUENTIAL)语句顺序语句只能用于进程或子程序(即函数和过程)中。语句按书写次序顺序执行。
① 条件 (IF)语句对应于并行语句部分的“条件信号赋值语句”,
即,WHEN ELSE 语句。
77
IF 条件 THEN
顺序处理语句
[ELSIF 条件 THEN
顺序处理语句
END IF;
ELSIF 条件 THEN
顺序处理语句 ]

ELSE
顺序处理语句
78
LIBRARY IEEE;
用 IF 语句实现例 11.4.5 四选一数据选择器。
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY mux4 IS
END mux4;
PORT (a,b,c,d:IN STD_LOGIC;
s:IN STD_LOGIC_VECTOR(1 DOWN TO 0);
x:OUT STD_LOGIC);
79
ARCHITECTURE archmux OF mux4 IS
BEGIN
IF (s=“00”) THEN x<=a;
ELSIF (s=“01”) THEN x<=b;
END archmux;
ELSE x<=?X?;
PROCESS(s,a,b,c,d)
BEGIN
ELSIF (s=“10”) THEN x<=c;
ELSIF (s=“11”) THEN x<=d;
END PROCESS;
END IF;
80
② 开关 (CASE)语句功能和 IF语句类似,但其可读性比 IF语句强。
CASE 表达式 IS
WHEN 条件 => 顺序处理语句;
WHEN 条件 => 顺序处理语句;
WHEN 条件 => 顺序处理语句;

END CASE ;
注意:应该将表达式的所有取值都列出来。
对应于并行语句部分的“选择信号赋值语句”,
即,WITH SELECT 语句。
81
LIBRARY IEEE;
用 CASE 语句实现例 11.4.5 四选一数据选择器。
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY mux4 IS
END mux4;
PORT (a,b,c,d:IN STD_LOGIC;
s:IN STD_LOGIC_VECTOR(1 DOWN TO 0);
x:OUT STD_LOGIC);
82
ARCHITECTURE archmux OF mux4 IS
BEGIN
CASE s IS
WHEN,00” => x<=a;
END PROCESS;
WHEN,11” => x<=d;
PROCESS(s,a,b,c,d)
BEGIN
WHEN,01” => x<=b;
WHEN,10” => x<=c;
END CASE;
WHEN OTHERS => x=>?X?;
END archmux;
83
③ 循环 (LOOP)语句
[标号 ],FOR 循环变量 IN 离散范围 LOOP
顺序处理语句
END LOOP [标号 ];
例 6 ASUM,FOR i IN 1 TO 9 LOOP
sum:=i+sum;--sum初始值为 0
END LOOP ASUM;
-- i是循环变量,它可取 1,2,…9 共 9个值。 -
- 该程序对 1~ 9的数进行累加计算。
84
[标号 ],WHILE 条件 LOOP
顺序处理语句;
END LOOP [标号 ];
例 7 i=1;
sum:=0;
END LOOP ASUM;
-- 该程序对 1~ 9的数进行累加计算。
ASUM:WHILE(i<10) LOOP
sum:=i+sum;
i:=i+1;
85
NEXT [标号 ] [WHEN 条件 ];
--用来跳出本次循环,转入下一次新的循环。
注意:若 NEXT后既无“标号”也无,WHEN 条件”说明,那么只要执行到该语句就立即无条件地跳出本次循环,从 LOOP语句的起始位置进入下一次循环。
--用于 LOOP语句的内部循环控制。
86
例 8 PROCESS (a,b)
CONSTANT max_limit:INTEGER,= 255;
BEGIN
FOR i IN O TO max_limit LOOP
IF (done(i)=TRUE) THEN
NEXT;
ELSE
done(i):=TRUE;
END IF ;
q(i)<=a(i) AND b(i);
END LOOP;
END PROCESS;
87
EXIT [标号 ] [WHEN 条件 ];
--用来结束循环状态,从 LOOP语句中跳出。
注意:若 NEXT后既无“标号”也无,WHEN 条件”说明,
那么只要执行到该语句就立即无条件地结束循环状态,继续执行 LOOP语句后续的语句。
88
例 9 PROCESS (a)
VARIABLE int_a:INTEGER;
BEGIN
FOR i IN O TO max_limit LOOP
IF (int_a <= 0) THEN
EXIT;
ELSE
int_a,= int_a-1;
END IF ;
y<=q;
END LOOP;
END PROCESS;
int_a:=a;
q(i)<=3.1416/REAL(a*i);
89
④ 等待 (WAIT)语句将一个顺序执行的进程或子程序“挂起”,直至所约定的条件满足为止。 WAIT语句可以设置 4种不同的条件。
WAIT — 无 限等待
WAIT ON — 敏感信号量变化
WAIT UNTIL — 条件满足
WAIT FOR — 时间到
90
Ⅰ WAIT ON 信号 [,信号 ];
例 10 PROCESS (a,b)
BEGIN
END PROCESS;
y <= a AND b;
PROCESS
BEGIN
END PROCESS;
y <= a AND b;
WAIT ON a,b;
91
Ⅱ WAIT UNTIL 表达式;
WAIT UNTIL ((x*10)<100);
-- 当信号量 x的值大于或等于 10时,执行到该语
-- 句时进程将被挂起;当 x的值小于 10时,进程
-- 再次被启动,继续执行 WAIT语句后的语句。
Ⅲ WAIT FOR 时间表达式;
WAIT FOR 20 nS;
-- 当执行到该语句时进程将被挂起,一旦 20nS
-- 时间到,进程将继续执行 WAIT语句后的语句。
92
⑤ 断言 (ASSERT)语句主要用于程序仿真、调试中的人 —机会话,它可以给出一个文字串作为警告和错误信息。
ASSERT 条件 REPORT 输出信息 SEVERITY 级别;
当执行 ASSERT语句时,先对条件进行判断。
若条件为“真”,则向下执行另一个语句;
若条件为“假”,则输出错误信息和错误严重程度的级别。
FAILURE,ERROR,WARNING,NOTE共 4
个级别。
93
例 11.6.10 IF (clk=?1?) THEN
ASSERT (last_d_change >= 20nS)
REPORT,Setup Violation”
SEVERITY Warning;
END IF ;
94
八、用 VHDL设计电路
1.编码器和译码器
(1)3位二进制编码器有 8个位输入 I0~ I7,3个位输出 A,B,C。为书写方便,现定义两个位矢量 temp_in(0 TO 7)
和 temp_out(0 TO 2)与其输入和输出相对应

95
表 4.2.1 3位二进制编码器真值表输 入 输 出
I0 I1 I2 I3 I4 I5 I6 I7 A B C
1 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0 0 1 1
0 0 0 0 1 0 0 0 1 0 0
0 0 0 0 0 1 0 0 1 0 1
0 0 0 0 0 0 1 0 1 1 0
0 0 0 0 0 0 0 1 1 1 1
96
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY enco_bin IS
PORT (I0,I1,I2,I3,I4,I5,I6,I7:IN STD_LOGIC;
A,B,C:OUT STD_LOGIC);
END enco_bin;
ARCHITECTURE rtl OF enco_bin IS
SIGNAL tmp_in,STD_LOGIC_VECTOR (0 TO 7);
SIGNAL tmp_out,STD_LOGIC_VECTOR (0 TO 2);
BEGIN
97
tmp_in <= I0&I1&I2&I3&I4&I5&I6&I7 ;
PORCESS(tmp_in)
BEGIN
CASE temp_in
IS WHEN,10000000”=>tmp_out<=“000”;
WHEN,01000000”=>tmp_out<=“001”;
WHEN,00100000”=>tmp_out<=“010”;
WHEN,00010000”=>tmp_out<=“011”;
WHEN,00001000”=>tmp_out<=“100”;
WHEN,00000100”=>tmp_out<=“101”;
WHEN,00000010”=>tmp_out<=“110”;
WHEN,00000001”=>tmp_out<=“111”;
98
END CASE;
WHEN OTHERS =>tmp_out<=“000”;
A <= tmp_out(0);
B <= tmp_out(1);
C <= tmp_out(2);
END PROCESS;
END rtl;
99
(2)8-3线优先编码器 74148
100
表 4.2.2 8—3线优先编码器 74148功能表
101 1 01 1 1 1 1 1 0?0
101 0 1 1 1 1 1 1 00
0
0
0
0
0
0
0
1
EN
使能输入
1 1 1
1 0 0
0 1 1
0 1 0
0 0 1
0 0 0
1 1 1
1 1 1
Y2 Y1 Y0
输 出
0
0
0
0
0
0
1
1
YEX
输出标志
11 1 1 0
11 1 0
11 0
11 1 1 1 0
11 1 1 1 1 1 1 0
10
01 1 1 1 1 1 1 1
1
YENI7 I6 I5 I4 I3 I2 I1 I0
使能输出输 入
101
LIBRARY IEEE;
ENTITY p74148 IS
USE IEEE.STD_LOGIC_1164.ALL;
PORT(en,in0,in1,in2,in3,in4,in5,in6,
in7:IN STD_LOGIC;
yen,yex,y0,y1,y2,OUT STD_LOGIC);
END p74148;
ARCHITECTURE rtl OF p74148 IS
SIGNAL temp_in,STD_LOGIC_VECTOR (7 DOWNTO 0);
SIGNAL temp_out,STD_LOGIC_VECTOR (4 DOWNTO 0);
BEGIN
102
temp_in <= in7&in6&in5&in4&in3&in2&in1&in0;
PROCESS(en,temp_in)
BEGIN
IF (en=?0?) THEN
IF(temp_in=“11111111”) THEN
temp_out <=,11110”;
ELSIF (temp_in(7)=?0?) THEN
temp_out <=,00001”;
ELSIF (temp_in(6)=?0?) THEN
temp_out <=,00101”;
103
ELSIF (temp_in(5)=?0?) THEN
temp_out <=,01001”;
ELSIF (temp_in(4)=?0?) THEN
temp_out <=,01101”;
ELSIF (temp_in(3)=?0?) THEN
temp_out <=,10001”;
ELSIF (temp_in(2)=?0?) THEN
temp_out <=,10101”;
ELSIF (temp_in(1)=?0?) THEN
temp_out <=,11001”;
104
ELSIF (temp_in(0)=?0?) THEN
temp_out <=,11101”;
END IF;
ELSE
temp_out <=,11111”;
END IF;
y2 <= temp_out(4);
y1 <= temp_out(3);
y0 <= temp_out(2);
yex <= temp_out(1);
105
yen <= temp_out(0);
END PROCESS;
END rtl;
106
(3)2-4线译码器表 4.2.4 2- 4 线译码器的功能表
1 1 0 11 00
0
0
0
1
EN
使能输入
1 1 1 01 1
1 0 1 10 1
0 1 1 1 0 0
1 1 1 1
Y0 Y1 Y2 Y3A1 A0
输 出输 入
107
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY enco_2_4 IS
PORT(en,a0,a1:IN STD_LOGIC;
y0,y1,y2,y3,OUT STD_LOGIC);
END enco_2_4;
ARCHITECTURE rtl OF enco_2_4 IS
SIGNAL temp_in,STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL temp_out,STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
108
temp_in <= a1&a0;
PROCESS(en,temp_in)
BEGIN
IF (en='0') THEN
CASE temp_in IS
WHEN "00" => temp_out<="1110";
WHEN "01" => temp_out<="1101";
WHEN "10" => temp_out<="1011";
WHEN "11" => temp_out<="0111";
WHEN OTHERS => temp_out<="1111";
109
END CASE;
ELSE
temp_out <= "1111";
END IF;
y3 <= temp_out(3);
y2 <= temp_out(2);
y1 <= temp_out(1);
y0 <= temp_out(0);
END PROCESS;
END rtl;
110
2,数据选择器表 4.2.9 四选一 MUX的功能表
0
0
0
0
1
EN
使能输入
D31 1
D21 0
D10 1
D00 0
0
YA1 A0
输 出输 入
111
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY mux4 IS
PORT(en,a0,a1,d0,d1,d2,d3:IN STD_LOGIC;
y,OUT STD_LOGIC);
END mux4;
ARCHITECTURE rtl OF mux4 IS
SIGNAL a,STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
112
a <= a1&a0;
PROCESS(en,a)
BEGIN
IF (en='0') THEN
CASE a IS
WHEN "00" => y<=d0;
WHEN "01" => y<=d1;
WHEN "10" => y<=d2;
WHEN "11" => y<=d3;
WHEN OTHERS => y<=?0?;
113
END CASE;
ELSE
y <=?0?;
END IF;
END PROCESS;
END rtl;
114
3,加法器图 4.1.4 (a) 全加器电路
1 2 3 4 5 6
A
B
C
D
654321
D
C
B
A
T i t l e
N u m be r R e v i s i o nS i z e
B
D a t e,1 4- F e b - 2 0 02 S he e t o f
F i l e,C,\ P r og r a m F i l e s \ D e s i gn E x p l o r e r 9 9 S E \ L i b r a r y \ Y a ng H e n g X i n \ M y D e s i g n,d d bD r a w n B y:
=1
=1
&
&
1
i
i
i
i
i - 1
A
B
C
C
S
a
b
cin
s
co
ab1
ab2
abc
115
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY adder IS
PORT(a,b,cin:IN STD_LOGIC;
co,s,OUT STD_LOGIC);
END adder;
ARCHITECTURE rtl OF adder IS
BEGIN
116
PROCESS(a,b,cin)
BEGIN
ab1:=a XOR b;
ab2:=a AND b;
abc:=ab1 AND cin;
s<= cin XOR ab1;
co<= abc OR ab2;
VARIABLE ab1,ab2,abc:STD_LOGIC;
END PROCESS;
END rtl;
117
四位串行进位全加器
1 2 3 4 5 6
A
B
C
D
654321
D
C
B
A
T i t l e
N u m be r R e v i s i o nS i z e
B
D a t e,2 0- F e b - 2 0 02 S he e t o f
F i l e,C,\ P r og r a m F i l e s \ D e s i gn E x p l o r e r 9 9 S E \ L i b r a r y \ Y a ng H e n g X i n \ M y D e s i g n,d d bD r a w n B y:
COCI COCI
COCI COCI
A
A
A A
BB
B
B
0
0
1
2 3
1
2 3
CO
SS
SS 0 1
2 3
C0 C1
C2
CI
118
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY adder_4 IS
PORT(ci,a0,b0,a1,b1,a2,b2,a3,b3:IN STD_LOGIC;
s0,s1,s2,s3,co,OUT STD_LOGIC);
END adder_4;
ARCHITECTURE rtl OF adder_4 IS
COMPONENT adder
119
PORT(a,b,cin:IN STD_LOGIC;co,s,OUT STD_LOGIC);
SIGNAL c0,c1,c2:STD_LOGIC;
BEGIN
u0:adder PORT MAP (a0,b0,ci,c0,s0);
u1:adder PORT MAP (a1,b1,c0,c1,s1);
u2:adder PORT MAP (a2,b2,c1,c2,s2);
u3:adder PORT MAP (a3,b3,c2,co,s3);
END COMPONENT;
END rtl;
120
4,三态门电路三态门( TS门)
EN?
1din
国标符号
dout
en
121
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY ts_gate IS
PORT(din,en:IN STD_LOGIC;
dout,OUT STD_LOGIC);
END ts_gate;
ARCHITECTURE rtl OF ts_gate IS
BEGIN
122
PROCESS(din,en)
BEGIN
IF ( en ='1') THEN
dout<=din;
ELSE
dout<='Z';
END IF;
END PROCESS;
END rtl;
123
5,触发器
1 2 3 4 5 6
A
B
C
D
654321
D
C
B
A
T i t l e
N u m be r R e v i s i o nS i z e
B
D a t e,1 9- M a r - 2 0 02 S he e t o f
F i l e,C,\ P r o g r a m F i l e s \ D e s i g n E x pl or e r 9 9 S E \ L i b r a r y \ Y a n g H e n g X i n \第五章,d dbD r a w n B y:
1D
C1
CP
Q
Q
D Q
QB
124
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY edge_dff IS
PORT(cp,d:IN STD_LOGIC;
q,qb,OUT STD_LOGIC);
END edge_dff;
ARCHITECTURE rtl OF edge_dff IS
BEGIN
125
PROCESS(cp)
BEGIN
IF (cp'EVENT AND CP='1') THEN
q<=d;
qb<=NOT d;
END IF;
END PROCESS;
END rtl;
126
1 2 3 4 5 6
A
B
C
D
654321
D
C
B
A
T i t l e
N u m be r R e v i s i o nS i z e
B
D a t e,1 9- M a r - 2 0 02 S he e t o f
F i l e,C,\ P r o g r a m F i l e s \ D e s i g n E x pl or e r 9 9 S E \ L i b r a r y \ Y a n g H e n g X i n \第五章,d dbD r a w n B y:
1D
C1
CP
Q
Q
D Q
QB
CLR
127
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY asy_edge_dff IS
PORT(cp,d,clr:IN STD_LOGIC;
q,qb,OUT STD_LOGIC);
END asy_edge_dff;
ARCHITECTURE rtl OF asy_edge_dff IS
BEGIN
128
PROCESS(cp,clr)
BEGIN
ELSIF (cp'EVENT AND CP='1') THEN
IF(clr='0') THEN
q<='0';
qb<='1';
q<=d;
qb<= NOT d;
END PROCESS;
END rtl;
END IF;
129
6,计数器六进制计数器,clr清零端,en计数允许端,
cp计数脉冲输入端,qa,qb,qc计数器的 3
位二进制输出端。
130
LIBRARY IEEE;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY counter6 IS
PORT(en,clr,cp:IN STD_LOGIC;
qa,qb,qc,OUT STD_LOGIC);
END counter6 ;
ARCHITECTURE rtl OF counter6 IS
USE IEEE.STD_LOGIC_1164.ALL;
SIGNAL q,STD_LOGIC_VECTOR(2 DOWNTO 0);
SUBTYPE countm6 IS INTEGER RANGE 0 TO 5;
131
PROCESS(cp)
BEGIN
ELSIF (en='1') THEN
IF(cp'EVENT AND cp='1') THEN
IF(clr='0') THEN
q6:= 0;
IF(q6=5) THEN
q6:=0;
BEGIN
VARIABLE q6:countm6;
132
END PROCESS;
END rtl;
ELSE
q6:=q6+1;
END IF;
END IF ;
END IF;
q <= CONV_STD_LOGIC_VECTOR(q6,3);
qa <= q(0);
qb <= q(1);
qc <= q(2);