郭 烜,杨晓玲
基于FPGA的信号发生器的设计与实现
郭 烜1,杨晓玲2
(1.中兵通信科技股份有限公司,河南 新乡 453000;2.新乡市科学技术协会,河南 新乡 453000)
信号发生器是数字设备工作中必不可少的一部分,文章主要研究了基于FPGA的函数信号发生器的设计思路和软硬件实现过程。首先介绍了该设计的总体方案,以及该方案中所使用的软件及硬件基本知识。在此基础上进行了硬件电路的设计,主要采用VHDL语言编写各个波形模块,将波形数据存储在rom中,通过控制信号时钟依次读出形成波形信号,基于Altera公司的cycloneII系列FPGA-EP2C50作为核心芯片,搭建外围转换电路,最后在软件Quartus上给出了系统仿真波形,验证了该设计的正确性。
信号发生器;VHDL;FPGA
信号发生器是一种常用的信号源,广泛应用于通信、雷达、测控、电子对抗及现代化仪器仪表等领域,是最普通、最基本也是应用最广泛的电子仪器之一。
传统的信号发生器都采用谐振法,即用具有频率选择性的回路来产生正弦振荡,弊端是输出波形单一。随着微处理器和集成电路的发展,对信号发生器的要求也在不断的提高中,本文就是基于FPGA来完成信号发生器的设计与实现。
本文主要研究了5种常用波形模块,包括正弦波、余弦波、三角波、锯齿波和方波,下面依次介绍这五种波形模块的软件实现过程。
正弦波是频率成分最为单一的一种信号,因波形是数学上的正弦曲线而得名。采集一个周期内?的64个点数值,放入存储单元,采集点数值如图1所示。
然后通过控制时钟在上升沿处依次读取存储数值,最后输出形成波形,具体编程过程如下:
signal cnt:integer range 0 to points-1;
begin
process(clk,reset)
begin
if reset='1'then
cnt<=0;
elsif rising_edge(clk)then
if cnt>=points-1 then
cnt<=0;
else
cnt<=cnt+1;
end if;
d1<=sin_data(cnt);
end if;
end process;
图1 正弦曲线上64个采集点的数值
余弦波和正弦波在波形上相差 1/4周期,其他均一样,所以该设计与正弦波模块的设计流程和代码均相同,可参考1.1节代码,rom里采集点数值位置不同,余弦波的64个采集点的数值如图2所示。
图2 余弦曲线上64个采集点的数值
然后通过控制时钟在上升沿处依次读取存储数值,最后输出形成波形。
三角波的波形特点是数值从最小值开始按一定的斜率逐渐增大,等数值达到最大值时,开始按一定的负斜率逐渐减小,直到达到最小值,从而形成一个波形周期,按此周期进行循环,形成连续的三角波波形。
依据三角波的特点,我们在编写程序中通过计数器来完成主要工作,前半波形周期,计数器递增;后半波形周期,计数器递减。然后通过控制时钟依次输出计数器的值来输出三角波。
三角波模块程序如下:
architecture behave of triangle is
begin
process(clk,reset)
variable tmp:std_logic_vector(7 downto 0);
variable a:std_logic;
begin
if reset='1'then
tmp:="00000000";
elsif rising_edge(clk)then
if a='0'then
if tmp="11111110"then
tmp:="11111111";
a:='1';
else
tmp:=tmp+1;
end if;
else
if tmp="00000001"then
tmp:="00000000";
a:='0';
else
tmp:=tmp-1;
end if;
end if;
end if;
d3<=tmp;
end process;
锯齿波的波形特点是数值从最小值开始按一定的斜率逐渐增大,等数值达到最大值时,数值由最大值直降为最小值,从而形成一个波形周期,按此周期进行循环,就可以形成连续的锯齿波波形。
依据锯齿波的特点,我们在编写程序中通过计数器来完成主要工作,波形周期内,计数器递增,等数值达到最大值时,重新开始计数。然后通过控制时钟依次输出计数器的值来输出锯齿波。
锯齿波模块程序如下:
architecture behave of sawtooth is
begin
process(clk,reset)
variable tmp:std_logic_vector(7 downto 0);
begin
if reset='1'then
tmp:="00000000";
elsif rising_edge(clk)then
if tmp="11111111"then
temp="00000000"
else
tmp:=tmp+1;
end if;
end if;
d4<=tmp;
end process;
方波又称矩形波,波形特点是只有高低两个固定数值,并且每个数值均占据半个周期,高低数据交替出现。
依据方波的特点,我们在编写程序中通过计数器来完成主要工作,取整个计数周期的中间数值为依据,大于中间值则在上升沿输出高,小于中间值则在上升沿输出低,等数值达到最大值时,重新开始计数。通过控制时钟依次输出高低值来输出方波。
方波模块程序如下:
architecture behave of square is
signal a:std_logic;
begin
process(clk,reset)
variable tmp:std_logic_vector(7 downto 0);
begin
if reset='1'then
a<='0';
elsif rising_edge(clk)then
if tmp="11111111"then
tmp:="00000000";
else
tmp:=tmp+1;
end if;
if tmp<"10000000"then
a<='1';
else
a<='0';
end if;
end if;
end process;
process(clk,a)
begin
if rising_edge(clk)then
if a='1'then
d5<="11111111";
else
d5<="00000000";
end if;
end if;
end process;
1.6 数据选择器模块
数据选择器模块的作用是根据实际需求输出指定波形。
该模块的程序如下;
architecture behave of MUX5_1 is
signal p: std_logic_vector(7 downto 0);
begin
process(sel)
begin
case sel is
when "000" =>p<=d1; --正弦波
when "001" =>p<=d2; --余弦波
when "010" =>p<=d3; --三角波
when "011" =>p<=d4; --锯齿波
when "100" =>p<=d5; --方波
when others =>p<=NULL;
end case;
q(9 downto 2)<=p;
q(1)<='0';
q(0)<='0';
end process;
本文的设计思路是基于FPGA来实现信号发生器模块,通过 Quartus软件来设计顶层结构文件,采用VHDL语言来编写各种波形模块,然后将仿真程序烧写到FPGA片子里,器件采用Altera公司的cycloneII系列 EP2C50。EP2C50配置原理图如图 3所示。
图3 EP2C50配置原理图
FPGA片子产生的信号,经过AD9761来进行模 数转换,最后经过滤波电路和放大电路来输出波形。其中输入时钟接DSP54_TOUT(19.2MHz)管脚,由外部提供,经过8倍分频得到2.4MHz,接到TX_CLK时钟管脚上,设计中涉及的读写控制时钟均采用TX_CLK。器件 EP2C50(TX_TEST9~TX_TEST0)十位数据输出线与 AD9761(DB9~DB0)相对应。AD9761周围电路原理图如图4所示。
图4 AD9761外围电路图
成功编译全部程序,经 JTAG 口下载wave_generate.sof仿真文件到器件 EP2C50,通过Quartus的仿真工具SignalTap II 逻辑分析器观察信号发生器输出的波形,得到的仿真波形信号如图 5所示。
图5 正弦波、余弦波、三角波、锯齿波和方波仿真波形信号
本文对信号发生器进行了理论研究,并在Altera公司的 EP2C50芯片上采用 VHDL语言实现了一种生成五种波形信号的算法,最后以直观的仿真图来验证了这种算法的有效性和正确性,该设计能满足在实际应用中涉及波形信号方面的大部分需求,具有一定的参考价值。
[1] Douglas L Perry. VHDL 编程实例(第四版)[M].北京:电子工业出版社,2009 .
[2] 黄振华. 基于 FPGA函数信号发生器的设计与实现[D].江苏大学,2009.
[3] 张亦华.数字电路EDA入门-VHDL程序实例集[M]. 北京:北京邮电大学出版社,2012.
[4] 高淼.基于 FPGA的自治型 SPWM波形发生器的设计[D]. ?2005.
[5] 王志鹏,付丽琴. 可编程逻辑器件开发技术 MAX+PLUS II[M].北京:国防工业出版社,2005.
[6] 尹佳喜,尹仕. 基于CPLD的三相多波形函数发生器设计[D]. ?2005.
TN741
A
1008–2093(2017)04–0005–04
2017-05-20
郭烜(1987―),男,河南新乡人,助理工程师,硕士,主要从事电子工程研究。
(责任编辑 王 磊)