其部分程序代码如下:
case(state1)
A: //初始化状态
begin
ADDRES1<=addr1; //时分复用第一路地址
READ_EN<=1′b1; //读使能开
NEXT<=1′b1; //开启预读模式
if(addr1==18'd767) //生成地址
addr1<=18'd0;
else if (!BUSY) //如不忙状态开始读
begin
addr1<=addr1+18′d1;//地址自增
out0<=DATAOUT; //数据暂存
state1<=B; //取第二路数据地址
end
end
B: //取第二路数据
begin
ADDRES1<=addr2; //时分复用第二路地址
READ_EN<=1′b1;
NEXT<=1′b1;
if(addr2==18′d767)
addr2<=18′d0;
else if (!BUSY)
begin
addr2<=addr2+18′d1;
out1<=DATAOUT;
state1<=C;
end
end
C: //取第三路数据
begin
ADDRES1<=addr3; //时分复用第三路地址
READ_EN<=1′b1;
NEXT<=1′b1;
if(addr3==18′d767)
addr3<=18′d0;
else if (!BUSY)
begin
addr3<=addr3+18′d1;
out2<=DATAOUT;
state1<=D;
end
end
D: //空操作状态
begin
state1<=E;
end
E: //数据存储,同时取出三路数据
begin
outdata0<=out0;
outdata1<=out1;
outdata2<=out2;
state1<=A;
end
endcase
3.5 三角波与正弦波比较控制模块
该模块用于输出三相六路SPWM脉冲序列。用模块1中输出的三角波分别与模块4输出的三相正弦波相比较,从而先得到三路SPWM脉冲序列。当正弦波数据大于三角波数据时,输出高电平;反之,输出低电平。每相输出又分为互补的两路输出,利用一个逆变器对输入波形取反,就可以得到与SPWM脉冲序列互补的波形。
其部分程序代码如下:
always@(outdata0 or outdata1 or outdata2 or out2)//比较器
begin
if(outdata0>out2)
outdata4=1;
else outdata4=0;
if(outdata1>out2)
outdata5=1;
else outdata5=0;
if(outdata2>out2)
outdata6=1;
else outdata6=0;
end
3.6 时延控制死区输出模块
对于SPWM三相桥式逆变器,由于开关管固有开关时间Ts的影响,开通时间Ton往往小于关断时间Tof,因此容易发生同臂两只开关管同时导通的短路故障。为了避免这种故障的发生,通常要设置开关死区ΔT,以保证同桥臂上的一只开关管可靠关断后,另一只开关管才能开通。死区的设置方式有两种:一种是提前关断、延时开通的双边对称设置;另一种是按时关断、延滞Δt开通的单边不对称设置。根据FPGA的编程特点,选择了按时关断、延滞Δt开通的单边不对称设置,并且时延死区的调节与控制与时延控制死区模块的输入时钟clk有关。
根据延时模块中延时信息:Δt=2×Tclk
clk是锁相环输出时钟CLK 1 MHz(本文采用的是1 MHz)的2次分频得到的时钟,只要改变顶层模块中对CLK 1 MHz的分频系数,就可以精确控制延滞Δt的大小,本文计算值Δt=4μs。
另外,死区调节单元还能消除由于FPGA器件本身时延造成的毛刺。其部分死区控制程序代码如下:
always@(posedge clk or posedge rst)
begin
if(rst) //异步复位
begin //初始化寄存器
q<=0;
q0<=0;
end
else
begin //延时输出的D触发器
if(d)
begin
q0<=1′b1;
q<=q0;
end
else
begin //立即清零
q<=0;
q0<=0;
end
end
end
有关clk生成与调节的程序代码如下:
always@(posedge CLK1M or posedge rst) //分频产生时延控制时钟
begin
if(rst) //异步复位
begin
clk<=0; //时钟初始状态清零
couter<=0; //计数初值设置零
end
else
begin
if(couter==2′b01)
begin
clk<=~clk;
couter<=0;
end
else
couter<=couter+1′b1; //计数器加1
end
end
3.7 时钟输出控制模块
FushionAFS600器件的系统时钟是48 MHz,因本设计正弦波的扫描频率和三角波的扫描频率预设为1 MHz,为减少时钟输出模块的数量以及能方便更改系统输出SPWM波形的占空比和频率,本设计充分利用Fushion器件的时钟调整电路,用SmartGen生成一个静态PLL宏模块,把系统时钟分频成1 MHz的时钟分别是CLK 1 M和CLK 2 M,并连接到全局网络上。当需要一定频率和不同占空比的SPWM脉冲时,只需计算出载波和调制波形的扫描频率,而后直接在SmartGen宏模块中修改静态PLL输出时钟,就可实现输出SPWM波形密度的控制与调节,从而满足各种工作频率的需求。 4 基于FPGA的SPWM实现及系统测试
4.1 SPWM控制技术的FPGA实现
根据顶层功能图(如图1),分别用Verilog HDL语言和SmartGen输入描述了各个功能单元模块,并分别在Libero 8.1集成开发环境下通过编译和仿真验证。最后用Verilog HDL语言编写一个顶层模块实现各个功能模块的有机组合,以实现总体功能,再在Libero 8.1集成开发环境下进行编译、逻辑综合、布局布线后下载到目标器件Fushion AFS600器件FPGA上,实现了三相六路可控SPWM全数字算法的片上系统。
4.2 系统测试结果
图5是从逻辑分析仪上对系统测试的结果。从图中可以看出所设计电路完全符合功能要求,且观测到的时延死区时间均为4 μs,与理论计算值一致。下载后观测与功能仿真,布局布线后仿真图形也都完全一样,达到了设计的预期要求。