资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,*,第六讲,VHDL,硬件描述语言,_4,教学课时:,2,学时,教学内容:,VHDL,语句,(,1,)元件例化语句(,1,学时),(,2,)生成语句(,1,学时),元件例化语句,元件例化就是,将预先设计好的设计实体定义为一个元件,,,然后利用映射语句将此元件与另一个设计实体中的指定端口相连,,,从而进行层次化设计,。元件例化是使,VHDL,设计实体构成“自上而下”或“自下而上”层次化设计的一种重要途径。,元件例化语句分为元件声明和元件例化两部分。,用元件例化方式设计电路的方法是:,(,1,)完成各种元件的设计。,(,2,)元件声明。,(,3,)通过元件例化语句调用这些元件,产生需要的设计电路。,元件声明语句的格式,COMPONENT,元件名,GENERIC,;,PORT,;,END COMPONENT,;,元件例化语句的格式,元件例化就是将元件的引脚与调用该元件的端口的引脚相关联。关联方法有位置关联,名字关联,混合关联。,(,1,)位置关联方式,例化名:元件名,port map(,信号,1,,信号,2,,,.);,(,2,)名字关联方式,例化名:元件名,port map(,信号关联式,1,,信号关联式,2,,,.);,信号关联式形如:,a=a1,b=b1,意思是将元件的引脚,a,与调用该元件的端口,a1,相关联。这种情况下,位置可以是任意的。,(,3,)混合关联方式,将上述两种相结合,即为混合关联方式。,元件例化举例,例,1,:利用,2,输入与非门元件,设计,4,输入的与非与非电路。,方法一,:,在调用文件里声明元件,,它放在结构体的,begin,之前,。,第一步:设计,2,输入与非门,其,VHDL,源程序为,nand_2.vhd;,第二步:元件声明及元件例化,其,VHDL,源程序为,nand_4.vhd;,生成的,RTL,视图:,library,ieee,;,use ieee.std_logic_1164.all;,entity nand_2 is,port(a,b:in,std_logic,;,y:out,std_logic,);,end nand_2;,architecture one of nand_2 is,begin,process(a,b,),begin,y=a,nand,b;,end process;,end one;,library,ieee,;,use ieee.std_logic_1164.all;,entity nand_4 is,port(a,b,c,d:in,std_logic,;,y:out,std_logic,);,end nand_4;,architecture one of nand_4 is,-,元件声明,component nand_2,port(a,b:in,std_logic,;,y:out,std_logic,);,end component;-,元件声明,signal y1,y2:std_logic;,begin,u1:nand_2 port map(a,b,y1);-,元件例化,u2:nand_2 port map(c,d,y2);,u3:nand_2 port map(y1,y2,y);,end one;,例,1,:利用,2,输入与非门元件,设计,4,输入的与非与非电路。,方法,2,:将元件声明放在程序包里进行说明,第一步:设计,2,输入与非门,其,VHDL,源程序为,nand_2.vhd;,第二步:元件声明,放在程序包里,其,VHDL,源程序为,mypkg.vhd,;,第三步:元件例化,其,VHDL,源程序为,mynand_4.vhd;,程序包,(p228),在设计实体中声明的数据类型、数据对象只能用于本实体和结构体内部,不能被其他实体和结构体使用,就像高级语言中的局部变量一样。为了使数据类型、元件等能被多个设计实体调用或共享,,VHDL,提供了程序包的机制。程序包就像是公用的工具箱,各个设计实体都可使用其中定义的工具。,程序包的格式,package,程序包名,is,程序包头说明部分,end,程序包名,;,package body,程序包名,is,程序包体说明部分及包体内容,end,程序包名,;,如何打开程序包?,用语句,use work.,程序包名,.all,;,打开程序包。,其中,,work,库是用户设计的现行工作库,用于存放自己设计的工程项目。在,QuartusII,的根目录下为设计建立一个工程目录,(即文件夹),,VHDL,综合器将此目录默认为,work,库。但,work,不是设计项目的目录名,而是一个逻辑名。,VHDL,标准规定,work,库总是可见的,因此,在程序设计时不需要明确指定。,用将元件声明放在程序包里的设计方法设计,4,输入的与非与非门,详见演示实例,mynand_4.qpf,。,(1),在,QuartusII,的根目录下新建工程,mynand_4.,(2),编辑,VHDL,源程序文件,nand_2.vhd,mypkg.vhd,mynand_4.vhd.,nand_2.vhd,用来描述,2,输入与非门。,mypkg.vhd,用来进行元件声明。,mynand_4.vhd,实现元件例化。,library,ieee,;,use ieee.std_logic_1164.all;,entity nand_2 is,port(a,b:in,std_logic,;,y:out,std_logic,);,end nand_2;,architecture one of nand_2 is,begin,process(a,b,),begin,y=a,nand,b;,end process;,end one;,library,ieee,;,use ieee.std_logic_1164.all;,package,mypkg,is,component nand_2,port(a,b:in,std_logic,;,y:out,std_logic,);-,元件声明,end component;,end,mypkg,;,library,ieee,;,use ieee.std_logic_1164.all;,use,work.mypkg.all,;-,打开程序包,entity mynand_4 is,port(a,b,c,d:in,std_logic,;,y:out,std_logic,);,end mynand_4;,architecture one of mynand_4 is,signal y1,y2:std_logic;,begin,-,元件例化,u1:nand_2 port map(a,b,y1);,u2:nand_2 port map(c,d,y2);,u3:nand_2 port map(y1,y2,y);,end one;,思考题,用一位,D,触发器,利用元件例化语句实现,4,位移位寄存器。,思路:,(,1,)设计一位,D,触发器的源程序文件,shift_reg1.vhd,。,(,2,)用元件例化实现,4,位移位寄存器文件,shift_reg4.vhd,。,4,位,D,触发器的,VHDL,程序文件:,library,ieee,;,use ieee.std_logic_1164.all;,entity shift_reg4 is,port(clk:in,std_logic,;,D:in,std_logic,;,Q:out,std_logic,);,end shift_reg4;,architecture one of shift_reg4 is,component shift_reg1,port(clk:in,std_logic,;,D:in,std_logic,;,Q:out,std_logic,);,end component;-,元件声明,signal Q0,Q1,Q2:std_logic;,begin,-,元件例化,u0:shift_reg1 port map(clk,D,Q0);,u1:shift_reg1 port map(clk,Q0,Q1);,u2:shift_reg1 port map(clk,Q1,Q2);,u3:shift_reg1 port map(clk,Q2,Q);,end one;,1,位,D,触发器的,VHDL,程序文件:,library,ieee,;,use ieee.std_logic_1164.all;,entity shift_reg1 is,port(clk:in,std_logic,;,D:in,std_logic,;,Q:out,std_logic,);,end entity;,architecture one of shift_reg1 is,begin,process(clk,D,),begin,if,clkevent,and,clk,=1 then,Q=D;,end if;,end process;,end one;,生成语句,生成语句(,GENERATE,),是一种可以建立重复结构或者是在多个模块的表示形式之间进行选择的语句。由于生成语句可以用来产生多个相同的结构,因此使用生成语句就可以避免多段相同结构的,VHDL,程序的重复书写(,相当于复制,)。,生成语句有两种形式:,FOR-GENERATE,模式和,IF-GENERATE,模式。,FOR-GENERATE,模式的生成语句,FOR-GENERATE,模式生成语句的书写格式为:,标号:,FOR,循环变量,IN,离散范围,GENERATE,;,END GENERATE,标号,;,其中循环变量的值在每次的循环中都将发生变化;离散范围用来指定循环变量的取值范围,循环变量的取值将从取值范围最左边的值开始并且递增到取值范围最右边的值,实际上也就限制了循环的次数;循环变量每取一个值就要执行一次,GENERATE,语句体中的并行处理语句;最后,FOR-GENERATE,模式生成语句以保留字,END GENERATE,标号:,;来结束,GENERATE,语句的循环。,生成语句的典型应用是存储器阵列和寄存器。下面以四位移位寄存器为例,说明,FOR-GENERATE,模式生成语句的优点和使用方法。,4,位,D,触发器的,VHDL,程序文件:,library,ieee,;,use ieee.std_logic_1164.all;,entity shift_reg4 is,port(clk:in,std_logic,;,D:in,std_logic,;,Q:out,std_logic,);,end shift_reg4;,architecture two of shift_reg4 is,component shift_reg1,port(clk:in,std_logic,;,D:in,std_logic,;,Q:out,std_logic,);,end component;-,元件声明,signal y:std_logic_vector(0 to 4);,begin,y(0)=D;,u0:for i in 0 to 3 generate,元件生成,ux:shift_reg1 port map(clk,y(i),y(i+1);,end generate;,Q=y(4);,end two;,1,位,D,触发器的,VHDL,程序文件:,library,ieee,;,use ieee.std_logic_1164.all;,entity shift_reg1 is,port(clk:in,std_logic,;,D:in,std_logic,;,Q:out,std_logic,);,end entity;,architecture one of shift_reg1 is,begin,process(clk,D,),begin,if,clkevent,and,clk,=1 then,Q=D;,end if;,end proc
展开阅读全文