《电子技术应用》
您所在的位置:首页 > 可编程逻辑 > 业界动态 > 基于Verilog HDL的SPWM全数字算法的FPGA实现

基于Verilog HDL的SPWM全数字算法的FPGA实现

2009-06-12
作者:丁电宽,梁建均,王文奇,杨荣杰

    摘  要: 在详细阐述正弦脉宽调制算法的基础上,结合DDS技术,以Actel FPGA作为控制核心,通过自然采样法比较1个三角载波和3个相位差为1 200的正弦波,利用Verilog HDL语言实现死区时间可调的SPWM全数字算法,并在Fushion StartKit开发板上实现SPWM全数字算法。通过逻辑分析仪和数字存储示波器得到了验证,为该技术进一步应用和推广提供了一个良好的开放平台。 

    关键词: Actel FPGA;SPWM;DDS;Verilog HDL

 

    随着信号处理技术及集成电路制造工艺的不断发展,全数字化SPWM(正弦脉宽调制)算法在调速领域越来越受到青睐。实现SPWM控制算法的方法很多,其中模拟比较法因电路复杂、且不易与数字系统连接而很少采用;传统的微处理器因不能满足电机控制所要求的较高采样频率(≥1 kHz)而逐渐被高性能的DSP硬件系统所取代,但该系统成本高、设计复杂。与传统方法相比,在现场可编程逻辑器件FPGA上产生一种新的SPWM控制算法,具有成本低、研发周期短、执行速度高、可扩展能力强等优点。该技术进一步推动了变频调速技术的发展。 

    本文结合SPWM算法及FPGA的特点,以Actel FPGA作为控制核心,用Verilog HDL语言实现了可编程死区延时的三相六路SPWM全数字波形,并在Fushion StartKit开发板上实现了各功能模块,通过逻辑分析仪和数字存储示波器上验证了SPWM波形及死区时间,为该技术进一步应用和推广提供了一个平台。 

1 Actel Fushion器件介绍[1-2] 

    Actel Fushion系列器件是一款具有模拟功能的Flash架构FPGA,结合先进的Flash FPGA数字技术和模拟技术,融合了FPGA数字内核、ADC、Flash存储器、模拟的I/O、RTC等部分。Fushion器件内部具有2 Mbit到8 Mbit不等的用户可用的Flash存储器;30个通道、最高12位精度、最高600 kS/s采样率的ADC;片内100 MHz的RC振荡器与PLL(锁相环)共同为FPGA提供时钟;Fushion内部40 bit的RTC除支持典型的RTC应用外,还可以控制片内1.5 V的电压调整器以实现低功耗的睡眠和唤醒模式。这些特点极大地提高了单芯片的功能,简化了整个系统设计,大幅度减少了电路板面积和系统的总成本。 

    Fushion系列AFS600内部含有用户使用的容量为4 Mbit的Flash存储器,内部存储器模块以Flash memory Block(FB)形式划分,每个FB限制为2 Mbit的空间,用户可以单独使用每个FB块,也可以自行用逻辑来级联所有的FB块以构建大容量的Flash存储器。Flash 存储器读操作可以从FB阵列、页面缓冲区或状态寄存器中读取数据。 

2 数字系统电路总体设计方案 

2.1 SPWM算法原理[3] 

    正弦脉宽调制技术(SPWM)是调制波为正弦波、载波为三角波或锯齿波的一种脉宽调制法,是现代变频调速系统中应用最为广泛的脉宽调制方式,目前有自然采样法、规则采样法、等面积法等。其中规则采样法计算简单,但谐波含量较大;一种改进的等面积法谐波含量低,但计算复杂,不利于系统实现;自然采样法是在正弦波和三角波的自然交点时刻控制功率开关器件的通断,是最理想的采样方法。 

    本文采用等腰三角波和三路相差120°的正弦波比较生成SPWM波,在Fushion StartKit开发板上采用自然采样法,结合数字频率合成技术DDS,生成死区延时可调的SPWM全数字波形。 

2.2 数字系统电路总体方案设计[4-7] 

    Verilog HDL硬件描述语言具有很好的易读性和可重用性,结合Verilog HDL硬件描述语言设计规范及SPWM工作机理,用自顶向下的分割方法对整个系统进行总体方案设计。首先从系统设计入手,在顶层进行功能方框图的划分和结构设计。系统顶层功能方框图如图1所示。 

 

 

    根据顶层设计的思想,采用Verilog HDL语言分别实现各个模块的设计,最后把各个模块嵌入到顶层模块中,使各个模块有机地组成一个完整的整体。 

3 系统模块的设计与实现 

3.1 直接数字频率合成模块[8] 

    直接数字频率合成DDS是采用数字化技术,通过控制频率控制字直接产生所需的各种不同频率信号,突破了模拟频率合成法的原理,从“相位”的概念出发进行频率合成。这种合成方法不仅可以给出不同频率的正弦波,而且还可以给出不同初始相位的正弦波,甚至可以给出各种任意波形。电路一般包括基准时钟、频率累加器、相位累加器、幅度/相位转换电路、D/A 转换器。在设计中,将要输出的波形数据(如正弦函数表)预先存在ROM(或RAM)单元中,然后在系统标准时钟频率下,按照一定的顺序从ROM(或RAM)单元中读出数据,再进行D/A转换,就可以得到一定频率的输出波形。本设计直接利用从Flash存储器的存储单元中读出的离散正弦函数值与生成的三角波进行比较,实现系统的全数字化要求。 

