当前位置:文档之家› 第1章 硬件描述语言VHDL

第1章 硬件描述语言VHDL

第1章 硬件描述语言VHDL
第1章 硬件描述语言VHDL

第1章硬件描述语言VHDL

数字系统设计分为硬件设计和软件设计, 但是随着计算机技术、超大规模集成电路(CPLD、FPGA)的发展和硬件描述语言(HDL, Hardware Description Language)的出现,软、硬件设计之间的界限被打破,数字系统的硬件设计可以完全用软件来实现,只要掌握了HDL语言就可以设计出各种各样的数字逻辑电路。

1.1老的硬件设计方法

老的硬件设计方法有如下几个特征:

(1)采用自下而上的设计方法

使用该方法进行硬件设计是从选择具体元器件开始,并用这些元器件进行逻辑电路设计,从而完成系统的硬件设计,然后再将各功能模块连接起来,完成整个系统的硬件设计,(2)采用通用逻辑元器件

通常采用74系列和CMOS4000系列的产品进行设计

(3)在系统硬件设计的后期进行调试和仿真

只有在部分或全部硬件电路连接完毕,才可以进行电路调试,一旦考虑不周到,系统设计存在较大缺陷,则要重新设计,使设计周期延长。

(4)设计结果是一张电路图

当设计调试完毕后,形成电原理图,该图包括元器件型号和信号之间的互连关系等等。

老的硬件设计方法已经使用了几十年,是广大电子工程师熟悉和掌握的一种方法,但是现在这种方法老了,不仅方法老了,就连使用的元器件也老了。

1.2使用HTL的硬件设计方法

所谓硬件描述语言,就是利用一种人和计算机都能识别的语言来描述硬件电路的功能,信号连接关系及定时关系,它可以比电原理图更能表示硬件电路的特性。

该方法有如下特征:

(1)支持自顶向下的设计方法

所谓自顶向下的设计方法就是从系统的总体要求出发,自顶向下分三个层次对系统硬件进行设计。

第一个层次是行为描述,所谓行为描述,实际就是对整个系统的数学模型的描述,在行为描述阶段,并不真正考虑其实际操作和算法怎么实现,而是考虑系统的结构和工作过程是否能达到系统设计规格书的要求。

第二个层次是数据流描述,又称为寄存器描述或RTL方式描述,该描述比行为描述更注重硬件的具体实现,通过该描述可以导出系统的逻辑表达式,为逻辑综合作准备,当然进行逻辑综合和逻辑综合工具的能力有关,当然设计人员还必须了解逻辑综合工具的说明和规定,

第三个层次为逻辑综合。该层次把RTL描述的程序转换成基本逻辑元件表示的文件,该文件就象老的设计方法中的电原理图。

(2)采用大量的ASIC芯片

(3)早期仿真以确定系统的可行性

(4)使设计更容易

只需写出系统的HDL源程序文件,其它由计算机去做

(5)全部设计文件就是HDL源程序文件

1.3 VHTL硬件设计语言

当前ASIC制造商都自己开发了HDL语言,但是都不通用,只有美国国防部开发的VHDL 语言成为了IEEE. STD_1076标准,并在全世界得到了承认。

该语言集成了各种HDL语言的优点,使数字系统设计更加简单和容易。VHDL语言是一个规模庞大的语言,在使用它之前完全学会它是很难的,本书介绍的只是VHDL语言的一部分。

1.4VHDL语言的基本结构

VHDL语言通常包含实体(Entity),构造体(Architecture),配置(Configuration),包集合(Package),和库(Library)五部分.其中实体用于描述所设计的系统的外部接口信号;构造体用于描述系统内部的结构和行为;建立输入和输出之间的关系;配置语句安装具体元件到实体—结构体对,可以被看作是设计的零件清单;包集合存放各个设计模块共享的数据类型、常数和子程序等;库是专门存放预编译程序包的地方。如下详细介绍。

1.4.1基本设计单元

VHDL的基本设计单元就是实体,无论数字电路复杂还是简单,都是由实体和构造体组成。

(1)实体说明

实体说明有如下结构:

ENTITY 实体名 IS

[端口说明]

END 实体名;

(VHDL语言中不分大小写字母)

其中:

端口说明是对设计实体中输入和输出借口进行描述,格式如下:

