讲解function任务的用法

电子说

1.2w人已加入

描述

本系列文章主要针对FPGA初学者编写,包括FPGA的模块书写、基础语法、状态机、RAM、UART、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的寄存器数据。(函数名)为所定义函数的名称,对函数的调用也是通过函数名完成的,并在函数结构体内部代表一个内部变量,函数调用的返回值就是通过函数名变量传递给调用语句。函数定义在函数内部会隐式定义一个寄存器变量,该寄存器变量和函数同名并且位宽也一致。函数通过在函数定义中对该寄存器的显式赋值来返回函数计算结果。

函数定义示例

变量

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

函数调用

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

代码示例

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

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

变量

 

变量

测试代码如下:

变量

仿真波形如图所示:

变量

由仿真图可以看:

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

 

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分