基于FPGA实现的任意波形发生器的设计与研究
基于FPGA实现的任意波形发生器的设计与研究

a v n a e f sm l p r t o n ih d g e f it g a in c a a tr s i sb t a s a d u t b e f eu n y d a t g so ip e o e a in a d h g e r e o n e r t o h r c e it c u lo h sa j sa l r q e c
本文的重点 。D S 电路工作 时首先对 需要的波形进行采样, D
将 采样数值存入波形存储器作 为查 找表 ,然 后再通过查找表 将 数据 读 出来 ,经过 D A转换器转化成模拟信 号,并通过低 / 通 滤波器将 D C 转换器输 出的阶梯波 转换成光 滑的连续 信 A
号 。D S电路 的基 本 结 构 一 般 包 括 以下 几 部 分 :相 位 累 加 器 、 D
3 基于 F G P A的 D S电路的实现 D
3 1DD 的 结构 . S
境下的时序约束分析工具分析可知, 采用此结构 的 3 位相位 2 累加器的数据累加延时 比普通结构的进位 累加器 的数据延 时 减小 了一倍,提高 了 D S的相位 累加速度 。 D
D S 电路 的实现 是整个硬件 系统设计的关键所在,也是 D
设计 。
21 硬件设计方案 .
在任 意波形发 生器 的组成部分 中,硬件系统是整个系统 的核心。它包括波形 生成 电路 ,处理器 、存储器、接 口控制 模块、波 形选择 电路以及系统硬件控制模块等 电路 ,其它模
块通过相关接 口与其连接 ,构成 了一个完整 的硬件系统 。
2 硬件
基于 D S技术实现波形发生器 的方法主要有 以下两种 : D
3 2 1 相 位 累 加 器 的 设 计 ..
基于FPGA的任意波形发生器设计

典型的模拟滤波器有巴特沃斯 (Butterworth) 滤波器、切比雪夫 (Chcbyshcv) 滤波器、贝塞尔(Scsscl) 滤波器和椭I 圜(Ellipsc) 滤波器。
这几种低通滤波器都有各自的幅频特性。通带与阻带之间称为过渡带,过渡 带越窄,说明滤波器的选择性越好。巴特沃斯滤波器的响应最为平坦,它的 通带内没有波纹,在靠近零频处,有最平坦通带,趋向阻带时衰减单调增大, 缺点是从通带到阻带的过渡带最宽,对于带外干扰信号的衰减作用最弱,过 渡带不够陡峭。切比雪夫滤波器在通带内衰减在零值和一个土限值之间做等 起伏变化,阻带内衰减单调增大,通带或组带有波动,但过渡带比较陡峭。 贝塞尔滤波器通带内有较好的线性相位持性。椭圆函数滤波器不仅通带内有 起伏,阻带内也有起伏,而且过渡带陡峭。
? 单片机主要完成以下三个方向的任务:
(1) 根据键盘设置的波形和频率,完成波形的选择、编辑,并产生相应的 频率控制字送FPGA 。
(2) 将输出信号的频率送数码管显示。
(3) 与USB 接口芯片实现USB 接口电路并与上位PC 机通信。
主要要完成的工作:
? 1)基于FPGA 的DDS 实现 首先熟悉Quartus II 开发环境,其次对确定FPGA
工艺,无需另行架构,波形稳定度与准确度都比较高,有 理想的波形质量。但是,专用的DDS 芯片的数据表都已 经固化在芯片里,因此对于不同的应用其灵活性相对较, 无法灵活的实现任意波形的输出,同时DDS 芯片加单片 机的设计模式使硬件电路相对复杂。
基于DDS技术选择的实施方案
? 方案二: 基于FPGA 实现DDS 功能,通过单片机实现控制。此方 案的核心在于FPGA 的设计实现逻辑功能,通过对存储器 查表后输出信号,由相连接的数模转换器转换为要求的波 形。单片机作为控制器,易于控制与调试。
基于FPGA的任意波形发生器设计与实现

