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

1.4.1基本设计单元
VHDL的基本设计单元就是实体,无论数字电路复杂还是简单,都是由实体和构造体组成。
(1) 实体说明
实体说明有如下结构:
ENTITY 实体名 IS
[端口说明]
END 实体名;
(VHDL语言中不分大小写字母)
其中:
端口说明是对设计实体中输入和输出借口进行描述,格式如下:
PORT(端口名(,端口名):方向 数据类型名;


端口名(,端口名):方向 数据类型名);
端口名是赋予每个系统引脚的名称,一般用几个英文字母组成。
端口方向是定义引脚是输入还是输出,见下表:
方向 说明
IN 输入到实体
OUT 从实体输出输出
INOUT 双向
BUFFER 输出(但可以反馈到实体内部)
LINKAGE 不指定方向

常用的端口数据类型有两种: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描述(子程序描述)
  1. 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<Y THEN
RETURN(x);
ELSE
RETURN(y);
END IF;
END min;

1.4.2 2 包、库和配置

(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 name.package.name.ITEM.name
例:
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. 变量
变量只能在进程、函数和过程

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
第1 绪 论 ....................................................................................................................1 § 1.1 关于EDA...............................................................................................................1 § 1.2 关于 VHDL............................................................................................................3 § 1.3 关于自顶向下的系统设计方法 ............................................................................5 § 1.4 关于应用 VHDL 的EDA 过程.............................................................................6 § 1.5 关于在系统编程技术 ............................................................................................9 § 1.6 关于 FPGA/CPLD 的优势...................................................................................10 § 1.7 关于 VHDL 的学习.............................................................................................10 第2 VHDL 入门..............................................................................................................12 § 2.1 用 VHDL 设计多路选择器和锁存器.................................................................12 § 2.2 用 VHDL 设计全加器.........................................................................................15 第3 VHDL 程序结构......................................................................................................19 § 3.1 实 体 ENTITY ..............................................................................................19 § 3.2 结构体 ARCHITECTURE ............................................................................26 § 3.3 块语句结构 BLOCK .....................................................................................29 § 3.4 进程 PROCESS .............................................................................................32 § 3.5 子程序(SUBPROGRAM)....................................................................................35 3.5.1 函数FUNCTION ..................................................................................36 3.5.2

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值