【教学课件】第7章VHDL要素.ppt
第7章 VHDL要素7.1 算术操作符与优先级算术操作符与优先级 与传统的程序语言一样,VHDL表达式中的基本元素也是由不同类型的运算符相连而成的。这里所说的基本元素称为操作数(Operands),运算符称为操作符(Operators)。VHDL操作符可分为逻辑操作符(参)、关系操作符(参)、算术操作符、符号操作符和重载操作符(Overloading Operator)。7.1.1 算术操作符Arithmetic Operator类别类别操作操作符符功能功能操作数操作数类类型型备备注注例例求和求和操作操作符符+加加整数整数A+BA+B-减减求求积积操作操作符符*乘乘整数、整数、实实数、数、浮点数浮点数2 2的的幂幂,可用可用移位移位LPMLPM库库无此限无此限制制A*BA*B/除除整数、整数、实实数、数、浮点数浮点数MODMOD取模取模整数整数REMREM取余取余整数整数符号符号操作操作符符+正数正数整数整数A*A*(-B B)-负负数数移位移位操作操作符符SLLSLL逻辑逻辑左移左移0 0A A:BITBIT、STDSTD、布布尔尔的一的一维维数数组组和整数;和整数;B B:移位位数整数:移位位数整数A SLL BA SLL BSRLSRL逻辑逻辑右移右移0 0SLASLA算算术术左移左移(左复制)(左复制)SRASRA算算术术右移右移(右复制)(右复制)ROLROL循循环环左移左移RORROR循循环环右移右移混合混合操作操作符符*乘方乘方整数整数+非非负负整数整数浮点数浮点数+非非负负整数整数MAX MAX PLUPLUSIISII不不支持支持A*B=AA*B=AB BABSABS取取绝对值绝对值整数整数&并置并置一一维维数数组组【例【例7-1】用】用SLL完成完成3-8译码器的设计译码器的设计 ENTITY decoder3to8 IS port (input:IN INTEGER RANGE 0 TO 7;output:OUT BIT_VECTOR(7 DOWNTO 0);OUT BIT_VECTOR(7 DOWNTO 0);END decoder3to8;ARCHITECTURE behave OF decoder3to8 IS BEGIN output=”00000001”SLL input;-被移位部分是常数!END behave;【例【例7-2】乘方和取绝对值语法例】乘方和取绝对值语法例SIGNAL a,b:INTEGER RANGE -8 to 7;SIGNAL c:INTEGER RANGE 0 to 5;SIGNAL d:INTEGER RANGE 0 to 3;a=ABS(b);c=2*d;7.1.2 VHDL操作符优先级运算符运算符优优先先级级NOT,ABS,*NOT,ABS,*优先级高优先级高优优先先级级低低*,/,MOD,REM*,/,MOD,REM+(正号)(正号),-,-(负负号)号)+,-,&+,-,&SLL,SLA,SRL,SRA,ROL,RORSLL,SLA,SRL,SRA,ROL,ROR=,/=,=,/=,=AND,OR,NAND,NOR,XOR,AND,OR,NAND,NOR,XOR,XNORXNOR在编程时可充分利用括号,可有效避免错误。7.2 BUFFER类型与操作符重载函数【例【例6-36-3】4 4位计数器设计。位计数器设计。题目分析:题目分析:计数器:对时钟信号计数器:对时钟信号CLKCLK进行计数,即在进行计数,即在CLKCLK上升沿时输上升沿时输出值出值Q=Q+1Q=Q+1;端口设置:端口设置:CLKCLK为为IN BITIN BIT,Q=Q+1Q=Q+1要实现将输出到端口要实现将输出到端口的值反馈回来加的值反馈回来加1 1,只有采用,只有采用BUFFERBUFFER端口类型;要实现端口类型;要实现算术运算,数据类型须采用算术运算,数据类型须采用INTEGERINTEGER。注意:表面上注意:表面上BUFFERBUFFER具有双向端口具有双向端口INOUTINOUT的功能,但实的功能,但实际上其输入功能是不完整的,它只能将自己输出的信号际上其输入功能是不完整的,它只能将自己输出的信号再反馈回来。再反馈回来。7.2.1 BUFFER类型类型ENTITY CNT4 ISENTITY CNT4 IS PORT PORT (CLKCLK:IN BIT IN BIT;Q Q :BUFFER INTEGER RANGEBUFFER INTEGER RANGE(15 DOWNTO 015 DOWNTO 0););););END CNT4END CNT4;ARCHITECTURE bhv OF CNT4 IS ARCHITECTURE bhv OF CNT4 IS BEGIN BEGIN PROCESS(CLK)PROCESS(CLK)BEGIN BEGIN IF CLKEVENT AND CLK=1 THEN IF CLKEVENT AND CLK=1 THEN Q=Q Q=Q十十1 1;END IF END IF;END PROCESS END PROCESS;END bhvEND bhv;BUFFEF类型在多级设计中不便于综合,常用类型在多级设计中不便于综合,常用OUT类型。类型。ENTITY CNT4 1S ENTITY CNT4 1S PORT(CLK PORT(CLK:IN BITIN BIT;Q Q :OUTOUT INTEGER RANGE INTEGER RANGE(15 DOWNTO 015 DOWNTO 0););ENDEND;ARCHITECTURE bhv OF CNT4 ISARCHITECTURE bhv OF CNT4 ISSIGNAL Q1SIGNAL Q1:INTEGER RANGEINTEGER RANGE(15 DOWNTO 015 DOWNTO 0);BEGIN BEGIN PROCESS (CLK)PROCESS (CLK)BEGIN BEGIN IF CLKEVENT AND CLK=l THEN IF CLKEVENT AND CLK=l THEN Q1=Q1+1 Q1=Q1+1;END IF END IF;Q=Q1 Qb THEN RETURN a IF ab THEN RETURN a;ELSE RETURN b ELSE RETURN b;END IF END IF;END FUNCTION max END FUNCTION max;-结束结束FUNCTIONFUNCTION语句语句ENDEND;-结束结束PACKAGE BODYPACKAGE BODY语句语句-下面是函数调用下面是函数调用 LIBRARY IEEELIBRARY IEEE;-函数应用实例函数应用实例 USE IEEE USE IEEESTD_LOGIC_1164STD_LOGIC_1164ALLALL;USE WORK USE WORKpackexppackexpALLALL;-打开自定义程序包打开自定义程序包ENTITY axamp ISENTITY axamp IS PORT(datl PORT(datl,dat2dat2:IN STD_LOGIC_VECTOR(3 DOWNTO 0)IN STD_LOGIC_VECTOR(3 DOWNTO 0);dat3 dat3,dat4dat4:IN STD_LOGIC_VECTOR(3 DOWNTO 0)IN STD_LOGIC_VECTOR(3 DOWNTO 0);outl outl,out2out2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)OUT STD_LOGIC_VECTOR(3 DOWNTO 0);ENDEND;ARCHITECTURE bhv OF axamp ISARCHITECTURE bhv OF axamp IS BEGIN BEGIN outl=max(datl outl=max(datl,dat2)dat2);用在赋值语句中的并行函数调用语句用在赋值语句中的并行函数调用语句 PROCESS(dat3 PROCESS(dat3,dat4)dat4)BEGIN BEGIN out2=max(dat3 out2b THEH RETURN a;ELSE RETURN b;END IF;END FUNCTION max;-结束MAX语句FUNCTION max(a,b:IN INTEGER)RETURN INTEGER IS-定义函数体 BEGIN IF a b THEN RETURN a;ELSE RETURN b;END IF;END FUNCTION max;-结束MAX语句 FUNCTION max(a,b:IN BIT_VECTOR)RETURN BIT_VECTOR IS-定义函数体 BEGIN IF ab THEN RETURN a;ELSE RETURN b;END IF;END FUNCTION max;-结束FUNCTION语句 END;-结束PACKAGE BODY语句重载函数的调用重载函数的调用 LIBRARY IEEE LIBRARY IEEE ;USE IEEE USE IEEESTD_LOGIC_1164STD_LOGIC_1164ALLALL;USE WORK USE WORKPackexp.AlLPackexp.AlL;ENTITY axamp IS ENTITY axamp IS PORT(PORT(a1 a1,b1b1:IN STD_LOGIC_VECTOR(3 DOWNTO 0);IN STD_LOGIC_VECTOR(3 DOWNTO 0);a2 a2,b2b2:IN BIT_VECTOR(4 DOWNTO 0)IN BIT_VECTOR(4 DOWNTO 0);a3 a3,b3b3:IN INTEGER RANGE 0 TO 15IN INTEGER RANGE 0 TO 15;c1 c1:OUT STD_ LOGIC_ VECTOR(3 DOWNTO 0)OUT STD_ LOGIC_ VECTOR(3 DOWNTO 0);c2 c2:OUT BIT_ VECTOR(4 DOWHTO 0)OUT BIT_ VECTOR(4 DOWHTO 0);c3 c3:OUT INTEGER RANCE 0 TO 15)OUT INTEGER RANCE 0 TO 15);ENDEND;ARCHITECTURE bhv OF axamp ISARCHITECTURE bhv OF axamp IS BEGIN BEGIN cl=max(a1 cl=max(a1,b1)b1);-对函数对函数max STD_LOGIC_VECTORmax STD_LOGIC_VECTOR的调用的调用 c2=max(a2 c2=max(a2,b2)b2);-对函数对函数max BIT_VECTORmax BIT_VECTOR的调用的调用 c3=max(d3 c3 value:=”0101”;WHEN “0101”=value:=“0000”;WHEN OTHERS=value:=“1111”;END CASE;END PROCEDURE prgl;2、过程调用、过程调用调用格式:过程名(变量表);调用格式:过程名(变量表);变量表顺序按过程定义的变量表顺序变量表顺序按过程定义的变量表顺序 【例【例6-106-10】重载过程与过程调用】重载过程与过程调用PROCEDURE calcu(v1PROCEDURE calcu(v1,v2v2:IN REALIN REAL;SIGNAL out1 SIGNAL out1:INOUT INTEGER)INOUT INTEGER);PROCEDURE calcu(v1PROCEDURE calcu(v1,v2v2:In INTEGERIn INTEGER;SIGNAL outlSIGNAL outl:INOUT REAL)INOUT REAL);Calcu(20.15Calcu(20.15,1.421.42,signl)signl);-调用第一个过程调用第一个过程calcucalcucalcu(23calcu(23,320 320,sign2)sign2);-调用第二个过程调用第二个过程calcucalcu先介绍再调用7.5 元件例化与调用 在庞大的系统设计中,常常将系统分割成几个模块,每个模块完成某一特定的功能。每个模块分开设计,最后将几个模块连接起来。这样可几人分工协作,提高工作效率。各模块的设计称为底层文件设计,系统连接称为顶层文件设计。底层文件可经过元件例化元件例化,变成一个元件,顶层文件可对此元件调用并进行端口连接。元件例化语句由两部分组成:元件例化语句由两部分组成:1、元件声明语句:对一个现成的设计实体进行封装介绍格式:COMPONENT实体名IS PORT (端口名表);END COMPONENT实体名;元件声明语句必须放在结构体的ARCHITECTURE和BEGIN之间。如果元件在程序包中定义,元件声明语句必须放在程序包包头内。2、元件与当前设计实体、元件与当前设计实体(顶层文件顶层文件)的连接:的连接:例化名:元件名PORT MAP(端口名=连接端口名,);其中:1)例化名是必须存在的,它相当于元件编号。2)PORT MAP是端口映射/连接的意思其中的“端口名”是在元件定义语句中的端口名,“连接端口名”则是顶层系统中准备与接入的元件的端口相连的通信线名,或者是顶层系统的信号名。3)映射表顺序任意。【例【例7-11】1位全加器说明元件例化与调用的方法位全加器说明元件例化与调用的方法半加器设计:半加器设计:LIBRARY IEEELIBRARY IEEE;USE IEEEUSE IEEESTD_LOGIC_1164STD_LOGIC_1164ALLALL;ENTITY halfadder ISENTITY halfadder ISPORT (a,bPORT (a,b:IN STD_LOGICIN STD_LOGIC;co,soco,so:OUT STD_LOGIC)OUT STD_LOGIC);END halhadderEND halhadder;ARCHITECTURE fhl OF halfadder isARCHITECTURE fhl OF halfadder isBEGINBEGINsO =a XOR bsO =a XOR b;cO =a AND bcO ain,b=bin,co=d,so=e);u2:halfadder PORT MAP(a=e,b=cin,co=f,so=sum);cout=d OR f;END fdl;7.6 类型转换函数 n nVHDLVHDL要求每一个常数、信号、变量、函数以及设定的要求每一个常数、信号、变量、函数以及设定的各种参量都必须具有确定的数据类型。只有相同数据类各种参量都必须具有确定的数据类型。只有相同数据类型的量才能互相传递和运算。型的量才能互相传递和运算。函数函数输输入参数入参数输输出参数出参数TO_STDLOGICTO_STDLOGICVECTORVECTORBIT_VECTORBIT_VECTORSTD_LOGICSTD_LOGIC_VECTOR_VECTORTO_BITTO_BITSTD_LOGICSTD_LOGICBITBITTO_BIT_VECTORTO_BIT_VECTORSTD_LOGIC_VECTORSTD_LOGIC_VECTORBIT_VECTORBIT_VECTORCONV_INTEGERCONV_INTEGERSTD_LOGIC_VECTORSTD_LOGIC_VECTORINTEGERINTEGERCONV_STD_CONV_STD_LOGIC_VECTORLOGIC_VECTORINTEGER INTEGER 数数INTEGER INTEGER 长长度度STD_LOGICSTD_LOGIC_VECTOR_VECTOR【例【例7-13】利用转换函数】利用转换函数CONV_INTEGER()完成的完成的3-8译码罪的设计译码罪的设计 LIBRARY IEEELIBRARY IEEE;USE IEEEUSE IEEESTD_LOGIC_1164STD_LOGIC_1164ALLALL;USE IEEEUSE IEEESTD_LOGIC_UNSIGNEDSTD_LOGIC_UNSIGNEDALLALL;ENTITY decoder3to8 ISENTITY decoder3to8 IS PORT(input PORT(input:IN STD_LOGIC_VECTOR(2 DWNTO 0)IN STD_LOGIC_VECTOR(2 DWNTO 0);output output:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)OUT STD_LOGIC_VECTOR(7 DOWNTO 0);END decoder3to8END decoder3to8;ARCHITECTURE behave OF decoder3to8 ISARCHITECTURE behave OF decoder3to8 IS BEGIN BEGIN PROCESS (input)PROCESS (input)BEGIN BEGIN output 0)output 0);output(CONV_INTEGER(input)=l output(CONV_INTEGER(input)0 AND i/=(m-1)GENERATE dffx:dff PORT MAP(x(i-1),clk,clrn,prn,x(i);END GENERATE u23;U4:IF (i=(m-1)GENERATE dffx:dff PORT MAP(x(i-1),clk,clrn,prn,b);END GENERATE u4;END GENERATE;