可综合的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内容搬到相应的地方去。
posted on 2012-04-20 14:57 lanlingshan 阅读(1672) 评论(0) 编辑 收藏 举报