PORT(端口名(,端口名):方向数据类型名;

端口名(,端口名):方向数据类型名);

端口名是赋予每个系统引脚的名称,一般用几个英文字母组成。

端口方向是定义引脚是输入还是输出,见下表:

常用的端口数据类型有两种:BIT和BIT_VECTOR,当端口被说明为BIT时,只能取值“1”或“0”,

当端口被说明为BIT_VECTOR时,它可能是一组二进制数。

例:

PORT(n0, n1, select: IN BIT;

q: OUT BIT;

bus: OUT BIT_VECTOR(7 DOWNTO 0));

本例中,n0, n1, select 是输入引脚,属于BIT型,q是输出引脚,BIT型,bus 是一组8位二进制总线,属于BIT_VECTOR,

例:

LIBRARY IEEE;

USE IEEE.STD_LOGIC.1164.ALL;

ENTITY mm IS

PORT(n0,n1,select: IN STD_LOGIC;

Q : OUT STD_LOGIC;

Bus : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));

END mm;

在此例中端口数据类型取自IEEE标准库(该库中有数据类型和函数的说明),其中STD_LOGIC 取值为“0”,“1”,“X”和“Z‖。

因为使用了库所以在实体说明前要增加库说明语句。

(2) 构造体

构造体是实体的一个重要部分,每一个实体都有一个或一个以上的构造体。

1) 一般说明

构造体格式如下:

ARCHITECTURE 构造体名 OF 实体名 IS

[定义语句] 内部信号,常数,数据类型,函数等的定义

BEGIN

[并行处理语句]

END 构造体名;

例:

ENTITY nax IS

PORT(a0,a1 : IN BIT;

Sel : IN BIT;

Sh : OUT BIT);

END nax;

ARCHITECTURE dataflow OF nax IS

BEGIN

sh<=(a0 AND sel) OR (NOT sel AND a1);

END dataflow;

构造体描述设计实体的具体行为,它包含两类语句:

●并行语句并行语句总是在进程语句(PROCESS)的外部,该语句的执行与书写顺

序无关,总是同时被执行

●顺序语句顺序语句总是在进程语句(PROCESS)的内部,从仿真的角度,该语句

是顺序执行的

一个构造体包含几个类型的子结构描述,这些描述是:

* BLOCK描述(块描述)

* PROCESS描述(进程描述)

* SUNPROGRAMS描述(子程序描述)

2) BLOCK语句描述

使用BLOCK语句描述的格式如下:

块标号:BLOCK

BEGIN

END BLOCK 块标号:

例: 二选一电路

ENTITY mux IS

PORT (d0,d1,sel: IN BIT;

q: OUT BIT);

END mux;

ARCHITECTURE connect OF mux IS

SIGNAL tmp1,tmp2,tmp3: BIT;

BEGIN

cale:

BLOCK

BEGIN

tmp1<=d0 AND sel;

tmp2<=d1 AND (NOT sel);

tmp3<=tmp1 OR tmp2;

q<=tmp3;

END BLOCK cale;

END connect;

在对程序进行仿真时,BLOCK中的语句是并行执行的,与书写顺序无关,这一点和构造体中直接写的语句是一样的。

3)进程(PROCESS)描述

进程描述的格式如下:

[进程名]:PROCESS(信号1,信号2,。。。)

BEGIN

END PROCESS 进程名;

* 一般用于组合电路进程模式:

__进程标记:

PROCESS (__信号名, __信号名, __信号名)

VARIABLE __变量名 : STD_LOGIC;

VARIABLE __变量名 : STD_LOGIC;

BEGIN

-- 指定信号

-- 指定变量

-- 过程调用

-- 如果语句

-- CASE语句

-- 循环语句

END PROCESS __进程标记;

* 用于时序电路进程模式:

__进程标记:

PROCESS (__信号名, __信号名, __信号名)

VARIABLE __变量名 : STD_LOGIC;

VARIABLE __变量名 : STD_LOGIC;

BEGIN

WAIT UNTIL __时钟信号 = '1';

-- 指定信号

-- 指定变量

-- 过程调用

-- 如果语句

-- CASE语句

-- 循环语句

END PROCESS __进程标记;

例:

ENTITY mux1 IS

PORT (d0,d1,sel: IN BIT;

q : OUT BIT);

END mux1;

ARCHITECTURE connect OF mux1 IS

BEGIN

