加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

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

2013/08/23
阅读需 6 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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

这个例子描述了一个简单的交通灯的时序控制,并且该交通灯有它自己的时钟产生器。
 

相关推荐

电子产业图谱

华清远见(www.farsight.com.cn)是国内领先嵌入师培训机构,2004年注册于中国北京海淀高科技园区,除北京总部外,上海、深圳、成都、南京、武汉、西安、广州均有直营分公司。华清远见除提供嵌入式相关的长期就业培训、短期高端培训、师资培训及企业员工内训等业务外,其下属研发中心还负责嵌入式、Android及物联网方向的教学实验平台的研发及培训教材的出版,截止目前为止已公开出版70余本嵌入式/移动开发/物联网相关图书。企业理念:专业始于专注 卓识源于远见。企业价值观:做良心教育、做专业教育,更要做受人尊敬的职业教育。