0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

讲解function任务的用法

e9Zb_gh_8734352 ? 来源:FPGA技术联盟 ? 作者:FPGA技术联盟 ? 2021-04-02 09:02 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本系列文章主要针对FPGA初学者编写,包括FPGA的模块书写、基础语法、状态机、RAMUART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解,旨在更快速的提升初学者在FPGA开发方面的能力,每一个章节中都有针对性的代码书写以及代码的讲解,可作为读者参考。

18

第十八章:function

function说明语句

function说明语句的用途就是要返回一个值,然后把这个值用在表达式中。本章讲解function任务的用法。

不同点

任务和函数主要的不同点如下:

1、function中不能包含时序控制语句,而task任务可以包含时序控制语句;

2、function不能调用task任务,而task任务能调用function语句;

3、function至少要有一个input类型的参数,不能有output和inout类型的参数。而task任务可以没有参数,也可以有多个类型的参数;

4、function返回一个值,而task任务则不返回值。

5、function只能对输入值返回一个结果值,而task可以支持多种用途,可以计算并返回多个结果值。使用task时,只能通过output和inout类型的参数把结果值传递回来。

function使用语法

定义任务的语法:

function<返回值的类型或范围>(函数名);
<端口说明语句>
<变量类型说明语句>

begin
<语句1>

<语句2>

………
end
endfunction

函数通过关键词 function 和 endfunction 定义。不允许输出端口声明(包括输出和双向端口),但可以有多个输入端口。<返回值的类型或范围>指定函数返回值的类型或位宽,是一个可选项,若没有指定,默认缺省值为宽度 1 bit的寄存器数据。(函数名)为所定义函数的名称,对函数的调用也是通过函数名完成的,并在函数结构体内部代表一个内部变量,函数调用的返回值就是通过函数名变量传递给调用语句。函数定义在函数内部会隐式定义一个寄存器变量,该寄存器变量和函数同名并且位宽也一致。函数通过在函数定义中对该寄存器的显式赋值来返回函数计算结果。

函数定义示例

1af4ba5c-8dcd-11eb-8b86-12bb97331649.png

函数的定义声明了与函数同名的,函数内部的寄存器。如在函数的声明语句中<返回值的类型或范围>为默认,则这个寄存器是1位的。否则是与函数定义中<返回值的类型或范围>一致的寄存器。函数的定义把函数返回值所赋值寄存器的名称初始化与函数同名的内部变量。上述代码示例定义了一个名为“function_use”的函数,把输入a的值低3bit赋给了返回值function_use。需要注意的是在函数定义时不能包含任何时间控制语句,即不能包含#,@,wait等。

函数调用

下面举例说明function 函数的定义与如何调用。

代码示例

函数的调用时通过将函数作为表达式中的操作数来实现的。调用格式如下:

<函数名> (<表达式>,……<表达式>)

1b5d95e0-8dcd-11eb-8b86-12bb97331649.png

1f4e4398-8dcd-11eb-8b86-12bb97331649.png

测试代码如下:

1f7e338c-8dcd-11eb-8b86-12bb97331649.png

仿真波形如图所示:

22fd3c4c-8dcd-11eb-8b86-12bb97331649.png

由仿真图可以看:

1、当 start 信号变成高电平的时候,state 状态由 0 跳变到 1 时,此时调用 load_data 函数,把 data_in 的值通过调用函数的方式赋给shift_data ,同时状态机状态跳转到 2。

2、当状态跳转到 2 的时候,此时调用shift 函数,把 shift_data 的值通过调用函数的方式往左移一位后赋给shift_data ,同时状态机状态跳转到 3。

3、当状态跳到 3 的时候,调用 load_data 函数,把 shift_data 的值通过调用函数的方式赋值给data_out ,同时状态机状态跳转到 0。

4、最终结果:

8‘hF0左移1位,data_out=8‘hE0。

8‘hFF左移1位,data_out=8‘hFE。

责任编辑:lq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1646

    文章

    22107

    浏览量

    621121
  • Function
    +关注

    关注

    0

    文章

    14

    浏览量

    10154
  • 变量
    +关注

    关注

    0

    文章

    614

    浏览量

    29084

原文标题:FPGA入门系列18--function