cale:

PROCESS(d0,d1,sel)

VARIABLE tmp1,tmp2,tmp3 : BIT;--在进程中定义的变量 BEGIN

tmp1:=d0 AND sel; --输入端口向变量赋值

tmp2:=d1 AND (NOT sel);

tmp3:=tmp1 OR tmp2;

q<=tmp3;

END PROCESS cale;

END connect;

在PROCESS中的语句是顺序执行的,这一点和BLOCK中的语句是不一样的。

当PROCESS所带的信号量发生变化时,PROCESS中的语句就会执行一遍。

4)子程序描述

子程序的概念和其它高级程序中子程序的概念相同,在VHDL中有两种类型:

●过程(Procedure)

●函数(Function)

1.过程的格式:

PROCEDURE 过程名(参数1,参数2。。。。) IS

[定义变量语句]

BEGIN

[顺序处理语句]

END 过程名;

例:

PROCEDURE vector_to_int

(z : IN STD_LOGIC_VECTOR;

x_flag : OUT BOOLEAN;

q : IN INTEGER) IS

BEGIN

q:=0;

x_flag:=FALSE;

FOR i IN z RANGE LOOP

q:=q*2;

IF(z(i)=1) THEN

q:=q+1;

ELSEIF (z(i)/=10) THEN

x_flag:=TRUE;

END IF;

END LOOP;

END vector_to_int;

在过程中,语句是顺序执行的。

2.函数

函数的格式:

FUNCTION 函数名(参数1,参数2。。。。) RETURN 数据类型名 IS

[定义变量语句]

BEGIN

[顺序处理语句]

RETURN [返回变量名];

END 函数名;

在VHDL 语言中函数的参数都是输入信号,

例:

FUNCTION min(x,y:INTEGER ) RETURN INTEGER IS

BEGIN

IF X

RETURN(x);

ELSE

RETURN(y);

END IF;

END min;

1.4.22包、库和配置

(1)库

库是经编译后的数据的集合,它存放包定义、实体定义、构造定义和配置定义。

在设计单元内的语句可以使用库中的结果,所以,库的好处就是设计者可以共享已经编译的设计结果,在VHDL中有很多库,但他们相互独立。

IEEE库:在IEEE库中有一个STD_LOGIC的包,它是IEEE正式认可的包。

STD库:STD库是VHDL的标准库,在库中有名为STANDARD的包,还有TEXTIO包。若使用STANDARD包中的数据可以不按标准格式说明,但是若使用TEXTIO包,则需要按照如下格式说明:

LIBRARY STD;

USE STD.TEXTIO.ALL

另外还有ASIC库、WORK库和用户自定义库等。

库的使用:

在使用库之前,一定要进行库说明和包说明,库和包的说明总是放在设计单元的前面:LIBRARY 库名;

USE LIBRARY https://www.doczj.com/doc/2217168860.html,

例:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL

该例说明要使用IEEE库中的1164包中所有项目

库的作用范围:

库的作用范围从一个实体说明开始到它所属的结构体、配置为止,当有两个实体时,第二个实体前要另加库和包的说明。

(2)包

通常在一个实体中对数据类型、常量等进行的说明只可以在一个实体中使用,为使这些说明可以在其它实体中使用,VHDL提供了程序包结构,包中罗列VHDL中用到的信号定义、常数定义、数据类型、元件语句、函数定义和过程定义,它是一个可编译的设计单元,也是库结构中的一个层次,使用包时可以用USE语句说明,例如:

USE IEEE.STD_LOGIC_1164.ALL

程序包分为包头和包体,包结构的格式如下:

1) 包头格式:

PACKAGE 包名 IS

[说明语句]

END 包名

包头中列出所有项的名称。

2) 包体格式:

PACKAGE BODY 包名 IS

[说明语句]

END 包名;

包体给出各项的具体细节。

例:包头

USE STD.STD.LOGIC.ALL

PACKAGE logic IS

TYPE three_level_logic IS (?0‘,‘1‘,‘z‘); //数据类型项目

CONSTANT unknown_value : three_level_logic :=‘0‘;//常数项目

FUNCTION invert (input: three_level_logic)//函数项目

RETURN three_level_logic;

END logic;

例:包体

PACKAGE BODY logic IS

FUNCTION invert (input: three_level_logic)//函数项目描述

BEGIN

