DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1303|回复: 0
打印 上一主题 下一主题

[待整理] 硬件描述语言Verilog HDL设计进阶之: Verilog HDL高级语法结构—任务

[复制链接]
跳转到指定楼层
楼主
发表于 2015-4-27 16:43:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
4.2  Verilog HDL高级语法结构——任务(TASK)
         
        如果传给任务的变量值和任务完成后接收结果的变量已定义,就可以用一条语句启动任务。任务完成以后控制就传回启动过程。如任务内部有定时控制,则启动的时间可以与控制返回的时间不同。
        任务可以启动其他的任务,其他任务又可以启动别的任务,可以启动的任务数是没有限制的。不管有多少任务启动,只有当所有的启动任务完成以后,控制才能返回。
         
        1.任务定义
        定义任务的语法如下:
          任务:
        task <任务名>;
              <端口及数据类型声明语句>
              <语句1>
              <语句2>
              ...
              <语句n>
        endtask
          这些声明语句的语法与模块定义中的对应声明语句的语法是一致的。
         
        2.任务调用及变量传递
        调用任务并传递输入/输出变量的声明语句的语法如下:
          <任务名>(端口1,端口2,...,端口n);
          下面的例子说明怎样定义任务和调用任务。
        任务定义如下所示:
          task  my_task;
             input a, b;
             inout  c;
             output d, e;
             …
             <语句>                 //执行任务工作相应的语句
             …
             c = foo1;            //赋初始值
             d = foo2;            //对任务的输出变量赋值
             e = foo3;
        endtask
          任务调用如下所示:
          my_task(v,w,x,y,z);
           
          任务调用变量(v、w、x、y、z)和任务定义的I/O变量(a、b、c、d、e)之间是一一对应的。当任务启动时,由v、w和x传入的变量赋给了a、b和c。当任务完成后的输出又通过c、d和e赋给了x、y和z。下面用一个具体的例子用来说明怎样在模块的设计中使用任务,使程序容易读懂。
           
          module traffic_lights;
              reg  clock, red, amber, green;
              parameter  on=1, off=0, red_tics=350,
              amber_tics=30,green_tics=200;
              initial    red=off;                          //交通灯初始化
              initial    amber=off;
              initial    green=off;
                always begin                                 //交通灯控制时序
                   red=on;                                  //开红灯
                   light(red,red_tics);                  //调用等待任务
                   green=on;                                //开绿灯
                   light(green,green_tics);              //等待
                   amber=on;                                //开黄灯
                   light(amber,amber_tics);              //等待
              end
                task  light(color,tics);                  //定义交通灯开启时间的任务
                   output  color;
                   input[31:0] tics;
                   begin
                        repeat(tics) @(posedge clock);  //等待tics个时钟的上升沿
                        color=off;                           //关灯
                   end
              endtask
                always begin                                //产生时钟脉冲的always块
                    #100 clock=0;
                    #100 clock=1;
              end
        endmodule
           
          这个例子描述了一个简单的交通灯的时序控制,并且该交通灯有它自己的时钟产生器。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-12-29 09:04 , 耗时 0.082871 秒, 18 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

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