本部分主要介绍 
 FPGA+ARM 
 控制部分的软件设计。 
 FPGA+ARM 
 控制部分包括 
 Verilog  
 
 
 HDL 
 硬件描述语言和 
 C 
 语言的开发。 
 FPGA  
 部分主要控制 
 AD7606 
 模数转换、数字三相锁相  
 
 
 环和FFT谐波计算模块、 
 SDRAM 
 控制器的设计、 
 FSMC 
 接口模块等。 
 ARM 
 部分主要完成嵌  
 
 
 入式实时操作系统  
 FreeRTOS 
 的移植、 
 FPGA 
 和 
 ARM 
 之间数据的读取和写入、 
 ARM 
 和上位机  
 
 
 之间的串口通信、以及经浮点运算后得出电能质量的各项参数等。  
 
 
 4.1 FPGA 模块软件设计  
 
 
 4.1.1 FPGA设计优势  
 
 
 FPGA  
 采用的是自顶向下的设计方法,将复杂的系统划分为低层次的功能模块,再将低  
 
 
 层次的模块划分为下一层的模块,一直划分直到能够使用基本模块为止。这种方式极大地  
 
 
 提高了开发效率和便于管理,使用  
 FPGA  
 开发具有很多优点:  
 
 
 ( 
 
 
 1)运行速度高。 
 FPGA  
 通过外部输入晶振产生系统时钟,再利用内部的锁相环倍频  
 
 
 功能可以生成各模块所需的时钟,频率可以达到很高。  
 
 
 ( 
 
 
 2)代码运行效率高。与单片机、 
 DSP  
 不同, 
 FPGA  
 打破了传统的顺序执行模式,采  
 
 
 用硬件并行执行方式,其运行效率更高。  
 
 
 ( 
 
 
 3)数字接口丰富。 
 FPGA  
 的  
 I/O  
 口众多,能够完成大规模的系统设计,而且开发人  
 
 
 员可以自定义这些  
 I/O 
 ,使得  
 FPGA  
 的灵活性很高,其功耗低,输入输出接口能与  
 TTL 
 、  
 
 
 CMOS  
 等兼容。  
 
 
 ( 
 
 
 4)可重构。 
 FPGA  
 的内部逻辑可以根据需求而改变,可以极大地缩短集成电路的设  
 
 
 计周期,还能够降低成本,市场前景广阔。  
 
 
 4.1.2 FPGA开发语言及软件  
 
 
 Verilog HDL 
 是一种硬件描述语言  
 [45] 
 ,用来描述数字系统硬件的结构和行为。和一般的  
 
 
 高级设计语言不同,硬件描述语言并行执行,还能描述过程中的时序,可以对各种抽象层  
 
 
 次的数字系统进行建模,这些层次按级别有系统级、算法级、 
 RTL 
 级、门级、开关级,在模  
 
 
 块中对设计的描述方式分为数据流、行为和结构三种方式, 
 Verilog HDL 
 于  
 1995  
 年被正式  
 
 
 纳入  
 IEEE  
 标准。  
 
 
 QuartusII 
 是  
 Altera  
 公司的 
 FPGA 
 开发软件,输入形式包括原理图、 
 Verilog HDL  
 等,其  
 
 
 界面友好且操作方便,涵盖了可编程逻辑器件的完整开发过程,包括设计输入、综合、布  
 
 
 局布线、时序分析、仿真和编程配置,用户可以在  
 QuartusII  
 中实现整个数字集成电路的  
 
 
 FPGA  
 设计流程。开发流程图如 
 4.1 
 所示。 
 
 
 
 
 4.1.3 FPGA软件运行流程  
 
 
 (1)设备上电后,复位,完成初始化。 
 PLL 
 锁相环将输入的 
 25MHz 
 晶振时钟倍频到  
 
 
 100MHz 
 ,作为系统运行的主时钟。 
 PLL 
 输出稳定后,主状态机开始运行,并等待 
 AD7606 
 初  
 
 
 始化完成后,设备正式开始运行。  
 
 
 ( 
 
 
 2)采样周期计数模块产生一个周期中断作为 
 AD7606 
 的采样频率,中断频率大小由三  
 
 
 相锁相环的输出决定(初始值为 
 100MHz/12.8KHz=7812 
 )。  
 
 
 ( 
 
 
 3) 
 ADC 
 采集模块接收到周期中断后,立刻开始同步采集并转换 
 3 
 路电压和 
 3 
 路电流信  
 
 
 号 ,转换方程如下: 
 ( 5 ) =  
 
 
 32768  
 
 
 5  
 
 
 2. 
 
 
 5  
 
 
 V 
 
 
 I 
 
 
 N R 
 
 
 E 
 
 
 F  
 
 
 V CODE  
 
 
 V  
 
 
 V  
 
 
   
 
 
    
 
 
 。同时正余弦计算模块,根据三相锁  
 
 
 相环输出的锁定相位角(初始值为 
 0 
 ),计算 
 1-17 
 次谐波的正余弦值。  
 
 
 ( 
 
 
 4) 
 SDRAM 
 计算模块,将 
 AD 
 采样的三相电流和正余弦值作为输入,计算出其实部和  
 
 
 虚部,然后将其存储在 
 SDRAM 
 中。  
 
 
 (5)FFT 
 计算模块,以一定的周期,在 
 SDRAM 
 模块中,抽取三相电流数据点,分别进  
 
 
 行 
 256 
 点 
 FFT 
 计算,然后将计算出的三相电流谐波分量幅值,存入到 
 RAM 
 中。  
 
 
 (6)三相锁相环模块,对AD 
 采样的三相电压,进行锁相环计算,并输出采样频率,通  
 
 
 过该值调整 
 AD 
 的采样频率,使当前正余弦值计算模块的相角与三相电压同相。  
 
 
 (7)最后将所有的计算数据同步更新到FSMC 
 的存储寄存器组中,并输出一个 
 ARM 
 中  
 
 
 断信号,通知 
 ARM 
 对这些寄存器数据进行访问。步骤 
 3-7 
 ,必须在下一个周期中断产生之前  
 
 
 完成。步骤 
 3-6 
 完成后,主状态机将等待下一个周期中断,然后重复以上步骤继续运行。  
 
 
 FPGA 
 主程序流程图如 
 4.2 
 所示。 
 
 
 
 
 4.1.4 AD7606 采样  
 
 
 AD7606  
 的工作是通过  
 FPGA  
 控制其信号时序进行的。 
 AD7606 
 通过 
 CONVST_A 
 、  
 
 
 CONVST_B  
 引脚分别控制 
 V1~V4 
 、 
 V5~V8 
 八个通道的转换,通过  
 CS  
 和  
 RD  
 控制数据的读  
 
 
 取,通过 
 PAR/SER SEL 
 引脚控制选择数据接口模式。本设计中将  
 CONVST_A 
 、 
 CONVST_B  
 
 
 连接在一起实现  
 8  
 通道同步采样,将 
 PAR/SER SEL 
 引脚设置为低电平时采用并行数据线  
 
 
 DB[15: 0] 
 输出。在开始采样之前,需要给 
 RESET 
 引脚一个大于 
 50ns 
 的正脉冲进行复位,当  
 
 
 CONVST 
 信号的上升沿时 
 AD 
 转换开启, 
 AD7606 
 内含有的片内振荡器用来实现转换,同时  
 
 
 BUSY 
 信号变为高电平并发送至 
 FPGA 
 表示正在进行数据转换,当转换结束时 
 BUSY 
 信号恢复  
 
 
 低电平,此时 
 8 
 路转换数据被锁村到输出数据寄存器中,设置 
 CS 
 和 
 RD 
 设置为低电平,使能  
 
 
 数据输出总线 
 DB[15:0] 
 并将数据发送至 
 FPGA 
 ,一次 
 A/D  
 转换结束。 
 BUSY  
 信号高电平的持  
 
 
 续时间 
 t 
 CONV  
 的长短取决于芯片的采样速率 ,转换控制时序如图  
 4.3 
 所示。 
 
 
 
 
 驱动程序的编写是利用 
 FSM 
 ( 
 
 
 Finite State Machine 
 ,有限状态机)设计实现的, 
 AD 
 数  
 
 
 据读取状态转换过程如图  
 4.5  
 所示,关键程序部分见附录。 
 
 
 
 
 4.1.6 FFT运算模块  
 
 
 本设计中谐波计算采用基 
 -2 FFT  
 变换, 
 FFT 
 运算模块有两种实现方法:第一种是根据  
 
 
 FFT 
 的基本原理自定义 
 FFT 
 模块,设计模块有蝶形运算单元、旋转因子单元、地址发生器以  
 
 
 及时序控制单元等,然后再进行仿真测试,这种方式占用较多的资源,而且计算效率较  
 
 
 低;第二种是利用 
 Quartus ii 
 软件上提供了专门的  
 FFT IP  
 核,根据设计要求设置参数就能得  
 
 
 到一个高效地 FFT 模块,在实际工程应用中可以直接移植,在移植之前需要对其进行时序  
 
 
 仿真验证。本文选择第二种方法。  
 
 
 Quartus ii 
 提供了两种定制 
 FFT 
 的方法: 
 DSP Builder  
 和 
 MegaWizard Plug-in Wizard 
 ,本  
 
 
 设计选择了第二种方法,其可以手动配置  
 FFT  
 的参数。选择  
 Transforms  
 下  
 FFT v13.1 
 ,选  
 
 
 择输出文件类型为  
 Verilog HDL  
 [47] 
 ,新建  
 FFT  
 如图  
 4.9  
 所示。 
 
 
 
 
 进入  
 FFT  
 配置界面后,配置的是转换长度为 
 256 
 点,数据位度和旋转因子精度都为  
 
 
 16bits 
 。 
 FFT IP 
 核元件图如 
 4.10 
 所示,包含 
 10 
 个输入和 
 8 
 个输出信号:  
 
 
 sink_real[1 5 
 : 
 0] 
 和 
 sink_imag[1 5 
 : 
 0] 
 :是输入数据的实部和虚部;  
 
 
 source_real[1 5 
 : 
 0] 
 和 
 source_imag[1 5 
 : 
 0] 
 :是输出数据的实部和虚部;  
 
 
 Source_exp[5 
 : 
 0] 
 :是所得输出实部和虚部数据的指数;  
 
 
 Sink_valid 
 :为 
 1 
 时,表示 
 FFT 
 正接收数据;  
 
 
 Source_valid 
 :为 
 1 
 时,表示正读取 
 FFT 
 的转换结果。 
 
 
 
 
 FFT 
 核的引擎架构分为四输出和单输出,这里的“单”和“四”是指内部FFT蝶形处理  
 
 
 器的吞吐量,前者分时复用一个复数乘法器,单个时钟内得到 
 1 
 个输出,单输出消耗资源  
 
 
 少;后者同时使用 
 4 
 个复数乘法器,单个时钟内得到 
 4 
 个输出,四输出计算速度快。本设计  
 
 
 采用单输出引擎架构,可以使  
 FFT  
 处理器的资源消耗最小化。其中单输出实现结果如图  
 
 
 4.11  
 所示, 
 FFT  
 引擎通过并行方式从  
 RAM  
 中读取复数输入 
 x[k,i] 
 ,然后通过蝶形运算得到  
 
 
 FFT 输出一路结果 
 G[k,i] 
 。 
 
 
 
 
 FFT  
 核内部数据使用块浮点结构,以达到高信噪比 
 (SNR) 
 , 
 Altera FFT  
 核可以设置  
 
 
 为四种  
 I/O  
 数据流结构,按不同的速度要求由高速到低速分别为流结构、变流结构、缓  
 
 
 冲突发结构、突发结构四种 
 I/O  
 流方式。流结构和变流结构都是流水线型的,是对时间  
 
 
 要求很严格的应用场合,能实现很高的数据吞吐率,但缺点是占用最多的逻辑资源。硬  
 
 
 件实现的  
 FFT  
 处理速度快,即便是突发结构, 
 1ms  
 内便可完成一次  
 256  
 点 
 FFT 
 ,故选  
 
 
 择  
 Burst  
 架构。  
 
 
 最后要对FFT仿真激励文件进行编写,利用 
 Modelsim 
 仿真软件,与 
 Quartus ii  
 自带的  
 
 
 仿真功能不一样, 
 Modelsim 
 仿真需要编写激励文件 
 (Testbench)。激励文件主要用于给子 
  
   
 
  
 
                 
  模块提供信号激励。 
  FFT 
  数据输入输出时序如图  
  4.12  
  所示,仿真图如 
  4.13 
  所示,左侧为  
 
 
  
  模块端口变量名。 
 
 
  
 
 
 
  4.2 ARM 模块软件设计  
 
 
  
  4.2.1FreeRTOS简介  
 
 
  
  近年来嵌入式操作系统因其高实时性、多任务调度等优点在各个领域得到了广泛的应  
 
 
  
  用,目前主流的嵌入式操作系统有 
  Vxworks 
  、 
  Linux 
  、 
  µC/OS-II 
  及 
  FreeRTOS 
  等,不同于 
  Unix  
 
 
  
  操作系统给每个任务分配同样的运行时间的任务调度方式, 
  RTOS的任务调度设计是可预测 
   
    
 
   
   
    
 
   
  
 
 
   的, 
   FreeRTOS 
   的任务调度就是根据优先级来决定下一刻该运行哪个任务,这样在实时环境  
  
 
   
   中操作系统就能够对某一事件做出实时的响应。本设计采用 
   FreeRTOS 
   嵌入式实时操作系  
  
 
   
   统,可以更合理、更有效地利用 
   CPU 
   的资源,简化应用软件的设计,缩短系统开发时间,更  
  
 
   
   好地保证系统的实时性和可靠性。 
   FreeRTOS 
   是一个可裁剪的小型实时操作系统,其特点包  
  
 
   
   括:  
  
 
   
   ( 
  
 
   
   1)性价比高。 
   FreeRTOS 
   是完全开源的操作系统,其完整的源码在官网就可以方便的  
  
 
   
   下载到。  
  
 
   
   ( 
  
 
   
   2)高可移植性。 
   FreeRTOS 
   源码大多用 
   C 
   语言编写,移植起来更加方便。  
  
 
   
   ( 
  
 
   
   3)可裁剪性。用户可根据 
   FreeRTOS 
   提供的丰富的配置,选择自己需要的内核功能。  
  
 
   
   ( 
  
 
   
   4)混合任务调度模式。 
   FreeRTOS 
   同时支持优先级抢占式、轮转式协同调度和时间片  
  
 
   
   调度三种方式,优先级高的任务优先处理,优先级相同时则按时间片轮流执行,这样使得  
  
 
   
   系统运行时的灵活性强。  
  
 
   
   ( 
  
 
   
   5 
   ) 
   FreeRTOS 
   系统简单、小巧,一般内核仅占用4k-9k字节空间,大大节约了资源。  
  
 
   
   4.2.2 ARM软件运行流程  
  
 
   
   ARM 
   上电后执行以下初始化: 
   FreeRTOS 
   内核初始化、板载信号灯初始化、串口初始  
  
 
   
   化、 
   FSMC 
   总线初始化、中断 
   IO 
   初始化。  
  
 
   
   初始化完成后,将会创建 
   4 
   个线程:  
  
 
   
   (1)参数设置线程:ARM 
   通过串口,接收上位机设置的参数,并执行响应操作。  
  
 
   
   (2)数据上传线程:ARM 
   通过串口,将设备运行数据上传给上位机。  
  
 
   
   (3)FPGA 
   通信线程:完成 
   ARM 
   向 
   FPGA 
   写入参数及 
   ARM 
   向 
   FPGA 
   读取数据。  
  
 
   
   (4)数据计算线程:计算FPGA 
   上传的数据。  
  
 
   
   线程创建完成后,开启任务调度器, 
   RTOS 
   将调度上述三个线程进行运行, 
   ARM 
   主程序  
  
 
   
   流程图如 
   4.14 
   所示。 
  
 
   
 
  信迈提供STM32 ARM+FPGA的解决方案。
 
   上位机软件主要实现功能是:接受串口发送的数据并发出指令,处理和存储通过串口  
  
 
   
   通信接收到的电能质量数据,并实现对电能质量指标和波形的显示和分析。  
  
 
   
   5.1 基本框架  
  
 
   
   本文上位机软件开发平台为  
   Microsoft Visual Studio 2013 
   ,开发语言为 
   C# 
   。 
   C# 
   语言具有  
  
 
   
   开发速度快、良好的面向对象的特性、基础类库全等优点  
   [48] 
   。数据分析软件编写采用了模块  
  
 
   
   化设计思想,方便系统后期的功能更新,主要包括绘图部分、数据存储部分以及数据分析  
  
 
   
   部分。软件基本框架如图  
   5.1  
   所示。 
  
 
   
 
   
 
 
 


![P35[10-5]硬件IIC配置+读写MPU6050(软)(此处注意与软件iic区别)](https://img-blog.csdnimg.cn/64c847bf47884ae58a120a120e443189.png)
















