搜索
bottom↓
回复: 1

FPGA开发经验之task与funtion的使用

[复制链接]

出0入0汤圆

发表于 2014-7-13 16:27:50 | 显示全部楼层 |阅读模式
Task与funtion

task和function说明语句分别用来定义任务和函数。
--特点
1、利用任务和函数可以把一个很大的程序模块分解成许多小的任务和函数便于理解和调用。
2、输入、输出和总线信号的值可以传入、传出任务和函数。
3、任务和函数往往还是打的程序模块中在不同地点多次用到的相同的程序段。


--task和function区别
task和function的主要不同有以下四点:
1、function只能与主模块公用一个仿真时间单位,而task可以定义自己的仿真时间单位。
2、function不能启动task,而task可以启动其他的task和function。
3、function至少有一个输入变量,而task可以没有或者有多个任何类型的变量。
4、function返回一个值,而task则不返回值。

--目的
function的目的是通过返回一个值来响应输入信号的值。
task能支持多种目的,能计算多个结果值,这些结果值之恩能通过被调用的task的输出或者总线端口送出。

--举例
Verilog中模块使用函数时是把它当作表达式中的操作符,这个操作的结果就是这个函数的返回值。例如:
定义一个task或者function对一个16位的字进行操作,让高字节与低字节互换,把它变为另一个字(假定这个任务或函数名为:switch_bytes)。
task返回的新字是通过输出端口的变量,因此16位字字节互换任务的调用源码是这样的:
  switch_bytes(old_word,new_word);
任务switch_bytes把输入old_word的字的高低字节互换放入new_word端口输出。
function返回的新字是通过函数本身的返回值,因此16位字字节互换函数的调用源码是这样的:
  new_word = switch_butes(old_word);
函数switch_bytes把输入的old_word的字的高低字节互换后赋值给new_word。

Task语法定义任务语法如下:
任务:
task <任务名>;
  <端口及数据类型声明语句>;
  <语句1>;
  <语句2>;
  <语句3>;
  ...
  <语句n>;
Endtask
这些声明语句的语法与模块定于中的对应声明语句语法一致。
2、任务的调用及变量的传递
启动任务并传递输入输出变量的声明语句的语法如下:
任务的调用:
<任务名> (端口1,端口2,端口3,...,端口n);
--function说明
函数的目的是返回一个用于表达式的值。
定义函数的语法:
        function <返回值的类型和范围>(函数名);
          <端口说明语句>;
           begin
            <语句>
            ........
           end
         endfunction

Task调用实例
01        module traffic_lights;
02         reg clock;
03         reg red;
04         reg amber;
05         reg green;
06          
07         parameter  on = 1,
08           off = 0,
09           red_tics = 350,
10           amber_tics = 30,
11           green_tics = 200;
12          
13        //交通灯初始化
14         initial red=off;
15         initial amber=off;
16         initial green=off;
17        //交通灯控制时序
18        always begin
19         red=on; //开红灯
20         light(red,red_tics); //调用等待任务
21         green=on; //开绿灯
22         light(green,green_tics); //等待
23         amber=on; //开黄灯
24         light(amber,amber_tics); //等待
25        end
26        //定义交通灯开启时间的任务
27        task light(color,tics);
28         output color;
29         input[31:0] tics;
30          
31         begin
32          repeat(tics) @(posedge clock);//等待tics个时钟的上升沿
33          color=off;//关灯
34         end
35        endtask
36        //产生时钟脉冲的always块
37        always begin
38         #100 clock=0;
39         #100 clock=1;
40        end
41          
42        endmodule
Funtion调用实例
01        module tryfact;
02         //函数定义------------------------------
03        function [31:0] operand;
04         input [3:0] operand;
05         reg [3:0] index;
06         begin
07          factorial = operand ? 1 : 0;
08          for(index = 2; index <= operand; index = index + 1)
09          factorial = index * factorial;
10         end
11        endfunction
12        //函数的测试----------------------------------
13         reg [31:0] result;
14         reg [3:0] n;
15        initial begin
16         result = 1;
17         for (n = 2; n < 9; n = n + 1) begin
18          $display ("Partial result n = %d result = %d",n,result);
19          result = n * factorial(n)/((n*2) + 1);
20         end
21         $display ("Finalresult = %d",result);
22        end
23        endmodule//模块结束


阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2014-7-15 09:43:16 | 显示全部楼层
这是抄书的吧
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 00:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表