CASE input IS

WHEN ?0‘ => RETURN ?1‘;

WHEN ?1‘ => RETURN ?0‘;

WHEN ?Z‘ => RETURN ?Z‘;

END CASE;

END invert;

END logic

该包使用例:

USE logic.three_level_logic, logic.invert; //使用数据类型和函数两个项目ENTITY inverter IS

PORT(x: IN three_level_logic ;

y: OUT three_level_logic);

END inverter;

ARCHITECTURE inverter_body OF inverter IS

BEGIN

kk:

PROCESS

BEGIN

Y<=invert(x) AFTER 10ns;

WAIT ON x;

END PROCESS;

END inverter_body;

(2)配置

用于在多构造体中的实体中选择构造体,例如,在做RS触发器的实体中使用了两个构造体,目的是研究各个构造体描述的RS触发器的行为性能如何,但是究竟在仿真中使用哪一个构造体的问题就是配置问题。

配置语句格式:

CONFIGURATION 配置名 OF 实体名 IS

[说明语句]

END 配置名;

例:最简单的配置

CONFIGURATION 配置名 OF 实体名 IS

FOR 被选构造体名

END FOR;

END 配置名;

例:

ENTITY rs IS

PORT(set,reset:IN BIT;

q,qb: BUFFER BIT);

END rs;

ARCHITECTURE rsff1 OF rs IS

COMPONENT nand2

PORT(a,b: IN BIT;

c: OUT BIT);

END COMPONENT;

BEGIN

U1:nand2 PORT MAP(a=>set, b=>qb, c=>q)

U2:nand2 PORT MAP(a=>reset, b=>q, c=>qb)

END rsff1;

ARCHITECTURE rsff2 OF rs IS

BEGIN

q<=NOT(qb AND set);

qb<=NOT(q AND reset);

END rsff2

两个构造体,可以用配置语句进行设置:

CONFIGRATION rscon OF rs IS //选择构造体rsff1

FOR rsff1

END FOR;

END rscon;

1.4.3 VHDL中使用的数据类型和运算操作

VHDL可以象其它高级语言一样定义数据类型,但还可以用户自己定义数据类型。

(1)信号、常量和变量

信号:通常认为信号是电路中的一根线

常数:可以在数字电路中代表电源、地线等等

变量:可以代表某些数值

1.常数

常数的描述格式:

CONSTANT 常数名:数据类型:=表达式

例:

CONSTANT Vcc: REAL:=5.0;

CONSTANT DALY: TIME:=100ns;

CONSTANT FBUS: BIT_VECTOR:=‖0101‖;

2.变量

变量只能在进程、函数和过程中使用,一旦赋值立即生效。

变量的描述格式:

VARIABLE 变量名:数据类型约束条件:=表达式

例:

VARIABLE x, y: INTEGER;

VARIABLE count: INTEGER RANGE 0 TO 255:=10;

3.信号

信号除了没有方向的概念以外几乎和端口概念一致。

信号的描述格式:

SIGNAL 信号名:数据类型约束条件:=表达式

例:

SIGNAL sys_clk: BIT:=‘0‘;

SIGNAL ground: BIT:=‘0‘

在程序中,信号值输入信号时采用代入符‖<=‖,而不是赋值符“:=”,同时信号可以附加延时。

信号传送语句:

s1<=s2 AFTER 10ns

信号是一个全局量,可以用来进行进程之间的通信

4.信号与变量的区别

信号赋值可以有延迟时间,变量赋值无时间延迟

信号除当前值外还有许多相关值,如历史信息等,变量只有当前值

进程对信号敏感,对变量不敏感

信号可以是多个进程的全局信号,但变量只在定义它之后的顺序域可见

信号可以看作硬件的一根连线,但变量无此对应关系

1.4.4 VHDL中的数据类型

(1)标准数据类型

1.整数(INTEGER)

范围:-2147483547---2147483646

2.实数(REAL)

范围:-1.0E38---1.0E38

书写时一定要有小数。

3.位(BIT)

在数字系统中,信号经常用位的值表示,位的值用带单引号的‘1’和‘0’来表示明确说明位数值时:BIT‘(‘1’)

4.位矢量(BIT_VECTOR)

位矢量是用双引号括起来的一组位数据

“010101”

5.布尔量(BOOLEAN)

只有“真”和“假”两个状态,可以进行关系运算

