欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
pfm雙通道驅(qū)動(dòng) verilog源碼
[打印本頁(yè)]
作者:
yang420621
時(shí)間:
2021-2-17 14:36
標(biāo)題:
pfm雙通道驅(qū)動(dòng) verilog源碼
pfm雙通道驅(qū)動(dòng)源碼,驅(qū)動(dòng)雙通道igbt,4路pwm相差90度
module PFMc ( sclk, f_en1,f_en2,Tf_i,Ts_i,Fout1, Fout2 ,Fout3, Fout4
// ,test1
//,t1,test2
);
input sclk ; //晶振50M 20ns
input f_en1; //波形輸出封鎖信號(hào) 0封鎖輸出
input f_en2; //波形輸出封鎖信號(hào) 0封鎖輸出
input [18:1] Tf_i; //1000000/f us 最大1000000,最小25
//PWM頻率對(duì)應(yīng)周期 f最小1HZ,最大40K
input [6:1]Ts_i; //PWM周期 us 最大31
output reg Fout1 ; //通道1PWM輸出
output reg Fout2 ;
output reg Fout3 ; //通道2PWM輸出
output reg Fout4 ;
// output wire [28:1] test1;
// output wire [28:1] test2;
// output wire [12:1] t1;
//
// assign test1 = f_cnt;
// assign test2 = f_cnt3;
// assign t1 = f1;
reg f_cs1 = 1'd0; //通道1波形使能
reg f_cs2 = 1'd0; //通道2波形使能
reg f_en1_buffer = 1'd0; //通道1波形使能緩存
reg f_en2_buffer = 1'd0; //通道2波形使能緩存
reg rest_n=1'b0; //兩個(gè)通道同時(shí)關(guān)閉時(shí),計(jì)數(shù)復(fù)位,高復(fù)位
reg [27:1] f_cnt; //計(jì)數(shù)值
reg [11:1] f_cnt1 = 11'd0 ; //Ts高電平計(jì)數(shù)個(gè)數(shù)
reg [25:1] f_cnt2 = 25'd250 ; //Ts 低電平計(jì)數(shù)個(gè)數(shù)
reg [27:1] f_cnt3 ; //總計(jì)數(shù)值
reg f0 = 1'd0;
reg [11:1] f1=11'd0;
reg [26:1] f2=26'd0,f3=26'd0;
reg [25:1] f4=25'd0,f5=25'd0;
reg [27:1] f6=27'd0,f7=27'd0;
reg [11:1] f8=11'd0;
reg [18:1] Tf_buffer=18'd0;
reg [6:1]Ts_buffer=6'd0;
reg [18:1] Tf=18'd10000;
reg [6:1]Ts=6'd0;
always @( Ts or Tf ) begin //參數(shù)設(shè)置改變后,對(duì)參數(shù)初始化
f_cnt1 = Ts*50 ; //(Ts*1000)/20; //Ts高電平計(jì)數(shù)個(gè)數(shù)
f_cnt2 = Tf*25; //對(duì)應(yīng)1/2 f個(gè)周期計(jì)數(shù)個(gè)數(shù)
f_cnt3 = Tf*25<<2 ; //4個(gè)驅(qū)動(dòng)方波輸出周期
f0 = 1'd0; //4個(gè)電平翻轉(zhuǎn)狀態(tài) PFM1上升沿
f1 = Ts*50; //PFM1 下降沿
f2 = Tf*25<<1 ; //PFM2上升沿
f3= (Tf*25<<1)+Ts*50; //PFM2 下降沿
f4 =Tf*25; //PFM3上升沿
f5 =Tf*25+Ts*50; //PFM3 下降沿
f6 = (Tf*25<<1)+Tf*25; //PFM4上升沿
f7 = (Tf*25<<1)+Tf*25+Ts*50; //PFM4 下降沿
f8 = Ts*50-Tf*25;
end
always @( f_cs1 or f_cs2 ) begin //兩個(gè)通道都關(guān)閉時(shí),計(jì)數(shù)復(fù)位
rest_n = !(f_cs1 || f_cs2);
end
//pwm 低電平狀態(tài)下 使能信號(hào)生效
always@( posedge sclk or negedge Fout1 or negedge Fout2 or negedge Fout3 or negedge Fout4 ) begin
if( Fout1==1'b0 || Fout2==1'b0 )
f_cs1 <= f_en1_buffer ;
else f_cs1 <= 1'b1;
if( Fout3==1'b0 || Fout4==1'b0 )
f_cs2 <= f_en2_buffer ;
else f_cs2 <= 1'b1;
end
always@( posedge sclk or posedge rest_n ) begin //通道1 2循環(huán)
f_en1_buffer <= f_en1;
f_en2_buffer <= f_en2;
if( rest_n==1'b1 ) begin //封閉后計(jì)數(shù)復(fù)位
f_cnt <= 27'd0;
Tf_buffer <= Tf_i; //f,Ts數(shù)據(jù)緩存2個(gè)時(shí)鐘周期
Ts_buffer <= Ts_i;
end
else begin
if( f_cnt>=(f_cnt3+1'b1) ) begin //循環(huán)計(jì)數(shù)復(fù)位
f_cnt <= 27'd0;
Tf_buffer <= Tf_i;
Ts_buffer <= Ts_i;
end
else begin
f_cnt <= f_cnt+1'b1;
if( f_cnt==27'd10) begin
Tf<=Tf_buffer;
Ts<=Ts_buffer;
end
end
end
end
always@( posedge sclk ) begin //PWM輸出控制
if(f_cs1==1'b0) begin //通道1,
Fout1 <= 1'b0;
Fout2 <= 1'b0;
end
else begin
if( f_cs1 ) begin
case ( f_cnt )
f0: Fout1 <= 1'b1;
f1: Fout2 <= 1'b1;
f2: Fout1 <= 1'b0;
f3: Fout2 <= 1'b0;
endcase
end
else begin
Fout1 <= 1'b0;
Fout2 <= 1'b0;
end
end
if ( f_cs2 ==1'b0) begin //通道2
Fout3 <= 1'b0;
Fout4 <= 1'b0;
end
else begin
if( f_cs2 ) begin
case(f_cnt)
f4: Fout3 <= 1'b1;
f5: Fout4 <= 1'b1;
f6: Fout3 <= 1'b0;
f7: Fout4 <= 1'b0;
endcase
if(f_cnt1>=f_cnt2) begin
if(f_cnt==f8)begin
Fout4 <= 1'b0;
end
end
end
else begin
Fout3 <= 1'b0;
Fout4 <= 1'b0;
end
end
end
endmodule
/*
module PFMc ( sclk, f_en1,f_en2,f_i,Ts_i,Fout1, Fout2 ,Fout3, Fout4
// ,test1,t1,test2
);
input sclk ; //晶振50M 20ns
input f_en1; //波形輸出封鎖信號(hào) 0封鎖輸出
input f_en2; //波形輸出封鎖信號(hào) 0封鎖輸出
input [16:1] f_i; //PWM頻率 Hz 最小1HZ,最大40K
input [6:1]Ts_i; //PWM周期 us 最大31
output reg Fout1 ; //通道1PWM輸出
output reg Fout2 ;
output reg Fout3 ; //通道2PWM輸出
output reg Fout4 ;
// output wire [28:1] test1;
// output wire [28:1] test2;
// output wire [12:1] t1;
//
// assign test1 = f_cnt;
// assign test2 = f_cnt3;
// assign t1 = f1;
reg f_cs1 = 1'd0; //通道1波形使能
reg f_cs2 = 1'd0; //通道2波形使能
reg f_en1_buffer = 1'd0; //通道1波形使能緩存
reg f_en2_buffer = 1'd0; //通道2波形使能緩存
reg rest_n=1'b0; //兩個(gè)通道同時(shí)關(guān)閉時(shí),計(jì)數(shù)復(fù)位,高復(fù)位
reg [27:1] f_cnt; //計(jì)數(shù)值
reg [11:1] f_cnt1 = 11'd0 ; //Ts高電平計(jì)數(shù)個(gè)數(shù)
reg [25:1] f_cnt2 = 25'd250 ; //Ts 低電平計(jì)數(shù)個(gè)數(shù)
reg [27:1] f_cnt3 ; //總計(jì)數(shù)值
reg f0 = 1'd0;
reg [11:1] f1=11'd0;
reg [26:1] f2=26'd0,f3=26'd0;
reg [25:1] f4=25'd0,f5=25'd0;
reg [27:1] f6=27'd0,f7=27'd0;
reg [11:1] f8=11'd0;
reg [17:1] f_buffer=17'd0;
reg [6:1]Ts_buffer=6'd0;
reg [17:1] f=17'd40000;
reg [6:1]Ts=6'd0;
always @( Ts or f ) begin //參數(shù)設(shè)置改變后,對(duì)參數(shù)初始化
f_cnt1 = Ts*50 ; //(Ts*1000)/20; //Ts高電平計(jì)數(shù)個(gè)數(shù)
f_cnt2 = (1000000/f)*25; //對(duì)應(yīng)1/2 f個(gè)周期計(jì)數(shù)個(gè)數(shù)
f_cnt3 = (1000000/f)*25<<2 ; //4個(gè)驅(qū)動(dòng)方波輸出周期
f0 = 1'd0; //4個(gè)電平翻轉(zhuǎn)狀態(tài) PFM1上升沿
f1 = Ts*50; //PFM1 下降沿
f2 = (1000000/f)*25<<1 ; //PFM2上升沿
f3= {(1000000/f)*25<<1}+Ts*50; //PFM2 下降沿
f4 =(1000000/f)*25; //PFM3上升沿
f5 =(1000000/f)*25+Ts*50; //PFM3 下降沿
f6 = {(1000000/f)*25<<1}+(1000000/f)*25; //PFM4上升沿
f7 = {(1000000/f)*25<<1}+{(1000000/f)*25}+Ts*50; //PFM4 下降沿
f8 = Ts*50-(1000000/f)*25;
end
always @( f_cs1 or f_cs2 ) begin //兩個(gè)通道都關(guān)閉時(shí),計(jì)數(shù)復(fù)位
rest_n = !(f_cs1 || f_cs2);
end
always@( posedge sclk or negedge Fout1 or negedge Fout2 or negedge Fout3 or negedge Fout4 ) begin
if( Fout1==1'b0 || Fout2==1'b0 )
f_cs1 <= f_en1_buffer ;
else f_cs1 <= 1'b1;
if( Fout3==1'b0 || Fout4==1'b0 )
f_cs2 <= f_en2_buffer ;
else f_cs2 <= 1'b1;
end
always@( posedge sclk or posedge rest_n ) begin //通道1 2循環(huán)
f_en1_buffer <= f_en1;
f_en2_buffer <= f_en2;
if( rest_n==1'b1 ) begin //封閉后計(jì)數(shù)復(fù)位
f_cnt <= 27'd0;
f_buffer <= f_i; //f,Ts數(shù)據(jù)緩存2個(gè)時(shí)鐘周期
Ts_buffer <= Ts_i;
end
else begin
if( f_cnt>=(f_cnt3+1'b1) ) begin //循環(huán)計(jì)數(shù)復(fù)位
f_cnt <= 27'd0;
f_buffer <= f_i;
Ts_buffer <= Ts_i;
end
else begin
f_cnt <= f_cnt+1'b1;
if( f_cnt==27'd10) begin
f<=f_buffer;
Ts<=Ts_buffer;
end
end
end
end
always@( posedge sclk ) begin //PWM輸出控制
if(f_cs1==1'b0) begin //通道1,
Fout1 <= 1'b0;
Fout2 <= 1'b0;
end
else begin
if( f_cs1 ) begin
case ( f_cnt )
f0: Fout1 <= 1'b1;
f1: Fout2 <= 1'b1;
f2: Fout1 <= 1'b0;
f3: Fout2 <= 1'b0;
endcase
end
else begin
Fout1 <= 1'b0;
Fout2 <= 1'b0;
end
end
if ( f_cs2 ==1'b0) begin //通道2
Fout3 <= 1'b0;
Fout4 <= 1'b0;
end
else begin
if( f_cs2 ) begin
case(f_cnt)
f4: Fout3 <= 1'b1;
f5: Fout4 <= 1'b1;
f6: Fout3 <= 1'b0;
f7: Fout4 <= 1'b0;
endcase
if(f_cnt1>=f_cnt2) begin
if(f_cnt==f8)begin
Fout4 <= 1'b0;
end
end
end
else begin
Fout3 <= 1'b0;
Fout4 <= 1'b0;
end
end
end
endmodule
*/
/*
//IGBT 波形發(fā)生 2個(gè)通道
module PFMc ( sclk, f_en1,f_en2,f_i,Ts_i,Fout1, Fout2 ,Fout3, Fout4,test);
input sclk ; //晶振50M 20ns
input f_en1; //波形輸出封鎖信號(hào) 0封鎖輸出
input f_en2; //波形輸出封鎖信號(hào) 0封鎖輸出
input [17:1] f_i; //PWM頻率 Hz 最小1HZ,最大40K
input [6:1]Ts_i; //PWM周期 us 最大25
output reg Fout1 ; //通道1PWM輸出
output reg Fout2 ;
output reg Fout3 ; //通道2PWM輸出
output reg Fout4 ;
output reg test ;
reg f_cs1 = 1'd0; //通道1波形使能
reg f_cs2 = 1'd0; //通道2波形使能
reg [28:1] f_cnt = 28'd0 ;
reg [12:1] f_cnt1 = 12'd0 ; //Ts高電平計(jì)數(shù)個(gè)數(shù)
reg [26:1] f_cnt2 = 26'd250 ; //Ts 低電平計(jì)數(shù)個(gè)數(shù)
reg [28:1] f_cnt3 ;
reg f0 = 1'd0;
reg [12:1] f1=12'd0;
reg [27:1] f2=27'd0,f3=27'd0;
reg [28:1] f4=28'd0,f5=28'd0;
reg [28:1] f6=28'd0,f7=28'd0;
reg [12:1] f8=12'd0;
reg [17:1] f_buffer=17'd0;
reg [6:1]Ts_buffer=6'd0;
reg [17:1] f=17'd40000;
reg [6:1]Ts=6'd0;
always@(posedge sclk or negedge f_en1) begin //測(cè)試
if(!f_en1) begin
test <= 1'b1;
end
else if(f_cnt == 28'd1)
test <= ~test;
end
always @( posedge sclk ) begin //TS f參數(shù)緩存1個(gè)周期,在1個(gè)周期完后生效
if( f_cnt == 28'd0 ) begin
f_buffer <= f_i;
Ts_buffer <= Ts_i;
end
if( f_cnt1 < f_cnt2 ) begin
if(f_cnt == f_cnt3) begin
f<=f_buffer;
Ts<=Ts_buffer;
end
end
if( f_cnt1 >= f_cnt2 ) begin
if(f_cnt == f8) begin
f<=f_buffer;
Ts<=Ts_buffer;
end
end
end
always @( Ts or f ) begin //參數(shù)設(shè)置改變后,對(duì)參數(shù)初始化
f_cnt1 = Ts*50 ; //(Ts*1000)/20; //Ts高電平計(jì)數(shù)個(gè)數(shù)
f_cnt2 = (1000000/f)*25; //對(duì)應(yīng)1/2 f個(gè)周期計(jì)數(shù)個(gè)數(shù)
f_cnt3 = (1000000/f)*25<<2 ; //4個(gè)驅(qū)動(dòng)方波輸出周期
f0 = 1 'd0; //4個(gè)電平翻轉(zhuǎn)狀態(tài) PFM1上升沿
f1 = Ts*50; //PFM1 下降沿
f2 = (1000000/f)*25<<1 ; //PFM2上升沿
f3= {(1000000/f)*25<<1}+Ts*50; //PFM2 下降沿
f4 =(1000000/f)*25; //PFM3上升沿
f5 =(1000000/f)*25+Ts*50; //PFM3 下降沿
f6 = {(1000000/f)*25<<1}+(1000000/f)*25; //PFM4上升沿
f7 = {(1000000/f)*25<<1}+{(1000000/f)*25}+Ts*50; //PFM4 下降沿
f8 = Ts*50-(1000000/f)*25;
end
always@( posedge sclk or posedge f_en1 or posedge f_en2) begin //波形輸出期間,禁止關(guān)斷
if(f_en1)
if( Fout1 || Fout2 )
f_cs1 <= 1'd1 ;
else f_cs1 <=f_en1 ;
else f_cs1 <= 1'b0;
if(f_en2)
if( Fout3 || Fout4 )
f_cs2 <= 1'd1 ;
else f_cs2 <=f_en2 ;
else f_cs2 <= 1'b0;
end
always@( posedge sclk or posedge f_cs1 or posedge f_cs2 ) begin //通道1 2循環(huán)
if( f_cs1 || f_cs2 ) begin //使能
f_cnt <= f_cnt+1'b1;
if( f_cnt>=f_cnt3 ) //循環(huán)復(fù)位
f_cnt <= 28'd0;
end
else f_cnt <= 28'd0;
end
always@( posedge sclk or posedge f_cs1 or posedge f_cs2 ) begin
if ( f_cs1 ) begin
case ( f_cnt )
f0: Fout1 <= 1'b1;
f1: Fout2 <= 1'b1;
f2: Fout1 <= 1'b0;
f3: Fout2 <= 1'b0;
endcase
end
else begin
Fout1 <= 1'b0;
Fout2 <= 1'b0;
end
if ( f_cs2 ) begin
case(f_cnt)
f4: Fout3 <= 1'b1;
f5: Fout4 <= 1'b1;
f6: Fout3 <= 1'b0;
f7: Fout4 <= 1'b0;
endcase
if(f_cnt1>=f_cnt2) begin
if(f_cnt==f8)begin
Fout4 <= 1'b0;
end
end
end
else begin
Fout3 <= 1'b0;
Fout4 <= 1'b0;
end
end
endmodule
*/
/*
//IGBT 波形發(fā)生 2個(gè)通道
module PFMc ( sclk, f_en1,f_en2,f_i,Ts_i,Fout1, Fout2 ,Fout3, Fout4);
input sclk ; //晶振50M 20ns
input f_en1; //波形輸出封鎖信號(hào) 0封鎖輸出
input f_en2; //波形輸出封鎖信號(hào) 0封鎖輸出
input [17:1] f_i; //PWM頻率 Hz 最小1HZ,最大40K
input [6:1]Ts_i; //PWM周期 us 最大25
output reg Fout1 ; //通道1PWM輸出
output reg Fout2 ;
output reg Fout3 ; //通道2PWM輸出
output reg Fout4 ;
reg f_cs1 = 1'd0; //通道1波形使能
reg f_cs2 = 1'd0; //通道2波形使能
reg [28:1] f_cnt = 0 ;
reg [12:1] f_cnt1 = 0 ; //Ts高電平計(jì)數(shù)個(gè)數(shù)
reg [26:1] f_cnt2 = 250 ; //Ts 低電平計(jì)數(shù)個(gè)數(shù)
reg [28:1] f_cnt3 ;
reg f0 = 1'd0;
reg [12:1] f1=0;
reg [27:1] f2=0,f3=0;
reg [28:1] f4=0,f5=0;
reg [28:1] f6=0,f7=0;
reg [12:1] f8=0;
reg [17:1] f_buffer=0;
reg [6:1]Ts_buffer=0;
reg [17:1] f=40000;
reg [6:1]Ts=0;
always @( posedge sclk ) begin //TS f參數(shù)緩存1個(gè)周期,在1個(gè)周期完后生效
if( f_cnt == 0 ) begin
f_buffer <= f_i;
Ts_buffer <= Ts_i;
end
if( f_cnt1 < f_cnt2 ) begin
if(f_cnt == f_cnt3) begin
f<=f_buffer;
Ts<=Ts_buffer;
end
end
if( f_cnt1 >= f_cnt2 ) begin
if(f_cnt == f8) begin
f<=f_buffer;
Ts<=Ts_buffer;
end
end
end
always @( Ts or f ) begin //參數(shù)設(shè)置改變后,對(duì)參數(shù)初始化
f_cnt1 = Ts*50 ; //(Ts*1000)/20; //Ts高電平計(jì)數(shù)個(gè)數(shù)
f_cnt2 = (1000000/f)*25; //對(duì)應(yīng)1/2 f個(gè)周期計(jì)數(shù)個(gè)數(shù)
f_cnt3 = (1000000/f)*25<<2 ; //4個(gè)驅(qū)動(dòng)方波輸出周期
f0 = 1 'd0; //4個(gè)電平翻轉(zhuǎn)狀態(tài) PFM1上升沿
f1 = Ts*50; //PFM1 下降沿
f2 = (1000000/f)*25<<1 ; //PFM2上升沿
f3= {(1000000/f)*25<<1}+Ts*50; //PFM2 下降沿
f4 =(1000000/f)*25; //PFM3上升沿
f5 =(1000000/f)*25+Ts*50; //PFM3 下降沿
f6 = {(1000000/f)*25<<1}+(1000000/f)*25; //PFM4上升沿
f7 = {(1000000/f)*25<<1}+{(1000000/f)*25}+Ts*50; //PFM4 下降沿
f8 = Ts*50-(1000000/f)*25;
end
always@( posedge sclk ) begin //波形輸出期間,禁止關(guān)斷
if( Fout1 || Fout2 )
f_cs1 <= 1'd1 ;
else f_cs1 <=f_en1 ;
if( Fout3 || Fout4 )
f_cs2 <= 1'd1 ;
else f_cs2 <=f_en2 ;
end
always@( posedge sclk or posedge f_cs1 or posedge f_cs2 ) begin //通道1 2循環(huán)
if( f_cs1 || f_cs2 ) begin //使能
f_cnt <= f_cnt+1;
if( f_cnt>=f_cnt3 ) //循環(huán)復(fù)位
f_cnt <= 0;
end
else f_cnt <= 0;
end
always@( posedge sclk or posedge f_cs1 or posedge f_cs2) begin
if ( f_cs1 ) begin
if(f_cnt==f0)begin
Fout1 <= 1'b1;
// Fout2 <= 1'b0;
end
if(f_cnt==f1)begin
Fout1 <= 1'b0;
// Fout2 <= 1'b0;
end
if(f_cnt==f2)begin
// Fout1 <= 1'b0;
Fout2 <= 1'b1;
end
if(f_cnt==f3)begin
// Fout1 <= 1'b0;
Fout2 <= 1'b0;
end
end
else begin
Fout1 <= 1'b0;
Fout2 <= 1'b0;
end
if ( f_cs2 ) begin
if(f_cnt==f4)begin
Fout3 <= 1'b1;
end
if(f_cnt==f5)begin
Fout3 <= 1'b0;
end
if(f_cnt==f6)begin
Fout4 <= 1'b1;
end
if(f_cnt==f7)begin
Fout4 <= 1'b0;
end
if(f_cnt1>=f_cnt2) begin
if(f_cnt==f8)begin
Fout4 <= 1'b0;
end
end
end
else begin
Fout3 <= 1'b0;
Fout4 <= 1'b0;
end
end
endmodule、
*/
/*
module PFMc ( sclk, f_en1,f_en2,f_i,Ts_i,Fout1, Fout2 ,Fout3, Fout4);
input sclk ; //晶振50M 20ns
input f_en1; //波形輸出封鎖信號(hào) 0封鎖輸出
input f_en2; //波形輸出封鎖信號(hào) 0封鎖輸出
input [18:1] f_i; //PWM頻率 Hz 最小1HZ,最大40K
input [6:1]Ts_i; //PWM周期 us 最大25
output reg Fout1 = 1'b0 ; //通道1PWM輸出
output reg Fout2 = 1'b0 ;
output reg Fout3 = 1'b0 ; //通道2PWM輸出
output reg Fout4 = 1'b0 ;
reg f_cs1 = 1'd0; //通道1波形使能
reg f_cs2 = 1'd0; //通道2波形使能
reg [28:1] f_cnt = 0 ;
reg [12:1] f_cnt1 = 0 ; //Ts高電平計(jì)數(shù)個(gè)數(shù)
reg [26:1] f_cnt2 = 250 ; //Ts 低電平計(jì)數(shù)個(gè)數(shù)
reg [26:1] f_cnt3 ;
reg f0 = 1'd0;
reg [12:1] f1=0;
reg [27:1] f2=0,f3=0;
reg [28:1] f4=0,f5=0;
reg [28:1] f6=0,f7=0;
reg [12:1] f8=0;
reg [4:1] state; //狀態(tài)指示
reg spr=1'b0; //參數(shù)計(jì)算完成指示
reg [18:1] f_ib; //PWM頻率 Hz 最小1HZ,最大40K 緩存
reg [6:1]Ts_ib; //PWM周期 us 最大25 緩存
reg [18:1] f=40000; //PWM頻率 Hz 最小1HZ,最大40K 緩存
reg [6:1]Ts=0; //PWM周期 us 最大25 緩存
parameter
Fout1_start = 4'd0,
Fout2_start = 4'd1,
Fout1_end = 4'd2,
Fout2_end = 4'd3,
Fout3_start = 4'd4,
Fout4_start = 4'd5,
Fout3_end = 4'd6,
Fout4_end = 4'd7,
Fout_clear = 4'd8;
always @( Ts or f ) begin //參數(shù)設(shè)置改變后,對(duì)參數(shù)初始化
f_cnt1 = Ts*50 ; //(Ts*1000)/20; //Ts高電平計(jì)數(shù)個(gè)數(shù)
f_cnt2 = (1000000/f)*25; //對(duì)應(yīng)1/2 f個(gè)周期計(jì)數(shù)個(gè)數(shù)
f_cnt3 = (1000000/f)*25<<2 ; //4個(gè)驅(qū)動(dòng)方波輸出周期
f0 = 1 'd0; //4個(gè)電平翻轉(zhuǎn)狀態(tài) PFM1上升沿
f1 = Ts*50; //PFM1 下降沿
f2 = (1000000/f)*25<<1 ; //PFM2上升沿
f3= {(1000000/f)*25<<1}+Ts*50; //PFM2 下降沿
f4 =(1000000/f)*25; //PFM3上升沿
f5 =(1000000/f)*25+Ts*50; //PFM3 下降沿
f6 = {(1000000/f)*25<<1}+(1000000/f)*25; //PFM4上升沿
f7 = {(1000000/f)*25<<1}+{(1000000/f)*25}+Ts*50; //PFM4 下降沿
f8 = Ts*50-(1000000/f)*25;
end
always@( f_en1 or f_en2) begin //波形輸出期間,禁止關(guān)斷
if( Fout1 || Fout2 )
f_cs1 <= 1'd1 ;
else f_cs1 <=f_en1 ;
if( Fout3 || Fout4 )
f_cs2 <= 1'd1 ;
else f_cs2 <=f_en2 ;
end
always@( f_cnt ) begin
if( f_cnt ) begin
f_ib = f_i;
Ts_ib = Ts_i;
end
if( (f_cnt+1)== f_cnt3) begin
f = f_ib;
Ts = Ts_ib;
end
end
always@( posedge sclk ) begin //通道1 2循環(huán)
if( f_cs1 || f_cs2 ) begin //使能
f_cnt <= f_cnt+1;
spr <= ~spr;
if( f_cnt>=f_cnt3 ) //循環(huán)復(fù)位
f_cnt <= 0;
end
else f_cnt <= 0;
end
always@( posedge sclk ) begin
if ( f_cs1 ) begin
if(f_cnt==f0)begin
state <= Fout1_start;
end
if(f_cnt==f1)begin
state <= Fout2_start;
// Fout2 <= 1'b0;
end
if(f_cnt==f2)begin
// Fout1 <= 1'b0;
state <= Fout1_end;
end
if(f_cnt==f3)begin
// Fout1 <= 1'b0;
state <= Fout2_end;
end
end
else state <= Fout_clear;
if ( f_cs2 ) begin
if(f_cnt==f4)begin
state <= Fout3_start;;
end
if(f_cnt==f5)begin
state <= Fout4_start;;
end
if(f_cnt==f6)begin
state <= Fout3_end;
end
if(f_cnt==f7)begin
state <= Fout4_end;
end
if(f_cnt1>=f_cnt2) begin
if(f_cnt==f8)begin
state <= Fout4_end;
end
end
end
else state <= Fout_clear;
end
always@( state ) begin
case (state)
Fout1_start: begin
Fout1 = 1'b1;
Fout2 = 1'b0;
end
Fout2_start: begin
Fout2 = 1'b1;
Fout1 = 1'b1;
end
Fout3_start: begin
Fout3 = 1'b1;
Fout4 = 1'b0;
end
Fout4_start: begin
Fout4 = 1'b1;
Fout3 = 1'b0;
end
Fout1_end : begin
Fout1 = 1'b0;
Fout2 = 1'b1;
end
Fout2_end : begin
Fout2 = 1'b0;
Fout1 = 1'b0;
end
Fout3_end : begin
Fout3 = 1'b0;
Fout4 = 1'b1;
end
Fout4_end : begin
Fout3 = 1'b0;
Fout4 = 1'b0;
end
Fout_clear : begin
Fout1 = 1'b0;
Fout2 = 1'b0;
Fout1 = 1'b0;
Fout1 = 1'b0;
end
default begin
Fout1 = 1'b0;
Fout2 = 1'b0;
Fout1 = 1'b0;
Fout1 = 1'b0;
end
endcase
end
endmodule
*/
復(fù)制代碼
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1