第六讲VHDL硬件描述语言_4教学课时:2学时教学内容:VHDL语句(1)元件例化语句(1学时)(2)生成语句(1学时)元件例化语句元件例化就是将预先设计好的设计实体定义为一个元件,然后利用映射语句将此元件与另一个设计实体中的指定端口相连,从而进行层次化设计。元件例化是使VHDL设计实体构成“自上而下”或“自下而上”层次化设计的一种重要途径。元件例化语句分为元件声明和元件例化两部分。用元件例化方式设计电路的方法是:(1)完成各种元件的设计。(2)元件声明。(3)通过元件例化语句调用这些元件,产生需要的设计电路。元件声明语句的格式COMPONENT元件名[GENERIC参数说明;]PORT端口说明;ENDCOMPONENT;元件例化语句的格式元件例化就是将元件的引脚与调用该元件的端口的引脚相关联。关联方法有位置关联,名字关联,混合关联。(1)位置关联方式例化名:元件名portmap(信号1,信号2,.....);(2)名字关联方式例化名:元件名portmap(信号关联式1,信号关联式2,.....);信号关联式形如:a=a1,b=b1,意思是将元件的引脚a与调用该元件的端口a1相关联。这种情况下,位置可以是任意的。(3)混合关联方式将上述两种相结合,即为混合关联方式。元件例化举例例1:利用2输入与非门元件,设计4输入的与非与非电路。方法一:在调用文件里声明元件,它放在结构体的begin之前。第一步:设计2输入与非门,其VHDL源程序为nand_2.vhd;第二步:元件声明及元件例化,其VHDL源程序为nand_4.vhd;生成的RTL视图:libraryieee;useieee.std_logic_1164.all;entitynand_2isport(a,b:instd_logic;y:outstd_logic);endnand_2;architectureoneofnand_2isbeginprocess(a,b)beginy=anandb;endprocess;endone;libraryieee;useieee.std_logic_1164.all;entitynand_4isport(a,b,c,d:instd_logic;y:outstd_logic);endnand_4;architectureoneofnand_4is--元件声明componentnand_2port(a,b:instd_logic;y:outstd_logic);endcomponent;--元件声明signaly1,y2:std_logic;beginu1:nand_2portmap(a,b,y1);--元件例化u2:nand_2portmap(c,d,y2);u3:nand_2portmap(y1,y2,y);endone;例1:利用2输入与非门元件,设计4输入的与非与非电路。方法2:将元件声明放在程序包里进行说明第一步:设计2输入与非门,其VHDL源程序为nand_2.vhd;第二步:元件声明,放在程序包里,其VHDL源程序为mypkg.vhd;第三步:元件例化,其VHDL源程序为mynand_4.vhd;程序包(p228)在设计实体中声明的数据类型、数据对象只能用于本实体和结构体内部,不能被其他实体和结构体使用,就像高级语言中的局部变量一样。为了使数据类型、元件等能被多个设计实体调用或共享,VHDL提供了程序包的机制。程序包就像是公用的工具箱,各个设计实体都可使用其中定义的工具。程序包的格式package程序包名is程序包头说明部分end程序包名;packagebody程序包名is程序包体说明部分及包体内容end程序包名;如何打开程序包?用语句usework.程序包名.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实现元件例化。libraryieee;useieee.std_logic_1164.all;entitynand_2isport(a,b:instd_logic;y:outstd_logic);endnand_2;architectureoneofnand_2isbeginprocess(a,b)beginy=anandb;endprocess;endone;libraryieee;useieee.std_logic_1164.all;packagemypkgiscomponentnand_2port(a,b:instd_logic;y:outstd_logic);--元件声明endcomponent;endmypkg;libraryieee;useieee.std_logic_1164.all;usework.mypkg.all;--打开程序包entitymynand_4isport(a,b,c,d:instd_logic;y:outstd_logic);endmynand_4;architectureoneofmynand_4issignaly1,y2:std_logic;begin--元件例化u1:nand_2portmap(a,b,y1);u2:nand_2portmap(c,d,y2);u3:nand_2portmap(y1,y2,y);endone;思考题用一位D触发器,利用元件例化语句实现4位移位寄存器。思路:(1)设计一位D触发器的源程序文件shift_reg1.vhd。(2)用元件例化实现4位移位寄存器文件shift_reg4.vhd。4位D触发器的VHDL程序文件:libraryieee;useieee.std_logic_1164.all;entityshift_reg4isport(clk:instd_logic;D:instd_logic;Q:outstd_logic);endshift_reg4;architectureoneofshift_reg4iscomponentshift_reg1port(clk:instd_logic;D:instd_logic;Q:outstd_logic);endcomponent;--元件声明signalQ0,Q1,Q2:std_logic;begin--元件例化u0:shift_reg1portmap(clk,D,Q0);u1:shift_reg1portmap(clk,Q0,Q1);u2:shift_reg1portmap(clk,Q1,Q2);u3:shift_reg1portmap(clk,Q2,Q);endone;1位D触发器的VHDL程序文件:libraryieee;useieee.std_logic_1164.all;entityshift_reg1isport(clk:instd_logic;D:instd_logic;Q:outstd_logic);endentity;architectureoneofshift_reg1isbeginprocess(clk,D)beginifclk'eventandclk='1'thenQ=D;endif;endprocess;endone;生成语句生成语句(GENERATE)是一种可以建立重复结构或者是在多个模块的表示形式之间进行选择的语句。由于生成语句可以用来产生多个相同的结构,因此使用生成语句就可以避免多段相同结构的VHDL程序的重复书写(相当于‘复制’)。生成语句有两种形式:FOR-GENERATE模式和IF-GENERATE模式。FOR-GENERATE模式的生成语句FOR-GENERATE模式生成语句的书写格式为:[标号:]FOR循环变量IN离散范围GENERATE并行处理语句;ENDGENERATE[标号];其中循环变量的值在每次的循环中都将发生变化;离散范围用来指定循环变量的取值范围,循环变量的取值将从取值范围最左边的值开始并且递增到取值范围最右边的值,实际上也就限制了循环的次数;循环变量每取一个值就要执行一次GENERATE语句体中的并行处理语句;最后FOR-GENERATE模式生成语句以保留字ENDGENERATE[标号:];来结束GENERATE语句的循环。生成语句的典型应用是存储器阵列和寄存器。下面以四位移位寄存器为例,说明FOR-GENERATE模式生成语句的优点和使用方法。4位D触发器的VHDL程序文件:libraryieee;useieee.std_logic_1164.all;entityshift_reg4isport(clk:instd_logic;D:instd_logic;Q:outstd_logic);endshift_reg4;architecturetwoofshift_reg4iscomponentshift_reg1port(clk:instd_logic;D:instd_logic;Q:outstd_logic);endcomponent;--元件声明signaly:std_logic_vector(0to4);beginy(0)=D;u0:foriin0to3generate—元件生成ux:shift_reg1portmap(clk,y(i),y(i+1));endgenerate;Q=y(4);endtwo;1位D触发器的VHDL程序文件:libraryieee;useieee.std_logic_1164.all;entityshift_reg1isport(clk:instd_logic;D:instd_logic;Q:outstd_logic);endentity;architectureoneofshift_reg1isbeginprocess(clk,D)beginifclk'eventandclk='1'thenQ=D;endif;endprocess;endone;例:FOR-GENERATE模式生成语句应用.用1位D触发器设计4位移位寄存器。可以看出用FOR-GENERATE模式生成语句替代思考题中的四条元件例化语句,使VHDL程序变的更加简洁明了。IF-GENERATE模式生成语句IF-GENERATE模式生成语句的书写格式如下:[标号:]IF条件GENERATE并行处理语句;ENDGENERATE[标号];思考题设计一位二进制全加器,然后利用for-generate生成语句实现4位二进制全加器,并仿真验证设计结果。libraryieee;useieee.std_logic_1164.all;entityadder_1isport(a,b:instd_logic;cin:instd_logic;cout:outstd_logic;s:outstd_logic);endadder_1;architectureoneofadder_1issignaltemp:std_logic_vector(2downto0);beginprocess(a,b,cin)begintemp=a&b&cin;iftemp=011ortemp=101ortemp=110ortemp=111thencout='1';elsecout='0';endif;s=axorbxorcin;endprocess;endone;一位二进制全加器的VHDL代码libraryieee;useieee.std_lo