6.字符(CHARACTER)

字符量通常用单引号括起来,对大小写敏感

明确说明1是字符时:

CHARACTER‘(‘1’)

7.字符串(STRING)

字符串是双引号括起来的一串字符:

“laksdklakld‖

8.时间(TIME)

时间的单位:fs,ps,ns,ms,sec,min,hr

例: 10 ns

整数数值和单位之间应有空格

9.错误等级(SEVERITY LEVEL)

用来表示系统的状态,它共有4种:

NOTE(注意)

WARNING(警告)

ERROR(错误)

FAILURE(失败)

10.大于等于零的整数(NATURAL)、正整数(POSITIVE)

只能是正整数

数据除定义类型外,有时还需要定义约束范围。

例:

INTEGER RANGE 100 DOWNTO 0

BIT_ VECTOR (3 DOWNTO 0)

REAL RANGE 2.0 TO 30.0

(2)用户定义的数据类型

用户定义的数据类型的一般格式:

TYPE 数据类型名 {,数据类型名} 数据类型定义

不完整的数据类型格式:

TYPE 数据类型名 {,数据类型名};

可由用户定义的数据类型为:

* 枚举(ENUMERATED)

格式:TYPE 数据类型名 IS(元素、元素、…);

例1: TYPE week IS(Sun,Mon,Tue,wed,Thu,Fri,Sat);

例2: TYPE STD_LOGIC IS

(?U‘,‘X‘,‘0‘,‘1‘,‘Z‘,‘W‘,‘L‘,‘H‘,‘-?);

* 整数(INTEGER)

格式:TYPE 数据类型名 IS 数据类型定义约束范围

例:TYPE digit IS INTEGER RANGE 0 TO 9

* 实数(REAL)

格式:TYPE 数据类型名 IS 数据类型定义约束范围

例:TYPE current IS REAL RANGE -1E4 TO 1E4

* 数组(ARRAY)

格式:TYPE 数据类型名 IS ARRAY 范围 OF 原数据类型名;

例:TYPE word IS ARRAY (1 TO 8) OF STD_LOGIC;

TYPE word IS ARRAY (INTEGER 1 TO 8) OF STD_LOGIC;

TYPE instruction IS (ADD,SUB,INC,SRL,SRF,LDA,LDB);

SUBTYPE digit IS INTEGER 0 TO 9;

TYPE indflag IS ARRAY (instruction ADD TO SRF) OF digit;

数组常在总线、ROM和RAM中使用。

* 时间(TIME)

格式: TYPE 数据模型名不副实 IS 范围

UNITS 基本单位

单位;

END UNITS;

TYPE time RANGE –1E18 TO 1E18

UNITS

fs;

ps=1000 fs;

ns=1000 ps;

us=1000 ns;

ms=1000 us;

sec=1000 ms;

min=60 sec;

hr=60 min;

END UNITS;

* 记录(RECODE)

将不同的数据类型放在一块,就是记录类型数据

格式:TYPE 数组类型名 IS RECORD

元素名:数据类型名;

元素名:数据类型名;

END RECORD;

例:TYPE bank IS RECORD

addr0: STD_LOGIC_VECTOR(7 DOWNTO 0);

addr1: STD_LOGIC_VECTOR(7 DOWNTO 0);

r0: INTEGER;

END RECORD;

存取(ACCESS)

文件(FILE)

(3)数据类型的转换

数据类型转换函数有VHDL语言的包提供,例如:STD_LOGIC_1164,STD_LOGIC_ARITH等等

转换函数见表:

例:由STD_BIT_VECTOR转换成INTEGER

LIBRARY IEEE

USE IEEE.STD_LOGIC_1164.ALL

USE IEEE.STD_LOGIC_UNSIGNED.ALL

ENTITY add5 IS

PORT(num: IN STD_LOGIC_VECTOR(2 DOWNTO 0);

);

END add5;

ARCHITECTURE rtl OF add5 IS

SIGNAL in_num: INTEGER RANGE 0 TO 5;

BEGIN

In_num<=CONV_INTEGER(num);

END rtl;

(5)有关BIT_VECTOR和STD_BIT_VECTOR 的语句例:

SIGNAL a: BIT_VECTOR(11 DOWNTO 8);

SIGNAL b: STD_LOGIC_VECTOR(11 DOWNTO 0);

