1、大规模专用集成电路实验报告基于 FPGA 芯片的函数 发生器基于 FPGA 芯片的函数发生器- - 1基于 FPGA 芯片的函数发生器1 系统总体设计方案及实现方法1.1 任意波形发生器基本功能和技术指标1.1.1 基本功能本论文设计的任意波形发生器所要实现的基本功能:(1)输出波形的种类:正弦波、方波、三角波、锯齿波、脉冲波、手绘任意波形、任意公式波形。(2)输出波形每一通道的频率、幅值、偏置都可以由用户调节,并且可以设置多个通道信号之间的相位差。(3)编辑波形的方式有:设置参数、输入公式、手工绘制通信波特率的全部功能在 PC 机上实现。此外根据研制开发具有产生任意周期信号的智能型信号发生器
2、的协议规定,我们研制该仪器应具有的功能有图形显示和 RS232 接口功能,键盘式输入功能,菜单式选择周期波形种类等功能。除了通过上位机软件来设置波形参数外,还可以通按键来本地设置波形参数。LCD 字符型液晶显示器,用来显示一些参数和运行状态。1.1.2 技术指标(1)最大输出频率:25MHz 。(2)频率分辨率: 0.1Hz(3)存储深度:4K/通道(4)输出幅度:Vpp 为 12V(5)幅值分辨率:16 位(6)接口:UART 接口和 USB 接口基于 FPGA 芯片的函数发生器- - 21.2 系统总的设计方案和实现原理整个系统由两大部分组成:智能函数发生器和 PC 机软件系统。二者的通信
3、接口采用了 UART。波形发生器实现的功能有:对仪器各部分的初始化、接收上位机的波形数据、数据处理,人机交互等。主要的模块有:微处理器、波形存储器、地址发生器、频率合成器、地址选择器、译码电路、低通滤波器、偏置电路、驱动电路等。PC 端软件系统实现的功能有:图形化的人机界面,波形数据的编辑、波形的打开和保存、系统控制及通信波特率的控制等。图 1.1 系统总体方案图整个系统具体实现方式,首先是在 Altera 公司 Cyclone系列 FPGA 上构建一个基于 Nios的 SOPC 系统,完成系统控制、 DDS 信号发生和与 PC 机通讯等功能;PC 端软件由 LabVIEW 编程实现,完成图形
4、用户界面(GUI) 、编辑产生波形数据、频率控制和与片上系统通讯等功能。D/A 转换完成将片上系统数字输出转换为模拟输出。滤波电路主要实现运放、滤波和幅度控制的功能;外接键盘实现对系统参数的设置和控制,LCD 液晶模块用来指示系统运行状态。系统的核心是 SOPC 片上系统,具体结构图如图 1.2 所示:基于 FPGA 芯片的函数发生器- - 3图 1.2 函数发生器固件原理图如图所示,实线框中的部分是在 FPGA 中构建的 SOPC 片上系统。实线框外表示的是外部设备。1.2.1 外部设备外部设备包括外部扩展存储器,按键,RS232 接口, LCD,外部时钟和D/A 转换器件等。外部存储器包括
5、 4M 的串行配置芯片,用来存储硬件配置文件。4Mbytes 的 FLASH,作为程序存储器。 8Mbytes 的 SDRAM 作为数据存储器。LCD 为 1602 的字符型液晶显示器,用来显示系统参数和运行状态。除了通过上位机软件来设置波形参数外,还可以通按键来本地设置波形参数。外部时钟由 50MHZ 的有源晶振来提供。基于 FPGA 芯片的函数发生器- - 41.2.2 片上系统片上系统由 FPGA 内部生成,是一个基于 Nios的 SOPC 系统,包括Nios 模块、DDS 模块、 PLL 等模块。(1)处理器模块处理器模块通过在 SOPC Builder 中调用 IP 库组件实现,主要
6、由Nios CPU、UART 接口、 SDRAM 控制器、FLASH 控制器和 PIO 接口等组成。处理器模块对 DDS 模块的控制和对片上 RAM 模块的读写都通过 PIO 接口实现。(2)DDS 模块DDS 模块是整个系统工作的核心,信号的产生和调制均由该部分来完成。DDS 模块包含相位累加器、幅度调制器、波形存储 ROM 和 D/A 控制器等几个部分。该模块通过 VHDL 语言直接编程,用于完成频率控制字的相位累加和截断输出,从而实现波形数据的输出和频率调制功能。(3)PLL 模块PLL 模块的作用是消除时钟输入焊盘和器件内部时钟输入引脚间的畸变。并自动地调整时钟延迟单元。保证到达内部触
7、发器的时钟边沿与到达时钟输入端的时钟边沿严格同步,这一闭环系统有效地消除了时钟传输延迟。其次 PLL可以有效的滤掉时钟中的毛刺,对外部时钟有很好的提纯作用。另外通常用于调整 SDRAM 控制器内核与 SDRAM 芯片之间的时钟相位差。PLL 另外一个重要的作用是对外部时钟分频和倍频。2 智能函数发生器 SOPC 片上系统的设计2.1 片上系统各部分的实现NiosII 系统设计中,适当的将一些组件设计成主端口,可以绕过 CPU 对从外设直接发起数据传输,这种工作方式类似于 DMA,可以很大的减轻 CPU 的负担并提高系统的效率。DDS 组件负责按指定频率和指定模式对波形 RAM 进基于 FPGA
8、 芯片的函数发生器- - 5行寻址,它实际担当的角色是相位发生器的角色。它与相幅转换电路共同组成一个完整的 DDS 模块。DDS 组件拥有一个主端口和一个从端口。地址选择模块负责波形 RAM 输入地址线的仲裁工作。当任意波形发生器正在输出波形的时候,它输出由 DDS 组件传来的相位地址。当任意波形发生器正在往波形RAM 内写入波形数据的时候,它输出由 RAM 控制器传来的地址线。这种设计方法的好处在于使得 NiosII 可以像写内存一样往 RAM 中直接写入波形数据。在操控的设置上,一个仪器总是希望拥有一个友好的人机界面,因此在本设计中采用了一个 LCD 模块。LCD 模块通过 LCD 控制器
9、与总线相连。LCD控制器的作用就是按照规定时序将显示数据传递给 LCD 进行显示。LCD 控制器是一个全数字结构,可以在 FPGA 中实现。因此在这里选择了自行实现LCD 控制器。为了能够减轻 NiosII 的负担,这里也将 LCD 控制器设计为一个主外设。显示数据由 NiosII 先写入在系统内存中开辟的显示缓存中,LCD 控制器再负责从这个缓存中读取显示数据。这样,LCD 控制器无需驱动就可以正常工作。键盘控制器外接一个 4*4 的键盘,它可以直接将当前按键转换成相应的键值储存于它内部的寄存器中,然后通过申请中断来通知 NiosII 读取这个键值系统中。其他组件均是 SOPC Builde
10、r 中自带的标准组件,例如 SDRAM 控制器、FLASH 控制器以及 UART 接口等。同样也是数字电路的 SDRAM 和FLASH 都选择了片外器件,这是因为 FPGA 不是专门用来存储的芯片,它内置的 RAM 资源主要用来实现数字逻辑,容量有限,而用 LE(Logic Element,FPGA 中的一种资源)资源去实现存储器代价太高。除了存储器外,其他数字器件全都在一片 FPGA 内设计完成,相比采用单独 CPU 加上 FPGA设计的 DDS 芯片组合的方案,大大简化了物理硬件的设计与电路连接。(1)NiosII 软核及其外部接口的定制该系统所涉及的 NiosII 硬件系统及其外部接口包
11、括如下模块:NiosII 处理器核;外部 SDRAM;外部 FLASH;基于 FPGA 芯片的函数发生器- - 6EPCS 串行配制器件;双口 RAM 控制器;Avalon 三态桥;24 位输出 PIO(用于频率控制字 K 的输出);3 位输出 PIO(滤波通道选择);按键 PIO;16*2LCD;系统 ID;定时器(Timer);串口 UART;所有的外设都添加完毕,整个 NiosCPU 模块如图 2.2 所示:基于 FPGA 芯片的函数发生器- - 7图 2.2 NiosCPU 模块(2)DDS 模块的设计DDS 模块采用 VHDL 语言编写,所以必须将其转换为图形符号,加入设计顶层图中。
12、DDS 模块由 CLK 时钟输入触发而不断进行相位累加,相位累加基于 FPGA 芯片的函数发生器- - 8器值为 N,不断累加 FSW。FSW 值由 CPU 进行输入。当累加器累加到规定值时,相位累加器清零。在本设计中,为了提高精确度,同时兼顾片上资源,相位累加器最后将高 12 位,即第 17 位到第 28 位截断作为地址,读取 RAM 中的波形数据。双口的 RAM 具有读写两个端口,通过两套地址系统,对片上RAM 进行读写操作。处理器模块对 RAM 进行写操作,更新波形数据;DDS模块对 RAM 进行读操作,读取波形数据,产生幅度量化序列。本设计中的片上 RAM 地址位为 12 位,数据位为
13、 16 位,空间大小为 4KB,即存储了 4096个 16 位数据。我们可以根据片上 RAM 资源的情况,改变 RAM 地址位和数据位的宽度,从而提高系统设计的精度。DDS 模块的输入端为 CLK 时钟和 24 位 FSW 频率控制字,输出端为 12位片上 RAM 寻址线。其中,输入端 FSW 频率控制字对系统的输出频率进行调制,输出端 W 位地址线对存储于片上 RAM 的波形数据进行输出。添加好的DDS 模块如图 2.3 所示。图 2.3 DDS 模块首先模块由 CLK 时钟输入触发而不断进行相位累加,相位累加器值为N,不断累加 FSW。24 位 FSW 值由 NiosCPU 进行输入。当累
14、加到规定值时,相位累加器清零。然后将相位累加器高 12 位,即第 17 位到第 28 位截断赋予W,最后输出。在 RAM 读时序信号的配合下,周期的从波形存储器中读取数据,地址自动加一,周而复始的产生地址信号,并送入高速 D/A 转换器件,完成波形转换。在 DDS 波形输出状态下,NiosCPU 的工作只是不断查询接收缓冲区有无 PC 机传来的数据,如果有,就禁止 DDS 状态,并设置系统状态为基于 FPGA 芯片的函数发生器- - 9波形更新状态,进行新一轮的波形参数更新。a.相位累加器的设计相位累加器是 DDS 的核心部分,用于完成频率控制字的相位累加,随频率控制字的改变进而实现调频的功能
15、。该功能容易用编程实现,只要出现一个时钟上升沿,从键盘输入的相位控制字就累加一次。对于相位累加器的位宽,我们可以根据基准时钟 fclk 来设定。由下面的公式可得出输出信号频率 fout 与基准时钟 fclk 之间得关系式如下:fout = K fclk / 2N其中 K 表示输入的频率控制字(只能取整数),N 为相位累加器的宽度。本次设计中所用的基准时钟 fclk 为系统时钟,使用的是 Nios核心板提供的时钟:fclk=50106Hz。而 2N 无论 N 取何值都不会与 50106 相等,所以 fclk/2N 的结果总会有小数产生。在此提出以下改进方案:如果不把 2 分成 2N 份而是分成f
16、clk*30 份( 即 1.5109 份),则此时输出频率 fout 等于输入的频率控制字K/30。1.510 9 转化成二进制数为 1101000000000000000000000000B,共 28 位二进制数,则取累加器的长度为 28 位。在累加过程中,如果相位累加器累加值小于 1101000000000000000000000000B,则相位累加器继续累加。如果大于1101000000000000000000000000B,则相位累加器减去此值,使得相位累加器循环累加以保证相位连续。此时按照下式计算输出频率为。fout = K fclk / 2N = K / 30由于输入的频率控制字 K 为整数,所以输出频率为整数。当 K=3 时,输出频率 fout =0.1Hz。这样,我们从 PC 端软件或者键盘输入的频率值经 CPU 处理转化为 28 位二进制数,再输出到 DDS 累加器的频率控制字的输入端,由公式可知,DDS 的输出频率即为我们所设定的频率值。输入的频率为基准时钟,相位累加器就按输入的频率控制字累加,截取相位累加器的高 12 位作为 ROM的读地址,读地址也连续增加。相位累加器是通过硬件来实现的,VHDL 代码如下:library IEEE;use IEEE. STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;