采用“激励—响应”方法进行系统参数测量时,需要产生已知的激励信号输入到被测系统,系统对激励信号输出相应的响应信号,通过对该响应的测定和分析找出被测系统的输入—输出关系,从而定义系统的性能。由此我们可以看出,高质量激励信号的产生是系统参数测量中一个重要的环节,标准理想的输入激励是整个测试系统正确工作的基础,它从根本上影响测量系统的性能。
传统的信号发生器一般基于模拟技术。它首先生成一定频率的正弦信号,然后再对这个正弦信号进行处理,从而输出其他波形信号(例如通过比较器可以输出方波信号,对方波信号通过积分器可以生成三角波信号等)。这种方法的关键在于如何生成特定频率的正弦信号。早期的信号发生器大都采用谐振法,后来出现采用锁相环等频率合成技术的信号发生器。但基于模拟技术的传统信号发生器能生成的信号类型比较有限,一般只能生成正弦波、方波、三角波等少数的规则波形信号。如果需要生成较复杂的波形信号,电路的复杂度及设计难度都将大大增加。
任意波形发生器是现代电子测试领域应用最为广泛的通用仪器之一,它的功能远比函数发生器强,可以产生各种理想及非理想的波形信号,对存在的各种波形都可以模拟,广泛应用于测试、通信、雷达、导航、宇航等领域。
1.2任意波形发生器的功能
任意波形发生器既具有其他信号源的信号生成能力,又可以通过各种编辑手段生成任意的波形采样数据,方便地合成其他信号源所不能生成的任意波形,从而满足测试和仿真实验的要求。任意波形发生器的主要功能[3]包括:
1.3国内外发展现状
采用可变时钟和计数器寻址波形存储器的任意波形发生器在一段时期内曾得到广泛的应用,其取样时钟频率较高且可调节,但其对硬件要求比较高,需要高性能的锁相环和截止频率可调的低通滤波器(或者多个低通滤波器),且频率分辨率低,频率切换速度较慢,已经逐步退出市场。
基于FPGA的任意波形发生器设计

基于FPGA的任意波形发生器设计与研究摘要:在此基于DDS技术进行任意波形发生器的研制。
以单片机为控制核心,采用FPGA芯片EP1C3T144C8,通过使用相位累加器和波形ROM等模块实现DDS功能,可产生正弦波、方波、三角渡与锯齿波等常规波形,而且能够产生任意波形,并通过键盘一一对应波形,从而满足研究的需要。
最后给出系统产生的测试数据,并对影响频谱纯度的杂散与噪声产生的原因进行分析。
关键词:FPGA;DDS;任意波形发生器;杂散引言任意波形发生器(Arbitrary Waveform Generator,AWG)是一种多波型的信号发生器,它不仅能产生正弦波、指数波等常规波形,也可以表现出载波调制的多样化,如:产生调频、调幅、调相和脉冲调制等。
更可以通过计算机软件实现波形的编辑,从而生成用户所需要的各种任意波形。
任意波形发生器的实现方案主要有程序控制输出、DMA输出、可变时钟计数器寻址和直接数字频率合成(DDS)等多种方式。
目前任意波形发生器的研制主要基于DDS 技术,与传统的频率合成器相比,DDS具有低成本、低功耗、高分辨率和快速转换时间等优点,广泛使用在通信、测量与电子仪器领域,是设备全数字化的一个关键技术。
1 任意波形发生器的理论分析1.1 DDS技术简介DDS(Direct Digital Synthesis)的概念由美国学者J.Tierney、C.M.Rader和B.Gold 在1971年提出。
该技术是从相位的概念进行频率合成,主要优点是输出相位连续、相对带宽较大、频率分辨率很高、可编程、准确度和稳定度都比较高。
DDS技术是利用查表法来产生波形,而通过修改存储在ROM里的数据,就可以产生任意波形。
1.2 DDS基本结构DDS主要有相位累加器、ROM波形查询表、数模转换器组成。
其基本框图如图1所示。
线性数字信号通过相位累加器逐级实现,波形函数存储在ROM中,根据累加器输出的相位值作为地址,寻找存储在ROM中的波形函数的幅度量化值,完成相位到幅值的转换,输出相对应的序列。
FPGA实现的任意波形发生器的设计

FPGA实现的任意波形发生器的设计波形发生器广泛应用于电子电路、自动控制和科学试验领域,是一种为电子测量工作提供符合严格技术要求的电信号设备,和示波器、电压表、频率计等仪器一样是最普通、最基本也是应用最为广泛的电子仪器之一,几乎所有电参量的测量都要用到波形发生器。
随着通信、雷达的不断发展,对信号源的频率稳定度、频谱纯度、频率范围和输出频率的个数以及信号波形的形状也提出越来越多的要求。
不仅要求能产生正弦波、方波等标准波形,还能根据需要产生任意波形,且操作方便,输出波形质量好,输出频率范围宽,输出频率稳定度、准确度及分辨率高,频率转换速度快且频率转换时输出波形相位连续等。
可见,研究制作高性能的任意波形发生器十分有必要,而且意义重大。
1 任意波形发生器的FPGA 实现系统框架如图1 所示,上位机产生任意波形数据,经USB2.0 控制器CY7C68013A 与FPGA(现场可编程门阵列)相连。
将数据下载到FPGA 的RAM 当中,再通过硬件电路依次从波形存储器中读取出来,经D/A 转换及滤波后得到所需信号波形输出。
关于DDS 的基本原理与结构在这里就不再加以阐述,用FPGA 按照DDS 的基本原理和结构设计和实现一个任意波形发生器,所以DDS 的几个基本部分都是应当具备的。
实现任意波形发生的关键在于把存放波形量化表的ROM换成了可以改写的RAM,这样通过与RAM 的接口可以改变存放在波形RAM 中的数据从而实现任意波形发生。
这里主要介绍控制部分、相位累加器、波形RAM 几个模块来叙述任意波形发生器的实现。
1.1 控制部分这个部分主要是要解决DDS 模块与单片机的接口问题。
在FPGA 的实现中,主要设计了2 个模块,一个是输入寄存器模块,为了接收单片机写入的频率控制字。
另外一。
课题设计 基于FPGA的多功能波形发生器的设计

