420 likes | 750 Vues
二、 EDA 设计流程. VHDL 代码. VHDL 文本编辑器. VHDL 综合器. FPGA/CPLD 适配器. 时序与功能 仿真器. FPGA/CPLD 编程下载器. FPGA/CPLD 器件. MAXPLUSII. EDA 设计流程主要包括哪三部分 ?. VHDL 程序基础. 1 VHDL 程序结构 2 VHDL 的语言要素 3 VHDL 顺序语句 4 VHDL 并行语句 5 VHDL 的描述方法. 2.1 实体( ENTITY ) ∆. 2.2 结构体( ARCHITECTURE ) ∆.
E N D
二、EDA 设计流程 VHDL代码 VHDL文本编辑器 VHDL综合器 FPGA/CPLD 适配器 时序与功能 仿真器 FPGA/CPLD 编程下载器 FPGA/CPLD 器件 MAXPLUSII
VHDL程序基础 1 VHDL程序结构 2 VHDL的语言要素 3 VHDL顺序语句 4 VHDL并行语句 5 VHDL的描述方法
2.1 实体(ENTITY)∆ 2.2 结构体(ARCHITECTURE ) ∆ 2.3 块( BLOCK) 2.4 进程( PROCESS) 2.5 子程序 (SUBPROGRAM) 2.6 库 (LIBRARY) ※ 2.7 程序包 (PACKAGE) ※ 2.8 配置(CONFIGURATION) 第二章VHDL程序结构
总 学 时:4学时 1.目的、要求 (1)掌握 VHDL程序的基本结构。 (2)正确描述实体和结构体 (3)了解其它各结构语句的基本特点和语法结构。 2.重点、难点 重点:实体和结构的合法描述。 难点: 库、包的引用原理和方法 3.教学方法:讲授、利用教学课件演示。
VHDL设计事例----一个2选1多路选择器 程序包 实体 结构体
VHDL程序基本结构 实体和结构体 是VHDL设计文件的两个基本组成部分。 实体部分 描述设计实体的外部接口信号(即输入/输出信号); 结构体 用于描述设计实体的内部电路。 包集合 存放各设计模块能共享的数据类型、常数、子程序等; 库 用于存放已编译的实体、结构体、包集合和配置。 配置 用于从库中选取所需元件安装到设计单元的实体中。
a y and2 b • 2.1 实体(ENTITY) 实体的一般格式为: ENTITY实体名 IS [类属参数说明]; [端口说明]; END; • 实体中的每一个I/O信号被称为端口,其功能对应于电路 图符号的一个引脚。端口说明则是对一个实体的一组端口的定义,即对基本设计实体与外部接口的描述。端口是设计实体和外部环境动态通信的通道。 • ENTITY、IS、END是VHDL的关键字(保留字)。 • 实体名、端口名等均应为符合VHDL命名规则的标识符。
端口模式 端口数 据类型 端口说明 端口说明的一般格式为: PORT(端口名{,端口名}:端口模式 数据类型; 端口名{,端口名}:端口模式 数据类型); PORT (a,b : IN STD_LOGIC; y : OUT STD_LOGIC);
Entity 端口模式 用来说明数据传输通过该端口的方向。 IN IN: 数据只能从端口流入实体 OUT: 数据只能从端口流出实体 INOUT: 数据从端口流入或流出实体 BUFFER:数据从端口流出实体,同时可被内部反馈 OUT INOUT BUFFER
Entity test1 is port(a: in std_logic; b,c: out std_logic ); end test1; architecture a of test1 is begin b <= not(a); c <= b; end a; Entity test2 is port(a: in std_logic; b : buffer std_logic; c: out std_logic); end test2; architecture a of test2 is begin b <= not(a); c <= b; end a; --Error Out与Buffer的区别
类属参数说明Generic 一种端口界面常数,用来规定端口的大小、实体中子元件的数目等 • 与常数不同,常数只能从内部赋值而类属参量可以由实体外部赋值 • 数据类型通常取Integer或Time • 综合器仅支持数据类型为整数的类属值。 类属参数说明是可选部分。如果需要,可使用以“GENERIC”语句来指定该设计单元的类属参数(如延时等)。
类属参量 类属参数说明的格式为: GENERIC(端口名{,端口名}:[IN] 子类型 [:=初始值] {;端口名{,端口名}: [IN] 子类型 [:=初始值]} ); ENTITYblack_boxIS Generic(constantwidth :integer:= 7;); PORT( clk, rst: IN std_logic; d: IN std_logic_vector(widthDOWNTO0); q: OUT std_logic_vector(widthDOWNTO0); co:OUT std_logic); ENDblack_box; DD
关键字 类属参量 端口定义 实体结束 黑盒 rst q[7:0] d[7:0] co clk 端口模式 端口数 据类型 实体举例 ENTITYblack_boxIS Generic(constantwidth :integer:= 7;); PORT( clk, rst:IN std_logic; d: IN std_logic_vector(widthDOWNTO0); q: OUT std_logic_vector(widthDOWNTO0); co: OUT std_logic); ENDblack_box;
a[3..0] Sum[3..0] add4 b[3..0] Co Ci 例: 四位加法器实体说明程序 ENTITY add4 IS PORT(a, b: IN STD_LOGIC_VECTOR(3 downto 0); Ci: IN STD_LOGIC; Sum: OUT STD_LOGIC_VECTOR(3 downto 0); Co: OUT STD_LOGIC); END add4; 由实体说明画出四位加法器add4的电路图如下所示。
2. 2 结构体(ARCHITECTURE ) 用来描述实体的内部结构和逻辑功能 结构体的一般格式如下: ARCHITECTURE结构体名OF实体名IS [结构体说明部分]; BEGIN [功能描述语句] ; END[ARCHITECTURE] 结构体名; • 结构体说明是指对结构体需要使用的信号、常数、数据类 型和函数进行定义和说明。 • 功能描述语句具体地描述了结构体的行为。 • 功能描述语句都是并发(同时)执行的-----与排列顺序无关。
Input 1 Output 1 实体 Input n Output n A B C D Sel MUX_Out 2 实体和结构体之间的关系
VHDL设计事例----一个2选1多路选择器 程序包 实体 结构体
由一系列并行执行语句构成的组合体,它的功能是将结构体中的并行语句组成一个或多个子模块 结构体(ARCHITECTURE) 说明语句 定义顺序语句模块,用以将从外部获得的信号值,或内部的运算数据向其它的信号进行赋值。 功能描述语句 块语句 将设计实体内的处理结果向定义的信号或界面端口进行赋值 进程语句 用以调用过程或函数,并将获得的结果赋值于信号 信号赋值语句 子程序调用语句 对其它的设计实体作元件调用说明,并将此元件的端口与其它的元件、信号或高层次实体的界面端口进行连接。 元件例化语句 结构体构造图
2.3 块( BLOCK) 一个大规模的电原理图通常可以分割成多张子原理图,以便于设计和存档。同样,在VHDL程序设计中,结构体对应整个电原理图,而结构体可由多个BLOCK块组成,每一个BLOCK块则对应一张子原理图。电原理图的分割关系和VHDL程序中用BLOCK块分割结构体的关系是一一对应的。 BLOCK语句的语法格式为: 块标号:BLOCK[(块保护表达式)] [说明语句]; BEGIN [并行语句]; END BLOCK标号名; • 保护表达式是可选项,它是一个布尔表达式。保护表达式的作用是:只有当其为真时,该块中的语句才被启动执行;否则,该块中的语句不被执行。 • BLOCK语句中所描述的各个语句是可以并行执行的,它和书写顺序无关。
u1 tmp1 d0 u3 q tmp3 d1 tmp2 u2 sel 2选1 数据选择器 例: 用BLOCK语句描述2选1电路的程序。 ENTITYmux2_1IS PORT(d0, d1, sel :INSTD_LOGIC; q :OUTSTD_LOGIC); ENDmux2_1; ARCHITECTURE amuxOFmux2_1IS SIGNALtmp1,tmp2,tmp3 : STD_LOGIC; BEGIN cale:BLOCK BEGIN tmp1<=d0ANDsel; tmp2<=d1AND(notsel); tmp3<=tmp1ORtmp2; q<=tmp3; END BLOCKcale; END amux; 上述结构体中只有一个 BLOCK块,若电路复杂时可由几个BLOCK块组成。
小 结 本节课我们学习了VHDL程序的基本结构及其主要模块实体结构体和结构体中的并行描述语句----块语句。 要求大家重点掌握的内容有: • VHDL程序的基本结构。 • 实体的功能和结构。 • 结构体的能和结构。 • 了解块语句的并行特点。 练习: 1、简述设计实体、实体和结构体之间的关系 2、描述结构体的主要特点
2.4 进程( PROCESS) PROCESS语句是一种并发处理语句,在一个构造体中多个PROCESS语句可以同时并发运行。PROCESS语句是VHDL中描述硬件系统并发行为的最常用、最基本的语句。 进程语句的一般格式为; [进程名:]PROCESS(敏感信号表) [进程说明语句] BEGIN 顺序描述语句; END PROCESS[进程名];
例: 利用PROCESS语句设计与非门电路。 nandx:PROCESS (a, b) BEGIN y<=aNANDb ; END PROCESSnandx; • 敏感信号表所标明的信号是用来启动进程的。敏感信号表中的信号无论哪一个发生变化(如由’0’变’1’或由’1’变’0’ )都将启动该PROCESS语句。 • 一旦启动后, PROCESS中的语句将从上至下逐句执行一遍。当最后一个执行完毕以后,即返回到开始的PROCESS语句,等待下一次启动。因此,只要PROCESS中指定的信号变化一次,该PROCESS语句就会执行一遍。
ARCHITECTURE 一个构造体可以有多个进程语句 PROCESS1 进程和进程之间的数据交换通过信号完成 进程内部是顺序语句 进程和进程之间是并行的 signal signal PROCESSn
过程(PROCEDURE) 函数(FUNCTION) VHDL的子程序有两种类型: • 2.5 子程序( SUBPROGRAM) 子程序的特点: • 子程序可以在结构体或程序包的任何位置被调用,而且可以反复调用。
过程(PROCEDURE) 过程语句的结构: PROCEDURE 过程名(参数1;参数2;… )IS [定义语句]; BEGIN [顺序处理语句]; END过程名; 过程语句的调用格式: 过程名(实际参数表);
例: 设计一个从两个整数中求取最大值的过程。 PROCEDUREmax(a, b:ININTEGER; y:OUTINTEGER)IS BEGIN IF(a<b)THEN y<=b; ELSE y<=a; END IF; ENDmax;
函数(FUNCTION) 函数语句的结构: FUNCTION函数名(输入参数表)RETUEN数据类型 IS [定义语句]; BEGIN [顺序处理语句]; RETUEN [返回变量名]; END [函数名]; 函数语句的调用格式: 函数名(实际参数表);
例: 用FUNCTION语句描述求取最大值的函数。 FUNCTIONmax(a:std_logic_vector; b:std_logic_vector) RETURNstd_logic_vectorIS VARIABLEtmp:std_logic_vector(a'range); BEGIN IF(a>b)THEN tmp:=a; ELSE tmp:=b; END IF; RETURNtmp; ENDmax; • 函数的参数均为输入参数。 • 函数调用返回一个指定数据类型的值。
ARCHITECTURErtlOF dpeak IS SIGNALpeak :STD_LOGIC_VECTOR(5 downto 0); BEGIN dout<=peak; PROCESS(clk) BEGIN IF(clk'event and clk='1')THEN IF(set='1')THEN peak<=date; ELSE peak<=max(date,peak); END IF; END IF; END PROCESS; ENDrtl;
2.6 库(LIBRARY) • 库是经编译后的数据的集合。库是用来放置可编译的设计单元(它存放包定义、实体定义、构造定义和配置定义)的地方,通过其目录可查询和调用。 • VHDL中的库大致可归纳为5种:IEEE库、STD库、ASIC矢量库、WORK库和用户定义库。 • IEEE库:常用的资源库。IEEE库包含经过IEEE正式认可的STD_LOGIC_1164包集合和某些公司提供的一些包集合,如STD_LOGIC_ARITH(算术运算包集合)等。 • STD库:VHDL的标准库。库中存放有称为“standard”的标准包集合,其中定义了多种常用的数据类型,均不加说明可直接引用。
ASIC矢量库。在VHDL语言中,为了进行门级仿真,各公司可提供面向ASIC的逻辑门库。在该库中存放着与逻辑门一一对应的实体。为了使用面向ASIC的库,对库进行说明是必要的。ASIC矢量库。在VHDL语言中,为了进行门级仿真,各公司可提供面向ASIC的逻辑门库。在该库中存放着与逻辑门一一对应的实体。为了使用面向ASIC的库,对库进行说明是必要的。 • WORK库。WORK库是现行作业库。设计者所描述的VHDL语句不需要任何说明,将都存放在WORK库中。WORK库对所有设计都是隐含可见的,因此在使用该库时无需进行任何说明。 • 用户定义库。用户定义库简称用户库,是由用户自己创建并定义的库。设计者可以把自己经常使用的非标准(一般是自己开发的)包集合和实体等汇集成在一起定义成一个库,作为对VHDL标准库的补充。用户定义库在使用时同样要首先进行说明。 • 上述5类库中,除了STD库和WORK库之外的其它库均为资源库。资源库是存放常规元件和标准模块的库,使用时需预先说明。
库说明语句的语法形式为: LIBRARY 库名;--说明使用什么库 USE包集合名;--说明使用库中哪一个包集合及包集 合中的项目(如过程名、函数名等) LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; • 包集合名最多为三个层次:即 • library-name.packge-name.item-name • LIBRARY 语句和USE语句的作用范围: • 仅限于紧跟起后的实体和结构体。
包集合的语法结构如下: PACKAGE 包集合名IS [包集合说明];包头 END包集合名; PACKAGE BODY包集合名IS [包体内容];包体 END BODY; • 2.7 包集合(PACKAGE) • 包集合是一种使其中的类型、元件、函数和其它说明对其它设计单元可见的设计单元。与之相反,构造体中的这些说明仅仅对其自身可见。 • 包集合包括包头和包体两部分。包头 用来声明包中的类型、元件、函数和子程序;而包体 则用来存放说明中的函数和子程序。不含有子程序和函数的包集合不需要包体。
例:描述三电平逻辑的包集合 PACKAGElogic IS TYPEthree_level_logicIS(’0’,’1’,’Z’);--三电平逻辑 CONSTANTunknown_value: three_level_logic :=’0’; FUNCTIONinvert (input : three_level_logic)RETURNthree_level_logic; ENDlogic; PACKAGE BODY logic IS FUNCTIONinvert (input : hree_level_logic) RETURN hree_level_logicIS BEGIN CASE inputIS WHEN’0’=>RETURN ’1’; WHEN’1’=>RETURN’0’; WHEN’Z’=>RETURN’Z’; END CASE; ENDinvert; END BODY;
一个包集合说明至多可以带一个包体,包体和包头使用相同的名字。包体的内容是基本说明和子程序体说明。但要注意,若包集合中含有子程序说明时,必须将子程序放在对应的包体中。 • 包体中的子程序及其相应的说明是专用的,不能被其它VHDL单元所引用;而包集合中的说明是公用的,它可以独立地编译并插入设计库中。包集合体是次级设计单元,只有在其对应的主设计单元编译并插入设计库之后,才可独立地编译并插入到设计库中。
2. 8 配置(CONFIGURATION) • 配置语句描述了层与层之间的连接关系,以及实体与构造体之间的连接关系。(一个实体(ENTITY)可以有多个构造体)设计者可以利用配置语句选择不同的构造体,使其与要设计的实体相对应;在仿真某一个实体时,可以利用配置选择不同的构造体进行性能对比实验,以得到性能最佳的构造体。 配置的基本格式为: CONFIGURATION配置名OF实体名IS [配置说明]; END配置名;
配置语句根据不同情况,其说明语句有简有繁。最简单的缺省配置格式为:配置语句根据不同情况,其说明语句有简有繁。最简单的缺省配置格式为: CONFIGURATION配置名OF实体名IS FOR 选配结构体名 END FOR; END配置名; 例:加入了配置的4位等值比较器设计文件 LIBRARYIEEE; USEIEEE.STD_LOGIC_1164.ALL; ENTITYcomp4IS PORT(a, b:INSTD_LOGIC_VECTOR(3 downto 0); y:OUTSTD_LOGIC); ENDcomp4;
--结构体1: ARCHITECTURE behaviorOF comp4IS BEGIN Comp: PROCESS(a, b) BEGIN IFa=bTHEN y<=’1’; ELSE y<=’0’; END IF; END PROCESScomp; ENDbehavior; --结构体2: ARCHITECTURE dataflow OF comp4IS BEGIN y<=’1’WHEN(a=b)ELSE’0’; ENDdataflow;
--结构体3: ARCHITECTURE structural OF comp4IS COMPONENTxnor2 PORT(in1, in2:INSTD_LOGIC; Out:OUTSTD_LOGIC); END COMPONENT; COMPONENTand4 PORT(in1, in2, in3, in4:INSTD_LOGIC; Out:OUTSTD-LOGIC); END COMPONENT; SIGNALs: STD_LOGIC_VECTOR(0 to 3); BEGIN u0: xnor2PORT MAP(a(0),b(0),c(0)); u1: xnor2PORT MAP(a(1),b(1),c(1)); u2: xnor2PORT MAP(a(2),b(2),c(2)); u3: xnor2PORT MAP(a(3),b(3),c(3)); u4: and4PORT MAP(s(0),s(1),s(2),s(3),y); ENDstructural;
u0 a a0 s0 b0 b u1 a1 s1 u4 b1 y u2 a2 s2 b2 u3 a3 s3 b3 4位等值比较器 --配置 : CONFIGURATIONcomp4_conOF comp4IS FOR behavior END FOR; ENDcomp4_con;