• 可综合的Task写法


    1、网上有人说Muxplus不可以综合Task语句,Quartus II可以综合Task语句,在翻看了夏宇闻的《Verilog数字系统设计教程》关于书中提到的可综合的Task写法似乎都是一个类型的,在Task里面并没有定义任何的输入输出类型以及变量。

    2、参考书中Task的写法,写了一个模拟陀螺仪的波形产生程序:

    GyroscopeWaveSimulation
      1 module WaveGenerate(clk,reset,gp_x_pos,gp_x_neg);
      2 input clk;
      3 input reset;
      4 output reg gp_x_pos;
      5 output reg gp_x_neg;
      6 
      7 /* 产生模拟陀螺仪波形时钟 */
      8 `define system_clk 50000000
      9 `define wave_div 600000
     10 reg wave_gen_clk;
     11 reg [15:0]clk_cnt;
     12 always @(posedge clk  or negedge reset)
     13 begin
     14     if(~reset)
     15         begin
     16         wave_gen_clk<=0;
     17         clk_cnt<=0;
     18         end
     19     else if(clk_cnt==`system_clk/`wave_div/2/2-1)
     20         begin
     21         wave_gen_clk<=~wave_gen_clk;
     22         clk_cnt<=0;
     23         end
     24     else 
     25         begin
     26         clk_cnt<=clk_cnt+1;
     27         end
     28 end
     29 /* 模拟陀螺仪波形状态机 */
     30 `define pos_first 2'b01
     31 `define neg_first 2'b10
     32 
     33 `define bit1 2'b00
     34 `define bit2 2'b01
     35 `define bit3 2'b10
     36 `define bit4 2'b11
     37 
     38 reg [1:0]work_state;
     39 reg [1:0]data_state;
     40 reg identifyer;
     41 always @(posedge wave_gen_clk or negedge reset)
     42 begin
     43     if(~reset)
     44         begin
     45         work_state<=`pos_first;
     46         data_state<=`bit1;
     47         gp_x_neg<=0;
     48         gp_x_pos<=0;
     49         identifyer<=0;
     50         end
     51     else 
     52         begin
     53         case (work_state)
     54         `pos_first:begin
     55                     if(~identifyer)
     56                         pos_first_cycle;
     57                     else 
     58                         begin
     59                         work_state<=`neg_first;
     60                         data_state<=`bit1;
     61                         identifyer<=0;
     62                         end
     63                     end
     64         `neg_first:begin
     65                     if(~identifyer)
     66                         begin
     67                         neg_first_cycle;
     68                         end
     69                     else 
     70                         begin
     71                         work_state<=`pos_first;
     72                         data_state<=`bit1;
     73                         identifyer<=0;
     74                         end
     75                     end
     76         default:begin
     77                 work_state<=`pos_first;
     78                 end
     79         endcase
     80         end
     81 end
     82 /* 正脉冲发送周期 */
     83 task pos_first_cycle;
     84     begin
     85             case (data_state)
     86             `bit1:begin
     87                     gp_x_pos <=1;
     88                     data_state <=`bit2;
     89                     end
     90             `bit2:begin
     91                     gp_x_neg<=1;
     92                     data_state<=`bit3;
     93                     end
     94             `bit3:begin
     95                     gp_x_pos<=0;
     96                     data_state<=`bit4;
     97                     end
     98             `bit4:begin
     99                     gp_x_neg<=0;
    100                     data_state<=`bit1;
    101                     identifyer<=1;
    102                     end
    103             default:begin
    104                     data_state<=`bit1;
    105                     end
    106             endcase
    107     end
    108 endtask
    109 /* 负脉冲发送周期 */
    110 task neg_first_cycle;
    111     begin
    112         case (data_state)
    113         `bit1:begin
    114                 gp_x_neg<=1;
    115                 data_state<=`bit2;
    116                 end
    117         `bit2:begin
    118                 gp_x_pos<=1;
    119                 data_state<=`bit3;
    120                 end
    121         `bit3:begin
    122                 gp_x_neg<=0;
    123                 data_state<=`bit4;
    124                 end
    125         `bit4:begin
    126                 gp_x_pos<=0;
    127                 data_state<=`bit1;
    128                 identifyer<=1;
    129                 end
    130         default:begin
    131                 data_state<=`bit1;
    132                 end
    133         endcase
    134     end
    135 endtask
    136 endmodule 

     最后观察示波器的波形正确。

    3、似乎这种Task写法就是将Task中的Case内容搬到相应的地方去。

  • 相关阅读:
    ibatis报错
    struts配置时遇到的几个问题
    快乐工作,快乐生活
    浅谈协方差矩阵理解篇
    类成员变量初始化
    类对象所占内存空间总结
    const 成员函数
    Qt对话框QDialog
    const引用返回值
    Qt 对象间的父子关系
  • 原文地址:https://www.cnblogs.com/lanlingshan/p/2459336.html
Copyright © 2020-2023  润新知