课题实训基于FPGA的多功能波形发生器的设计一、实训目的1.懂得利用FPGA芯片实现多种波形的产生方法2.懂得多功能波形发生器的结构组成3.懂得一种复杂FPGA电路的设计二、实训器材1.EDA实验箱1台2.微型计算机1台3.MAX+PLUSII10.2软件1套4.下载电缆1条三、实训原理设计一个多功能波形发生器。
该波形发生器能产生正弦波、方波、三角波和由用户编辑的特定形状波形。
具体要求如下:(1)具有产生正弦波、方波、三角波、锯齿波4种周期性波形的功能。
(2)用键盘输入编辑生成上述4种波形(同周期)的线性组合波形。
(3)具有波形存储功能。
(4)输出波形的频率范围为100Hz~200kHz;重复频率可调,频率步进间隔≤100Hz。
(5)输出波形幅度范围0~5V(峰-峰值),可按步进0.1V(峰-峰值)调整。
(6)具有显示输出波形的类型、重复频率(周期)和幅度的功能。
(7)用键盘或其他输入装置产生任意波形。
多功能波形发生器系统由以下四部分组成.输入部分、FPGA部分、DAC、显示部分组成。
多功能波形发生器方框图四、设计程序(参考程序)--功能:实现4种常见波形正弦、三角、锯齿、方波(A、B)的频率、幅度可控输出(方波--A的占空比也是可控的),可以存储任意波形特征数据并能重现该波形,还可完成--各种波形的线形叠加输出。
--说明:SSS(前三位)和SW信号控制4种常见波形种哪种波形输出。
4种波形的频率、--幅度(基准幅度A)的调节均是通过up、down、set按键和4个BCD码置入器以及一--个置入档位控制信号(ss)完成的(AMP的调节范围是0~5V,调节量阶为1/51V)。
--其中方波的幅度还可通过u0、d0调节输出数据的归一化幅值(AMP0)进行进一步--细调(调节量阶为1/(51*255)V)。
方波A的占空比通过zu、zp按键调节(调节--量阶1/64*T)。
系统采用内部存储器——RAM实现任意输入波形的存储,程序只支--持键盘式波形特征参数置入存储,posting 为进入任意波置入(set)、清除(clr)状态--控制信号,SSS控制存储波形的输出。
基于fpga多功能波形发生器实验报告含程序

