- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
SOC原理及應用实验指导书(修订实验3)
实验三 函数和任务的应用设计
一、实验目的
1.掌握函数在模块设计中的使用;
2.掌握任务在结构化Verilog HDL设计中的应用。
二、实验原理
1.函数在模块设计中的使用
函数可以在模块不同位置执行共同代码。函数只能返回一个值,它不能包含任何时延或时序控制(必须立即执行),并且它不能调用其它的任务。
函数必须带有至少一个输入,在函数中允许没有输出或输入输出说明。函数可以调用其它的函数。
函数说明部分可以在模块说明中的任何位置出现,函数的输入是由输入说明指定。如果函数说明部分中没有指定函数取值范围,则其缺省的函数值为1位二进制数。函数定义在函数内部隐式地声明一个寄存器变量,该寄存器变量与函数同名并且取值范围相同。函数通过在函数定义中显式地对该寄存器赋值来返回函数值。对这一寄存器的赋值必须出现在函数定义中。
函数调用是表达式的一部分。与任务相似,函数定义中声明的所有局部寄存器都是静态的,即函数中的局部寄存器在函数的多个调用之间保持它们的值。
2.任务在结构化设计中的应用
一个任务就像一个过程,它可以从描述的不同位置执行共同的代码段。共同的代码段用任务定义编写成任务,这样它就能够从设计描述的不同位置通过任务调用被调用。任务可以包含时序控制,即时延控制,并且任务也能调用其它任务和函数。
任务可以没有或有一个或多个参数。值通过参数传入和传出任务。除输入参数外(参数从任务中接收值),任务还能带有输出参数(从任务中返回值)和输入输出参数。任务的定义在模块说明部分中编写。
任务调用:
一个任务由任务调用语句调用。任务调用语句给出传入任务的参数值和接收结果的变量值;
任务调用语句是过程性语句,可以在always 语句或initial 语句中使用;
任务调用语句中参数列表必须与任务定义中的输入、输出和输入输出参数说明的顺序匹配。此外,参数要按值传递,不能按地址传递;
任务能够包含定时控制,任务可在被调用后再经过一定时延才返回值;
任务调用语句是过程性语句,所以任务调用中的输出和输入输出参数必须是寄存器类型的;
任务可以带有时序控制,或等待特定事件的发生。但是,输出参数的值直到任务退出时才传递给调用参数。
三、实验仪器
序号 名称 型号与规格 数量 备注 1 计算机系统(PC机) Intel奔腾系列,1G内存 1 2 Quarues 6.0以上 1
四、实验内容
1.函数在模块设计中的使用
下例是函数调用的一个简单示范,采用同步时钟触发运算的执行,每个clk时钟周期都会执行一次运算。
模块源代码:
module tryfunct(clk,result,reset);
output[31:0] result;
input reset,clk;
reg[31:0] result;
always @(posedge clk) //clk的上沿触发同步运算。
begin
if(!reset) //reset为低时复位。
result=0;
else
begin
result = factorial(3);
end
end
function [31:0] factorial; //函数定义。
input [3:0] operand;
reg [3:0] index;
begin
factorial = operand ? 1 : 0;
for(index = 2; index = operand; index = index + 1)
factorial = index * factorial;
end
endfunction
endmodule
上例中函数factorial(n)实际上就是阶乘运算。必须提醒大家注意的是,在实际的设计中,我们不希望设计中的运算过于复杂,以免在综合后带来不可预测的后果。经常的情况是,我们把复杂的运算分成几个步骤,分别在不同的时钟周期完成。
2.任务在结构化设计中的应用
实例应用:利用task和电平敏感的always块设计比较后重组信号的组合逻辑。可以看到,利用task非常方便地实现了数据之间的交换,如果要用函数实现相同的功能是非常复杂的;另外,task也避免了直接用一般语句来描述所引起的不易理解和综合时产生冗余逻辑等问题。
模块源代码:
//----------------- sort4.v ------------------
module
您可能关注的文档
最近下载
- 年产3万吨黄桃罐头工厂设计.docx
- 浅谈政务信息化项目全过程咨询管理.pdf VIP
- [临沂]2024年山东临沂市直部分医疗卫生事业单位招聘笔试典型考题与考点研判含答案详解.docx
- 2022-2023学年人教版二年级数学下册第九单元 数学广角——推理测试卷含答案.docx
- 年产一万吨黄桃罐头工厂设计.docx VIP
- 2024年水泥质量与检验题库——简答题(二).docx
- 2025年云南省高等职业技术院校分类考试思想政治模拟卷(A4).doc VIP
- 钒钛磁铁矿冶炼渣选铁工艺及设备.docx VIP
- 新疆大学《计算机网络》2019-2020学年期末试卷.pdf VIP
- 水泥质量与检验题库--简答题(含答案).docx VIP
文档评论(0)