|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
module PWM( clk,//系统时钟
% E4 y* v. u& e- `( Irst_n,//复位7 y1 \, o, w G
cs,//DSP片选
h# P7 t* t; Y7 S4 i& lfault_and_out,//故障5 C1 x D' p/ p+ Y3 g/ t) |
overcurrent,//过流,逐波限流
: J0 r+ U8 q( D; xePWM_sync,//同步,即EPWM时基起始计时点5 }- B( i- N" ]7 ^/ ~1 G
pwm1,pwm2,pwm3,pwm4,//PWM输入 pwm1_out,pwm2_out,pwm3_out,pwm4_out//PWM输出
$ u. `3 L; D4 @* R5 d* k);- o5 l! l J# c( _
input clk;//系统时钟 30M
. |& g8 L( b5 ainput rst_n;//复位 低电平有效
* N0 U. C+ X( E& z( @, _input cs,fault_and_out,ePWM_sync;//同步 片选 严重故障信号
3 B8 Y' |6 _$ s! k+ m; vinput overcurrent;//过流 G5 _% w6 y" E, l$ c2 X
input pwm1,pwm2,pwm3,pwm4;//PWM输入
% H: W9 y6 ]8 T" q- D7 @6 noutput pwm1_out,pwm2_out,pwm3_out,pwm4_out;//PWM输出$ A+ T" z* @, l' ^0 X, N
reg pwm1_out,pwm2_out,pwm3_out,pwm4_out; c* h0 V9 o8 n3 n8 t( M; I. W$ S
. S! f% B9 d( w" F% J" z
parameter CLOSE_ALL=4'b0001,//关闭4个管子 独热键编码状态机7 A6 a/ K1 t* u1 `" Y: V
CLOSE_OUTSIDE=4'b0010,//关闭外侧2个管子; i1 z( V# n I& A7 s: K% p
//SET_INSIDE=6'b000100,//内侧2个管子强制导通全置1,1字型备用+ }/ _+ ]% N: Y5 U3 X/ ~$ F
OPEN_INSIDE=4'b0100,//打开内侧2个管子! G5 I1 i: W( {! f, a) T5 ~3 z4 w, O
OPEN_ALL=4'b1000;//打开内外侧4个管子,正常工作状态
5 Q) G5 Z" x( `4 O( hreg[3:0] state;//状态机
% [6 T" ~ [& @/ A5 Q( e Kreg[5:0] cnt_close;$ Q/ l! R$ t! z& i+ ?
reg[5:0] cnt_open;
$ Z! [5 @0 P9 i. ~$ f* r! _( y//reg[5:0] cnt_set; //1字型备用
n% f9 h, O$ N7 z9 t/ S# O# T# |; S, ealways @(posedge clk or negedge rst_n )//
; h; M2 ]0 D- A& [begin! L+ }" `- Q+ K2 [6 y) ~
if(!rst_n) //复位5 T* j! H7 Q. @3 ]. A9 x. A
begin: _' h& z' \% U5 ~& _9 P. c% a( I
{pwm1_out,pwm2_out,pwm3_out,pwm4_out}<=4'd0;//关闭管子& x& E1 H9 @6 f7 d. _* o" R5 t; B
cnt_close<=6'd0;
- b- j! @; I9 c k1 ?, \! S4 A Ycnt_open<=6'd0;% z( s$ l$ Q/ M2 q
state<=CLOSE_ALL;
) c# \+ z9 N- E. ]/ n V# Zend, l1 S: u* a" ^- d6 n
else
( f& V, H( }' g2 N# Hbegin2 Z8 M% r& V/ V: k
case(state)
t' S7 J9 [9 p* XCLOSE_ALL:
* v$ q9 t s& l* f$ Bbegin
" D- H; G, _# {$ V+ p0 X8 ?* u$ z{pwm1_out,pwm2_out,pwm3_out,pwm4_out}<=4'd0;//初始化状态,关闭管子% ?6 [# f' |, ~! G5 E
if(!cs && fault_and_out && overcurrent && ePWM_sync) state<=OPEN_INSIDE;//等待片选选中且无故障进入下一状态
3 }/ n2 K6 [0 ~, f$ T4 Uend
4 M. R8 h' I6 B6 d- COPEN_INSIDE://打开内侧2个管子
" I0 @$ n( m9 E! V$ ?" sbegin
5 o% e' W, S7 d0 l( S% J{pwm2_out,pwm3_out}<={pwm2,pwm3};//打开内侧2个管子2us
. h( s0 C/ ~- k/ s{pwm1_out,pwm4_out}<=2'b00;//关闭外侧2个管子/ ?# K' g: z# m9 y% {) p
cnt_open<=cnt_open+1'b1;+ P* S5 G7 S9 x4 _4 ~$ l+ n
if(cnt_open==6'd63) state<=OPEN_ALL;
+ n' S2 o" ]- g2 K( ^4 N+ Q `end: ~7 L* S7 T2 y. { c0 A. n* l% j
OPEN_ALL://打开外侧2个管子,4个管子全部开放0 [$ o* h' J. {5 x) v! K
begin5 k! B' Q4 |- x7 k
{pwm1_out,pwm2_out,pwm3_out,pwm4_out}<={pwm1,pwm2,pwm3,pwm4};
* v7 U$ V$ y/ M, O. S: F, pif(cs || !fault_and_out || !overcurrent) state<=CLOSE_OUTSIDE;//故障,关闭管子# l5 T4 C! I9 a4 d ]% k( c
end
; ?) U. ?' ^' ~CLOSE_OUTSIDE://关闭外侧2个管子4 Y) ~: J+ Q' F; o* }: i* z0 g+ O
begin3 P! F& u/ A$ i
{pwm2_out,pwm3_out}<={pwm2,pwm3};//内侧2个管子保持# m# G, H5 C7 n
{pwm1_out,pwm4_out}<=2'd0;//关闭外侧2个管子2US& L+ L7 c- w% I1 V
cnt_close<=cnt_close+1'b1;) R) s4 [" @. }1 ?) a- A/ [
if(cnt_close==6'd63) state<=CLOSE_ALL;
5 p' G V4 ?5 @end( V8 Q s3 _( C6 j
/*SET_INSIDE://1字型备用
, s+ C0 @6 ^( p, @7 ybegin( N5 W" w- f1 ?$ U/ U6 y
{pwm2_out,pwm3_out}<=2'b11;//内侧2个管子强制导通2us,Q1和Q4结电容充电至E/2: _% R, X# s# P
{pwm1_out,pwm4_out}<=2'd0;//关闭外侧2个管子
, A7 n) A/ Z( V Icnt_set<=cnt_set+1'b1;
6 s, s: F. p6 H2 q. ?# m5 X% uif(cnt_set==6'd63) state<=OPEN_INSIDE;
& N( ?# m/ n; F; _end*/5 L! T6 _% J) f* T; Q
default:state<=CLOSE_ALL;
! B, U6 ]: h. N( nendcase: X& G0 Z/ V, j# r1 l
end& e6 X4 }. w$ \8 B" i4 V3 s
end2 S3 R% d3 g; H3 D% F* f! [" N2 _
$ K: v4 D8 ^9 t( L- {6 z( ^) w' E
endmodule
' K9 J% F" }3 D/ W
8 z# [3 R5 }: A6 w+ x$ V+ G) m仿真时使用的是modelsim-altera,RTL仿真正确,门级仿真看波形以及通过调试发现程序总是停留的OPEN_INSIDE状态,我琢磨好久甚是不透,这里OPEN_INSIDE状态程序不可能有竞争冒险的% X; K) {$ E: X$ Q- x
|
|