a<=X‖A8‖; 十六进制可以赋予位矢量

b<=X‖A8‖; 十六进制不可以赋予逻辑矢量,所以此句错,逻辑量中只能赋予二进制b<=TO_STDLOGICVECTOR(X‖AF7‖);十六进制变换

b<=TO_STDLOGICVECTOR(O‖5177‖); 八进制变换

b<=TO_STDLOGICVECTOR(B‖1010_1111_0111‖); 三位二进制变换

(6)IEEE标准“STD_LOGIC”和”STD_LOGIC_VECTOR”

1993年制定的标准IEEE STD1164 对STD_LOGIC的值做如下规定:

‘U’初始值

‘X’不定

‘0’0

‘1’1

‘Z’高阻

‘W’弱信号不定

‘L’弱信号0

‘H’弱信号1

‘-’不可能情况

1.4.5 VHDL语言的运算操作符

(1)逻辑运算符

要求运算符左右的数据类型必须相同,

例:x<=(a AND b) OR (NOT c AND d);

x<=b AND a AND d AND e;

x<=b OR c OR d OR e;

x<=a XOR d XOR e;

a<=(x1 AND x2) OR (y1 AND y2);

(2) 算数运算符

在使用乘法运算符时,应该特别慎重,因为它可以使逻辑门数大大增加。

(3)关系运算符

应该注意小于等于<=和代入运算符的不同(从上下文区别)

(4)并置运算符

并置运算符‖&‖用于位连接,

例如: y(0)=b(0)&en

y(1)=b(1)&en

y(2)=b(2)&en

y(3)=b(3)&en

y(4)=a(0)

y(5)=a(1)

y(6)=a(2)

y(7)=a(3)

从上可以看出a,b是四位长度的矢量,而y的位长是7位,上述情况可以表示成:

tmp_b<=b AND (en&en&en&en);

y<= a&tmp_b;

若是位连接,可以简单写为:

tmp_b<=b AND (en,en,en,en);

1.4.5 VHDL语言构造体的描述方式

有三种描述方式:行为描述,RTL描述和ASIC描述,采用后两种描述方式可以进行逻辑综合。

(1)行为描述

描述数字系统的行为,主要用于仿真和系统工作原理的研究。下面介绍一些专用语句。

1)代入语句

格式:信号量<=敏感信号量表达式;

例如: z<=a NOR(b NAND c);

该例中有三个敏感量,无论哪一个发生变化都可以使z变化。

具有时间延迟的代入语句:

a<=b AFTER 10 ns

表示当b发生变化10 ns后a才变化。

例:与门电路

ENTITY and2 IS

PORT(a,b : IN BIT;

c : OUT BIT);

END and2;

ARCHITECTURE and2_behave OF and2 IS

BEGIN

c<=a AND b;

END and2_behave;

2)延时语句

VHDL中有两种延时语句:惯性延时和传输延时。

*惯性延时

VHDL中惯性延时是缺省的,因为逻辑硬件电路总是有时间延迟的,若延迟时间是20ns,那末输入信号时间若小于20ns,则输出信号将不跟随输入信号的变化。

有时为使延迟时间更逼真实际电路,就专门设置惯性时间:

b<=a AFTER 10 ns;

* 传输延时

传输延时常代表总线、连接线的延迟时间,该时间必须专门说明。该传输延时只对信号起纯延时作用。

例: b<=TRANSPORT a AFTER 20 ns;

(2) 数据流描述方式

数据流描述方式是一种可以进行逻辑综合的描述方式,由于要进行逻辑综合所以对使用的语句有一定的限制,VHDL中的每一个命令和语句都对逻辑综合能力进行了定义,要进行逻辑综合的设计实体就要使用有逻辑综合能力的命令和语句。

例:四选一电路

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY mux42 IS

PORT(input : IN STD_LOGIC_VECTOR(3 DOWNTO 0);

Sel : IN STD_LOGIC_VECTOR(1 DOWNTO 0);

Y : OUT STD_LOGIC);

END mux42;

ARCHITECTURE app OF mux42 IS

BEGIN

y<=input(0) WHEN sel=0 ELSE

input(1) WHEN sel=1 ELSE

input(2) WHEN sel=2 ELSE

input(3);

END app;

使用数据流描述方式应该注意的问题:

1.‘X’状态的传递问题

