版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
FPGA设计及应用西安科技大学通信与信息工程学院主代码2
概述第6章包集、元件和子程序
库声明
实体entity结构体
architecture
LIBRARY声明
包集PACKAGE
COMPONENTFUNCTIONPROCEDUREVHDL代码的基本组成配置configuration3
包集(package)包集的概念:已定义的常数、数据类型、元件调用说明、子程序的一个集合,类似于C语言中的“.h”文件(头文件);使用包集的目的:方便公共信息、资源的访问和共享。包集的主要内容:除了包含元件(component)、函数(function)和过程(procedure)之外,还可以包含类型(type)和常量(constant);元件、函数和过程的作用:经常使用的VHDL代码通常以这几种形式编写,从而可以被添加到包集中,然后被编译到目标library中,有利于代码分割、代码共享和代码重用;库:多个包集构成库。
4
package包集名is{声明:元件、函数、过程、类型和常量说明}
end包集名;
[packagebody包集名is{包体说明项:函数、过程的所有描述代码}
end包集名;]包集的语法结构包集的声明部分,必须包体,可选虽然包体是可选的,但是如果包集的声明部分有一个或多个函数、过程的声明,则在包体部分必须存在对应的描述代码;如果在包集的声明部分含有元件,则不必在包体中出现该元件的描述代码,元件的代码以完整的.vhd文件存在。package和对应的packagebody的名称必须相同!特殊注意:5---------------------------------libraryieee;useieee.std_logic_1164.all;packagemy_packageistypestateis(st1,st2,st3,st4);typecoloris(red,green,blue);constantvec:std_logic_vector(7downto0):=“11111111”;endmy_package;---------------------------------例1简单的程序包仅包含类型和常量声明的package,不需要使用packagebody!6libraryieee;useieee.std_logic_1164.all;packagemy_packageistypestateis(st1,st2,st3,st4);typecoloris(red,green,blue);constantvec:std_logic_vector(7downto0):=“11111111”;
functionpositive_edge(signals:std_logic)returnboolean;endmy_package;---------------------------------packagebodymy_packageis
functionpositive_edge(signals:std_logic)returnbooleanisbeginreturn(s’eventANDclk=‘1’);endpositive_edge;endmy_package;例2内部包含函数的packagelibraryieee;useieee.std_logic_1164.all;usework.my_package.all;---------------------------------entity..........................architecture...................package可以被编译成work或其它库中的一部分!包集中除了说明类型和变量之外,还包括了一个函数要使用自定义的包集,必须在主程序中加入一个use语句在包集中出现自定义函数时,须使用packagebody声明这个函数7元件声明的两种位置(或两种方法)a.在主代码段中声明b.在package中声明8例3在主代码中声明元件设计步骤:
编写几个基本组成模块(两个模块:h_adder/or2a)的.vhd文件;
在主代码中将这几个基本组成模块声明为元件;在主代码中实例化这些元件。9----------------文件h_adder.vhd-------------llibraryieee;useieee.std_logic_1164.all;entityh_adderis port(a,b:inSTD_LOGIC; co,so:outSTD_LOGIC);endh_adder;architecturefhofh_adderisbeginso<=axorb;co<=aandb;endfh;------------------------------------------------具体实现(1):两个待声明的.vhd文件----------------文件or2a.vhd-------------libraryieee;useieee.std_logic_1164.all;entityor2aisport(a,b:instd_logic;c:outstd_logic);endor2a;architectureoneofor2aisbeginc<=aorb;endone;---------------------------------------------注意:文件名、实体名必须一致!10具体实现(2):主.vhd文件,将前两个文件的代码作为元件加以实例化,用以实现新的功能。----------------主文件f_adder.vhd-------------libraryieee;useieee.std_logic_1164.all;entityf_adderis port(ain,bin,cin:instd_logic; cout,sum:outstd_logic); endentityf_adder;architecturefd1off_adderis componenth_adder port(a,b:instd_logic; co,so:outstd_logic); endcomponent;--对应文件h_adder.vhd componentor2a
port(a,b:inSTD_LOGIC; c:outSTD_LOGIC);endcomponent;
--对应文件or2a.vhdsignald,e,f:std_logic;------------------------------------------------注意:主文件名与其实体名必须一致,元件名称必须与元件所在文件的文件名及文件中的实体名一致!!----------------------------beginu1:h_adderportmap(a=>ain,b=>bin,co=>d,so=>e);--元件例化u2:h_adderportmap(a=>e,b=>cin,co=>f,so=>sum);u3:or2aportmap(a=>d,b=>f,c=>cout);endarchitecturefd1;-----------------------------------------------11例4在包集中声明元件设计步骤:
编写几个基本组成模块(两个模块:h_adder/or2a)的.vhd文件;
创建一个包集文件,在该包集中将这几个基本组成模块声明为元件;在主代码中use该包集;在主代码中实例化这些元件。虽多了一个包集文件,但可避免在主代码中每实例化一个元件就声明一次,在有多个主文件时很方便!!12具体实现:省略前两个.vhd文件----------------主文件f_adder.vhd-------------libraryieee;useieee.std_logic_1164.all;usework.my_components.all;entityf_adderis port(ain,bin,cin:instd_logic; cout,sum:outstd_logic); endentityf_adder;architecturefd1off_adderissignald,e,f:std_logic;beginu1:h_adderportmap(a=>ain,b=>bin,co=>d,so=>e);--元件例化u2:h_adderportmap(a=>e,b=>cin,co=>f,so=>sum);u3:or2aportmap(a=>d,b=>f,c=>cout);endarchitecturefd1;------------------------------------------------------包集文件my_components.vhd----------libraryieee;useieee.std_logic_1164.all;packagemy_componentsis-------------元件在包集中的声明-------componenth_adder port(a,b:instd_logic; co,so:outstd_logic);endcomponent;--对应文件h_adder.vhd------------------------------------------------componentor2a
port(a,b:inSTD_LOGIC; c:outSTD_LOGIC);endcomponent;
--对应文件or2a.vhd------------------------------------------------endmy_components;------------------------------------------------注意:主文件中包集名称必须与包集文件名及包集文件中包集定义名一致!例5用例化的方式实现4位全加器思考:怎样用1位全加器作为元件,实现如图所示4位全加器?例6用例化的方法实现异步复位的移位寄存器思考:怎样用异步复位D触发器作为元件,实现如图所示4位移位寄存器?15
子程序
函数(function)和过程(procedure)统称为子程序(subprogram)。子程序与进程的相同点:内部包含的都是顺序描述代码,使用相同的顺序描述语句,如if,case和loop(wait语句除外)。子程序与进程语句的区别:
在使用目的上:进程可以直接在主代码中使用;而子程序一般在建库时使用,以便代码重用和代码共享。当然子程序也是可以在主代码中直接建立和使用的。
在使用方法上:1、子程序不能从结构体的其余部分直接读写信号,所有通信都是通过子程序的接口来完成的;进程可以直接读写结构体内的其它信号。
2、子程序中不允许使用wait语句。
16子程序的存放位置:
Package、Architecture、Process子程序与硬件规模:与普通软件中子程序调用的区别:
普通软件子程序调用增加处理时间;
VHDL中每调用一次子程序,其综合后都将对应一个相应的电路模块。子程序调用次数与综合后的电路规模成正比。设计中应严格控制子程序调用次数。17子程序的类型:
过程(Procedure):0个或多个
in、inout、或out参数。可获得多个返回值。
函数(Function):
0个或多个in参数,一个return值。只能获得一个返回值。
过程可作为一种独立的语句结构而单独存在,函数通常作为表达式的一部分来调用。子程序包含两部分:子程序声明和子程序主体。18
函数(function)
一个函数就是一段顺序描述的代码。对于一些经常遇到的具有共性的设计问题,如数据类型转换、算术运算等,希望将其功能实现的代码被共享和重用,使主代码简洁并易于理解---函数。注意:由于在于每次调用函数时,都要首先对其进行初始化,即一次执行结束后再调用需再次初始化,即函数内部的值是不能保持的,因此在函数中禁止进行信号声明和元件实例化。函数的使用过程:先创建函数,再调用函数。19
函数的存放函数存放位置包集(+包体)主代码LIBRARYARCHITECTURE(声明部分)实体必须!20例1:在主代码中定义函数,可以出现在entity中,也可以出现在architecture中。如存放于architecture中的声明:libraryieee;useieee.std_logic_1164.all;entitydffisport(d,clk,rst:instd_logic;q:outstd_logic);enddff;architecturemy_archofdffis
functionpositive_edge(signals:std_logic)returnbooleanisbegin
return(s’eventands=‘1’);
endpositive_edge;beginprocess(clk,rst)beginif(rst=‘1’)thenq<=‘0’;elsifpositive_edge(clk)thenq<=d;endif;endprocess;endmy_arch;
21例2(1):在包集中定义函数,可以方便地被其它设计所重用和共享。注意:函数在package中声明,在packagebody中定义。---------------在包集中定义函数-------------------libraryieee;useieee.std_logic_1164.all;packagemy_packageis
functionpositive_edge(signals:std_logic)returnboolean;endmy_package;packagebodymy_packageis
functionpositive_edge(signals:std_logic)returnbooleanisbegin
return(s’eventands=‘1’);endpositive_edge;endmy_package;要先声明再定义22例2(2):在主代码中调用在包集中定义的函数。---------------在主代码中调用包集中定义的函数-------------------libraryieee;useieee.std_logic_1164.all;usework.my_package.all;entitydffisport(d,clk,rst:instd_logic;q:outstd_logic);enddff;architecturemy_archofdffisbeginprocess(clk,rst)beginif(rst=‘1’)thenq<=‘0’;elsifpositive_edge(clk)thenq<=d;endif;endprocess;endmy_arch;23例3:在包集中定义conv_integer()函数
libraryieee;useieee.std_logic_1164.all;packagemy_packageisfunctionconv_integer(signalvector:std_logic_vector)returninteger;endmy_package;packagebodymy_packageisfunctionconv_integer(signalvector:std_logic_vector)returnintegerisvariableresult:integerrange0to2**vector’length-1;beginif(vector(vector’high)=‘1’)thenresult:=1;elseresult:=0;endif;foriin(vector’high-1)downto(vector’low)loopresult:=result*2;if(vector(i)=‘1’)thenresult:=result+1;endif;endloop;returnresult;endconv_integer;endmy_package;24-------在主代码中调用包集中定义的函数-------libraryieee;useieee.std_logic_1164.all;usework.my_package.all;entityconv_int2isport(a:instd_logic_vector(0to3);y:outintegerrange0to15);endconv_int2;architecturemy_archofconv_int2isbegin
y<=conv_integer(a);endmy_arch;25例4:“+”函数:
功能描述:扩展预定义的“+”操作符,进行std_logic_vector类型数据的加法运算。实现方式:在包集中定义函数,在主代码中调用。-------在包集中定义函数----libraryieee;useieee.std_logic_1164.all;packagemy_packageisfunction“+”(a,b:std_logic_vector)returnstd_logic_vector;endmy_package;packagebodymy_packageisfunction“+”(a,b:std_logic_vector)returnstd_logic_vectorisvariableresult:std_logic_vector(3downto0);variablecarry:std_logic;begincarry:=‘0’;foriina’reverse_rangeloopresult(i):=a(i)XORb(i)XORcarry;carry:=(a(i)ANDb(i))OR(a(i)ANDcarry)OR(b(i)ANDcarry);endloop;returnresult;end“+”;endmy_package;比较特殊的函数名称26-------在主代码中调用包集中定义的函数--------------
libraryieee;useieee.std_logic_1164.all;usework.my_package.all;entityadd_bitisport(a:instd_logic_vector(3downto0);y:outstd_logic_vector(3downto0));endadd_bit;architecturemy_archofadd_bitis
CONSTANTb:std_logic_vector(3downto0):=“0011”;
CONSTANTc:std_logic_vector(3downto0):=“0110”;begin
y<=a+b+c;--重载“+”操作符endmy_arch;与通常的函数形式func(<参数列表>)有所不同!27
过程(procedure)
过程与函数的使用目的相似,也是希望将其功能实现的代码被共享和重用,使主代码简洁并易于理解。
过程通常用来定义一个算法,而函数用来产生一个具有特定意义的值;注意:过程与函数的主要差别就是过程可以有多个返回值。过程的使用过程:先定义过程,再调用过程。28
过程的存放过程存放位置包集(+包体)主代码LIBRARYARCHITECTURE(声明部分)实体必须!29例1:过程存放在主代码中min_maxinp1inp2min_outmax_outena多个输出,宜采用过程方式过程sort的功能描述:对输入两个8位的无符号整数进行比较,数值小的从min_out输出,数值大的从max_out输出。30代码实现:
--在主代码中存放过程libraryieee;useieee.std_logic_1164.all;entitymin_maxisgeneric(limit:integer:=255);port(ena:inbit;inp1,inp2:inintegerrange0tolimit;min_out,max_out:outintegerrange0tolimit);endmin_max;architecturemy_archofmin_maxis
proceduresort(signalin1,in2:inintegerrange0tolimit;signalmin,max:outintegerrange0tolimit)isbeginif(in1>in2)thenmax<=in1;min<=in2;elsemax<=in2;min<=in1;endif;endsort;beginprocess(ena)beginif(ena=‘1’)thensort(inp1,inp2,min_out,max_out);endif;endprocess;endmy_arch;名称可以不同,但顺序要一致!31例2:过程存放在包集中(续前例)-------在包集中定义过程sort------------libraryieee;useieee.std_logic_1164.all;PACKAGEmy_packageisCONSTANTlimit:integer:=255);PROCEDUREsort(signalin1,i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高中地理(高三二轮)·原因分析类主观题进阶教学设计
- 高二地理《自然环境的整体性》教学设计
- 环保项目公益募捐方案范本
- 景区经营规划方案范本
- 食堂检查机制方案范本
- 小区绿化更改方案范本
- 初中体育与健康·防溺水安全与应急救护基础教学设计
- 高中二年级德育《巳蛇蜕新映赤胆:以哪吒之志燎原高二征途》教学设计
- 高中地理必修第一册“植被”单元教案(第1课时)-以“解密植被密码”跨学科主题学习为例
- 寻脉千年·创承未来-初中综合实践活动七年级上册“传统文化体验项目”教学设计
- 2026内蒙古阿拉善盟事业单位招聘工作人员暨“智汇驼乡·鸿雁归巢”143人考试备考试题及答案解析
- 2026届河南省郑州市外国语中学中考数学适应性模拟试题含解析
- 慢性肾病诊疗指南(2026年版)基层规范化诊疗
- 景德镇景德镇市公安机关2025年招聘65名警务辅助人员笔试历年参考题库附带答案详解
- 幸福的教师培训课件
- 2026秋招:铜陵有色金属集团面试题及答案
- 【《基于SOR模型的电商直播对消费者购物行为的影响实证研究》17000字(论文)】
- 6.1认识经济全球化课件-2025-2026学年高中政治统编版选择性必修一当代国际政治与经济
- 2025年国资央企答题题库及答案
- 2025年贵州省员额检察官遴选考试真题及答案
- 20.5 跨学科实践:制作简易直流电动机 课件 2025-2026学年人教版物理九年级全一册
评论
0/150
提交评论