超高速集成电路硬件描述语言VHDL.ppt
第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,PORT(a1,b1:IN std_logic;,c1:OUT std_logic);,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,它描述实体硬件的互连关系、数据的传输和变换以及动态行为。一个实体可以对应多个结构体,每个结构体可以代表该硬件的某一方面特性,例如行为特性,结构特性。,ARCHITECTURE kxor_arc OF kxor IS,例3,BEGIN,c1=(NOT a1 AND b1)OR(a1 AND NOT b1);,END kxor_arc;,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 ISBEGIN 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 ISBEGIN PROCESS(cs,x1,x2,x3,x4)VARIABLE n:NATURAL RANGE 0 TO 15;CONSTANT rom0:std_logic_vector(0 TO CONSTANT rom1:std_logic_vector(0 TOCONSTANT rom2:std_logic_vector(0 TOCONSTANT rom3:std_logic_vector(0 TO 15):=“0000000011111111”;,下面举一个VHDL程序说明一维数组实现164的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:=bitLEFT;-returns 63 right_range:=bitRIGHT;-returns 32 uprange:=bitHIGH;-returns 63 lowrange:=bitLOW;-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:=bitLENGTH;-return 8 len2:=bit1LENGTH;-return 24,下面再举一个值类数组属性的例子,让其返回数组范围的总长度。例:,它可用来检查一个信号的变化,并且变化刚刚发生,既推断出在信号上发生了一个跳变。,函数信号属性:函数信号属性用来返回有关信号行为功能的信息,它反映一个信号是否正好有值的变化或事件的发生,如clkEVENT,这个属性为“EVENT”,对检查时钟边沿触发是很有效的。,下面举一个例子,说明函数信号属性的用法,IF clk=1 AND clkEVENT THEN q=d;END IF;,上述语句中用到了函数信号属性clkEVENT,说明如果时钟信号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 ISBEGIN b1=a1 AND b2;b2=NOT a1 OR a2;END exe_arc1;,ARCHITECTURE exe_arc2 OF exe ISBEGIN b2=NOT a1 OR a2;b1=a1 AND b2;END exe_arc2;,另一种并行信号赋值语句是选择信号赋值语句,它们的每一个赋值语句都需要给出一个表达式,同时给出与该表达式的每个可能值相关联的信号,选择信号赋值语句的一般形式如下:WITH SELECT WHEN,WHEN,WHEN;,一个典型的四路数据选择器的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;,仍以四路数据选择器为例,讨论另一个较为复杂的并行信号赋值语句的例子,以便更详细地说明并行概念,下面是四输入数据选择器的第二个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 dout=(0,0,0,0,0,0,0,1)AFTER 5 ns;,WHEN 1=dout dout dout dout dout dout 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 ISBEGIN,下面举例说明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的行为描述设计半减器:,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;,下面再将或门的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:OUT BIT);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;,