3.2 三角波产生模块 

    本模块采用同步三角波调制方法,利用可逆计数器对输入时钟进行计数。计数器先执行加法,从0计数到255,再执行减法计数从255到0,从而形成三角载波。如此反复就可以得到峰峰值255连续的三角波形。输入时钟是系统时钟通过锁相环输出的1 MHz的时钟。 

3.3 建立正弦函数表 

    三角波的幅值范围在0~255,而正弦波的幅值在-1~+1之间,为了实现等幅值比较,将正弦波上移一个单位后,再将所有值同乘以128,使正弦波的幅值也在0~255之间。即: 

    m=128×(sin(x)+1)                                 (1) 

    式(1)用C语言对此函数在一个周期(0~2π)内完成768个量化并且直接生成Flash存储器的初始化文件(.ahx)格式,再用SmartGen输入将Flash 存储器配置成常用的数据存储器,将预先生成的.ahx文件导入生成data Storage宏模块,就建立了正弦函数表。生成正弦函数表的流程图如图2所示。 

3.4 三相正弦波产生和输出模块[9,10] 

    FPGA的Fushion芯片理论上可以实现任何方式的数学运算逻辑,但由于芯片的容量限制,并不是任何计算都能实现的。因此需事先将正弦函数离散并加载到FPGA的Flash存储器中,在正弦调制波的离散过程中即可将一个周期完整地离散。因此,只对其中A相进行离散化处理,数据存储在Flash存储器中,每个数据分配1个地址。即可以利用计数器来产生取正弦波数据的地址,通过数字频率合成技术改变计数器的计数频率就可以改变正弦波的频率。这样即可先输出一路的正弦波,另外两路正弦波产生的方法与此类似,只是起始取数据的地址相差120°,即分别从第256和第512个数据开始取数。 

    为了在每个调制波周期查找正弦函数表以及分别与载波进行比较,在设计中采用时分复用技术。即依据三相关系,由一个地址计数器,通过基本量加1转移到另一地址计数器中,并且在跳转过程中,这一地址计数器加1指向下一单元,从而分时取出三相地址单元的内容。利用对正弦表寻址的高速度,使一个正弦表在不同时间段查询不同相的正弦波的幅值,以达到减少正弦表所占用的FPGA资源的目的。这样就大大减少了逻辑数目,仅增加了地址选择器和三个同步存储器,实现了正弦函数表的复用,在很大程度上节省了芯片的资源。 

    电路的具体实现:相位互差120°的三路地址数据并行输入,通过一个三选一的选择器进行选择,选择器的控制端接三进制的计数器。如计数器为0时,输出A相地址,取出A相正弦值;为1时,输出B相地址,取出B相正弦值;为2时,输出C相地址,取出C相正弦值。因此只要使输入的三相地址周期性变化,就可实现并行输入的三相地址数据在时间上的连续,也就实现了三相地址数据的合成。其存储单元功能框图如图3。这样就可以利用一个正弦表来得到三相的正弦值,达到减少正弦表占用FPGA资源的目的。 

 

 

    查表时每次只能输出一相的数据,所以每次产生的数据需利用寄存器先暂存一下。首先输出A相,通过暂存器l存入到A相存储器;接着输出B相,利用暂存器2存入到B相存储器;最后输出C相,利用暂存器3存入到C相存储器中。这样,三相正弦波数据都存储在各自的存储器中,这三个寄存器采用同步控制信号,当控制信号触发时,同时输出三相的正弦波数据用于后面的比较。该部分用状态机实现,其状态转换图如图4所示。 

 

 

    其部分程序代码如下: 

    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,与理论计算值一致。下载后观测与功能仿真,布局布线后仿真图形也都完全一样,达到了设计的预期要求。 

 

 

图5  逻辑分析仪测试时序结果

 

参考文献 

[1] 周立功.Actel FPGA实验教程[M].广州:广州致远电子有限公司,2007,10. 

[2] 周立功.Actel FPGA原理与应用[M].广州:广州致远电子有限公司,2007,10. 

[3] 刘凤君.正弦波逆变器[M].北京:科学出版社,2002,2. 

[4] 夏宇闻.Verilog 数字系统设计教程[M].北京:北京航空航天大学出版社,2007,1. 

[5] 王伟.Verilog HDL程序设计与应用[M].北京:人民邮电出版社,2005,3. 

[6] 陈尚松,雷加.电子测量与仪器[M].北京:电子工业出版社,2007,2. 

[7] 王金明.Verilog HDL程序设计教程[M].北京:人民邮电出版社,2004,1. 

[8] 谭浩强.C语言程序设计(第二版)[M].北京:清华大学出版社,2006,1. 

[9] 陈利杰,董焕芝.SPWM信号产生系统IP软核设计及验证[J].包头钢铁学院学报,2005,24(4):364-368. 

[10] 杨旭东,张强.SPWM的FPGA实现方法.微计算机信息[J].(嵌入式与SOC),2006,12(2):145-147.

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。