基于VHDL语言的波形发生器的设计Word文件下载.docx
《基于VHDL语言的波形发生器的设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于VHDL语言的波形发生器的设计Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
利用循环语句不断的产生幅值为255的波形的输出。
原理图如下:
三角波模块RTL图2-3
2.3u4数据选择器模块(见附录五)
利用数据选择器模块可以对三角波,正弦波,方波进行三选一得输出。
当开关d0拨通,d1,d2均闭合时q端输出的是三角波;
当开关d1拨通,d0,d2均闭合时q端输出的是方波;
当开关d2拨通,d0,d1均闭合时q端输出的是正弦波;
数据选择器模块RTL图2-4
3硬件测试
当程序下载到硬件之后,采用chipscope实现对FPGA内部信号的在线调试。
在FPGA已经下载程序的情况下,添加我们关心的信号或者接口,将选定了端口Chipscope(不妨理解为一个嵌入的系统)加入到程序后重新布局布线下载到FPGA中,此时我们就可以观察信号和接口的值了。
在对ip核的设置中设置chipscope每次对信号的抓取为2048个。
3.1对三角波的抓取
当选择信号K0置1,K1、K2置0时,信号发生器输出波形为三角波,如图3-1-1所示:
Chipscope抓三角波波形图3-1-1
利用chipscope的导出功能,得到具体的数据表。
如图3-1-2
所示:
Chipscope对三角波形的导出图3-1-2
3.2对方波的抓取
当选择信号K1置1,K0、K2置0时,信号发生器输出波形为方波,如图3-2-1所示:
Chipscope抓方波波形图3-2-1
如图3-2-2所示:
Chipscope对方波形的导出图3-2-2
3.3对正弦波的抓取
当选择信号K2置1,K0、K1置0时,信号发生器输出波形为正弦波,如图3-3-1所示:
Chipscope抓正弦波形图3-3-1
如图3-3-2所示:
Chipscope对正弦波形的导出图3-3-2
4利用MATLAB实现直观的观测数据
因为利用chipscope所导出的数据是一个一个的数组,所以无法对波形实现直观的观察。
为了方便观察实验数据,利用MATLAB软件实现对文本文件中的数据的读。
导出的每行数据可看做一个数组,每个数组第11位是波形的数据位,因此利用MATLAB只读第11列的数据。
利用MATLAB画波形时,横轴作为波形的时间轴,每间隔为1打一个点,纵轴作为波形的幅值,用polt输出将这些点链接起来,就可以直观的观测波形。
方波的MATLAB程序如下:
clc,clear
data=textread('
F:
\ISEDesign\wave_generate\实验数据\DELTA.txt'
);
%采集路径
th=data(:
11);
%数组全部采集,采集第11位
a=th'
;
%转置
t=0:
2047;
%点的个数
subplot(311)
plot(t,a);
利用gridon,和subplot语句可以实现把三个波形画在一起(MATLAB全部程序见附录六),画好后波形如图4-1:
MATLAB画出波形图4-1
5有待改进
程序中的频率和幅值都是固定的,未能实现频率和幅值的可调节,因此就没有广泛的实用性,进一步的研究应从波形发生器向信号发生器改变。
附录一
顶层设计例化语句
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
entitysigis
PORT(clk,clrn:
INSTD_LOGIC;
fb,sjb,zxb:
INSTD_LOGIC;
ou:
INOUTSTD_LOGIC_VECTOR(7DOWNTO0));
endsig;
architectureBehavioralofsigis
COMPONENTsin
PORT(clk,clrn:
q:
INOUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDCOMPONENT;
COMPONENTsquare
COMPONENTdelta
COMPONENTsig_control
PORT(delta,square,sin:
d0,d1,d2:
INSTD_LOGIC_VECTOR(7DOWNTO0);
q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
componentila
PORT(
CONTROL:
INOUTSTD_LOGIC_VECTOR(35DOWNTO0);
CLK:
TRIG0:
INSTD_LOGIC_VECTOR(7DOWNTO0));
endcomponent;
componenticon
CONTROL0:
INOUTSTD_LOGIC_VECTOR(35DOWNTO0));
signalCONTROL:
STD_LOGIC_VECTOR(35DOWNTO0);
signalTRIG0:
STD_LOGIC_VECTOR(7DOWNTO0);
signala:
STD_LOGIC_VECTOR(7DOWNTO0);
signalb:
signalc:
begin
squarePORTMAP(clk=>
clk,clrn=>
clrn,q=>
a);
sinPORTMAP(clk=>
b);
deltaPORTMAP(clk=>
c);
sig_controlPORTMAP(delta=>
sjb,square=>
fb,sin=>
zxb,d0=>
a,d1=>
b,d2=>
c,q=>
ou);
u5:
ilaPORTMAP(CONTROL,clk,ou);
u6:
iconportmap(CONTROL);
endBehavioral;
附录二
u1方波产生模块程序
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYsquareIS
PORT(clk,clrn:
OUTSTD_LOGIC_VECTOR(7downto0));
ENDsquare;
ARCHITECTUREaOFsquareIS
SIGNALf:
STD_LOGIC;
BEGIN
PROCESS(clk,clrn)
VARIABLEtmp:
STD_LOGIC_VECTOR(7downto0);
IFclrn='
0'
THENtmp:
="
00000000"
ELSE
IFclk'
eventandclk='
1'
THEN------------------------------上升沿触发
IFtmp="
11111111"
---计数为256时置零
ELSEtmp:
=tmp+1;
ENDIF;
IFtmp<
"
10000000"
THENf<
='
------------------当计数小于128时,f为1
ELSEf<
---------------------------------------------否则f为0
ENDPROCESS;
PROCESS(clk,f)
THEN
IFf='
THENq<
-----------------------------------f为1时q为255
ELSEq<
--------------------------------------------f为0时q为0
ENDa;
附录三
sin正弦波产生模块程序
ENTITYsinIS
PORT(clk,clrn:
ENDsin;
ARCHITECTUREAOFsinIS
PROCESS(clk,clrn)
VARIABLEtmp:
INTEGERRANGE63DOWNTO0;
-------------------------对一个周期的正弦波采用64个点
IFclrn='
;
tmp:
=0;
ELSE
EVENTANDclk='
THEN-----------------------------------------------上升沿触发
IFtmp=63THENtmp:
ELSEtmp:
ENDIF;
CASEtmpIS
WHEN00=>
q<
WHEN01=>
11111110"
WHEN02=>
11111100"
WHEN03=>
11111001"
WHEN04=>
11110101"
WHEN05=>
11101111"
WHEN06=>
11101001"
WHEN07=>
11100001"
WHEN08=>
11011001"
WHEN09=>
11001111"
WHEN10=>
11000101"
WHEN11=>
10111010"
WHEN12=>
10101110"
WHEN13=>
10100010"
WHEN14=>
10010110"
WHEN15=>
10001001"
WHEN16=>
01111100"
WHEN17=>
01110000"
WHEN18=>
01100011"
WHEN19=>
01010111"
WHEN20=>
01001011"
WHEN21=>
01000000"
WHEN22=>
00110101"
WHEN23=>
00101011"
WHEN24=>
00100010"
WHEN25=>
00011010"
WHEN26=>
00010011"
WHEN27=>
00001101"
WHEN28=>
00001000"
WHEN29=>
00000100"
WHEN30=>
00000001"
WHEN31=>
WHEN32=>
WHEN33=>
WHEN34=>
WHEN35=>
WHEN36=>
WHEN37=>
WHEN38=>
WHEN39=>
WHEN40=>
WHEN41=>
WHEN42=>
WHEN43=>
WHEN44=>
WHEN45=>
WHEN46=>
WHEN47=>
WHEN48=>
WHEN49=>
WHEN50=>
WHEN51=>
WHEN52=>
WHEN53=>
WHEN54=>
WHEN55=>
WHEN56=>
WHEN57=>
WHEN58=>
WHEN59=>
WHEN60=>
WHEN61=>
WHEN62=>
WHEN63=>
WHENOTHERS=>
NULL;
ENDCASE;
ENDIF;
ENDA;
附录四
u3:
三角波产生模块程序
-------------------预先定义的操作符可以进行重载
ENTITYdeltaIS
port(clk,clrn:
ENDdelta;
ARCHITECTUREaOFdeltaIS
BEGIN
PROCESS(clk,clrn)
VARIABLEf:
STD_LOGIC;
ELSIFclk'
THEN---------------三角波的上升,到255时跳到f1
f:
ELSE-----------------三角波的下降,到0时跳到f0
IFtmp="
=tmp-1;
q<
=tmp;
ENDPROCESS;
附录五
u4:
数据选择器模块程序
ENTITYsig_controlIS
PORT(delta,square,sin:
d0,d1,d2:
ENDsig_control;
ARCHITECTUREbehaveOFsig_controlIS
SIGNALsel:
STD_LOGIC_VECTOR(2DOWNTO0);
sel<
=delta&
square&
sin;
---------------------------并置
PROCESS(sel)
CASEselIS
WHEN"
100"
=>
=d0;
010"
=d1;
001"
=d2;
ENDbehave;
附录六
利用MATLAB画波形的程序
gridon
\ISEDesign\wave_generate\实验数据\SIN.txt'
b=th'
subplot(312)
plot(t,b);
\ISEDesign\wave_generate\实验数据\SQUARE.txt'
c=th'
subplot(313)
plot(t,c);