EDA技术教程课件-第五章_VHDL设计初步.ppt_第1页
EDA技术教程课件-第五章_VHDL设计初步.ppt_第2页
EDA技术教程课件-第五章_VHDL设计初步.ppt_第3页
EDA技术教程课件-第五章_VHDL设计初步.ppt_第4页
EDA技术教程课件-第五章_VHDL设计初步.ppt_第5页
已阅读5页,还剩177页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

EDA技术,第 5 章,VHDL设计初步,HDL文本输入设计 HDL: VHDL Verilog Able Very high speed integrated Hardware Description Language (VHDL) 是IEEE、工业标准硬件描述语言 用语言的方式而非图形等方式描述硬件电路 容易修改 容易保存 特别适合于设计的电路有: 复杂组合逻辑电路,如: 译码器、编码器、加减法器、多路选择器、地址译码器. 状态机,VHDL的功能和标准,VHDL 描述 输入端口 输出端口 电路的行为和功能 VHDL有两个标准: IEEE Std 1076-1987 (called VHDL 1987) IEEE Std 1076-1993 (called VHDL 1993),5.1 VHDL程序的基本结构,一、VHDL设计实体的组成,库和程序包(Library、package)-打开本设计使用的库 和程序包 实体(Entity) -说明本设计实体的外部端口 结构体(Architecture) -描述本设计实体的内部结构 和行为 配置(Configuration) -指定实体希望配置的结构体,【例5-1.1】 ENTITY mux21a IS PORT( a, b : IN BIT ; s : IN BIT; y : OUT BIT ) ; END ENTITY mux21a ; ARCHITECTURE one OF mux21a IS BEGIN y = a WHEN s = 0 ELSE b ; END ARCHITECTURE one ;,实体,结构体,5-1.1 多路选择器VHDL描述,图5-1 mux21a实体,图5-2 mux21a结构体,2选1多路选择器的VHDL描述,2选1多路选择器的VHDL描述,【例5-1.2】 ENTITY mux21a IS PORT ( a, b : IN BIT; s : IN BIT; y : OUT BIT ); END ENTITY mux21a; ARCHITECTURE one OF mux21a IS SIGNAL d,e : BIT; BEGIN d = a AND (NOT S) ; e = b AND s ; y = d OR e ; END ARCHITECTURE one ;,【例5-1.3】 . . . ARCHITECTURE one OF mux21a IS BEGIN y = (a AND (NOT s) OR (b AND s) ; END ARCHITECTURE one;,图5-3 mux21a功能时序波形,8,二、实体功能描述 实体的功能 对一个电路元件或电路系统的外部接口进行描述,实体反映了本电路与其他电路之间的连接关系,可以看成一个电路符号。 1、实体的语句格式 实体描述语句通常包括引导语句、结束语句、类属表和端口表四部分,如表5.1.1所示。 表5.1.1 实体描述语句的格式 名称 内容 引导语句 ENTITY 实体名 IS 类 属 表 GENERIC(); 端 口 表 PORT(); 结束语句 END实体名;,是一种端口界面常数,常以一种说明形式放在实体或结构体的说明部分,类属值可以由设计实体外部赋值,通过类属参数的重新设定可以改变一个设计实体的内部电路和规模。类属参数以关键词GENERIC引导的类属表给出,表中提供时间参数或总线宽度等信息。 类属说明的书写格式是: GENERIC(常数名:数据类型:设定值 常数名:数据类型:设定值); 例5-2 ENTITY body IS GENERIC(n: INTEGER); PORT(a: IN STD_LOGIC_VECTOR(n-1 DOWNTO 0); b: OUT STD_LOGIC); END body;,类 属 参 数,端 口 模 式,IN,OUT,INOUT,BUFFER,数据类型,表5.1.3 几种基本的数据类型,表5.1.3 几种基本的数据类型,a: IN BIT; b: OUT STD_LOGIC_VECTOR (7 DOWNTO 0); SIGNAL C: STD_LOGIC_VECTOR(1 TO 4); SIGNAL d: BIT_VECTOR (3 DOWNTO 0); 三、结构体(ARCHITECTURE)说明 1、结构体的功能与格式 结构体承担的具体任务是: 定义结构体中的各项内部使用元素,如数据类型(TYPE)、常数(CONSTANT)、信号(SIGNAL)、元件(COMPONENT)、过程(POCEDURE)等; 通过VHDL语句描述实体所要求的具体行为和逻辑功能; 描述各元件之间的连接。 结构体的语句书写格式如下: Architectrue 结构体名 OF 实体名 IS 定义语句; -并非一定有,视具体情况而定 BEGIN 功能描述语句; END 结构体名;,2、结构体的三种描述方式,例5-3 用行为描述方式设计的全加器 LIBRARY IEEE; -库说明 USE IEEE.STD_LOGIC_1164.ALL; ENTITY onebitadder IS -实体说明 PORT(x,y,cin:IN BIT; -端口信号定义 Sum,count: OUT BIT); END onebitadder; ARCHITECTURE behavior OF onebitadder IS -结构说明 BEGIN PROCESS (x,y,cin) BEGIN sum= x XOR y XOR cin; count= (x AND y) OR (x XOR y) AND cin); END PROCESS; END behavior; ,例5-4 用RTL描述方式设计的2选1数据选择器 ARCHITECTURE rtl OF mux2 IS BEGIN y= input(a) WHEN sel=1 ELSE Input(b); END rtl 例5-5 用结构描述方式设计的R-S触发器 ENTITY rsff IS PORT(set, reset: IN BIT) q,qbar: INOUT BIT); END rsff; ARCHITECTURE netlist OF rsff IS COMPONENT nand2 -元件说明 PORT(a,b: IN BIT; c: OUT BIT); END COMPONENF; BEGIN U1: nand2 PORT MAP (set, qbar, q); -用位置关联实现元件端口名和系统端口 的连接 U2: nand2 PORT MAP (q,reset, qbar); END entlist;,表5.1.5 结构体中的三种子结构方式比较,例5-6 使用块语句结构的程序实例2位二进制计数器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY counter2 IS PORT( clk: IN STD_LOGIC ;q1,q2:OUT STD-LOGIC); END counter2; ARCHITECTURE arch_counter2 OF counter2 IS SIGNAL count: STD_LOGIC_VECTOR(1 DOWNTO 0); BEGIN Counter: BLOCK; BEGIN Process(clk) begin IF (clk event AND clk=1) THEN IF count=11 THEN count=“00“; ELSE count=count+1;,END IF; END IF; q1=count(1); q0=count(0); End process; END BLOCK counter; END arch_counter2; 上例是一个2位二进制计数器的VHDL描述,结构体部分使用了块语句结构。其中,用了两个IF语句,即当时钟CLK的上升沿到来时,若2位计数器的输出q1q0已计数到11时则将其置为0;否则,将计数器作加1运算并赋值给q1q0。 块语句只是表示程序的结构,并不执行.,为什么不直接对q1q0作计数操作而另设信号count,然后再将count转移到q1q0中呢?,该程序ENTITY前面的3条程序说明什么呢?,取整数数据类型,为什么?,整数取值范围,端口信号模式取 BUFFER,为什么?,注意整数和位的不同表达方式!,例5-7 用进程语句结构的程序实例一4位二进制计数器,例5-8 “过程”语句的程序实例一2位二进制译码器 PROCEDURE decoder (code: IN STD_LOGIC_VECTOR (1 TO 0); decoder_out: OUT STD_LOGIC_vecTOR (3 DOWNTO 0) IS VARIABLE decod: OUT STD_LOGIC_VECTOR (3 DOWNTO 0); BEGIN CASE code IS WHEN “00“= decod decod decod decod NULL ; END CASE; decoder_out = decod; END decoder;,表5.1.6 2位二进制译码器真值表,例5-9 函数定义和调用举例 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY func IS PORT(a: IN STD_LOGIC_VECTOR (0 to 2); m: OUT STD_LOGIC_VECTOR (0 to 2); END ENTITY func; ARCHITECTURE demo OF func IS FUNCTION sam (x, y, z: STD_LOGIC) RETURN STD_LOGIC IS BEGIN RETURN (x AND y) OR z; End sam; BEGIN PROCESS (a) BEGIN m(0) = sam (a(0), a(1), a(2); m(1) = sam (a(2), a(0), a(1); m(2) = sam (a(1), a(2), a(0); END PROCESS; END ARCHITECTURE demo;,5.1.2 寄存器描述及其VHDL语言现象,D触发器的VHDL描述,LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; ENTITY DFF1 IS PORT (CLK : IN STD_LOGIC ; D : IN STD_LOGIC ; Q : OUT STD_LOGIC ); END ; ARCHITECTURE bhv OF DFF1 IS SIGNAL Q1 : STD_LOGIC ; -类似于在芯片内 部定义一个数据的暂存节点 BEGIN,D触发器,BEGIN PROCESS (CLK) BEGIN IF CLKEVENT AND CLK = 1 THEN Q1 = D ; END IF; Q = Q1 ; -将内部的暂存数据向端口输出,End PROCESS ; END bhv;,比较用5种不同语句的D触发器VHDL程序,Entity test1 is port (clk, d : in bit; q : out bit); end test1; architecture body of test1 is signal q1 : bit ; begin process (clk) begin if clk=1 AND clklast_value=0 then q1 = d; end if; q = q1 ; end process; end test1_body;,LIBRARY IEEE; USE IEEE.std_logic_1164.all; Entity test1 is port (clk, d : in bit; q : out bit); end test1; architecture body of test1 is begin process (clk,d) begin if rising_edge(clk) then q = d; end if; end process; end test1_body;,They are all the same,DFF,Entity test1 is port (clk : in bit; d : in bit; q : out bit); end test1; architecture body of test1 is signal q1 : bit ; begin process (clk) begin if (clk = 1) then q1 = d; end if; q = q1 ; end process; end body;,Entity test1 is port (clk : in bit; d : in bit; q : out bit); end test1; architecture body of test1 is signal q1 : bit ; begin process (clk,d) begin if (clk = 0) then q1 = d; end if; q = q1 ; end process; end body;,5.1.3 VHDL中的程序库,包和配置,一、VHDL 库,库-用来存放预先已设计好的程序包、数据集合体、元件的仓库 库中存放的信息供用户进行VHDL设计时调用,如果在完成一项VHDL设计需要用到库中的某一个程序包时,在设计实体前使用USE语句打开这一程序包。而综合过程中,综合器检测到VHDL源程序中的库文件时则将源文件读入. 1、常用的库资源 一类是资源库,库中存放常规元件、标准模块、预定义数据类型等,有些是被IEEE确定为标准的,如IEEE库中的STD_LOGIC_1164程序包。 一类是设计库,例如存放用户设计和定义的某些元件和程序包的Work库。程序库由若干程序包构成,程序包又包含若干子程序,子程又涉及若干基本设计单元。 VHDL设计中常用的有IEEE库、STD库、Work和ASIC库,表5.1.6 VHDL中常用库的特点,二、包集合,打包后的程序将VHDL设计中常用的一些诸如信号定义、常数定义、数据类型、元件、函数和过程定义等内容集合在一起形成一个程序包,即所谓“打包”,供设计者在使用中调用,PACKAGE 包集合名 IS,说明语句,;,说明语句,END BODY;,END 包集合名;,包首,包体,PACKAGE BODY 包集合名 IS,PACKAGE one IS -程序包首,名字为 one SUBTYPE segments IS BIT_VECTOR (0 TO 6); -包体开始定义子类型segments TYPE bcd IS integer RANGE 0 TO 9; -定义数据bcd的范围是09 END one; -程序包结束 USE WORK. one. ALL; -WORK库默认是打开的,这里只指明所用的包 ENTITY decoder IS PORT (input: in bcd; drive: out segments); END decoder; ARCHITECTURE simple OF decoder IS, 例5-10 程序包定义和应用举例,BEGIN WITH input SELECT -用选择信号赋值语句实现译码 drive = B “1111110“ WHEN 0; B “0110000“ WHEN 1; B “1101101“ WHEN 2; B “1111001“ WHEN 3; B “0110011“ WHEN 4; B “1011011“ WHEN 5;,B “1011111“ WHEN 6; B “1110000“ WHEN 7; B “1111111“ WHEN 8; B “1111011“ WHEN 9; B “0000000“ WHEN OTHERS; END simple;,三、配置(configuration),两种情况: 一种是为一个具有两个或两个以上结构体的设计实体指定一个结构体。因为一个设计实体中,应该是一个实体对应一个结构体,但有时为了比较各种算法编写的不同结构体的性能,在一个实体后面带有几个结构体,这时可以用配置语句指定一个结构体。 另一种情况是为例化语句的各种元件实体配置结构体,例如一个与非门的设计中,一个实体对应着两个以不同逻辑描述实现的结构体,通过配置语句指定其中的一个作为仿真应用的结构体。,CON FIGURATION 配置名 OF 实体名 IS 配置说明 END 配置名;,配置语句的格式是:,例5-11 配置语句应用举例 ENTITY nand IS PORT (a: IN STD_LOGIC; b: IN STD_LOGIC; c: OUT STD_LOGIC); END ENTITY nand; ARCHITECTURE one OF nand IS -one是实体nand的一个结构体 BEGIN,END ARCHITECTURE one; ARCHITECTURE two OF nand IS _ two是实体nand的另一个结构体 BEGIN c=1 WHEN (a=0)AND(b=0) ELSE 1 WHEN (a=0)AND(b=1) ELSE 1 WHEN (a=1)AND(b=0) ELSE 0 WHEN (a=1)AND(b=1) ELSE 0; END ARCHITECTURE two; CONFIGURATION second OF nand IS -用配置语句指定two为nand 实际结构体 FOR two END FOR; END second;,c=NOT (a AND b);,CONFIGURATION first OF nand IS -用配置语句指定one为nand的 实际结构体 FOR one END FOR; END first;,5.2 VHDL语言的基本要素,5.2.1 VHDL的字符规则,5.2.2 数据类型 1、预定义数据类型,1、预定义数据类型,2. 自定义数据类型,2. 自定义数据类型,5.2.3 VHDL的数据对象,VHDL的数据对象分为三类, 常量(constant)、 变量(variable) 信号(signal)。 总体来说,三者都用于传递数据或接受数据赋值, 在最终实现的硬件电路中,信号和变量相当于连线及连线上数据值; 常量 是一个固定不变的数据值,如VCC、GND等,常量只能取一个值,信号和变量却可以取多个不同的值。 常量定义的一般表达格式是: CONSTANT 常数名:数据类型 := 表达式;,例如 CONSTANT data: STD_LOGIC_VECTOR:=“0110“ 上式的意思是data是常数0110,其数据类型为标准位矢量型。常量语句定义的适应范围有实体、结构体、程序包、块、进程和子程序。如果在一个设计实体中定义,则有效范围是这个设计实体的结构体,如果在设计实体的某一部分定义,则有效范围只是所定义的这部分电路,例如一个进程语句中,则有效范围只在这个进程中。 在VHDL具体设计中,变量和信号有不同的特点、不同的赋值符号,适应范围也有着明显的区别。 表5.2.4对信号和变量进行了比较。,数据对象 DATA OBJECTS,6.3.1 常数(CONSTANT),6.3.2 变量(VARIABLE),6.3.3 信号(SIGNAL),1. 常数(CONSTANT),2. 变量(VARIABLE),3. 信号(SIGNAL),常数定义的一般表述: CONSTANT 常数名:数据类型 := 表达式 ;,定义变量的一般表述: VARIABLE 变量名 : 数据类型 := 初始值 ;,定义 格式: SIGNAL 信号名: 数据类型 = 初始值 ;,表5.2.4信号和变量赋值语句比较,例5-12 使用了变量赋值的VHDL实例,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;,ENTITY dff3 IS PORT (CLK, d1: IN STD_LOGIC; Q1: OUT STD_LOGIC); END; ARCHITECTURE bhv OF dff3 IS BEGIN PROCESS (CLK) VARIABLE QQ: STD_LOGIC; BEGIN IF CLK EVENT AND CLK=1 THEN QQ := d1; END IF; Q1= QQ; END PROCESS; End bhv;,例5-13 使用了信号赋值的VHDL实例,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY dff3 IS PORT (CLK, d1: IN STD_LOGIC; Q1: OUT STD_LOGIC); END; ARCHITECTURE bhv OF dff3 IS SIGNAL QQ: STD_LOGIC; BEGIN PROCESS (CLK) BEGIN IF CLK EVENT AND CLK=1 THEN QQ = d1 ; END IF; Q1=QQ; END PROCESS; END bhv;,5.3 VHDL的操作符,表5.3.1 VHDL中使用的主要操作符,5.3.1 逻辑操作符,(1)逻辑操作符所要求的数据类型是BIT、BOOLEAN、STD_LOGIC三种以及BIT和STD_LOGIC相应的数组类型;对数组类型操作时除了操作符两边的数据类型相同外,还应保证数位相等。 (2)一个表达式中出现两个以上的运算符号,应使用括号对运算进行分组。如果一个等式中重复应用了AND、OR、XOR三个算符中的一个则不要加括号。 例如:y1 AND y2 AND y3; -AND是三种算符之一,不必加括号 (a OR b) AND c; -不是一个运算符重复应用,应加括号 d=a AND b OR c; -用了两种运符未加括号,错误 (3)逻辑运算符除NOT外,其余操作符的优先级是各类运算符中最低的,但NOT与*乘方)、ABS(取绝对值)一样,同处于最高优先级。,5.3.2 算术运算符,1、求和操作符 +(加)、-(减)、&(并置),2、求积运算 *(乘)、/(除)、MOD(取模)、REM(取余),3、混合操作 *(乘方)、ABS(取绝对值),4、符号操作 +(正)、-(负),例5-14 并置符应用实例,SIGNAL f: STD_LOGIC_VECTOR (5 DOWNTO 0); SIGNAL a, b: STD_LOGIC_VECTOR (2 DOWNTO 0); SIGNAL c, d, e: STD_LOGIC; a=c -数组与数组并置成为长度6位的数组,例5-15 用加法运算实现位长4位的加法器,LIBRARY IEEE; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY adder4B IS PORT (cin: IN STD_LOGIC;,a;b: IN STD_LOGIC_VECTOR (3 DOWNTO 0); s: OUT STD_LOGIC_VECTOR (3 DOWNTO 0); cout: OUT STD_LOGIC);,END adder4 B; ARCHITECTURE behav OF adder4B IS SIGNAL: sint: STD_LOGIC_VECTOR (4 DOWNTO 0); SIGNAL: aa,bb: STD_LOGIC_VECTOR (4 DOWNTO 0); BEGIN aa=0 ,5.3.3 关系运算符,1 .关系操作符的作用 将同类型的数据作大小比较或作排序判断,其结果以Boolean数据类型表示。应用时,操作符两边的数类型应相同,但位数可不同。 2 等号和不等号的操作数可为任何数据类型,例如两个数m1和m2的类型相同且数值大小一样,则可判断m1和m2相等的结果为Ture,而m1/= m2的结果为False。 3 4种关系运算符、=为排序符号,允许使用的操作数类型为整数或整数的一维数组。 4 排序判断是将操作数从左至右逐位比较后得出结论的,若两操作数的位数不相等可能产生错误结论, 如“101”和“1001”比较到左起第3位时会认为“101”“1001”的错误结论,这时将操作数定义数据类型STD_LOGIC_ARITH中的为Unsigned则能得到正确结论。如:UNSIGNED“1“UNSIGNED “011“的比较结果为TRUE。,5.4 VHDL的基本语句解析,顺序语句(sequential statements) 特点-语句的执行(指仿真)按书写顺序进行,应用范围只能是进程和子程序。 并行语句(concurrent statements)又称并发语句 并行语句-执行是同步进行的,与语句书写顺序无关。并行语句执行中,各语句之间的关系可能是相互独立的,但也可能存在信息交流,5.4.1 顺序语句(sequential statements),1 赋值语句,2 条件语句(IF),3 条件语句(CASE),5 循环控制语句 (NEXT),4 循环语句(LOOP),6 循环控制语句(EXIT ),7 等待语句(WAIT),信号赋值语句,变量赋值语句,赋值目标,赋值符号,赋值源,赋值语句的作用 将一个数值或一个表达式的运算结果传递到某一数据对象,以实现设计实体内部的数据传送以及端口外部数据的读写。 赋值语句包含赋值源、赋值目标和赋值符三要素。要求赋值源和赋值目标的数据类型必须相同。 根据赋值对象的不同,赋值语句分为 : 信号赋值和变量赋值两种, 信号赋值-具有延时性、全局性,赋值符用(=)表示。 变量赋值-具有即时性、局部性,且定义只限于进程和子程序中,变量赋值符是(:=),一、赋值语句,IF一种顺序语句是应用很广的语句,属于流程控制语句之一,除此之外,流程控制语句还有LOOP、NEXT、EXIT语句。IF条件语句,分为4种语句格式,见表5.4.1。,二、条件语句(IF),表5.4.1 条件语句的功能和格式,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY coder IS PORT( din: IN STD_LOGIC_VECTOR (9 DOWNTO 0); output: OUT STD_LOGIC_VECTOR (3 DOWNTO 0); END coder; ARCHITECTURE behav OF coder IS BEGIN PROCESS (din) BEGIN IF (din (9)=0) THEN output =“1001“; ELSIF (din (8)=0) THEN output =“1000“; ELSIF (din (7)=0) THEN output =“0111“; ELSIF (din (6)=0) THEN output =“0110“; ELSIF (din (5)=0) THEN output =“0101“; ELSIF (din (4)=0) THEN output =“0100”; ELSIF (dif (3)=0) THEN utput =“0011”; ELSIF (din(2)=0) THEN output =“0010”; ELSIF (din (1)=0) THEN output =“0001“; ELSE output =“0000“;,例5-16 一位BCD码编码器的VHDL描述,表5.4.2 一位BCD码编码器真值表,END IF; END PROCESS; END behav;,作业:试用if语句编写一个具有优先级的83线编码器,实现74LS148的功能。,三、条件语句(CASE),表5.4.4 Loop语句的特点和语句格式,四、循环语句(LOOP),循环语句的功能是 : 将其所包含的一组顺序语句循环执行,执行次数由循环参数决定。,例5-18 用VHDL描述的8位奇偶校验电路,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY p_check IS PORT (a: IN STD_LOGIC_VECTOR (7 DOWNTO 0); y: OUT STD_LOGIC); END p_check; ARCHITECTURE opt OF p_check IS SIGNAL tmp: STD_LOGIC; BEGIN PROCESS (a) Variable temp : std_logic; BEGIN temp:=0; FOR n IN 0 TO 7 LOOP -循环语句,循环变量为n,次数是07,此循环语 句作为进程语句中的顺序语句使用,temp := temp XOR a(n); END LOOP; tmp = temp ; END PROCESS; y=tmp; END opt;,五、循环控制语句 (NEXT),循环控制语句NEXT一般嵌套在LOOP语句中,控制程序执行顺序有条件或无条件的转向。 表5.4.5说明了NEXT语句的特点和格式,例5-19 NEXT语句应用示例 L1:FOR cet IN 1 TO 8 LOOP -循环语句,循环变量是cet,循环次数是18 S1:a(cet):=0 NEXT WHEN (b=c); -条件转向控制语句,若b=c则跳转到L1语句将cet加1后再执行S1语句,否则执行S2语句 S2:a(cet+8) := 0; END LOOP L1;,六、循环控制语句(EXIT),EXIT语句也是嵌套在LOOP语句中用于控制LOOP语句的转向,其语句格式和功能都十分相似。 EXIT也有三种格式: EXIT -格式1 EXIT LOOP 标号 -格式2 EXIT LOOP 标号 条件表达式 -格式3 EXIT语句和NEXT语句,在功能上有何差别?从前面的实例中已知NEXT语句的跳转方向是LOOP标号指定的语句,在没有LOOP标号时则跳转到当前LOOP语句的循环起点。而EXIT的跳转方向则不同,当执行到EXIT语句时会完全跳出循环,即跳转到LOOP循环语句的结束处。可见这两种跳转控制语句的差别在于跳转的方向不一样,NEXT语句是跳转至LOOP语句起点,而EXIT是跳转至LOOP语句的终点。,【例5-20】 SIGNAL a, b : STD_LOGIC_VECTOR (1 DOWNTO 0); SIGNAL a_less_then_b : Boolean; . a_less_then_b b EXIT ; ELSIF (a(i)=0 AND b(i)=1) THEN a_less_then_b = TRUE ; - a b EXIT; ELSE NULL; END IF; END LOOP; - 当 i=1时返回LOOP语句继续比较,表5.4.6 WAIT语句的特点及格式,七、等待语句(WAIT),等待语句有四种不同的格式,一般地,只有WAIT_UNTIL格式的等待语句可以被综合器接受(其余语句格式只能在VHDL仿真器中使用) ,WAIT_UNTIL语句有以下三种表达方式: WAIT UNTIL 信号=Value ; - (1) WAIT UNTIL 信号EVENT AND 信号=Value; - (2) WAIT UNTIL NOT 信号STABLE AND 信号=Value;-(3),如果设clock为时钟信号输入端,以下四条WAIT语句所设的进程启动条件都是时钟上跳沿,所以它们对应的硬件结构是一样的: WAIT UNTIL clock =1; WAIT UNTIL rising_edge(clock) ; WAIT UNTIL NOT clockSTABLE AND clock =1; WAIT UNTIL clock =1 AND clockEVENT;,八、子程序调用语句(SUBPROGRAM CALLS),子程序 是一种具有某种特殊功能的相对独立的VHDL模块,通过对子程序的调用能更有效的完成一些重复性的工作。 子程序具有两种不同的类型, 函数(FUNTION) 过程(PROCEDURE) 相当于高级语言中的“函数”和“过程”。 过程语句中的参数可以是输入、输出和双向,而且这些参数在定义时都在“过程名”后面的括号中列出,如果没有特别说明,“IN”将作为常数使用,“OUT”、“INOUT”将作为变量使用,如果主程序要将输入输出参数作为信号使用,则应在过程定义中指明为信号。,表5.4.7 子程序的定义和调用语句格式及特点说明,表5.4.7 子程序的定义和调用语句格式及特点说明,1. 函数(FUNTION)定义语句中所要求的参数都是输入形式的信号或常数,调用时主程序将这些参数替代为主程序所要求的参数进行运算。 (1.) 函数与过程不同的是,要给出一个返回值,并且指明返回值的数据类型。 (2. )子程序的应用包括“子程序定义”和“调用”两个方面,定义中又常包含返回语句。,FUNCTION opt (a, b, opr :STD_LOGIC) RETURN STD_LOGIC IS 【例5-21】 BEGIN IF (opr =1) THEN RETURN (a AND b); ELSE RETURN (a OR b) ; END IF ; END FUNCTION opt ;,一个调用过程的语句格式如下: 过程名(形参名= 实参表达式 ,形参名= 实参表达式) ;过程的调用将分别完成以下三个步骤:,(1)将IN和INOUT模式的实参值赋给欲调用的过程中与它们对应的形参;,(2)执行这个过程;,(3)将过程中IN和INOUT模式的形参值返回给对应的实参。,2、过程调用,九 返回语句(RETURN),RETURN; - 第一种语句格式 RETURN 表达式; - 第二种语句格式,【例5-21】 PROCEDURE rs (SIGNAL s , r : IN STD_LOGIC ; SIGNAL q , nq : INOUT STD_LOGIC) IS BEGIN IF ( s =1 AND r =1) THEN REPORT “Forbidden state : s and r are quual to 1“; RETURN ; ELSE q = sAND nq AFTER 5ns ;nq = s AND q AFTER 5ns ; END IF ; END PROCEDURE rs ;,【例5-22】 PACKAGE data_types IS - 定义程序包 SUBTYPE data_element IS INTEGER RANGE 0 TO 3 ; - 定义数据类型 TYPE data_array IS ARRAY (1 TO 3) OF data_element; END data_types; USE WORK.data_types.ALL; -打开以上建立在当前工 作库的程序包data_types ENTITY sort IS PORT ( in_array : IN data_array ; out_array : OUT data_array); END sort;,ARCHITECTURE exmp OF sort IS BEGIN PROCESS (in_array) - 进程开始,设data_types为敏感信号 PROCEDURE swap(data : INOUT data_array; - swap的形参名为data、low、high low, high : IN INTEGER range 1 to 3 ) IS VARIABLE temp : data_element ; BEGIN - 开始描述本过程的逻辑功能 IF (data(low) data(high) THEN - 检测数据,temp := data(low) ; data(low) := data(high); data(high) := temp ; END IF ; END swap ; - 过程swap定义结束 VARIABLE my_array : data_array ;- 在本进程中定义变量my_arra,BEGIN - 进程开始 my_array := in_array ; - 将输入值读入变量 swap(my_array, 1, 2); - my_array、1、2是对应于data、low、high的实参 swap(my_array, 2, 3); - 位置关联法调用, 第2、第3元素交换 swap(my_array, 1, 2); - 位置关联法调用, 第1、第2元素再次交换 out_array = my_array ; END Process ; END exmp ;,【例5-23】 ENTITY sort4 is GENERIC (top : INTEGER :=3); PORT (a, b, c, d : IN BIT_VECTOR (0 TO top); ra, rb, rc, rd : OUT BIT_VECTOR (0 TO top); END sort4; ARCHITECTURE muxes OF sort4 IS PROCEDURE sort2(x, y : INOUT BIT_VECTOR (0 TO top) is VARIABLE tmp : BIT_VECTOR (0 TO top);,BEGIN IF x y THEN tmp := x; x := y; y := tmp; END IF; END sort2;,BEGIN va := a; vb := b; vc := c; vd := d; sort2(va, vc); sort2(vb, vd); sort2(va, vb); sort2(vc, vd); sort2(vb, vc); ra = va ; rb = vb; rc = vc; rd = vd; END PROCESS; END muxes;,BEGIN PROCESS (a, b, c, d) VARIABLE va, vb, vc, vd : BIT_VECTOR(0 TO top);,在下例的CASE语句中,NULL用于排除一些不用的条件。 CASE Opcode IS WHEN “001“ = tmp := rega AND regb ; WHEN “101“ = tmp := rega OR regb ; WHEN “110“ = tmp := NOT rega ; WHEN OTHERS = NULL ; END CASE ;,空操作语句的语句格式如下: NULL;,十 空操作语句(NULL),5.4.2 并行语句(Concurrent statements),并行语句,又称为并发语句 1.结构体中各并行语句是同步执行的,与语句在结构体中书写的顺序位置无关。 2.同一结构体中的各并行语句之间可以是相互独立的,也可以相互发生信息交流。 3.在一条并行语句内部可能嵌套几条其他语句,这些嵌套的语句可能是并行执行,也可能是顺序执行。,1、并行信号赋值语句(Concurrent Signal Assignments)。,2、进程语句(Process Statements)。,3、块语句(Block Statements)。,4、条件信号赋值语句(Selected Signal Assignments)。,5、元件例化语句(Component Instantiations),其中包括类属配置语句,6、生成语句(Generate Statements)。,7、并行过程调用语句(Concurrent Procedure Calls)。,结构体中的并行语句主要有七种:,。,表5.4.8 PROCESS的特点,一、进程语句(PROCESS),PROCESS 组成,PROCESS语句结构,进程说明,顺序描

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论