您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > 04可编程逻辑电路技术VHDL语言要素4hr
1主要内容4.1VHDL程序设计约定4.2VHDL数据对象4.3VHDL数据类型4.4数据类型转换4.5VHDL运算操作符4.6VHDL文字规则第4章VHDL语言要素2主要内容4.1VHDL程序设计约定4.2VHDL数据对象4.3VHDL数据类型4.4数据类型转换4.5VHDL运算操作符4.6VHDL文字规则第4章VHDL语言要素34.1VHDL程序设计约定每条VHDL语句由一个分号结束;对于VHDL编译器和综合器,文字大小写不加区分;注释使用双横线“--”,不参加编译和综合;为便于阅读与调试,使用层次缩进格式,同一层次的对齐,低层次比高层次缩进两个字符;MAX+plusII要求程序文件名必须与实体名一致,建议各源程序文件名均与其实体名一致。4主要内容4.1VHDL程序设计约定4.2VHDL数据对象4.3VHDL数据类型4.4数据类型转换4.5VHDL运算操作符4.6VHDL文字规则第4章VHDL语言要素5VHDL数据对象(DataObjects)用于接受不同数据的赋值。四种:常量、变量、信号和文件。1.常量(CONSTANT)常量指在设计实体中不会发生变化的值。一但被赋值后就不能再改变。格式:CONSTANT常数名:数据类型:=表达式CONSTANTVcc:REAL:=5.0;CONSTANTDALY:TIME:=100ns;CONSTANTFBUS:BIT_VECTOR:=”0101”;4.2VHDL数据对象赋值应与数据类型一致!!!6常量的可视性规则:可在程序包、实体说明、结构体和进程的说明区域进行说明,其使用范围取决于定义的位置。在程序包中定义的常量,具有最大的全局化特征,凡调用此程序包的所有设计实体均可使用;若定义在实体中,其有效范围为该实体对应的所有结构体;若定义在某结构体,只能用于该结构体内部语句;若定义在一个进程,则该常量只能用于该进程中。4.2VHDL数据对象72.变量(VARIABLE)变量是一个局部量,主要用于对中间数据的局部存储。(1)变量的定义语法格式VARIABLE变量名:数据类型:=初始值;例:VARIABLEA:INTEGER;--定义A为整数型变量VARIABLEB,C:INTEGER:=2;--定义B和C为整型变--量,初始值为2VARIABLEcount:INTEGERRANGE0TO255:=10;4.2VHDL数据对象8(2)变量赋值赋值语句的格式:VARIABLEx,y:REAL;VARIABLEa:BIT_VECTOR(0TO7);x:=100.0;--实数赋值,x是实数变量y:=1.5+x;--运算表达式赋值,y也是实数变量a(3TO6):=(‘1’,‘1’,‘0’,‘1’);--段赋值,注意赋值格式4.2VHDL数据对象目标变量名:=表达式9(3)变量使用的注意事项:变量只能在进程语句、过程语句和函数语句的说明区域中进行说明和使用;变量不能将信息带出对它作出定义的当前设计单元,若要带出,只能将其赋值给相同类型的信号;变量的赋值是立即发生,不存在延时,不支持变量附加延时语句。目标变量可以是单值变量或数组型变量;表达式与目标变量数据类型相同,可以是运算表达式,也可是一个数值;变量常用在实现某种算法的赋值语句中。4.2VHDL数据对象10例:Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;Entitysyncisport(clk:instd_logic;irq:outstd_logic);Endsync;Architecturertlofsyncissignaltemp:integer;BeginLabel1:processVariablecounter:integer:=0;BeginWaituntilclk=‘1’;counter:=counter+1;temp=counter;Endprocess;label2:processBeginWaituntilclk=‘1’;If(temp=15)thenirq=‘0’;Elseirq=‘1’;Endif;Endprocess;Endrtl;4.2VHDL数据对象11说明:根据输入时钟clk,产生周期为16倍的中断信号irq,中断信号宽度为1个时钟周期;进程Lable1用来计数,当clk发生变化且为1时启动该进程,执行counter的加1操作;进程Label2产生中断信号irq,当计数器temp计满16个时钟周期,将irq置0并持续1个时钟周期;counter为进程Label1的变量,不能在Label2中使用。在结构体中定义一个信号temp,将变量counter的值赋给它,将其值带出进程Label1。4.2VHDL数据对象12程序仿真结果:4.2VHDL数据对象133.信号(SIGNAL)信号是实体间动态交换数据的手段,在物理上它对应着硬件设计中的一条硬件连接线。(1)信号的描述格式SIGNAL信号名:数据类型﹕=初始值;信号初始值的设置不是必需的,而且初始值仅在VHDL的行为仿真中有效。4.2VHDL数据对象14例:signalclock:std_logic:=‘0’;signalreset:std_logic:=‘1’;signaldata_bus:std_logic_vector(7downto0):=(others=‘1’);signaladdress_bus:std_logic_vector(7downto0);4.2VHDL数据对象信号的赋值语句表达式如下:目标信号名=表达式;x=9;z=xAFTER5ns;15(2)信号使用注意信号初始化时采用“:=”,程序中信号值的代入将采用代入符“=”。信号可以连续赋值,其值在设计实体中可以改变,这一点与常量不同。当没有被赋初值时,默认取该类型的最左值或最小值。如:前面的第4个信号没指定初始值,则信号address_bus取默认值“UUUUUUUU”,93版的“std_logic”有9种值:‘U’(未初始化)、‘X’(强未知)、‘0’(强0)、‘1’(强1)、‘Z’(高阻)、‘W’(弱未知)、‘L’(弱0)、‘H’(弱1)、‘-’(任意项)。4.2VHDL数据对象164.2VHDL数据对象(3)信号说明的位置信号可以在程序包、实体说明部分、结构体的说明区域中进行说明,进程和子程序不许定义信号;程序包中说明的信号可由任何实体、结构体所引用;在实体说明中定义的信号在该实体的任何结构体中引用;在结构体中说明的信号只能被该结构体内部语句引用。端口只是一种附加了数据流动的方向的隐性信号,输出端口不能读入数据,输入端口不能被赋值,信号可以看成是实体内部的“端口”,无数据流动方向。17需要特别注意的是,在进程中,只能将信号列入敏感表,而不能将变量列入敏感表,这是因为只有信号才能把进程外的信息带入进程内部。目标信号获得传入的数据要经历延时过程。综合器在综合过程中将略去所设的延时值,在综合后的功能仿真中,信号或变量间的延时是看成零延时的,但为了给信息传输的先后作出符合逻辑的排序,将自动设置一个小的延时量,即所谓的δ延时量(VHDL模拟器的最小分辩时间)。4.2VHDL数据对象18(4)信号与变量的区别:信号和变量都可以被连续地赋值。信号赋值:信号名=表达式;变量赋值:变量:=表达式;允许两者之间互相赋值,但要保证两者类型一致;信号赋值有一定延迟,变量赋值无延迟;信号除当前值外还有许多相关值,如历史信息等,变量只有当前值;信号在程序包、实体说明和结构体说明部分定义,可以是多个进程的全局信号,而变量只在定义它的过程、函数和进程中可见;信号可看作硬件连线,变量无此对应关系。4.2VHDL数据对象19label1:processVariablea,b:=integer;Beginwaituntilclk=‘1’;a:=10;b:=20;a:=b;b:=a;Endprocess;signala,b:integer;label2:process(a,b)Variablea,b:=integer;Begina=10;b=20;waitfor10ns;a=b;b=a;waitfor10ns;Endprocess;4.2VHDL数据对象20说明:(1)进程label1,其结果为:a=20,b=20;(2)对进程label2,执行第1和第2条赋值语句后,a和b并没有直接得到初值,而在waitfor10ns语句后,信号a为10,b为20;在执行第3条赋值语句后,由于信号赋值有延迟,a的值并没有立即变化;紧接着执行第4条语句,此时a的值仍为10;在执行完waitfor10ns这一语句后,信号a和b的赋值语句生效。因此该进程的结果是:a=20,b=10。4.2VHDL数据对象21下面分析用不同的语句描述4选1多路选择器的VHDL程序。例:4-1多路选择器(采用变量赋值)Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;Entitymux4_varisport(d0:instd_logic_vector(7downto0);d1:instd_logic_vector(7downto0);d2:instd_logic_vector(7downto0);d3:instd_logic_vector(7downto0);s0:instd_logic;s1:instd_logic;q:outstd_logic_vector(7downto0);int:outintegerrange0to3);Endentitymux4_var;4.2VHDL数据对象22Architecturebehaveofmux4_varisBeginlabel1:process(d0,d1,d2,d3,s0,s1)variabletmp:integerrange0to3;begintmp:=0;if(s0='1')thentmp:=tmp+1;endif;if(s1='1')thentmp:=tmp+2;endif;int=tmp;casetmpiswhen0=q=d0;when1=q=d1;when2=q=d2;whenothers=q=d3;endcase;endprocesslabel1;Endbehave;4.2VHDL数据对象23程序仿真结果:4.2VHDL数据对象24例:4-1多路选择器(采用信号赋值)Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;Entitymux4_sigisport(d0:instd_logic_vector(7downto0);d1:instd_logic_vector(7downto0);d2:instd_logic_vector(7downto0);d3:instd_logic_vector(7downto0);s0:instd_logic;s1:instd_logic;q:outstd_logic_vector(7downto0);int:outintegerrange0to3);Endentitymux4_sig;4.2VHDL数据对象25Architecturebehaveofmux4_sigissiganltmp:integerrange0to3;Beginlabel1:process(d0,d1,d2,d3,s0,s1)begintmp=0;if(s0='1')thentmp=tmp+1;endif;if(s1='1')thentmp=tmp+2;endif;int=tmp;casetmpiswhen0=q=d0;when1=q=d1;when2=q=d2;when
本文标题:04可编程逻辑电路技术VHDL语言要素4hr
链接地址:https://www.777doc.com/doc-50743 .html