基于FPGA多功能波形发生器实验报告含程序基于FPGA的多功能波形发生器课程设计实验报告学院: 电气与控制工程学院班级: 微电子11011106080118 学号:姓名: 李少飞日期: 2015.4.2一、电路主体电路图二、各模块vhdl代码三、各模块仿真结果四、实验感悟一、实验主体电路二、各模块vhdl代码三角LIBRARY ieee; USE ieee.std_logic_1164.all;LIBRARY altera_mf;USE altera_mf.all;ENTITY sanjiao ISPORT(address : IN STD_LOGIC_VECTOR (7 DOWNTO 0); inclock : IN STD_LOGIC ;q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0));END sanjiao;ARCHITECTURE SYN OF sanjiao ISSIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0); COMPONENT altsyncramGENERIC (clock_enable_input_a : STRING;clock_enable_output_a : STRING;init_file : STRING;intended_device_family : STRING;lpm_hint : STRING;lpm_type : STRING;numwords_a : NATURAL;operation_mode : STRING;outdata_aclr_a : STRING;outdata_reg_a : STRING;widthad_a : NATURAL;width_a : NATURAL;width_byteena_a : NATURAL);PORT (clock0 : IN STD_LOGIC ;address_a : IN STD_LOGIC_VECTOR (7 DOWNTO 0);q_a : OUT STD_LOGIC_VECTOR (7 DOWNTO 0));END COMPONENT;BEGINq <= sub_wire0(7 DOWNTO 0);altsyncram_component : altsyncramGENERIC MAP (clock_enable_input_a => "BYPASS",clock_enable_output_a => "BYPASS",init_file => "sanjiao.hex",intended_device_family => "Cyclone II",lpm_hint => "ENABLE_RUNTIME_MOD=YES, INSTANCE_NAME=rom3", lpm_type => "altsyncram",numwords_a => 256,operation_mode => "ROM",outdata_aclr_a => "NONE",outdata_reg_a => "UNREGISTERED",widthad_a => 8,width_a => 8,width_byteena_a => 1)PORT MAP (clock0 => inclock,address_a => address,q_a => sub_wire0);END SYN;-正弦LIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY altera_mf;USE altera_mf.all;ENTITY sinx ISPORT(address : IN STD_LOGIC_VECTOR (7 DOWNTO 0); inclock : IN STD_LOGIC ;q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0));END sinx;ARCHITECTURE SYN OF sinx ISSIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0); COMPONENT altsyncramGENERIC (clock_enable_input_a : STRING;clock_enable_output_a : STRING;init_file : STRING;intended_device_family : STRING;lpm_hint : STRING;lpm_type : STRING;numwords_a : NATURAL;operation_mode : STRING;outdata_aclr_a : STRING;outdata_reg_a : STRING;widthad_a : NATURAL;width_a : NATURAL;width_byteena_a : NATURAL);PORT (clock0 : IN STD_LOGIC ;address_a : IN STD_LOGIC_VECTOR (7 DOWNTO 0); q_a : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );END COMPONENT;BEGINq <= sub_wire0(7 DOWNTO 0);altsyncram_component : altsyncramGENERIC MAP (clock_enable_input_a => "BYPASS",clock_enable_output_a => "BYPASS",init_file => "sinx.hex",intended_device_family => "Cyclone II",lpm_hint => "ENABLE_RUNTIME_MOD=YES, INSTANCE_NAME=ROM1", lpm_type => "altsyncram",numwords_a => 256,operation_mode => "ROM",outdata_aclr_a => "NONE",outdata_reg_a => "UNREGISTERED",widthad_a => 8,width_a => 8,width_byteena_a => 1)PORT MAP (clock0 => inclock,address_a => address,q_a => sub_wire0);END SYN;方波LIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY altera_mf;USE altera_mf.all;ENTITY fangbo ISPORT(address : IN STD_LOGIC_VECTOR (7 DOWNTO 0); inclock : IN STD_LOGIC ;q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0));END fangbo;ARCHITECTURE SYN OF fangbo ISSIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0); COMPONENT altsyncramGENERIC (clock_enable_input_a : STRING;clock_enable_output_a : STRING;init_file : STRING;intended_device_family : STRING;lpm_hint : STRING;lpm_type : STRING;numwords_a : NATURAL;operation_mode : STRING;outdata_aclr_a : STRING;outdata_reg_a : STRING;widthad_a : NATURAL;width_a : NATURAL;width_byteena_a : NATURAL);PORT (clock0 : IN STD_LOGIC ;address_a : IN STD_LOGIC_VECTOR (7 DOWNTO 0);q_a : OUT STD_LOGIC_VECTOR (7 DOWNTO 0));END COMPONENT;BEGINq <= sub_wire0(7 DOWNTO 0);altsyncram_component : altsyncramGENERIC MAP (clock_enable_input_a => "BYPASS",clock_enable_output_a => "BYPASS",init_file => "fangbo.hex",intended_device_family => "Cyclone II",lpm_hint => "ENABLE_RUNTIME_MOD=YES, INSTANCE_NAME=rom2", lpm_type => "altsyncram",numwords_a => 256,operation_mode => "ROM",outdata_aclr_a => "NONE",outdata_reg_a => "UNREGISTERED",widthad_a => 8,width_a => 8,width_byteena_a => 1)PORT MAP (clock0 => inclock,address_a => address,q_a => sub_wire0);END SYN;斜波LIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY altera_mf;USE altera_mf.all;ENTITY xiebo ISPORT(address : IN STD_LOGIC_VECTOR (7 DOWNTO 0); inclock : IN STD_LOGIC ;q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0));END xiebo;ARCHITECTURE SYN OF xiebo ISSIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0);COMPONENT altsyncramGENERIC (clock_enable_input_a : STRING;clock_enable_output_a : STRING;init_file : STRING;intended_device_family : STRING;lpm_hint : STRING;lpm_type : STRING;numwords_a : NATURAL;operation_mode : STRING;outdata_aclr_a : STRING;outdata_reg_a : STRING;widthad_a : NATURAL;width_a : NATURAL;width_byteena_a : NATURAL);PORT (clock0 : IN STD_LOGIC ;address_a : IN STD_LOGIC_VECTOR (7 DOWNTO 0); q_a : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );END COMPONENT;BEGINq <= sub_wire0(7 DOWNTO 0);altsyncram_component : altsyncramGENERIC MAP (clock_enable_input_a => "BYPASS",clock_enable_output_a => "BYPASS",init_file => "xiebo.hex",intended_device_family => "Cyclone II",lpm_hint => "ENABLE_RUNTIME_MOD=YES, INSTANCE_NAME=rom4", lpm_type => "altsyncram",numwords_a => 256,operation_mode => "ROM",outdata_aclr_a => "NONE",outdata_reg_a => "UNREGISTERED",widthad_a => 8,width_a => 8,width_byteena_a => 1)PORT MAP (clock0 => inclock,address_a => address,q_a => sub_wire0);END SYN;四选一library ieee;use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity choice_4 isport(sel:in std_logic_vector(1 downto 0); d1,d2,d3,d4:instd_logic_vector(7 downto 0);q:out std_logic_vector(7 downto 0)); end choice_4;architecture behave of choice_4 is beginprocess(sel)begincase sel iswhen "00"=>q<=d1;when "01"=>q<=d2;when "10"=>q<=d3;when "11"=>q<=d4;when others=>null;end case;end process;end architecture;2-4译码器library ieee;use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; ENTITY decoder24 ISPORT(sel:IN std_logic_vector(1 downto 0);en1,en2,en3,en4:OUT std_logic); END;ARCHITECTURE be OF decoder24 IS BEGINprocess(sel)BEGINcase sel iswhen "00" => en1 <='1'; when "01" => en2 <='1'; when "10" =>en3<='1'; when "11" => en4 <='1'; when others=>null; end case;END process;END;正选扫描电路LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; --正弦信号发生器源文件USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY sins ISPORT ( CLK,en ,reset: IN STD_LOGIC; --信号源时钟DOUT : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );--8位波形数据输出 END sins;ARCHITECTURE behave OF sins IS COMPONENT sinx --调用波形数据存储器LPM_ROM文件:datarom.vhd声明 PORT(address : IN STD_LOGIC_VECTOR (7 DOWNTO 0);--8位地址信号 inclock : IN STD_LOGIC ;--地址锁存时钟q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) ); END COMPONENT;SIGNAL Q1 : STD_LOGIC_VECTOR (7 DOWNTO 0); --设定内部节点作为地址计数器BEGINPROCESS(CLK,en,reset ) --LPM_ROM地址发生器进程BEGINif reset='0' then Q1<="00000000";elsif CLK'EVENT AND CLK = '1' and en='1' THEN Q1<=Q1+1; --Q1作为地址发生器计数器 END IF;END PROCESS;u1 : sinx PORT MAP(address=>Q1, q => DOUT,inclock=>CLK);--例化 END;斜波扫描电路LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; --正弦信号发生器源文件USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY xiebos ISPORT ( CLK,en ,reset: IN STD_LOGIC; --信号源时钟DOUT : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );--8位波形数据输出 END xiebos;ARCHITECTURE behave OF xiebos IS COMPONENT xiebo --调用波形数据存储器LPM_ROM文件:datarom.vhd声明 PORT(address : IN STD_LOGIC_VECTOR (7 DOWNTO 0);--8位地址信号 inclock : IN STD_LOGIC ;--地址锁存时钟q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );END COMPONENT;SIGNAL Q1 : STD_LOGIC_VECTOR (7 DOWNTO 0); --设定内部节点作为地址计数器 BEGINPROCESS(CLK,en,reset ) --LPM_ROM地址发生器进程BEGINif reset='0' then Q1<="00000000";elsif CLK'EVENT AND CLK = '1' and en='1' THEN Q1<=Q1+1; --Q1作为地址发生器计数器 END IF;END PROCESS;u1 : xiebo PORT MAP(address=>Q1, q => DOUT,inclock=>CLK);--例化 END;方波扫描电路LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; --正弦信号发生器源文件USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY fangbos ISPORT ( CLK,en ,reset: IN STD_LOGIC; --信号源时钟DOUT : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );--8位波形数据输出 END fangbos;ARCHITECTURE behave OF fangbos ISCOMPONENT fangbo --调用波形数据存储器LPM_ROM文件:datarom.vhd声明PORT(address : IN STD_LOGIC_VECTOR (7 DOWNTO 0);--8位地址信号 inclock :IN STD_LOGIC ;--地址锁存时钟q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) ); END COMPONENT;SIGNAL Q1 : STD_LOGIC_VECTOR (7 DOWNTO 0); --设定内部节点作为地址计数器 BEGINPROCESS(CLK,en,reset ) --LPM_ROM地址发生器进程BEGINif reset='0' then Q1<="00000000";elsif CLK'EVENT AND CLK = '1' and en='1' THEN Q1<=Q1+1; --Q1作为地址发生器计数器 END IF;END PROCESS;u1 : fangbo PORT MAP(address=>Q1, q => DOUT,inclock=>CLK);--例化 END;三角波扫描电路LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; --正弦信号发生器源文件USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY sanjiaos ISPORT ( CLK,en ,reset: IN STD_LOGIC; --信号源时钟DOUT : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );--8位波形数据输出 END sanjiaos;ARCHITECTURE behave OF sanjiaos IS COMPONENT sanjiao --调用波形数据存储器LPM_ROM文件:datarom.vhd声明 PORT(address : IN STD_LOGIC_VECTOR (7 DOWNTO 0);--8位地址信号 inclock : IN STD_LOGIC ;--地址锁存时钟q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) ); END COMPONENT;SIGNAL Q1 : STD_LOGIC_VECTOR (7 DOWNTO 0); --设定内部节点作为地址计数器 BEGINPROCESS(CLK,en,reset ) --LPM_ROM地址发生器进程BEGINif reset='0' then Q1<="00000000";elsif CLK'EVENT AND CLK = '1' and en='1' THEN Q1<=Q1+1; --Q1作为地址发生器计数器 END IF;END PROCESS;u1 : sanjiao PORT MAP(address=>Q1, q => DOUT,inclock=>CLK);--例化END;方波仿真三、各模块仿真结果斜波仿真三角仿真正弦仿真四选一仿真二四译码器四、实验感悟大学的生活就要接近尾声,为了巩固我们所学的专业知识,学院为我们开设了这门实验课,说真的我十分喜欢FPGA课程,因为从一开始我就认准这个行业会是将来发展的热门行业,因此我不仅把全部的精力投注到了这门实验上,而且为了进一步学到多的知识,我选择了有关FPGA的毕业设计课题。
基于fpga的任意波形发生器的设计与实现

