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

    关注

    1610

    文章

    21390

    浏览量

    595435
  • Function
    +关注

    关注

    0

    文章

    14

    浏览量

    9855
  • 变量
    +关注

    关注

    0

    文章

    599

    浏览量

    28175

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

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

收藏 人收藏

    评论

    相关推荐

    三菱PLC传送指令的用法

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

    verilog task和function区别

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

    verilog function函数的用法

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

    verilog中function和task的区别

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

    pcb插针的用法

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

    Pipeline中throwIt的用法

    字如其名,来看下Pipeline中throwIt的用法,是怎么个丢弃方式。
    的头像 发表于 10-21 16:24 338次阅读
    Pipeline中throwIt的<b class='flag-5'>用法</b>

    元组的基础用法和进阶用法

    元组是 Rust 语言中一种非常有用的数据结构,它可以将多个不同类型的值组合在一起。本教程将介绍元组的基础用法和进阶用法,并结合示例代码进行讲解。 元组是一种有序的数据集合,其中每个元素可以
    的头像 发表于 09-30 16:49 675次阅读

    基于Rust语言Hash特征的基础用法和进阶用法

    ,包括Hash trait、HashMap、HashSet等,本教程将详细介绍Rust语言Hash特征的基础用法和进阶用法。 基础用法 使用Hash trait 在Rust语言中,Hash trait
    的头像 发表于 09-19 16:02 932次阅读

    基于select!宏的进阶用法

    宏,它可以让我们同时监听多个异步事件,一旦其中一个事件触发,就可以立即执行相应的代码。在本教程中,我们将详细介绍 select!宏的进阶用法,并提供多个示例来帮助您更好地理解和掌握这个宏的使用方法。 进阶用法 除了基础用法之外,
    的头像 发表于 09-19 15:35 401次阅读

    Stream模块的基础用法和进阶用法

    有用。在本教程中,我们将介绍 Stream 模块的基础用法和进阶用法,并提供示例。 基础用法 在本节中,我们将介绍 Stream 模块的基础用法,并提供基础示例。 从 Vec 中创建
    的头像 发表于 09-19 15:33 827次阅读

    SeaORM的基础用法

    可读性。 在本教程中,我们将介绍SeaORM的基本用法和进阶用法。我们将使用SQLite数据库来演示这些用法。 基础用法 在使用SeaORM之前,我们需要将其添加到我们的Rust项目
    的头像 发表于 09-19 14:37 1645次阅读

    SQLx在Rust语言中的基础用法和进阶用法

    SQLx是一个Rust语言的异步SQL执行库,它支持多种数据库,包括MySQL、PostgreSQL、SQLite等。本教程将以MySQL数据库为例,介绍SQLx在Rust语言中的基础用法和进阶用法
    的头像 发表于 09-19 14:32 3724次阅读

    SQLx的基础用法和进阶用法

    SQLx是一个Rust语言的异步SQL数据库访问库,支持多种数据库,包括PostgreSQL、MySQL、SQLite等。本教程将以SQLite为例,介绍SQLx的基础用法和进阶用法。 基础用法
    的头像 发表于 09-19 14:29 1597次阅读

    C语言中位运算符的高级用法(3)

    在上一篇文章中,我们介绍了|运算符的高级用法,本篇文章,我们将介绍^ 运算符的一些高级用法
    发表于 08-22 10:47 179次阅读
    C语言中位运算符的高级<b class='flag-5'>用法</b>(3)

    C语言中位运算符的高级用法(1)

    在上一篇文章中,我们介绍了&运算符的基础用法,本篇文章,我们将介绍& 运算符的一些高级用法
    发表于 08-22 10:44 211次阅读
    C语言中位运算符的高级<b class='flag-5'>用法</b>(1)