文章出处:【微信号:gh_873435264fd4,微信公众号:FPGA技术联盟】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    同步任务开发指导

    {// 调用静态类对象中实现的同步等待调用Handle.syncSet(num);return true;}// 步骤2: 创建任务并执行async function asyncGet(): Promise
    发表于 06-19 07:57

    I/O密集型任务开发指导

    使用异步并发可以解决单次I/O任务阻塞的问题,但是如果遇到I/O密集型任务,同样会阻塞线程中其它任务的执行,这时需要使用多线程并发能力来进行解决。 I/O密集型任务的性能重点通常不在于
    发表于 06-19 07:19

    CPU密集型任务开发指导

    CPU密集型任务是指需要占用系统资源处理大量计算能力的任务,需要长时间运行,这段时间会阻塞线程其它事件的处理,不适宜放在主线程进行。例如图像处理、视频编码、数据分析等。 基于多线程并发机制处理CPU
    发表于 06-19 06:05

    【RA4L1-SENSOR】05 按键实现RTOS任务切换

    是只做了两个任务来回切换,之后再完善多任务切换的。 #include \"Key_Switch_Task.h\" /* KeySwitch entry function
    发表于 06-16 22:38

    在IAR Arm开发工具链中--function_sections编译选项的使用

    本文主要介绍在IAR Arm开发工具链中不修改源代码的情况下使用??function_sections编译选项把函数放到单独的section。
    的头像 发表于 06-13 13:53 ?1153次阅读
    在IAR Arm开发工具链中--<b class='flag-5'>function</b>_sections编译选项的使用

    harmony OS NEXT-Navagation基本用法

    # Navagation基本用法 > Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含了标题栏,内容栏和公工具栏,其中内容区默认首页显示导航内容
    的头像 发表于 04-27 17:39 ?387次阅读

    Linux中文本处理命令的用法

    Linux 三剑客是(grep,sed,awk)三者的简称,熟练使用这三个工具可以提升运维效率。Linux 三剑客以正则表达式作为基础,而在Linux系统中,支持两种正则表达式,分别为“标准正则表达式”和“扩展正则表达式”。在掌握好正则表达式后,将具体讲解三剑客的用法
    的头像 发表于 04-15 10:22 ?343次阅读
    Linux中文本处理命令的<b class='flag-5'>用法</b>

    Linux计划任务cron详解

    cron是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的
    的头像 发表于 02-07 15:31 ?1139次阅读
    Linux计划<b class='flag-5'>任务</b>cron详解

    DAC7562的CLR引脚怎么用法?可以悬空吗?

    DAC7562的CLR引脚怎么用法?可以悬空吗?能不能详细解释一下?谢谢
    发表于 12-17 08:16

    Linux计划任务介绍

    1.计划任务(定时任务)基本概述 1.什么是crond crond就是计划任务,类似于我们平时生活中的闹钟。定点执行。 2.为什么要使用crond?crond主要是做一些周期性的任务
    的头像 发表于 11-24 15:49 ?876次阅读

    Linux lsof命令的基本用法

    在 linux 系统中,一切皆文件。通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以 lsof 命令不仅可以查看进程打开的文件、目录,还可以查看进程监听的端口等 socket 相关的信息。本文将介绍 lsof 命令的基本用法,本文中 demo 的演示环境为 ubuntu 18.04。
    的头像 发表于 10-23 11:52 ?1560次阅读
    Linux lsof命令的基本<b class='flag-5'>用法</b>

    共模电感的用法

    呈现出大电感,具有抑制作用,而对于差模信号则呈现出很小的漏电感,几乎不起作用。以下是对共模电感用法的详细探讨。
    的头像 发表于 10-17 15:12 ?2323次阅读

    干货篇:低功耗4G模组Air780E的串口通信

    ? 今天我们来讲解低功耗4G模组Air780E的串口通信的基本用法,小伙伴们,学起来吧!
    的头像 发表于 10-05 14:38 ?1270次阅读
    干货篇:低功耗4G模组Air780E的串口通信

    Sn74hc245具体的用法是什么?

    Sn74hc245是缓冲器,但是具体的用法不会
    发表于 09-10 07:32

    电感技术的讲解

    详细讲解电感的原理及计算
    的头像 发表于 09-06 02:07 ?3041次阅读
    电感技术的<b class='flag-5'>讲解</b>