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
    +关注

    关注

    1625

    文章

    21664

    浏览量

    601677
  • Function
    +关注

    关注

    0

    文章

    14

    浏览量

    9897
  • 变量
    +关注

    关注

    0

    文章

    613

    浏览量

    28327

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

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

收藏 人收藏

    评论

    相关推荐

    linux定时任务用法总结

    习惯了使用 windows 的计划任务,使用 linux 中的 crontab 管理定时任务时很不适应。
    的头像 发表于 08-14 18:16 797次阅读
    linux定时<b class='flag-5'>任务</b>的<b class='flag-5'>用法</b>总结

    Allegro X 23.11 版本更新 I 原理图设计:变体及 function 的创建与管理

    的新功能及用法,助力您提升设计质量和设计效率。AllegroXSystemCapture系统级原理图设计变体及function的创建与管理在2
    的头像 发表于 06-22 08:12 885次阅读
    Allegro X 23.11 版本更新 I 原理图设计:变体及 <b class='flag-5'>function</b> 的创建与管理

    ESP32 IDF 4.3创建任务使用外部PSRAM分配内存,在任务里操作FLASH死机的原因?

    ESP32 IDF 4.3 创建任务使用外部PSRAM分配内存,在任务里操作FLASH一定会死机,请问是什么原因或者有这种限制吗 static StaticTask_t xTaskBuffer
    发表于 06-19 06:10

    三菱PLC传送指令的用法

    三菱PLC(可编程逻辑控制器)在工业自动化领域中扮演着至关重要的角色。其中,传送指令(MOV)作为PLC编程中的基础指令之一,其正确使用对于实现数据的准确、高效传输至关重要。本文将详细讲解三菱PLC传送指令(MOV)的用法,包括指令的功能、格式、应用示例及注意事项等,以帮
    的头像 发表于 06-18 09:41 3732次阅读

    verilog task和function区别

    : task的语法格式为:task [automatic|static] 数据类型 任务名称 (输入参数列表); function的语法格式为:函数数据类型 函数名称 (输入参数列表) task
    的头像 发表于 02-22 15:53 973次阅读

    verilog function函数的用法

    Verilog 是一种硬件描述语言 (HDL),主要用于描述数字电子电路的行为和结构。在 Verilog 中,函数 (Function) 是一种用于执行特定任务并返回一个值的可重用代码块。函数在
    的头像 发表于 02-22 15:49 5008次阅读

    verilog中function和task的区别

    非常相似,但它们在功能和使用方式上有一些重要的区别。 定义和声明方式不同: Function:使用关键字"function"来定义和声明。函数可以有一个或多个输入参数,可以有一个返回值。函数必须在声明之后直接定义,不能在其他函数或任务
    的头像 发表于 02-22 15:40 1759次阅读

    单片机定时器的用法

    本章以CW32通用定时器为例介绍单片机定时器的用法
    的头像 发表于 01-04 10:37 1340次阅读
    单片机定时器的<b class='flag-5'>用法</b>

    鸿蒙原生应用/元服务开发-短时任务

    : ${err.message}`); }) } 4.取消短时任务 function cancelSuspendDelay() { backgroundTaskManager.cancelSuspendDelay(id); }
    发表于 12-28 16:13

    verilog语法-如何使用function提高效率?

    function的作用返回一个数值,此数值由一串组合逻辑代码计算得到。
    的头像 发表于 12-25 15:27 2262次阅读
    verilog语法-如何使用<b class='flag-5'>function</b>提高效率?

    split在python中的用法

    split在python中的用法 split()是Python中一个非常常用的字符串函数,它能够根据指定的分隔符将一个字符串分割成多个子字符串,并返回一个包含这些子字符串的列表。本文将详细介绍
    的头像 发表于 12-25 15:12 1964次阅读

    sbit在单片机中的作用和用法

    sbit是单片机(Microcontroller)中的一个特殊功能寄存器位(Special Function Register Bit),用于控制特定IO引脚的输入输出方向及状态。本文将详细介绍
    的头像 发表于 12-20 09:35 1.7w次阅读

    pcb插针的用法

    pcb插针的用法
    的头像 发表于 12-13 16:58 1762次阅读

    开关和按钮的不同特点和用法

    开关和按钮的不同特点和用法! 开关和按钮是常见的电子设备或电器的组成部分,它们在控制电路或操作电子设备时起着关键的作用。虽然它们都用于控制电气电路的通断或启停,但它们之间存在一些不同的特点和用法
    的头像 发表于 12-11 10:40 1234次阅读

    oracle中substr函数用法

    字符串的源字符串,start_position是子字符串的起始位置,length是要提取的子字符串的长度(可选参数)。 下面将详细介绍SUBSTR函数的用法及示例。 基本用法 最简单的用法是只指定源
    的头像 发表于 12-05 16:57 1228次阅读