有时‘X’状态会逐级传递,造成系统的输出为不确定或者错误,所以要在设计中考虑‘X’状态对输出的影响。

2. 一些限制

*禁止在一个进程中使用两个寄存器

*在IF语句描述寄存器时,禁止ELSE项

*在寄存器描述中,禁止将变量代入信号

*关连性强的信号应该放在一个进程中

(3)结构描述方式

注重调用已有的元件、元件或门级电路之间的连线是结构描述的特点,结构描述可以提高设计效率.

1) 元件声明语句:

元件声明语句用于调用已生成的元件,这些元件可能在库中,也可能是预先编写的元件实体描述.

元件语句的格式:

COMPONENT 元件名

PORT 说明; 端口说明

END COMPONENT;

元件语句可以在ARCHITECTURE,PACKAGE和BLOCK的说明部分.

2) 元件调用:

VHDL硬件描述语言实验报告

硬件描述语言实验附录 姓名:xxx 学号:xxx 指导教师:xxx 目录 硬件描述语言实验附录 (1) 实验1.三输入与门电路实验 (2) 实验2. 三—八译码器实验 (3) 实验3. D触发器实验 (4) 实验4. 分频器实验 (5) 实验5. 状态机实验 (8)

实验1.三输入与门电路实验 --三输入与门电路threeinput --姓名:王定 --学号:1306034248 --中北大学 LIBRARY IEEE; --调用库 USE IEEE.STD_LOGIC_1164.ALL;--库文件 -------------------------------------------------------------- ENTITY threeinput IS --定义实体名,其名称必须与VHDL文本文件名称相同PORT( A: IN STD_LOGIC; --输入端口,时钟输入 B: IN STD_LOGIC; --输入端口,个位写入使能 C: IN STD_LOGIC; --输入端口,十位写入使能 CO: OUT STD_LOGIC); --输出端口,溢出标志 END ENTITY threeinput; --结束端口定义 -------------------------------------------------------------- ARCHITECTURE RTL OF threeinput IS--定义结构体 BEGIN PROCESS(A,B,C) IS --开始,必须带上 BEGIN CO<=A AND B AND C ; END PROCESS; END ARCHITECTURE RTL; --结束结构体 表1. 三输入与门电路VHDL实验代码 图1. 三输入与门电路仿真波形图,A,B,C输入,CO输出

硬件描述语言VHDL大总结

VHDL大总结 一、填空题 1.两种标识符 短、扩展 2.4种基本数据类型 常量、变量、信号、文件 3.常量说明格式 constant 常数名: 数据类型:=表达式; 4.三种数据变换方法? 函数转换、常数转换、类型标记 5.四种运算操作符? 逻辑、关系、算术、并置 6.如何启动进程? (1).必须包含一个显示的敏感信号变量 (2).或者包含一个wait语句 7.五种基本结构? 库(library)、包集合(package)、实体(entity)、结构体(architecture)、配置(configuration) 8.信号与变量代入? (1).<= (2).:= 9.列举可编程逻辑器件? PROM→PLA→PAL→CPLD→FPGA→EPROM→EEPROM→GAL 10.数据类型 整数、位、位矢量、符号、布尔量、时间、错误等级、标准逻辑 11.四种端口模式? IN—OUT—INOUT—BUFFER 12.三种子结构描述语句?BLOCK—PROCESS—SUBPROGRAMS

13.结构体三种描述方式 寄存器传输(RTL)--数据流、结构描述、行为描述14.标识符规则? (1).不以数字靠头 (2).下划线不连续 (3).不与保留字重复 (4).下划线前后必须有英文字母或者数字 (5).最后一个不能使用下划线(连字符) 15.扩展标识符 \12@+\ 16.赋值? (1).信号、变量可以多次赋值 (2).常量只能定义时赋值(进程内部,子函数内部)17.高阻、不定态? 'Z'------------'X' 18.进程位置? 结构体内部 19.变量位置? 进程内部---包内部----子程序内部 20.进程执行机制? 敏感信号发生跳变 21.优先级? if语句之间具有不同优先级 22.时序电路的去驱动信号? 时钟 23.时序电路在何时发生变化? 时钟信号的边沿 24.两种状态机? (1).moore-----f(现状) (2).mealy-----f(现状,输入)

相关主题
文本预览
相关文档 最新文档