已阅读5页,还剩41页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1、11章的函数和手续、函数(function )和手续(procedure )统称为子程序(subprogram )。 子程序和进程的共同点:内部包含顺序描述代码,使用相同的顺序描述语句,如if、case、loop(wait语句除外)。 子程序和进程语句的差异:使用目的:进程可以直接在主代码中使用。子程序通常用于创建库以用于代码的重用和代码共享。 当然子程序也可以通过主代码直接制作使用。 按照使用方法,第一子例程不能直接从结构的剩馀部分读写信号,而且通过子例程的接口发生的过程不能直接读写结构中的其他信号。 2 .在子程序中不能使用wait语句。 2、子程序的存储位置: Package、Architecture、程序子程序和硬件规模:与通常软件中的子程序调用的不同:通常软件子程序调用增加处理时间在VHDL中调用子程序子程序调用次数与合并后的电路规模成比例。 在设计中必须严格控制子程序调用次数。 知识点补充(1) :3,子程序的类型:过程: in、inout、out参数的数量在0个以上。 可以获取多个返回值。 函数: 0个或多个输入参数,返回值。 返回值只有一个。 过程可以作为独立的语句结构存在,函数通常作为表达式的一部分被调用。 子程序有两部分:子程序声明和子程序主体. 知识点补充(2) :4,每次调用子程序时,首先将其初始化,即一次执行结束后再重新开始调用。 因此,无法保持子程序内部的值。 知识点补充(3) :5,5,11.1函数,一个函数是一系列描述的代码。 对于常见的设计问题,例如数据类型转换、算术运算等,想实现其功能的代码被共享、重用,主代码简洁容易理解-函数。 注意:函数不允许信号声明和组件实例化,因为每次调用函数时,它们都首先进行初始化,也就是说,一次运行结束后再次进行初始化,也就是说,不能保存函数内部的值。 使用函数:先创建函数,然后调用函数。6、函数的创建:函数名称return数据类型IS声明BEGIN (顺序描述代码) END函数名称;=constant常数名称:常数类型=SIGNAL信号名称:信号类型,参数列表表示函数的输入参数。 输入参数的数量是任意的,没有参数也可以。输入参数的类型:变量不能是参数,可以是常数和信号。 语法如下: 7、在VHDL语言中,函数语句只能计算数值,不能更改参数值,因此该参数的模式只有IN,通常可以省略。 FUNCTION的输入值从调用方复制到输入参数中,如果没有特别指定,FUNCTION语句会用常数或信号来处理。 因此,输入参数不能是变量类型。 此外,由于函数的输入值从调用方复制到输入参数,因此输入参数不能指定值的范围。 8、函数的输出:使用RETURN语句。 语法结构如下:return表达式; return语句只能在子程序(函数或过程)中使用,用于结束一个子程序的执行。 如果用于函数,则必须返回值。 返回值的类型由return之后的数据类型指定。 9、创建函数示例:创建名为、f1的函数,并有三个输入参数a、b、c。 其中,a和b是常数(关键字constant是可选的),c是信号。 输出参数(只有一个)为布尔型。 functionf1(a,b:integer; signal LC : STD _ logic _ vector ) returnboleanisbegin (顺序描述代码) ENDf1; 不能指定范围、没有变量类型、10、函数调用:函数可以独立地组成表达式,也可以作为表达式的一部分来调用。xmax(a ), b).-公式的一部分,11,示例11.1:positive_edge ()函数时钟上升边缘检测函数, 可以用于d触发器的设计-函数位置_ edge (signal ls : STD _ logic )返回boleanisbeginreturn (s) endpositive_edge; 对函数的调用-if positive _ edge (clk ) then.12,示例11.2:conv_integer ()函数, 可以将std_logic_vector类型的数据转换为integer类型并处理任意宽度和方向的输入向量:- -函数conv _ integer (signal vector : STD _ logic _ vector ) returnintegerisvariablesresult :智能范围0 to2* *向量长度- 1; begin if (矢量)=1thenresult :=1; elseresult:=0; endif; fori in (向量高-1)下降到(向量低) loop result :=result * 2; if (向量(I )=1) thenresult :=result 1; endif; 结束环; 返回结果; endconv_integer; - -y=conv _ integer (a )注意:不能在输入参数列表中指定信号的范围。 注意:不能在内部声明信号。 注意:虽然不知道输入信号的范围,但在调用函数时可以使用slength获取输入参数的具体范围。 必须存储13,11.2函数,14,示例11.3 :可以在主代码中定义函数,并在entity或architecture中显示该函数。 存储在architecture中的声明: libraryieee; useieee.std_logic_1164.all; entitydffisport(d,clk,rst:instd_logic; q :输出STD _ logic; enddff; architecture my _ archofdfisfunctionpositive _ edge (signal ls : STD _ logic ) returnboleanisbeginreturn (sevent ands=1); endpositive_edge; begin处理(clk,rst ) begin if (rst=1) thenq=0电子定位_ edge (clk ) thenq=d; endif; 结束处理; endmy_arch; 另外,15,例子11.4(1) :一旦在包集中定义了函数,它就被其他设计简单地重用和共享。 注意:函数在package中声明并在packagebody中定义。 函数-library IEEE; useieee.std_logic_1164.all; 数据包my _数据包isfunctionpositive _ edge (信号ls : STD _ logic )返回布尔; endmy_package; packagebodyy _ packageisfunctionpositive _ edge (signal ls : STD _ logic ) returnboleanisbeginreturn (sevent ands=1); endpositive_edge; endmy_package; 声明、重定义、16、示例11.4(2) :调用主代码中在包集中定义的函数。 -在主代码中在包集中定义的函数-libraryieee; useieee.std_logic_1164.all; usework.my_package.all; entitydffisport(d,clk,rst:instd_logic; q :输出STD _ logic; enddff; architecture my _ archofdfisbeginprocess (clk,rst ) begin if (rst=1) thenq=0; elsifpositive_edge(clk)thenq=d; endif; 结束处理; endmy_arch;17、例11.5 :在分组集中包含conv_integer ()函数、libraryieee; useieee.std_logic_1164.all; 包my _包包isfunctionconv _ integer (信号向量: STD _ logic _ vector )返回整数; endmy_package; packagebodyy _ packageisfunctionconv _ integer (信号向量: STD _ logic _ vector ) returnintegerisvariableresult : integer ra begin if (矢量)=1thenresult :=1; elseresult:=0; endif; fori in (向量高-1)下降到(向量低) loop result :=result * 2; if (向量(I )=1) thenresult :=result 1; endif; 结束环; 返回结果; endconv_integer; endmy_package; 在主代码中定义的函数- library IEEE; useieee.std_logic_1164.all; usework.my_package.all; entity conv _ int2isport (a : instd _ logic _ vector (0to3) y : outintegerrange0to 15; endconv_int2; architecture my _ archofconv _ int2isbeginy=conv _ integer (a ) endmy _ arch;18、例11.6 :“”函数:功能说明:扩展定义的“”运算符,进行std_logic_vector型数据的相加。 实现方法:在包集中定义函数,并通过主代码调用。函数-library IEEE; useieee.std_logic_1164.all; packagemy_packageisfunction(a,b : STD _ logic _ vector ) return STD _ logic _ vector; endmy_package; packagebodyy _ packageisfunction “(a,b : STD _ logic _ vector ) return STD _ logic _ vectorvariableresult : STD _ logic _ vector (begin carry :=0reverse _ rangelooppresult (I ) :=a (I ) xorb (I ) xor carry; carry :=(a ) andb (I ) ) or (a ) and carry (b ) and carry (I ) end loop; 返回结果; 结束 ; endmy_package; 比较特殊的函数名,19,-在主代码中在包集中定义的函数- library IEEE; useieee.std_logic_1164.all; usework.my_package.all; 实体附加_比特(a :安装_逻辑_向量(3下载到0 ) y :输出STD _逻辑_向量(3下载到0 ) ); endadd_bit; architecture my _ archofadd _ bitisconstantb : STD _ logic _ vector (3down to0) :=“0011”) constant c:STD _ logic _ vector (3down to0) thenproc_add(in1,in2,out_carry,out_sum )、25,11.4进程的存储与函数相同! 另外,26,例11.9 :过程存储在主码中,多个输出应采用过程方式,过程sort的功能描述:输入2个8位,比较无符号整数,数值小的一方从min_out输出,数值大的一方从max_out输出、27、代码实现:- useieee.std_logic_1164.all; entity min _ maxis generic (限制: integer :=255 )端口(ENA : in位; inp1、InP 2: inintegerrange0to limit; 最小_ out,最大_ out :输出限制; endmin_max; architecture my _ archofmin _ maxis procedur
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 31595-2025安全与韧性业务连续性管理体系GB/T 30146使用指南
- 2025解除合同公函示范文
- 刀口愈合护理方法
- 贫血常见症状及护理指导手册
- 2025版急性肾小管坏死诊疗与护理指南
- 保安消防安全培训
- 2025版子宫内膜异位症症状解析及护理计划
- 2025年上海安全知识竞赛考试复习题库及答案
- 2025版产前诊断与遗传咨询知识检测答案及解析
- 幼儿科普紫荆花
- JT-T 1409-2022 城市轨道交通运营应急能力建设基本要求
- 2024年助理值班员(中级)技能鉴定理论题库(含答案)
- 高三4月模考“青春的样子”审题立意及范文
- 安环个人述职报告
- 确保体育馆钢结构预埋件施工质量QC成果
- 高中化学选修5:有机化学基础 应用广泛的高分子材料【全国一等奖】
- 预防接种工作规范(2023年版)解读课件
- 数学史选讲解读课件
- 餐饮舞台策划方案
- 数据存储与备份解决方案
- 木工协议书范文精简处理
评论
0/150
提交评论