郭 烜,楊曉玲
基于FPGA的信號(hào)發(fā)生器的設(shè)計(jì)與實(shí)現(xiàn)
郭 烜1,楊曉玲2
(1.中兵通信科技股份有限公司,河南 新鄉(xiāng) 453000;2.新鄉(xiāng)市科學(xué)技術(shù)協(xié)會(huì),河南 新鄉(xiāng) 453000)
信號(hào)發(fā)生器是數(shù)字設(shè)備工作中必不可少的一部分,文章主要研究了基于FPGA的函數(shù)信號(hào)發(fā)生器的設(shè)計(jì)思路和軟硬件實(shí)現(xiàn)過(guò)程。首先介紹了該設(shè)計(jì)的總體方案,以及該方案中所使用的軟件及硬件基本知識(shí)。在此基礎(chǔ)上進(jìn)行了硬件電路的設(shè)計(jì),主要采用VHDL語(yǔ)言編寫(xiě)各個(gè)波形模塊,將波形數(shù)據(jù)存儲(chǔ)在rom中,通過(guò)控制信號(hào)時(shí)鐘依次讀出形成波形信號(hào),基于A(yíng)ltera公司的cycloneII系列FPGA-EP2C50作為核心芯片,搭建外圍轉(zhuǎn)換電路,最后在軟件Quartus上給出了系統(tǒng)仿真波形,驗(yàn)證了該設(shè)計(jì)的正確性。
信號(hào)發(fā)生器;VHDL;FPGA
信號(hào)發(fā)生器是一種常用的信號(hào)源,廣泛應(yīng)用于通信、雷達(dá)、測(cè)控、電子對(duì)抗及現(xiàn)代化儀器儀表等領(lǐng)域,是最普通、最基本也是應(yīng)用最廣泛的電子儀器之一。
傳統(tǒng)的信號(hào)發(fā)生器都采用諧振法,即用具有頻率選擇性的回路來(lái)產(chǎn)生正弦振蕩,弊端是輸出波形單一。隨著微處理器和集成電路的發(fā)展,對(duì)信號(hào)發(fā)生器的要求也在不斷的提高中,本文就是基于FPGA來(lái)完成信號(hào)發(fā)生器的設(shè)計(jì)與實(shí)現(xiàn)。
本文主要研究了5種常用波形模塊,包括正弦波、余弦波、三角波、鋸齒波和方波,下面依次介紹這五種波形模塊的軟件實(shí)現(xiàn)過(guò)程。
正弦波是頻率成分最為單一的一種信號(hào),因波形是數(shù)學(xué)上的正弦曲線(xiàn)而得名。采集一個(gè)周期內(nèi)?的64個(gè)點(diǎn)數(shù)值,放入存儲(chǔ)單元,采集點(diǎn)數(shù)值如圖1所示。
然后通過(guò)控制時(shí)鐘在上升沿處依次讀取存儲(chǔ)數(shù)值,最后輸出形成波形,具體編程過(guò)程如下:
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 正弦曲線(xiàn)上64個(gè)采集點(diǎn)的數(shù)值
余弦波和正弦波在波形上相差 1/4周期,其他均一樣,所以該設(shè)計(jì)與正弦波模塊的設(shè)計(jì)流程和代碼均相同,可參考1.1節(jié)代碼,rom里采集點(diǎn)數(shù)值位置不同,余弦波的64個(gè)采集點(diǎn)的數(shù)值如圖2所示。
圖2 余弦曲線(xiàn)上64個(gè)采集點(diǎn)的數(shù)值
然后通過(guò)控制時(shí)鐘在上升沿處依次讀取存儲(chǔ)數(shù)值,最后輸出形成波形。
三角波的波形特點(diǎn)是數(shù)值從最小值開(kāi)始按一定的斜率逐漸增大,等數(shù)值達(dá)到最大值時(shí),開(kāi)始按一定的負(fù)斜率逐漸減小,直到達(dá)到最小值,從而形成一個(gè)波形周期,按此周期進(jìn)行循環(huán),形成連續(xù)的三角波波形。
依據(jù)三角波的特點(diǎn),我們?cè)诰帉?xiě)程序中通過(guò)計(jì)數(shù)器來(lái)完成主要工作,前半波形周期,計(jì)數(shù)器遞增;后半波形周期,計(jì)數(shù)器遞減。然后通過(guò)控制時(shí)鐘依次輸出計(jì)數(shù)器的值來(lái)輸出三角波。
三角波模塊程序如下:
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;
鋸齒波的波形特點(diǎn)是數(shù)值從最小值開(kāi)始按一定的斜率逐漸增大,等數(shù)值達(dá)到最大值時(shí),數(shù)值由最大值直降為最小值,從而形成一個(gè)波形周期,按此周期進(jìn)行循環(huán),就可以形成連續(xù)的鋸齒波波形。
依據(jù)鋸齒波的特點(diǎn),我們?cè)诰帉?xiě)程序中通過(guò)計(jì)數(shù)器來(lái)完成主要工作,波形周期內(nèi),計(jì)數(shù)器遞增,等數(shù)值達(dá)到最大值時(shí),重新開(kāi)始計(jì)數(shù)。然后通過(guò)控制時(shí)鐘依次輸出計(jì)數(shù)器的值來(lái)輸出鋸齒波。
鋸齒波模塊程序如下:
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;
方波又稱(chēng)矩形波,波形特點(diǎn)是只有高低兩個(gè)固定數(shù)值,并且每個(gè)數(shù)值均占據(jù)半個(gè)周期,高低數(shù)據(jù)交替出現(xiàn)。
依據(jù)方波的特點(diǎn),我們?cè)诰帉?xiě)程序中通過(guò)計(jì)數(shù)器來(lái)完成主要工作,取整個(gè)計(jì)數(shù)周期的中間數(shù)值為依據(jù),大于中間值則在上升沿輸出高,小于中間值則在上升沿輸出低,等數(shù)值達(dá)到最大值時(shí),重新開(kāi)始計(jì)數(shù)。通過(guò)控制時(shí)鐘依次輸出高低值來(lái)輸出方波。
方波模塊程序如下:
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 數(shù)據(jù)選擇器模塊
數(shù)據(jù)選擇器模塊的作用是根據(jù)實(shí)際需求輸出指定波形。
該模塊的程序如下;
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;
本文的設(shè)計(jì)思路是基于FPGA來(lái)實(shí)現(xiàn)信號(hào)發(fā)生器模塊,通過(guò) Quartus軟件來(lái)設(shè)計(jì)頂層結(jié)構(gòu)文件,采用VHDL語(yǔ)言來(lái)編寫(xiě)各種波形模塊,然后將仿真程序燒寫(xiě)到FPGA片子里,器件采用Altera公司的cycloneII系列 EP2C50。EP2C50配置原理圖如圖 3所示。
圖3 EP2C50配置原理圖
FPGA片子產(chǎn)生的信號(hào),經(jīng)過(guò)AD9761來(lái)進(jìn)行模 數(shù)轉(zhuǎn)換,最后經(jīng)過(guò)濾波電路和放大電路來(lái)輸出波形。其中輸入時(shí)鐘接DSP54_TOUT(19.2MHz)管腳,由外部提供,經(jīng)過(guò)8倍分頻得到2.4MHz,接到TX_CLK時(shí)鐘管腳上,設(shè)計(jì)中涉及的讀寫(xiě)控制時(shí)鐘均采用TX_CLK。器件 EP2C50(TX_TEST9~TX_TEST0)十位數(shù)據(jù)輸出線(xiàn)與 AD9761(DB9~DB0)相對(duì)應(yīng)。AD9761周?chē)娐吩韴D如圖4所示。
圖4 AD9761外圍電路圖
成功編譯全部程序,經(jīng) JTAG 口下載wave_generate.sof仿真文件到器件 EP2C50,通過(guò)Quartus的仿真工具SignalTap II 邏輯分析器觀(guān)察信號(hào)發(fā)生器輸出的波形,得到的仿真波形信號(hào)如圖 5所示。
圖5 正弦波、余弦波、三角波、鋸齒波和方波仿真波形信號(hào)
本文對(duì)信號(hào)發(fā)生器進(jìn)行了理論研究,并在A(yíng)ltera公司的 EP2C50芯片上采用 VHDL語(yǔ)言實(shí)現(xiàn)了一種生成五種波形信號(hào)的算法,最后以直觀(guān)的仿真圖來(lái)驗(yàn)證了這種算法的有效性和正確性,該設(shè)計(jì)能滿(mǎn)足在實(shí)際應(yīng)用中涉及波形信號(hào)方面的大部分需求,具有一定的參考價(jià)值。
[1] Douglas L Perry. VHDL 編程實(shí)例(第四版)[M].北京:電子工業(yè)出版社,2009 .
[2] 黃振華. 基于 FPGA函數(shù)信號(hào)發(fā)生器的設(shè)計(jì)與實(shí)現(xiàn)[D].江蘇大學(xué),2009.
[3] 張亦華.數(shù)字電路EDA入門(mén)-VHDL程序?qū)嵗痆M]. 北京:北京郵電大學(xué)出版社,2012.
[4] 高淼.基于 FPGA的自治型 SPWM波形發(fā)生器的設(shè)計(jì)[D]. ?2005.
[5] 王志鵬,付麗琴. 可編程邏輯器件開(kāi)發(fā)技術(shù) MAX+PLUS II[M].北京:國(guó)防工業(yè)出版社,2005.
[6] 尹佳喜,尹仕. 基于CPLD的三相多波形函數(shù)發(fā)生器設(shè)計(jì)[D]. ?2005.
TN741
A
1008–2093(2017)04–0005–04
2017-05-20
郭烜(1987―),男,河南新鄉(xiāng)人,助理工程師,碩士,主要從事電子工程研究。
(責(zé)任編輯 王 磊)