第 10章 超高速集成电路硬件
描述语言 VHDL
§ 8-1 VHDL语言的基本组成
§ 8-2 VHDL数据类型和属性
§ 8-3 VHDL的行为描述
§ 8-4 VHDL的结构描述
小结
? 传统的电路系统设计方法的步骤从状态图的简化,
写出最简逻辑表达式, 到绘出电路原理图 。 这在不是
较大的电路系统中, 工程师可以用一定的时间, 了解
电路的原理 。 若电路系统非常庞大, 工程师就不容易
在电路原理图上了解电路的原理, 而且对绘图者也是
一项非常烦琐的工作 。 因此众多软件公司开发研制了
具有自己特色的电路硬件描述语言 ( Hardware
Description Language,HDL), 这些硬件描述语言必
然有很大的差异, 工程师一旦选用某种硬件描述语言
作为输入工具, 就被束缚在这个硬件设计环境之中,
不能在众多的软件工具中选择一个最佳组合作为自己
的最优设计环境 。 因此, 硬件设计工程师需要一种强
大的, 标准化的硬件描述语言, 作为可相互交流的设
计环境 。
美国国防部在 20世纪 80年代初提出了 VHSIC
( Very High Speed Integrated Circuit) 计划, 其
目标之一是为下一代集成电路的生产, 实现阶段
性的工艺极限以及完成 10万门级以上的设计, 建
立一项新的描述方法 。 1981年提出了一种新的
HDL, 称之为 VHSIC Hardware Description
Language,简称为 VHDL,这种语言的成就有两
个方面:
1,描述复杂的电路系统 ;
2,VHDL成为硬件描述语言的标准 。
VHDL的主要优点是:
1.覆盖面广,描述能力强,是一个多层次的硬件描述语言。
即设计的原始描述可以是非常简练的描述,经过层层细化求
精,最终成为可直接付诸生产的电路级或版图参数描述,整
个过程都可以在 VHDL的环境下进行。
2.VHDL有良好的可读性, 即可以被计算机接受, 也容
易被理解 。 用 VHDL书写的原文件, 即是程序, 又是文档,
即是技术人员之间交换信息的文件, 又可作为合同签约者
之间的文件 。
3.VHDL本身的生命期长,因为 VHDL的硬件描述与工
艺技术无关,不会因工艺变化而使描述过时。与工艺技术
有关的参数可通过 VHDL提供的属性加以描述,工艺改变
时,只需修改相应程序中的属性参数即可。
4.支持大规模设计的分解和已有设计的
再利用, 一个大规模设计不可能一个人独
立完成, 它将由多人, 多项目组来共同完
成 。 VHDL为设计的分解和设计的再利用
提供了有力的支持 。
VHDL的主要优点是:
5.VHDL已成为 IEEE承认的一个工业标
准, 事实上已成为通用硬件描述语言 。
§ 10-1 VHDL的基本组成
VHDL可以把任意复杂的电路系统视作一个模
块, 一个模块可主要分为三个组成部分:
每个模块中的程序包有 IEEE标准的标准程序
包或设计者自身设计的程序包, 而且调用的数量
不限 。 模块中的程序包是设计中的子程序和公用
数据类型的集合, 是构成设计工具的工具箱, 工
具箱中最基本的工具是数据类型包, 调用此标准
程序包的 VHDL语言是:
一,参数部分 —— 程序包
例 1,
LIBRARY ieee;
USE ieee.std_logic_1164.all; 调用程序包 语句
标
准
程
序
包
定
义
程
序
包
这两句设置在 VHDL
程序的前面, 表示以后
在实体或结构体中要用
到数据类型包中的数据
类型 。
模块中仅有一个设计实体,
它提供该设计模块的公共信息,
是 VHDL设计电路的最基本部
分 。 VHDL设计的电路系统是
可以分层次的, 所以设计的模
块系统实体即可以是顶层实体,
又可以是最底层实体 。
二, 接口部分 — 设计实体,调用程序包
语句
标
准
程
序
包
定
义
程
序
包
实体
及实
体声
明语
句
ENTITY kxor IS kxor
PORT(a1,b1:IN std_logic;
a1
b1
c1:OUT std_logic);
c1
END kxor;
例 2
实体部分的大写单词 ENTITY,IS,PORT、
IN,OUT和 END为关键字 。 在 ENTITY...END之
间表示实体内容, ENTITY后的字符串 kxor表示
实体的名称, 即电路的符号名 。 端口 ( 引脚 ) 信
息关键字 PORT中的语句有三个端口, 描述了信
号的流向, 分别是两个输入 ( IN) 模式 a1和 b1,
一个是输出 ( OUT) 模式 c1,端口信息除了输入
输出之外, 还可以是双向, 缓冲器等 。 std_logic
表示信号取值的类型为标准逻辑位, 除了标准逻
辑位之外, 还可以是实数, 整数, 无符号数, 物
理以及以上数据类型组成的记录和数组集合, 信
号类型也可以是设计者定义 。
三, 描述部分 — 结构体:
当异或门的符号和外部端口
a1,b1和 c1确定之后, 就要确定
实体的内部电路, 使之与实体相
对应 。 电路描述部分称之为结构
体 ARCHITECTURE,它描述实
体硬件的互连关系, 数据的传输
和变换以及动态行为 。 一个实体
可以对应多个结构体, 每个结构
体可以代表该硬件的某一方面特
性, 例如行为特性, 结构特性 。
调用程序包
语句
标
准
程
序
包
定
义
程
序
包
实体
及实
体声
明语
句
结
构
体
1
结
构
体
2
结
构
体
n
ARCHITECTURE kxor_arc OF kxor IS
例 3
BEGIN
c1 <= (NOT a1 AND b1) OR (a1 AND NOT b1);
END kxor_arc;
kxora1
b1
c1
a1
b1
c1
§ 10-2 VHDL数据类型和属性
VHDL硬件描述语言中涉及到了许多信号, 变量和常
量, 它们用来保持一个数据 。
保持数据的信号,变量和常量,在 VHDL中称为
目标,每一个目标都有一个数据类型确定目标保持的
那一类数据。
VHDL是一种非常严格的数据类型化语言,规定每个信
号,常量或变量和每个表达式有一个唯一的确定数据类型,
一般说,在表达式中分配数值给目标时的数据类型不可以
被混用。
每个目标和表达式的类型静态地确定。
在 VHDL中有三类目标:信号, 变量和常量 。
信号和变量可以赋予一系列的值,而常量一次
仅被分配一个值。
变量和信号又有不同,赋予信号的数值要到未来
的某个时刻,信号才接受当前的数值,而赋予变量的
数值,变量立即接受当前的数值。
目标的一般形式如下:
< 目标种类 > < 目标 <,目标,..>>, < 目标类型 >,=< 表达式 > ;
目标,是一个或多个代表着目标种类的字符串, 多个目
标时用,,, 号分开 。
< 目标种类 > < 目标 <,目标,..>>, < 目标类型 >,=< 表达式 > ;
目标种类, 信号, 变量 和 常量 。
信号,它可以表示把元件的端口连接在一起的互连线。
变量,用于对暂时数据的局部存储,变量只在进程和子
程序内部定义。
常量,对某些特定类型数据赋予的数值。
表达式,表达式是为了规定目标的初始值,这是缺省部分。
目标类型,为了规定目标的特征, VHDL含有很宽范围的
数据类型 。 VHDL除了有基本的数据类型之外, 设计者还
可以建立自己新的数据类型, 类型说明部分规定类型名和
类型范围, 它的一般形式是:
TYPE < 类型名 > IS < 类型范围 > ;
标量类型、复合类型、子类型、文件类型和寻址类型。
标量类型包括所有的简单类型:如整数、实数等
复合类型包括数组和记录
寻址类型在一般编辑语言中等价为指针
文件类型用设计者定义的文件类型为设计者提供说明的文件对象
子类型主要是对现有类型加以限制
VHDL可用数据类型有五类:
一,标量数据类型
标量数据类型是基本的数据类型,它包括整数类型、
实数类型、物理类型和枚举类型。
一个目标的数值有可能经常更换或者说是包含多个值,
但一个目标一次只能被一种类型说明。
物理类型要提供一个基本单位,然后在这个基本单位
上定义多个或零个次级单位,每个次级单位都是基本
单位的整数倍。
枚举类型在形式上是定义括弧括起来的字符串文字表,
一个字符串文字在枚举类型定义中只能出现一次,但
允许同样一个字符串文字出现在不同的枚举类型的字
符串文字表中,枚举类型的字符串文字表中的文字是
由设计者定义的,这些字母可以是单个字母,也可以
是一个字符串,例如 BREAKFAST,Lunch,a等。
下面举两个 VHDL程序加深理解枚举类型的使用 。
PACKAGE meals_pkg IS
TYPE meal IS(breakfast,lunch,dinner);
END meals_pkg;
例 2:
USE work, meals_pkg, all;
ENTITY meals IS
PORT(previous_meal:IN meal;
next_meal:OUT meal);
END meals;
ARCHITECTURE meals_arc OF meals IS
BEGIN
WITH previous_meal SELECT
next_meal <= breakfast WHEN dinner,
lunch WHEN breakfast,
dinner WHEN lunch;
END meals_arc;
二, 复合数据类型
复合类型是由数组类型和记录类型组成, 它们的元
素是标量类型的元素 。 数组类型是由相同的标量元素
组成, 即同构复合类型, 数组可以是一维二维或多维 。
例如
TYPE matrix IS ARRAY(row,column) OF std_logic;
TYPE r_ma IS ARRAY( 1 TO 10,1 TO 40) OF
std_logic;
TYPE word IS ARRAY(15 DOWNTO 0) OF BIT;
TYPE column IS RANGE 1 TO 40;
TYPE row IS RANGE 1 TO
10;CONSTANT ROM, BIT_VECTOR(0 TO 15);
ARCHITECTURE rom_arc OF rom IS
BEGIN
PROCESS(cs,x1,x2,x3,x4)
VARIABLE n:NATURAL RANGE 0 TO 15;
CONSTANT rom0:std_logic_vector(0 TO 15):=,0101010101010101”;
CONSTANT rom1:std_logic_vector(0 TO 15):=,0011001100110011”;
CONSTANT rom2:std_logic_vector(0 TO 15):=,0000111100001111”;
CONSTANT rom3:std_logic_vector(0 TO 15):=,0000000011111111”;
下面举一个 VHDL程序说明一维数组实现 16× 4的 ROM。
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY rom IS
PORT(cs,x1,x2,x3,x4:IN std_logic;
d0,d1,d2,d3:OUT std_logic);
END rom;
BEGIN
IF cs= ‘1’ THEN
n:=0;
IF x1 = ‘1’ THEN n:= n+1; END IF;
IF x2 = ‘1’ THEN n:= n+2; END IF;
IF x3 = ‘1’ THEN n:= n+4; END IF;
IF x4 = ‘1’ THEN n:= n+8; END IF;
d0 <= rom0(n) AFTER 10 ns;
d1 <= rom1(n) AFTER 10 ns;
d2 <= rom2(n) AFTER 10 ns;
d3 <= rom3(n) AFTER 10 ns;
ELSE
d0 <= ‘Z’ AFTER 10 ns;
d1 <= ‘Z’ AFTER 10 ns;
d2 <= ‘Z’ AFTER 10 ns;
d3 <= ‘Z’ AFTER 10 ns;
END IF;
END PROCESS;
END rom_arc;
在结构体说明区 ( ARCHITECTURE和 BEGIN之间 ) 被
说明的目标, 仅可以在此结构体中引用或在结构体中的任何
进程语句中被引用, 称此目标为局部信号 。
数据类型的全局化和局部化
前面已经讨论 VHDL描述语言的组成是由程序包、实体、
结构体(结构体中有进程)、以及子程序而组成,不同的目标
可以在指定的组成部分内加以说明。
如果一个目标在实体说明部分被说明,那么在本实体和本
实体内部的任何结构体和任何进程中都可以引用在实体中说明
的目标,称为全局信号;
VHDL中不同的目标和类型规定在不同的构造中可以被说明 。
信号, 实 体, 结 构 体 说 明 区, 程 序 包 和 子 程 序 。
变量,进程语句说明区和子程序 。
常量,实体, 结构体, 进程语句说明区和程序包和子程序 。
标量类型,实体, 结构体, 进程语句说明区和程序包和子程序 。
复合类型,实体, 结构体, 进程语句说明区和程序包和子程序 。
文 件 类 型, 子 程 序 和 进 程 语 句 说 明 区 。
寻址类型,进程语句说明区 。
VHDL的属性
VHDL中的属性使得 VHDL程序更加简明扼要,更
加容易理解,VHDL的属性在时序程序中几乎处处可
见,如值类属性的左边界、右边界、上下边界以及值
类属性的长度,还可以检测信号上升沿和下降沿以及
前一次发生的事件等等。
VHDL的属性可归纳为,信号类属性、函数类属性、
值类属性、类型类属性和范围类属性。本节介绍值类
属性及函数信号类属性。
TYPE bit IS ARRAY(63 DOWNTO 32) OF BIT;
VARIABLE
left_range,right_range,uprange,lowrange:INTEGER;
BEGIN
left_range:= bit’LEFT; --returns 63
right_range:= bit’RIGHT; --returns 32
uprange:= bit’HIGH; --returns 63
lowrange:= bit’LOW; --returns 32
值类属性,值类属性用于返回数组的边界或长度,首先举一例
数组边界的例子说明类型属性。
例 8:
TYPE bit IS ARRAY(0 TO 7) OF BIT;
TYPE bit1 IS ARRAY(8 TO 31) OF BIT;
VARIABLE len1,len2:INTEGER;
BEGIN
len1:=bit’LENGTH; --return 8
len2:=bit1’LENGTH; --return 24
下面再举一个值类数组属性的例子,让其返
回数组范围的总长度。
例,
它可用来检查一个信号的变化, 并且变化刚
刚发生, 既推断出在信号上发生了一个跳变 。
函数信号属性:函数信号属性用来返回有关信
号行为功能的信息,它反映一个信号是否正好有值
的变化或事件的发生,如 clk’EVENT,这个属性为
,EVENT”,对检查时钟边沿触发是很有效的。
下面举一个例子,说明函数信号属性的用法
IF clk= ‘1’ AND clk’EVENT
THEN
q <= d;
END IF;
上述语句中用到了函数信号属性 clk’EVENT,说明
如果时钟信号 clk为高电平,并且事件刚刚发生,也就
是说是时钟上升沿有效,此时 q得到 d的信号。
§ 10-3 VHDL的行为描述
在 VHDL硬件描述语言中,描述电路逻辑的程
序称为 行为描述,行为描述有 并行行为描述, 进程
行为描述 和 顺序行为描述 。
三个行为即可以是相互独立,成为单一的行为
描述体,又可以相互联系,成为混合描述体,如进
程行为描述行为 之间 是并行行为,进程行为体的 内
部 是顺序行为。
一,VHDL的并行行为
在典型的编程语言如 C或 Pascal中,每个赋值语句按规定的次
序,一个接在另一个之后顺序执行,执行的次序由源文件决定。
在 VHDL中,结构体的内部没有规定语句的次序,执行的次序
仅由对语句中的敏感信号发生的事件决定,且语句是同时执行,产
生其并行型。
结构体中并行赋值语句的一般格式如下:
< 对象 > <= < 表达式 >
该一般形式读作对象得到表达式的值,其作用是将表达式的信号
值分配给对象,也就是说每当表达式的信号值变化时执行该语句。
每个表达式都至少有一个敏感信号,每当敏感信号改变其
值时,这个信号赋值语句就执行,
在所有的并行语句中, 两个以上的并行赋值语句在字面
上的顺序并不表明它们的执行顺序,
例如下面的两个结构体在功能上是等价的。
ENTITY exe IS
PORT(a1,a2:IN BIT;
b1,b2:OUT BIT);
END exe;
ARCHITECTURE exe_arc1 OF exe IS
BEGIN
b1 <= a1 AND b2;
b2 <= NOT a1 OR a2;
END exe_arc1;
ARCHITECTURE exe_arc2 OF exe IS
BEGIN
b2 <= NOT a1 OR a2;
b1 <= a1 AND b2;
END exe_arc2;
a1
a2
b1
b2
另一种并行信号赋值语句是选择信号赋值语句,它们的每一
个赋值语句都需要给出一个表达式,同时给出与该表达式的每个
可能值相关联的信号
选择信号赋值语句的一般形式如下:
WITH < 表达式 > SELECT
< 对象 > <= < 信号 1> WHEN < 分支 1>,
< 信号 2> WHEN < 分支 2>,
< 信号 n> WHEN < 分支 n> ;
一个典型的四路数据选择器的 VHDL程序说明 WITH一般
形式的用法
ENTITY sels IS
PORT(d0,d1,d2,d3:IN BIT;
s,IN INTEGER RANGE 0 TO 3;
out1,OUT BIT);
END sels;
ARCHITECTURE sels_arc OF sels ISBEGIN
WITH s SELECT
out1 <= d0 WHEN 0,
d1 WHEN 1,
d2 WHEN 2,
d3 WHEN 3;
END sels_arc;
d0d1
d2d3
s
out1
sels
仍以四路数据选择器为例, 讨论另一个较为复杂的并
行信号赋值语句的例子, 以便更详细地说明并行概念,
下 面 是 四 输 入 数 据 选 择 器 的 第 二 个 VHDL 程序 。
例,LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY mux4 IS
PORT(I0,I1,I2,I3,A,B:IN std_logic;
Q,OUT std_logic);
END mux4;
ARCHITECTURE mux4_arc OF mux4 IS
SIGNAL sel,INTEGER ;
BEGIN
Q <= I0 AFTER 10 ns WHEN sel= 0 ELSE
I1 AFTER 10 ns WHEN sel= 1 ELSE
I2 AFTER 10 ns WHEN sel= 2 ELSE
I3 AFTER 10 ns ;
sel <= 0 WHEN A= ‘0’ AND B= ‘0’ ELSE
1 WHEN A= ‘1’ AND B= ‘0’ ELSE
2 WHEN A= ‘0’ AND B= ‘1’ ELSE
3 ;
END mux4_arc;
二,VHDL的进程行为
VHDL除了并行行为之外,还有顺序行为。顺序行为执行
的顺序是一个接在另一个之后严格执行。
顺序行为的语句存在于 VHDL程序中的 进程行为 之中。
而进程行为之间是并行行为语句 。
进程行为语句的一般形式如下,
< 进程标号 >, PROCESS < 敏感信号表 >
< 进程说明区 >
BEGIN
< 语句部分 >
WAIT ON < 敏感信号表 > ;
WAIT UNTIL < 条件表达式 > ;
WAIT FOR < 时间表达式 > ;
END PROCESS;
进程行为的说明区定义该进程所需要的局部数据环境、它
包括 子程序说明, 属性说明 和 变量说明 等
在这里只给出 变量说明 的一个例子,变量说明的一般形式为
VARIABLE < 定义变量表 >, < 类型说明,= 初始值 > ;
下面进程说明区中说明了变量 count,进程也可对变量赋值。
PROCESS
VARIABLE count:INTEGER:= 0;
BEGIN
count:= count+1;
WAIT FOR 1000 ns;
END PROCESS;
整个实体模块中的每个进程行为语句,可以在任何时候被
激活,所有被激活的进程是并行执行的
下面举一个 3线 -8线通用译码器程序的例子,说明进程语句
如何工作。
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
ENTITY decoder IS
PORT(sel, IN UNSIGNED(2 DOWNTO 0);
dout, OUT UNSIGNED(7 DOWNTO 0));
END decoder;
ARCHITECTURE decoder_arc OF decoder IS
SIGNAL sel1,INTEGER;
BEGIN
PROCESS(sel)
BEGIN
sel1 <= CONV_INTEGER(sel);
CASE sel1 IS
WHEN 0 => dout <= (‘0’,’0’,’0’,’0’,’0’,’0’,’0’,’1’) AFTER 5 ns;
WHEN 1 => dout <= (‘0’,’0’,’0’,’0’,’0’,’0’,’1’,’0’)AFTER 5 ns;
WHEN 2 => dout <= (‘0’,’0’,’0’,’0’,’0’,’1’,’0’,’0’) AFTER 5 ns;
WHEN 3 => dout <= (‘0’,’0’,’0’,’0’,’1’,’0’,’0’,’0’) AFTER 5 ns;
WHEN 4 => dout <= (‘0’,’0’,’0’,’1’,’0’,’0’,’0’,’0’) AFTER 5 ns;
WHEN 5 => dout <= (‘0’,’0’,’1’,’0’,’0’,’0’,’0’,’0’) AFTER 5 ns;
WHEN 6 => dout <= (‘0’,’1’,’0’,’0’,’0’,’0’,’0’,’0’) AFTER 5 ns;
WHEN OTHERS=> dout <= (‘1’,’0’,’0’,’0’,’0’,’0’,’0’,’0’) AFTER 5 ns;
END CASE;
END PROCESS;
END decoder_arc;
此例不像上例那样等待时间到 1000ns以后再激活进程,而
是只要 sel的值一发生改变就激活进程,从第一句执行直到满足
条件后再被挂起。
下例是另一种激活进程的方式:
ENTITY reg IS
PORT(d,clk:IN BIT;
q1,q2:OUT BIT);
END reg;
ARCHITECTURE reg_arc OF reg IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL clk= ‘1’;
q1 <= d;
END PROCESS;
PROCESS
BEGIN
WAIT UNTIL clk= ‘0’;
q2 <= d;
END PROCESS;
END reg_arc;
进程行为语句之间是
并行关系,进程行为
语句内部是顺序关系。
VHDL的每个结构
体中可以有多个进程
行为语句。
它的关键之处是:
三,VHDL的顺序行为
顺序行为语句可分为两大类,条件控制类, 循环控制类
在这两类中选出六种 IF,CASE,FOR,WHILE..LOOP、
EXIT和 ASSERT进行讨论
IF < 条件 > THEN
< 语句 > ;
ELSIF < 条件 > THEN
< 语句 > ;
ELSIF < 条件 > THEN
< 语句 > ;
ELSE
< 语句 > ;
END IF;
1,IF语句
IF语句的一般形式为:
ARCHITECTURE alarm_arc OF alarm IS
BEGIN
下面举例说明 IF条件语句的用法。
例,
用 VHDL设计一家用告警系统的控制逻辑,它有来自传感
器的三个输入信号 smoke,door,water和准备传输到告警设备
的三个输出触发信号 fire_alarm,burg_alarm,water_alarm以
及使能信号 en和 alarm_en。
VHDL程序描述如下:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY alarm IS
PORT(smoke,door,water:IN std_logic;
en,alarm_en,IN std_logic;
fire_alarm,burg_alarm,water_alarm:OUT std_logic);
END alarm;
PROCESS(smoke,door,water,en,alarm_en)
BEGIN
IF ((smoke= ‘1’) AND (en= ‘0’)) THEN
fire_alarm <= ‘1’;
ELSE
fire_alarm <= ‘0’;
END IF;
IF((door= ‘1’) AND ((en= ‘0’)AND (alarm_en= ‘0’))) THEN
burg_alarm <= ‘1’;
ELSE
burg_alarm <= ‘0’;
END IF;
IF((water= ‘1’)AND (en= ‘0’)) THEN
water_alarm <= ‘1’;
ELSE
water_alarm <= ‘0’;
END IF;
END PROCESS;
END alarm_arc;
2,CASE 语句
CASE语句的一般形式:
CASE < 表达式 > IS
WHEN < 值 > = > < 语句 > ;
WHEN < 值 > | < 值 > = > < 语句 > ;
WHEN < 离散范围 > = > < 语句 > ;
WHEN OTHERS = > < 语句 > ;
END CASE;
CASE语句是 VHDL提供的另一种形式的控制语句,每当
单个表达式的值在多个起作用的项中选择时,用此语句是较合
适的,它根据所给表达式的值或域,选择,=>”后面的执行语句。
用 CASE语句应该注意三个问题:
一,是关键字 WHEN的数量不作限制,但不容许两
个语句用一个值;
二,是所有 WHEN后面的值在 CASE语句中合起来的
值域中的全部;
三,是 WHEN的次序可以任意排定
信号可被看作两个元件之间数据传输的通路,
§ 10-4 VHDL的结构描述
实体主要描述元件、端口与信号。
元件是硬件的描述,即门、芯片或者电路板。
端口是元件与外界的连接点,数据通过端口进入或流出元件。
而信号则是作为硬件连线的一种抽象描述,它即能保持变化
的数据,又可以连接各个子元件。
下面举例说明, 调用元件语句, 的用法 。
对一个硬件的 结构进行描述,就是要描述它由哪些
子元件组成,以及各个子元件之间的互连关系。
结构描述比行为描述更加具体化,即,结构描述与硬
件之间的关系要比行为描述与硬件之间的关系更明显。
前面讨论,
? 行为描述的基本单元是进程语句
? 而结构描述的基本单元则是“调用元件语句”。
例,用 VHDL结构描述设计一全减器,全减器可由两个
半减器和一个或门组成。
首先用 VHDL的行为描述设计半减器:
ENTITY halfsub IS
PORT(A,B:IN BIT;
T,C:OUT BIT);
END halfsub;
PROCESS(A,B)
BEGIN
T<= A XOR B AFTER 10 ns;
C <= (NOT A) AND B AFTER 10 ns;
END PROCESS;
ARCHITECTURE halfsub_arc OF halfsub IS
BEGIN
END halfsub_arc;
下面再将或门的 VHDL程序描述如下:
ARCHITECTURE orgate_arc OF orgate IS
BEGIN
O1<= A1 OR B1;
END orgate_arc;
下面将两个半减器,一个或门的端口,通过定义一
些中间信号将其连接起来形成 VHDL的结构描述。
ENTITY orgate IS
PORT(A1,B1:IN BIT;
O1:OUT BIT);
END orgate;
在下面举的全减器例子里可以看到定义了中间信号
temp_T,temp_c1和 temp_c2
ENTITY fullsub IS
PORT(I1,I2,C_IN:IN BIT;
FT,C_OUT:OUTBIT);
END fullsub;
ARCHITECTURE fullsub_arc OF fullsub IS
SIGNAL temp_T,temp_c1,temp_c2:BIT;
COMPONENT halfsub
PORT(A,B:IN BIT;
T,C:OUT BIT);
END COMPONENT;
COMPONENT orgate
PORT(A1,B1:IN BIT;
O1:OUT BIT);
END COMPONENT;
图中虚线框各元件之间
的连线命名。 temp_T将第一
个半减器的差位输出连到第
二个半减器的输入端。信号
temp_c1将第一个半减器的借
位输出连至“或”门的一个输入
端,信号 temp_c2将第二个半
减器的借位输出连至“或”门的
另一个输入端。
用三个元件调用语句定义这三个连接关系。
BEGIN
U0:halfsub PORT MAP(I1,I2,temp_T,temp_c1);
U1:halfsub PORT MAP(temp_T,C_IN,FT,temp_c2);
U2:orgate PORT MAP(temp_c1,temp_c2,C_OUT);
END fullsub_arc;
U0
halfsub
I1
I2
temp_T
temp_c1
U1
halfsub
C_IN
FT
temp_c2
U2 C_OUT
描述语言 VHDL
§ 8-1 VHDL语言的基本组成
§ 8-2 VHDL数据类型和属性
§ 8-3 VHDL的行为描述
§ 8-4 VHDL的结构描述
小结
? 传统的电路系统设计方法的步骤从状态图的简化,
写出最简逻辑表达式, 到绘出电路原理图 。 这在不是
较大的电路系统中, 工程师可以用一定的时间, 了解
电路的原理 。 若电路系统非常庞大, 工程师就不容易
在电路原理图上了解电路的原理, 而且对绘图者也是
一项非常烦琐的工作 。 因此众多软件公司开发研制了
具有自己特色的电路硬件描述语言 ( Hardware
Description Language,HDL), 这些硬件描述语言必
然有很大的差异, 工程师一旦选用某种硬件描述语言
作为输入工具, 就被束缚在这个硬件设计环境之中,
不能在众多的软件工具中选择一个最佳组合作为自己
的最优设计环境 。 因此, 硬件设计工程师需要一种强
大的, 标准化的硬件描述语言, 作为可相互交流的设
计环境 。
美国国防部在 20世纪 80年代初提出了 VHSIC
( Very High Speed Integrated Circuit) 计划, 其
目标之一是为下一代集成电路的生产, 实现阶段
性的工艺极限以及完成 10万门级以上的设计, 建
立一项新的描述方法 。 1981年提出了一种新的
HDL, 称之为 VHSIC Hardware Description
Language,简称为 VHDL,这种语言的成就有两
个方面:
1,描述复杂的电路系统 ;
2,VHDL成为硬件描述语言的标准 。
VHDL的主要优点是:
1.覆盖面广,描述能力强,是一个多层次的硬件描述语言。
即设计的原始描述可以是非常简练的描述,经过层层细化求
精,最终成为可直接付诸生产的电路级或版图参数描述,整
个过程都可以在 VHDL的环境下进行。
2.VHDL有良好的可读性, 即可以被计算机接受, 也容
易被理解 。 用 VHDL书写的原文件, 即是程序, 又是文档,
即是技术人员之间交换信息的文件, 又可作为合同签约者
之间的文件 。
3.VHDL本身的生命期长,因为 VHDL的硬件描述与工
艺技术无关,不会因工艺变化而使描述过时。与工艺技术
有关的参数可通过 VHDL提供的属性加以描述,工艺改变
时,只需修改相应程序中的属性参数即可。
4.支持大规模设计的分解和已有设计的
再利用, 一个大规模设计不可能一个人独
立完成, 它将由多人, 多项目组来共同完
成 。 VHDL为设计的分解和设计的再利用
提供了有力的支持 。
VHDL的主要优点是:
5.VHDL已成为 IEEE承认的一个工业标
准, 事实上已成为通用硬件描述语言 。
§ 10-1 VHDL的基本组成
VHDL可以把任意复杂的电路系统视作一个模
块, 一个模块可主要分为三个组成部分:
每个模块中的程序包有 IEEE标准的标准程序
包或设计者自身设计的程序包, 而且调用的数量
不限 。 模块中的程序包是设计中的子程序和公用
数据类型的集合, 是构成设计工具的工具箱, 工
具箱中最基本的工具是数据类型包, 调用此标准
程序包的 VHDL语言是:
一,参数部分 —— 程序包
例 1,
LIBRARY ieee;
USE ieee.std_logic_1164.all; 调用程序包 语句
标
准
程
序
包
定
义
程
序
包
这两句设置在 VHDL
程序的前面, 表示以后
在实体或结构体中要用
到数据类型包中的数据
类型 。
模块中仅有一个设计实体,
它提供该设计模块的公共信息,
是 VHDL设计电路的最基本部
分 。 VHDL设计的电路系统是
可以分层次的, 所以设计的模
块系统实体即可以是顶层实体,
又可以是最底层实体 。
二, 接口部分 — 设计实体,调用程序包
语句
标
准
程
序
包
定
义
程
序
包
实体
及实
体声
明语
句
ENTITY kxor IS kxor
PORT(a1,b1:IN std_logic;
a1
b1
c1:OUT std_logic);
c1
END kxor;
例 2
实体部分的大写单词 ENTITY,IS,PORT、
IN,OUT和 END为关键字 。 在 ENTITY...END之
间表示实体内容, ENTITY后的字符串 kxor表示
实体的名称, 即电路的符号名 。 端口 ( 引脚 ) 信
息关键字 PORT中的语句有三个端口, 描述了信
号的流向, 分别是两个输入 ( IN) 模式 a1和 b1,
一个是输出 ( OUT) 模式 c1,端口信息除了输入
输出之外, 还可以是双向, 缓冲器等 。 std_logic
表示信号取值的类型为标准逻辑位, 除了标准逻
辑位之外, 还可以是实数, 整数, 无符号数, 物
理以及以上数据类型组成的记录和数组集合, 信
号类型也可以是设计者定义 。
三, 描述部分 — 结构体:
当异或门的符号和外部端口
a1,b1和 c1确定之后, 就要确定
实体的内部电路, 使之与实体相
对应 。 电路描述部分称之为结构
体 ARCHITECTURE,它描述实
体硬件的互连关系, 数据的传输
和变换以及动态行为 。 一个实体
可以对应多个结构体, 每个结构
体可以代表该硬件的某一方面特
性, 例如行为特性, 结构特性 。
调用程序包
语句
标
准
程
序
包
定
义
程
序
包
实体
及实
体声
明语
句
结
构
体
1
结
构
体
2
结
构
体
n
ARCHITECTURE kxor_arc OF kxor IS
例 3
BEGIN
c1 <= (NOT a1 AND b1) OR (a1 AND NOT b1);
END kxor_arc;
kxora1
b1
c1
a1
b1
c1
§ 10-2 VHDL数据类型和属性
VHDL硬件描述语言中涉及到了许多信号, 变量和常
量, 它们用来保持一个数据 。
保持数据的信号,变量和常量,在 VHDL中称为
目标,每一个目标都有一个数据类型确定目标保持的
那一类数据。
VHDL是一种非常严格的数据类型化语言,规定每个信
号,常量或变量和每个表达式有一个唯一的确定数据类型,
一般说,在表达式中分配数值给目标时的数据类型不可以
被混用。
每个目标和表达式的类型静态地确定。
在 VHDL中有三类目标:信号, 变量和常量 。
信号和变量可以赋予一系列的值,而常量一次
仅被分配一个值。
变量和信号又有不同,赋予信号的数值要到未来
的某个时刻,信号才接受当前的数值,而赋予变量的
数值,变量立即接受当前的数值。
目标的一般形式如下:
< 目标种类 > < 目标 <,目标,..>>, < 目标类型 >,=< 表达式 > ;
目标,是一个或多个代表着目标种类的字符串, 多个目
标时用,,, 号分开 。
< 目标种类 > < 目标 <,目标,..>>, < 目标类型 >,=< 表达式 > ;
目标种类, 信号, 变量 和 常量 。
信号,它可以表示把元件的端口连接在一起的互连线。
变量,用于对暂时数据的局部存储,变量只在进程和子
程序内部定义。
常量,对某些特定类型数据赋予的数值。
表达式,表达式是为了规定目标的初始值,这是缺省部分。
目标类型,为了规定目标的特征, VHDL含有很宽范围的
数据类型 。 VHDL除了有基本的数据类型之外, 设计者还
可以建立自己新的数据类型, 类型说明部分规定类型名和
类型范围, 它的一般形式是:
TYPE < 类型名 > IS < 类型范围 > ;
标量类型、复合类型、子类型、文件类型和寻址类型。
标量类型包括所有的简单类型:如整数、实数等
复合类型包括数组和记录
寻址类型在一般编辑语言中等价为指针
文件类型用设计者定义的文件类型为设计者提供说明的文件对象
子类型主要是对现有类型加以限制
VHDL可用数据类型有五类:
一,标量数据类型
标量数据类型是基本的数据类型,它包括整数类型、
实数类型、物理类型和枚举类型。
一个目标的数值有可能经常更换或者说是包含多个值,
但一个目标一次只能被一种类型说明。
物理类型要提供一个基本单位,然后在这个基本单位
上定义多个或零个次级单位,每个次级单位都是基本
单位的整数倍。
枚举类型在形式上是定义括弧括起来的字符串文字表,
一个字符串文字在枚举类型定义中只能出现一次,但
允许同样一个字符串文字出现在不同的枚举类型的字
符串文字表中,枚举类型的字符串文字表中的文字是
由设计者定义的,这些字母可以是单个字母,也可以
是一个字符串,例如 BREAKFAST,Lunch,a等。
下面举两个 VHDL程序加深理解枚举类型的使用 。
PACKAGE meals_pkg IS
TYPE meal IS(breakfast,lunch,dinner);
END meals_pkg;
例 2:
USE work, meals_pkg, all;
ENTITY meals IS
PORT(previous_meal:IN meal;
next_meal:OUT meal);
END meals;
ARCHITECTURE meals_arc OF meals IS
BEGIN
WITH previous_meal SELECT
next_meal <= breakfast WHEN dinner,
lunch WHEN breakfast,
dinner WHEN lunch;
END meals_arc;
二, 复合数据类型
复合类型是由数组类型和记录类型组成, 它们的元
素是标量类型的元素 。 数组类型是由相同的标量元素
组成, 即同构复合类型, 数组可以是一维二维或多维 。
例如
TYPE matrix IS ARRAY(row,column) OF std_logic;
TYPE r_ma IS ARRAY( 1 TO 10,1 TO 40) OF
std_logic;
TYPE word IS ARRAY(15 DOWNTO 0) OF BIT;
TYPE column IS RANGE 1 TO 40;
TYPE row IS RANGE 1 TO
10;CONSTANT ROM, BIT_VECTOR(0 TO 15);
ARCHITECTURE rom_arc OF rom IS
BEGIN
PROCESS(cs,x1,x2,x3,x4)
VARIABLE n:NATURAL RANGE 0 TO 15;
CONSTANT rom0:std_logic_vector(0 TO 15):=,0101010101010101”;
CONSTANT rom1:std_logic_vector(0 TO 15):=,0011001100110011”;
CONSTANT rom2:std_logic_vector(0 TO 15):=,0000111100001111”;
CONSTANT rom3:std_logic_vector(0 TO 15):=,0000000011111111”;
下面举一个 VHDL程序说明一维数组实现 16× 4的 ROM。
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY rom IS
PORT(cs,x1,x2,x3,x4:IN std_logic;
d0,d1,d2,d3:OUT std_logic);
END rom;
BEGIN
IF cs= ‘1’ THEN
n:=0;
IF x1 = ‘1’ THEN n:= n+1; END IF;
IF x2 = ‘1’ THEN n:= n+2; END IF;
IF x3 = ‘1’ THEN n:= n+4; END IF;
IF x4 = ‘1’ THEN n:= n+8; END IF;
d0 <= rom0(n) AFTER 10 ns;
d1 <= rom1(n) AFTER 10 ns;
d2 <= rom2(n) AFTER 10 ns;
d3 <= rom3(n) AFTER 10 ns;
ELSE
d0 <= ‘Z’ AFTER 10 ns;
d1 <= ‘Z’ AFTER 10 ns;
d2 <= ‘Z’ AFTER 10 ns;
d3 <= ‘Z’ AFTER 10 ns;
END IF;
END PROCESS;
END rom_arc;
在结构体说明区 ( ARCHITECTURE和 BEGIN之间 ) 被
说明的目标, 仅可以在此结构体中引用或在结构体中的任何
进程语句中被引用, 称此目标为局部信号 。
数据类型的全局化和局部化
前面已经讨论 VHDL描述语言的组成是由程序包、实体、
结构体(结构体中有进程)、以及子程序而组成,不同的目标
可以在指定的组成部分内加以说明。
如果一个目标在实体说明部分被说明,那么在本实体和本
实体内部的任何结构体和任何进程中都可以引用在实体中说明
的目标,称为全局信号;
VHDL中不同的目标和类型规定在不同的构造中可以被说明 。
信号, 实 体, 结 构 体 说 明 区, 程 序 包 和 子 程 序 。
变量,进程语句说明区和子程序 。
常量,实体, 结构体, 进程语句说明区和程序包和子程序 。
标量类型,实体, 结构体, 进程语句说明区和程序包和子程序 。
复合类型,实体, 结构体, 进程语句说明区和程序包和子程序 。
文 件 类 型, 子 程 序 和 进 程 语 句 说 明 区 。
寻址类型,进程语句说明区 。
VHDL的属性
VHDL中的属性使得 VHDL程序更加简明扼要,更
加容易理解,VHDL的属性在时序程序中几乎处处可
见,如值类属性的左边界、右边界、上下边界以及值
类属性的长度,还可以检测信号上升沿和下降沿以及
前一次发生的事件等等。
VHDL的属性可归纳为,信号类属性、函数类属性、
值类属性、类型类属性和范围类属性。本节介绍值类
属性及函数信号类属性。
TYPE bit IS ARRAY(63 DOWNTO 32) OF BIT;
VARIABLE
left_range,right_range,uprange,lowrange:INTEGER;
BEGIN
left_range:= bit’LEFT; --returns 63
right_range:= bit’RIGHT; --returns 32
uprange:= bit’HIGH; --returns 63
lowrange:= bit’LOW; --returns 32
值类属性,值类属性用于返回数组的边界或长度,首先举一例
数组边界的例子说明类型属性。
例 8:
TYPE bit IS ARRAY(0 TO 7) OF BIT;
TYPE bit1 IS ARRAY(8 TO 31) OF BIT;
VARIABLE len1,len2:INTEGER;
BEGIN
len1:=bit’LENGTH; --return 8
len2:=bit1’LENGTH; --return 24
下面再举一个值类数组属性的例子,让其返
回数组范围的总长度。
例,
它可用来检查一个信号的变化, 并且变化刚
刚发生, 既推断出在信号上发生了一个跳变 。
函数信号属性:函数信号属性用来返回有关信
号行为功能的信息,它反映一个信号是否正好有值
的变化或事件的发生,如 clk’EVENT,这个属性为
,EVENT”,对检查时钟边沿触发是很有效的。
下面举一个例子,说明函数信号属性的用法
IF clk= ‘1’ AND clk’EVENT
THEN
q <= d;
END IF;
上述语句中用到了函数信号属性 clk’EVENT,说明
如果时钟信号 clk为高电平,并且事件刚刚发生,也就
是说是时钟上升沿有效,此时 q得到 d的信号。
§ 10-3 VHDL的行为描述
在 VHDL硬件描述语言中,描述电路逻辑的程
序称为 行为描述,行为描述有 并行行为描述, 进程
行为描述 和 顺序行为描述 。
三个行为即可以是相互独立,成为单一的行为
描述体,又可以相互联系,成为混合描述体,如进
程行为描述行为 之间 是并行行为,进程行为体的 内
部 是顺序行为。
一,VHDL的并行行为
在典型的编程语言如 C或 Pascal中,每个赋值语句按规定的次
序,一个接在另一个之后顺序执行,执行的次序由源文件决定。
在 VHDL中,结构体的内部没有规定语句的次序,执行的次序
仅由对语句中的敏感信号发生的事件决定,且语句是同时执行,产
生其并行型。
结构体中并行赋值语句的一般格式如下:
< 对象 > <= < 表达式 >
该一般形式读作对象得到表达式的值,其作用是将表达式的信号
值分配给对象,也就是说每当表达式的信号值变化时执行该语句。
每个表达式都至少有一个敏感信号,每当敏感信号改变其
值时,这个信号赋值语句就执行,
在所有的并行语句中, 两个以上的并行赋值语句在字面
上的顺序并不表明它们的执行顺序,
例如下面的两个结构体在功能上是等价的。
ENTITY exe IS
PORT(a1,a2:IN BIT;
b1,b2:OUT BIT);
END exe;
ARCHITECTURE exe_arc1 OF exe IS
BEGIN
b1 <= a1 AND b2;
b2 <= NOT a1 OR a2;
END exe_arc1;
ARCHITECTURE exe_arc2 OF exe IS
BEGIN
b2 <= NOT a1 OR a2;
b1 <= a1 AND b2;
END exe_arc2;
a1
a2
b1
b2
另一种并行信号赋值语句是选择信号赋值语句,它们的每一
个赋值语句都需要给出一个表达式,同时给出与该表达式的每个
可能值相关联的信号
选择信号赋值语句的一般形式如下:
WITH < 表达式 > SELECT
< 对象 > <= < 信号 1> WHEN < 分支 1>,
< 信号 2> WHEN < 分支 2>,
< 信号 n> WHEN < 分支 n> ;
一个典型的四路数据选择器的 VHDL程序说明 WITH一般
形式的用法
ENTITY sels IS
PORT(d0,d1,d2,d3:IN BIT;
s,IN INTEGER RANGE 0 TO 3;
out1,OUT BIT);
END sels;
ARCHITECTURE sels_arc OF sels ISBEGIN
WITH s SELECT
out1 <= d0 WHEN 0,
d1 WHEN 1,
d2 WHEN 2,
d3 WHEN 3;
END sels_arc;
d0d1
d2d3
s
out1
sels
仍以四路数据选择器为例, 讨论另一个较为复杂的并
行信号赋值语句的例子, 以便更详细地说明并行概念,
下 面 是 四 输 入 数 据 选 择 器 的 第 二 个 VHDL 程序 。
例,LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY mux4 IS
PORT(I0,I1,I2,I3,A,B:IN std_logic;
Q,OUT std_logic);
END mux4;
ARCHITECTURE mux4_arc OF mux4 IS
SIGNAL sel,INTEGER ;
BEGIN
Q <= I0 AFTER 10 ns WHEN sel= 0 ELSE
I1 AFTER 10 ns WHEN sel= 1 ELSE
I2 AFTER 10 ns WHEN sel= 2 ELSE
I3 AFTER 10 ns ;
sel <= 0 WHEN A= ‘0’ AND B= ‘0’ ELSE
1 WHEN A= ‘1’ AND B= ‘0’ ELSE
2 WHEN A= ‘0’ AND B= ‘1’ ELSE
3 ;
END mux4_arc;
二,VHDL的进程行为
VHDL除了并行行为之外,还有顺序行为。顺序行为执行
的顺序是一个接在另一个之后严格执行。
顺序行为的语句存在于 VHDL程序中的 进程行为 之中。
而进程行为之间是并行行为语句 。
进程行为语句的一般形式如下,
< 进程标号 >, PROCESS < 敏感信号表 >
< 进程说明区 >
BEGIN
< 语句部分 >
WAIT ON < 敏感信号表 > ;
WAIT UNTIL < 条件表达式 > ;
WAIT FOR < 时间表达式 > ;
END PROCESS;
进程行为的说明区定义该进程所需要的局部数据环境、它
包括 子程序说明, 属性说明 和 变量说明 等
在这里只给出 变量说明 的一个例子,变量说明的一般形式为
VARIABLE < 定义变量表 >, < 类型说明,= 初始值 > ;
下面进程说明区中说明了变量 count,进程也可对变量赋值。
PROCESS
VARIABLE count:INTEGER:= 0;
BEGIN
count:= count+1;
WAIT FOR 1000 ns;
END PROCESS;
整个实体模块中的每个进程行为语句,可以在任何时候被
激活,所有被激活的进程是并行执行的
下面举一个 3线 -8线通用译码器程序的例子,说明进程语句
如何工作。
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
ENTITY decoder IS
PORT(sel, IN UNSIGNED(2 DOWNTO 0);
dout, OUT UNSIGNED(7 DOWNTO 0));
END decoder;
ARCHITECTURE decoder_arc OF decoder IS
SIGNAL sel1,INTEGER;
BEGIN
PROCESS(sel)
BEGIN
sel1 <= CONV_INTEGER(sel);
CASE sel1 IS
WHEN 0 => dout <= (‘0’,’0’,’0’,’0’,’0’,’0’,’0’,’1’) AFTER 5 ns;
WHEN 1 => dout <= (‘0’,’0’,’0’,’0’,’0’,’0’,’1’,’0’)AFTER 5 ns;
WHEN 2 => dout <= (‘0’,’0’,’0’,’0’,’0’,’1’,’0’,’0’) AFTER 5 ns;
WHEN 3 => dout <= (‘0’,’0’,’0’,’0’,’1’,’0’,’0’,’0’) AFTER 5 ns;
WHEN 4 => dout <= (‘0’,’0’,’0’,’1’,’0’,’0’,’0’,’0’) AFTER 5 ns;
WHEN 5 => dout <= (‘0’,’0’,’1’,’0’,’0’,’0’,’0’,’0’) AFTER 5 ns;
WHEN 6 => dout <= (‘0’,’1’,’0’,’0’,’0’,’0’,’0’,’0’) AFTER 5 ns;
WHEN OTHERS=> dout <= (‘1’,’0’,’0’,’0’,’0’,’0’,’0’,’0’) AFTER 5 ns;
END CASE;
END PROCESS;
END decoder_arc;
此例不像上例那样等待时间到 1000ns以后再激活进程,而
是只要 sel的值一发生改变就激活进程,从第一句执行直到满足
条件后再被挂起。
下例是另一种激活进程的方式:
ENTITY reg IS
PORT(d,clk:IN BIT;
q1,q2:OUT BIT);
END reg;
ARCHITECTURE reg_arc OF reg IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL clk= ‘1’;
q1 <= d;
END PROCESS;
PROCESS
BEGIN
WAIT UNTIL clk= ‘0’;
q2 <= d;
END PROCESS;
END reg_arc;
进程行为语句之间是
并行关系,进程行为
语句内部是顺序关系。
VHDL的每个结构
体中可以有多个进程
行为语句。
它的关键之处是:
三,VHDL的顺序行为
顺序行为语句可分为两大类,条件控制类, 循环控制类
在这两类中选出六种 IF,CASE,FOR,WHILE..LOOP、
EXIT和 ASSERT进行讨论
IF < 条件 > THEN
< 语句 > ;
ELSIF < 条件 > THEN
< 语句 > ;
ELSIF < 条件 > THEN
< 语句 > ;
ELSE
< 语句 > ;
END IF;
1,IF语句
IF语句的一般形式为:
ARCHITECTURE alarm_arc OF alarm IS
BEGIN
下面举例说明 IF条件语句的用法。
例,
用 VHDL设计一家用告警系统的控制逻辑,它有来自传感
器的三个输入信号 smoke,door,water和准备传输到告警设备
的三个输出触发信号 fire_alarm,burg_alarm,water_alarm以
及使能信号 en和 alarm_en。
VHDL程序描述如下:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY alarm IS
PORT(smoke,door,water:IN std_logic;
en,alarm_en,IN std_logic;
fire_alarm,burg_alarm,water_alarm:OUT std_logic);
END alarm;
PROCESS(smoke,door,water,en,alarm_en)
BEGIN
IF ((smoke= ‘1’) AND (en= ‘0’)) THEN
fire_alarm <= ‘1’;
ELSE
fire_alarm <= ‘0’;
END IF;
IF((door= ‘1’) AND ((en= ‘0’)AND (alarm_en= ‘0’))) THEN
burg_alarm <= ‘1’;
ELSE
burg_alarm <= ‘0’;
END IF;
IF((water= ‘1’)AND (en= ‘0’)) THEN
water_alarm <= ‘1’;
ELSE
water_alarm <= ‘0’;
END IF;
END PROCESS;
END alarm_arc;
2,CASE 语句
CASE语句的一般形式:
CASE < 表达式 > IS
WHEN < 值 > = > < 语句 > ;
WHEN < 值 > | < 值 > = > < 语句 > ;
WHEN < 离散范围 > = > < 语句 > ;
WHEN OTHERS = > < 语句 > ;
END CASE;
CASE语句是 VHDL提供的另一种形式的控制语句,每当
单个表达式的值在多个起作用的项中选择时,用此语句是较合
适的,它根据所给表达式的值或域,选择,=>”后面的执行语句。
用 CASE语句应该注意三个问题:
一,是关键字 WHEN的数量不作限制,但不容许两
个语句用一个值;
二,是所有 WHEN后面的值在 CASE语句中合起来的
值域中的全部;
三,是 WHEN的次序可以任意排定
信号可被看作两个元件之间数据传输的通路,
§ 10-4 VHDL的结构描述
实体主要描述元件、端口与信号。
元件是硬件的描述,即门、芯片或者电路板。
端口是元件与外界的连接点,数据通过端口进入或流出元件。
而信号则是作为硬件连线的一种抽象描述,它即能保持变化
的数据,又可以连接各个子元件。
下面举例说明, 调用元件语句, 的用法 。
对一个硬件的 结构进行描述,就是要描述它由哪些
子元件组成,以及各个子元件之间的互连关系。
结构描述比行为描述更加具体化,即,结构描述与硬
件之间的关系要比行为描述与硬件之间的关系更明显。
前面讨论,
? 行为描述的基本单元是进程语句
? 而结构描述的基本单元则是“调用元件语句”。
例,用 VHDL结构描述设计一全减器,全减器可由两个
半减器和一个或门组成。
首先用 VHDL的行为描述设计半减器:
ENTITY halfsub IS
PORT(A,B:IN BIT;
T,C:OUT BIT);
END halfsub;
PROCESS(A,B)
BEGIN
T<= A XOR B AFTER 10 ns;
C <= (NOT A) AND B AFTER 10 ns;
END PROCESS;
ARCHITECTURE halfsub_arc OF halfsub IS
BEGIN
END halfsub_arc;
下面再将或门的 VHDL程序描述如下:
ARCHITECTURE orgate_arc OF orgate IS
BEGIN
O1<= A1 OR B1;
END orgate_arc;
下面将两个半减器,一个或门的端口,通过定义一
些中间信号将其连接起来形成 VHDL的结构描述。
ENTITY orgate IS
PORT(A1,B1:IN BIT;
O1:OUT BIT);
END orgate;
在下面举的全减器例子里可以看到定义了中间信号
temp_T,temp_c1和 temp_c2
ENTITY fullsub IS
PORT(I1,I2,C_IN:IN BIT;
FT,C_OUT:OUTBIT);
END fullsub;
ARCHITECTURE fullsub_arc OF fullsub IS
SIGNAL temp_T,temp_c1,temp_c2:BIT;
COMPONENT halfsub
PORT(A,B:IN BIT;
T,C:OUT BIT);
END COMPONENT;
COMPONENT orgate
PORT(A1,B1:IN BIT;
O1:OUT BIT);
END COMPONENT;
图中虚线框各元件之间
的连线命名。 temp_T将第一
个半减器的差位输出连到第
二个半减器的输入端。信号
temp_c1将第一个半减器的借
位输出连至“或”门的一个输入
端,信号 temp_c2将第二个半
减器的借位输出连至“或”门的
另一个输入端。
用三个元件调用语句定义这三个连接关系。
BEGIN
U0:halfsub PORT MAP(I1,I2,temp_T,temp_c1);
U1:halfsub PORT MAP(temp_T,C_IN,FT,temp_c2);
U2:orgate PORT MAP(temp_c1,temp_c2,C_OUT);
END fullsub_arc;
U0
halfsub
I1
I2
temp_T
temp_c1
U1
halfsub
C_IN
FT
temp_c2
U2 C_OUT