当前位置:首页 期刊杂志

基于FPGA的信号发生器的设计与实现

时间:2024-06-19

郭 烜,杨晓玲

基于FPGA的信号发生器的设计与实现

郭 烜1,杨晓玲2

(1.中兵通信科技股份有限公司,河南 新乡 453000;2.新乡市科学技术协会,河南 新乡 453000)

信号发生器是数字设备工作中必不可少的一部分,文章主要研究了基于FPGA的函数信号发生器的设计思路和软硬件实现过程。首先介绍了该设计的总体方案,以及该方案中所使用的软件及硬件基本知识。在此基础上进行了硬件电路的设计,主要采用VHDL语言编写各个波形模块,将波形数据存储在rom中,通过控制信号时钟依次读出形成波形信号,基于Altera公司的cycloneII系列FPGA-EP2C50作为核心芯片,搭建外围转换电路,最后在软件Quartus上给出了系统仿真波形,验证了该设计的正确性。

信号发生器;VHDL;FPGA

信号发生器是一种常用的信号源,广泛应用于通信、雷达、测控、电子对抗及现代化仪器仪表等领域,是最普通、最基本也是应用最广泛的电子仪器之一。

传统的信号发生器都采用谐振法,即用具有频率选择性的回路来产生正弦振荡,弊端是输出波形单一。随着微处理器和集成电路的发展,对信号发生器的要求也在不断的提高中,本文就是基于FPGA来完成信号发生器的设计与实现。

1 模块实现

本文主要研究了5种常用波形模块,包括正弦波、余弦波、三角波、锯齿波和方波,下面依次介绍这五种波形模块的软件实现过程。

1.1 正弦波模块

正弦波是频率成分最为单一的一种信号,因波形是数学上的正弦曲线而得名。采集一个周期内?的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.2 余弦波模块

余弦波和正弦波在波形上相差 1/4周期,其他均一样,所以该设计与正弦波模块的设计流程和代码均相同,可参考1.1节代码,rom里采集点数值位置不同,余弦波的64个采集点的数值如图2所示。

图2 余弦曲线上64个采集点的数值

然后通过控制时钟在上升沿处依次读取存储数值,最后输出形成波形。

1.3 三角波模块

三角波的波形特点是数值从最小值开始按一定的斜率逐渐增大,等数值达到最大值时,开始按一定的负斜率逐渐减小,直到达到最小值,从而形成一个波形周期,按此周期进行循环,形成连续的三角波波形。

依据三角波的特点,我们在编写程序中通过计数器来完成主要工作,前半波形周期,计数器递增;后半波形周期,计数器递减。然后通过控制时钟依次输出计数器的值来输出三角波。

三角波模块程序如下:

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;

1.4 锯齿波模块

锯齿波的波形特点是数值从最小值开始按一定的斜率逐渐增大,等数值达到最大值时,数值由最大值直降为最小值,从而形成一个波形周期,按此周期进行循环,就可以形成连续的锯齿波波形。

依据锯齿波的特点,我们在编写程序中通过计数器来完成主要工作,波形周期内,计数器递增,等数值达到最大值时,重新开始计数。然后通过控制时钟依次输出计数器的值来输出锯齿波。

锯齿波模块程序如下:

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;

1.5 方波模块

方波又称矩形波,波形特点是只有高低两个固定数值,并且每个数值均占据半个周期,高低数据交替出现。

依据方波的特点,我们在编写程序中通过计数器来完成主要工作,取整个计数周期的中间数值为依据,大于中间值则在上升沿输出高,小于中间值则在上升沿输出低,等数值达到最大值时,重新开始计数。通过控制时钟依次输出高低值来输出方波。

方波模块程序如下:

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;

2 系统设计

本文的设计思路是基于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外围电路图

3 设计验证

成功编译全部程序,经 JTAG 口下载wave_generate.sof仿真文件到器件 EP2C50,通过Quartus的仿真工具SignalTap II 逻辑分析器观察信号发生器输出的波形,得到的仿真波形信号如图 5所示。

图5 正弦波、余弦波、三角波、锯齿波和方波仿真波形信号

4 总结

本文对信号发生器进行了理论研究,并在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―),男,河南新乡人,助理工程师,硕士,主要从事电子工程研究。

(责任编辑 王 磊)

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!