基于fpga的任意波形发生器的设计与实现
一、设计概述
本设计的主要目的是利用FPGA(可编程逻辑器件)来实现一个任意波形发生器,可以产生任意的波形,用于模拟信号的测试和测量。
本设计利用FPGA的自定义功能,根据用户输入的参数,设计一个可以产生任意波形的发生器,并将其实现在一个硬件系统中。
二、系统架构
本系统的架构主要由以下几个部分组成:
(1)输入模块:用户输入的参数由输入模块接收,并将其转换为FPGA可识别的数据格式。
(2)FPGA模块:FPGA模块将用户输入的参数转换为可以产生任意波形的算法,并将其实现在FPGA的芯片上。
(3)输出模块:输出模块将FPGA模块产生的波形输出到外部设备,以便进行测试和测量。
三、设计实现
(1)输入模块:输入模块负责接收用户输入的参数,包括波形类型、频率、相位等,并将其转换为FPGA可识别的数据格式。
(2)FPGA模块:FPGA模块负责将用户输入的参数转换为可以产生任意波形的算法,并将其实现在FPGA的芯片上。
(3)输出模块:输出模块负责将FPGA模块产生的波形输出到外部设备,以便进行测试和测量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
- 47 -基于FPGA 实现的任意波形发生器的设计与研究王 玥(广西工学院鹿山学院,广西 柳州 545616)【摘 要】文章设计的任意波形发生器是以Altera 公司的FPGA 芯片为核心,运用Quartus Ⅱ开发工具和Verilog —HDL 语言,采用DDS 技术而设计的。
具有操作简单、集成度高的特点且频率和相位可调。
【关键词】FPGA ;DDS ;任意波形发生器【中图分类号】TN919-34 【文献标识码】A 【文章编号】1008-1151(2012)04-0047-03The design and research of Arbitrary Waveform Generators based on FPGAAbstract:The design of the arbitrary waveform generator use Altera company FPGA chip as the core, using the Quartus II development tools , Verilog - HDL language,and using DDS technology to design. It not only has the advantages of simple operation and high degree of integration characteristics but also has adjustable frequency and phase.Key words :FPGA;DDS;Arbitrary Waveform Generator1 任意波形发生器产生的背景任意波形发生器可以为不同应用领域提供各种标准信号和非标准函数信号,尤其在雷达导航,通信,电子对抗等装备的研制、生产中,是必不可少的信号发生器。
它的快速发展,关键在于直接数字频率合成(DDS)技术的提出。
DDS 是利用数字采样存储技术,通过频率控制字和查找表方法直接产生各种不同频率信号的一种频率合成方法。
直接数字频率合成技术是20世纪70年代提出的,它具有频率转换速度快、频率分辨率高、相位噪声低,变频相位连续等优良特性,易于控制,输出频率稳定,易于功能扩展和全数字化,便于集成,容易实现对输出信号的多种调制。
由于DDS 技术是利用查找表来生成波形的,这也使它更适用于任意波形发生器的设计。
2 硬件基于DDS 技术实现波形发生器的方法主要有以下两种:(1)采用DDS 高性能芯片实现设计;(2)自行设计基于FPGA 的逻辑电路来解决。
DDS 专用芯片采用只读存储器ROM 作为波形存储器,在芯片出厂前已将波形数据固化到ROM 中,无法根据用户的需要而更改波形数据生成任意波形。
相比之下,采用FPGA 设计所需的DDS 电路比用专用DDS 芯片更具灵活性。
因为只要通过改变FPGA 内部波形存储器中的波形数据,就可以实现任意波形的输出,这使得用FPGA 来实现DDS 电路具有更高的应用价值。
随着近年来电子技术飞速发展,现场可编程门阵列(FPGA)的资源容量、工作频率以及集成度都得到了很大提高,为实现DDS 电路提供了有利条件,通过FPGA 编程定制系统所需的DDS 电路,不但降低了成本,还提高了任意波形发生器的性能。
这也是本系统采用FPGA 来实现的主要原因。
2.1 硬件设计方案在任意波形发生器的组成部分中,硬件系统是整个系统的核心。
它包括波形生成电路,处理器、存储器、接口控制模块、波形选择电路以及系统硬件控制模块等电路,其它模块通过相关接口与其连接,构成了一个完整的硬件系统。
图1 任意波形发生器系统硬件结构图从图中可以看到系统主要由NiosII 处理器、Flash 存储【收稿日期】2012-01-25【作者简介】王玥(1980-),女,辽宁阜新人,广西工学院鹿山学院电控系教师,硕士,研究方向为FPGA 数字电路设计。
- 48 -器、Sram 存储器以及系统功能逻辑模块等组成,其中系统功能逻辑模块主要分为总线接口电路,主控制模块、波形选择模块、DDS 电路、以及D/A 转换器等。
2.2 硬件系统实现原理主控制模块接收CPU 发出的命令,并将其解析为相应的控制指令,通过波形选择模块驱动硬件电路使其进入相应的工作模式、同时用于对整个硬件系统进行控制与调节。
本系统采用DDS 电路来实现任意波形发生器的硬件系统设计。
在DDS 电路系统中,包括相位累加器、波形存储器以及相关的电路控制模块,当需要实现不同波形时,只需相应的更改DDS 波形存储器的波形数据即可。
本系统采用SRAM 作为系统软件存储器,并将标准波形数据存储于Flash 存储器中,在系统运行期间根据测试的需要,通过RAM 数据输入接口将相应的波形数据从Flash 中取出,并写入DDS 的波形存储器中,用于生成相应波形信号的输出。
3 基于FPGA 的DDS 电路的实现3.1 DDS 的结构DDS 电路的实现是整个硬件系统设计的关键所在,也是本文的重点。
DDS 电路工作时首先对需要的波形进行采样,将采样数值存入波形存储器作为查找表,然后再通过查找表将数据读出来,经过D/A 转换器转化成模拟信号,并通过低通滤波器将DAC 转换器输出的阶梯波转换成光滑的连续信号。
DDS 电路的基本结构一般包括以下几部分:相位累加器、波形存储器ROM、数模转换器DAC以及低通滤波器等。
图2 DDS 电路结构框图在图2中,fc 为系统的参考时钟频率,Fcw 为频率控制字,N 为相位累加器的累加位数,M 为波形存储器的地址位数,D 为波形存储器的数据位字长和D/A 转换器位数。
3.2 DDS 工作原理在DDS 电路中,相位累加器由加法器与数据寄存器级联而成。
每来一个时钟脉冲,加法器将频率控制字与数据寄存器输出的累加相位数据相加,把相加后的结果反馈到加法器的输入端,以使加法器在下一个时钟脉冲的作用下继续与频率控制字相加。
相位累加器在时钟作用下,不断对频率控制字进行线性相位累加。
相位累加器输出的数据就是合成信号的相位,当相位累加器达到上限时,就会溢出,完成一个周期性动作。
相位累加器的溢出频率就是DDS 输出的信号频率。
用相位累加器输出的数据作为波形存储器的相位取样地址, 这样就可把存储在波形存储器内的波形抽样值经查找表取出, 完成相位到幅值转换。
波形存储器的输出送到D/A 转换器,D/A 转换器将数字量形式的波形幅值转换成模拟量形式信号。
D/A 转化器的输出是一个近似波形的阶梯波,还需要通过一级低通滤波器滤除不需要的杂波就可以得到频谱比较纯净的波形信号。
3.2.1 相位累加器的设计相位累加器用于对频率控制字进行累加运算,频率控制字决定输出信号频率和频率分辨率,改变频率控制字就会改变相位累加器的溢出时间,就可以改变波形的输出频率。
但如果相位累加器的延时超过了系统的工作频率,就会出现相位丢失,反而限制了整个DDS 电路的输出频率。
加法器的运算时间主要消耗在数据的进位延时上,加法器运算位数越多,所需的进位延时时间越长,在时序电路中为了提高速度,流水线结构是一种常用的方法。
对于累加器来说,流水线结构就是把一个位数很长的加法拆成N 个位数很短的加法。
在N 个时钟周期内做完,然后输出结果。
N 是流水线的级数。
采用流水线结构后,字长变短,这对于工作频率的提高有帮助。
基于以上原因,为使DDS 电路工作在较高频率,本文在设计过程中将32位的相位累加器拆成4级8位加法器并以流水线的方式实现,流水线的结构如图3所示。
通过 QuartusII 环境下的时序约束分析工具分析可知,采用此结构的32位相位累加器的数据累加延时比普通结构的进位累加器的数据延时减小了一倍,提高了DDS的相位累加速度。
图3 32位流水线结构相位累加器DDS 电路的输入数据在进入相位累加器之前,首先通过一个32位的数据寄存器对输入的频率控制字进行寄存,同时将这32位数据按照数据位从高至低的顺序分为4组8位的数据参与流水线运算。
当输入数据进入流水线运算模块时,最低的8位数据作为第一级流水线相位累加器的输入数据参与运算,运算结束后将输出的数据反馈给该级相位累加器的数据输入端,并将累加产生的进位co_l 输出作为下一级累加器的输入。
当下一个时钟上升沿到来时,第二级累加器开始重复上述的数据运算,依次类推, 4个时钟周期后,将输出第一个32位数据,并且在以后的运算过程中,每一个时钟周期都会得到一个输出的运算结果。
在流水线相位累加器设计完成后,通过Modesim 对电路的性能进行仿真,图4即是流水线相位累加器在125MHz 时钟频率下的时序仿真图,从仿真结果可以看出该相位累加器能够很好的满足系统设计的需要。
图4 32位流水线相位累加器时序仿真- 49 -3.2.2 波形存储器RAM 的设计在DDS 电路中,波形存储器用于存放波形数据,它将相位累加器生成的相位值转变成波形的幅度值,完成相幅转换的功能。
本系统实现任意波形的关键在于把存放波形量化表的ROM 改成了可以改写的RAM。
在选取波形存储器时不但需要考虑波形存储器的存储容量,更要考虑存储器的存取速度。
存取速度必须满足相位累加器的累加速度,这样才能保证直接数字合成的正常进行。
同时,对于任意波形发生器来说,DDS 电路的设计必须能满足生成任意波形的要求,即在波形发生器的使用过程中,DDS 波形存储器中的波形数据必须能够根据需要而改变。
针对以上问题,考虑到器件自带的RAM 模块综合效果更好,使用更灵活方便。
本文采用FPGA 片内固有的嵌入式RAM 块来设计DDS 波形存储器,本系统所用的FPGA 芯片拥有120个M4K 的嵌入式RAM 块IP 核,每个M4K 的RAM 存储块可以提供 4096bit 的存储位,最高可以支持25OMHz 的数据存取速度。
本文利用QUARTUSⅡ9.0中的MegaWizardPlug 一 InManager 定制了一个存储深度为32Kx14bit 的dds_ram 双端口RAM 模块作为DDS 电路的波形存储器。
双端口RAM 的使用,实现了任意波形生成的问题,由于是片内实现,缩小了系统的体积,也提高了系统的稳定性。
3.2.3 D/A 转换电路数模转化器DAC 是DDS 电路中必不可少的部分,它将波形存储器输出的离散波形数据转化成模拟量波形信号,在对DAC 器件存在的非线性转换误差分析中得知,D/A 转换的瞬间毛刺,非线性和数字噪声已对DDS 的性能产生不利影响。
所以在选择D/A 转换芯片的时候除了考虑字长和转换速度,还应该顾及D/A 的非线性误差和噪声等特性。
根据需要选择合适的D/A 转换芯片。
3.2.4 低通滤波器的设计从波形存储器中输出的离散波形数据经过DAC 器件转换以后,转变为一个连续的阶梯电平信号,它的输出频谱内还含有很多杂散频谱分量,为得到一个平滑的输出曲线,必须加上一个低通滤波器去除它的杂散成分,并无失真的恢复出理想信号。