基于VHDL语言的波形发生器的设计.docx

上传人:b****6 文档编号:7395655 上传时间:2023-01-23 格式:DOCX 页数:11 大小:78.46KB
下载 相关 举报
基于VHDL语言的波形发生器的设计.docx_第1页
第1页 / 共11页
基于VHDL语言的波形发生器的设计.docx_第2页
第2页 / 共11页
基于VHDL语言的波形发生器的设计.docx_第3页
第3页 / 共11页
基于VHDL语言的波形发生器的设计.docx_第4页
第4页 / 共11页
基于VHDL语言的波形发生器的设计.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

基于VHDL语言的波形发生器的设计.docx

《基于VHDL语言的波形发生器的设计.docx》由会员分享,可在线阅读,更多相关《基于VHDL语言的波形发生器的设计.docx(11页珍藏版)》请在冰豆网上搜索。

基于VHDL语言的波形发生器的设计.docx

基于VHDL语言的波形发生器的设计

基于VHDL语言的波形

发生器的设计

基于VHDL语言的波形发生器的设计

利用FPGA芯片信号发生器的设计。

当按下开关1时产生三角波,当按下开关2时产生正弦波,当按下开关3时产生方波。

本次设计采用xilinx公司的ISE设计工具,在zedboard开发板中的xc7z020芯片上用VHDL来实现,并且利用ISE自带的chipscop完成对FPGA内部的信号的读取。

这样的设计具有体积小,修改升级容易等特点。

本设计采用自顶向下、纯文本实现数字时钟的设计、下载和调试。

1设计原理

本设计由信号产生,信号选择,信号控制输出三大模块组合而成。

其中信号产生模块有:

三角波模块、方波模块、正弦波模块。

本设计采用K0~K2这三个按键为信号选择开关,选择信号产生模块输出的信号。

(顶层设计的例化语句见附录一)其RTL图1-1:

RTL图1-1

2主要功能模块

u1:

square方波产生模块;

u2:

sin正弦波产生模块;

u3:

delta三角波产生模块;

u4:

sig_control数据选择器模块;

u5,u6:

为使用chipscope所需生成的IP核。

2.1u1方波产生模块(程序见附录二)

产生方波,初始化为幅值225的高电平,每有一次时钟上升沿触发产生一次计数,当计数值达到128时跳到为0的低电平。

利用循环语句不断的产生高低电平的方波输出。

原理如图2-1:

方波模块RTL图2-1

2.2u1正弦波产生模块(程序见附录三)

功能是产生正弦波,产用信号抽样的原理,在一个正弦信号中等间隔的抽样64点,此64点的幅值作为一个正弦波数据表,每有一次时钟上升沿触发便赋予输出端q一个点的数据,依次赋值64个点的数据便完成一个周期的正弦波的输出。

并利用循环语句不断的产生正弦波的输出。

原理如图2-2:

正弦波模块RTL图2-2

2.3u1三角波产生模块(程序见附录四)

功能是产生三角波,初始化为幅值为0,每有一次时钟上升沿触发便进行幅值加1,当幅值达到最大255时,每有一次时钟上升沿触发便进行幅值减1,当幅值减为0时完成一个周期的输出。

利用循环语句不断的产生幅值为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

利用chipscope的导出功能,得到具体的数据表。

如图3-2-2所示:

Chipscope对方波形的导出图3-2-2

3.3对正弦波的抓取

当选择信号K2置1,K0、K1置0时,信号发生器输出波形为正弦波,如图3-3-1所示:

Chipscope抓正弦波形图3-3-1

利用chipscope的导出功能,得到具体的数据表。

如图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:

INSTD_LOGIC;

q:

INOUTSTD_LOGIC_VECTOR(7DOWNTO0));

ENDCOMPONENT;

COMPONENTsquare

PORT(clk,clrn:

INSTD_LOGIC;

q:

INOUTSTD_LOGIC_VECTOR(7DOWNTO0));

ENDCOMPONENT;

COMPONENTdelta

PORT(clk,clrn:

INSTD_LOGIC;

q:

INOUTSTD_LOGIC_VECTOR(7DOWNTO0));

ENDCOMPONENT;

COMPONENTsig_control

PORT(delta,square,sin:

INSTD_LOGIC;

d0,d1,d2:

INSTD_LOGIC_VECTOR(7DOWNTO0);

q:

OUTSTD_LOGIC_VECTOR(7DOWNTO0));

ENDCOMPONENT;

componentila

PORT(

CONTROL:

INOUTSTD_LOGIC_VECTOR(35DOWNTO0);

CLK:

INSTD_LOGIC;

TRIG0:

INSTD_LOGIC_VECTOR(7DOWNTO0));

endcomponent;

componenticon

PORT(

CONTROL0:

INOUTSTD_LOGIC_VECTOR(35DOWNTO0));

endcomponent;

signalCONTROL:

STD_LOGIC_VECTOR(35DOWNTO0);

signalTRIG0:

STD_LOGIC_VECTOR(7DOWNTO0);

signala:

STD_LOGIC_VECTOR(7DOWNTO0);

signalb:

STD_LOGIC_VECTOR(7DOWNTO0);

signalc:

STD_LOGIC_VECTOR(7DOWNTO0);

begin

u1:

squarePORTMAP(clk=>clk,clrn=>clrn,q=>a);

u2:

sinPORTMAP(clk=>clk,clrn=>clrn,q=>b);

u3:

deltaPORTMAP(clk=>clk,clrn=>clrn,q=>c);

u4:

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方波产生模块程序

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYsquareIS

PORT(clk,clrn:

INSTD_LOGIC;

q:

OUTSTD_LOGIC_VECTOR(7downto0));

ENDsquare;

ARCHITECTUREaOFsquareIS

SIGNALf:

STD_LOGIC;

BEGIN

PROCESS(clk,clrn)

VARIABLEtmp:

STD_LOGIC_VECTOR(7downto0);

BEGIN

IFclrn='0'THENtmp:

="00000000";

ELSE

IFclk'eventandclk='1'THEN------------------------------上升沿触发

IFtmp="11111111"THENtmp:

="00000000";---计数为256时置零

ELSEtmp:

=tmp+1;

ENDIF;

IFtmp<"10000000"THENf<='1';------------------当计数小于128时,f为1

ELSEf<='0';---------------------------------------------否则f为0

ENDIF;

ENDIF;

ENDIF;

ENDPROCESS;

PROCESS(clk,f)

BEGIN

IFclk'eventandclk='1'THEN

IFf='1'THENq<="11111111";-----------------------------------f为1时q为255

ELSEq<="00000000";--------------------------------------------f为0时q为0

ENDIF;

ENDIF;

ENDPROCESS;

ENDa;

附录三

u2:

sin正弦波产生模块程序

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYsinIS

PORT(clk,clrn:

INSTD_LOGIC;

q:

INOUTSTD_LOGIC_VECTOR(7DOWNTO0));

ENDsin;

ARCHITECTUREAOFsinIS

BEGIN

PROCESS(clk,clrn)

VARIABLEtmp:

INTEGERRANGE63DOWNTO0;-------------------------对一个周期的正弦波采用64个点

BEGIN

IFclrn='0'THENq<="00000000";tmp:

=0;

ELSE

IFclk'EVENTANDclk='1'THEN-----------------------------------------------上升沿触发

IFtmp=63THENtmp:

=0;

ELSEtmp:

=tmp+1;

ENDIF;

CASEtmpIS

WHEN00=>q<="11111111";WHEN01=>q<="11111110";WHEN02=>q<="11111100";

WHEN03=>q<="11111001";WHEN04=>q<="11110101";WHEN05=>q<="11101111";

WHEN06=>q<="11101001";WHEN07=>q<="11100001";WHEN08=>q<="11011001";

WHEN09=>q<="11001111";WHEN10=>q<="11000101";WHEN11=>q<="10111010";

WHEN12=>q<="10101110";WHEN13=>q<="10100010";WHEN14=>q<="10010110";

WHEN15=>q<="10001001";WHEN16=>q<="01111100";WHEN17=>q<="01110000";

WHEN18=>q<="01100011";WHEN19=>q<="01010111";WHEN20=>q<="01001011";

WHEN21=>q<="01000000";WHEN22=>q<="00110101";WHEN23=>q<="00101011";

WHEN24=>q<="00100010";WHEN25=>q<="00011010";WHEN26=>q<="00010011";

WHEN27=>q<="00001101";WHEN28=>q<="00001000";WHEN29=>q<="00000100";

WHEN30=>q<="00000001";WHEN31=>q<="00000000";WHEN32=>q<="00000000";

WHEN33=>q<="00000001";WHEN34=>q<="00000100";WHEN35=>q<="00001000";

WHEN36=>q<="00001101";WHEN37=>q<="00010011";WHEN38=>q<="00011010";

WHEN39=>q<="00100010";WHEN40=>q<="00101011";WHEN41=>q<="00110101";

WHEN42=>q<="01000000";WHEN43=>q<="01001011";WHEN44=>q<="01010111";

WHEN45=>q<="01100011";WHEN46=>q<="01110000";WHEN47=>q<="01111100";

WHEN48=>q<="10001001";WHEN49=>q<="10010110";WHEN50=>q<="10100010";

WHEN51=>q<="10101110";WHEN52=>q<="10111010";WHEN53=>q<="11000101";

WHEN54=>q<="11001111";WHEN55=>q<="11011001";WHEN56=>q<="11100001";

WHEN57=>q<="11101001";WHEN58=>q<="11101111";WHEN59=>q<="11110101";

WHEN60=>q<="11111001";WHEN61=>q<="11111100";WHEN62=>q<="11111110";

WHEN63=>q<="11111111";WHENOTHERS=>NULL;

ENDCASE;

ENDIF;

ENDIF;

ENDPROCESS;

ENDA;

附录四

u3:

三角波产生模块程序

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;-------------------预先定义的操作符可以进行重载

ENTITYdeltaIS

port(clk,clrn:

INSTD_LOGIC;

q:

INOUTSTD_LOGIC_VECTOR(7DOWNTO0));

ENDdelta;

ARCHITECTUREaOFdeltaIS

BEGIN

PROCESS(clk,clrn)

VARIABLEtmp:

STD_LOGIC_VECTOR(7DOWNTO0);

VARIABLEf:

STD_LOGIC;BEGIN

IFclrn='0'THENtmp:

="00000000";

ELSIFclk'EVENTANDclk='1'THEN

IFf='0'THEN---------------三角波的上升,到255时跳到f1

IFtmp="11111110"THENtmp:

="11111111";f:

='1';

ELSEtmp:

=tmp+1;

ENDIF;

ELSE-----------------三角波的下降,到0时跳到f0

IFtmp="00000001"THENtmp:

="00000000";f:

='0';

ELSEtmp:

=tmp-1;

ENDIF;

ENDIF;

ENDIF;

q<=tmp;

ENDPROCESS;

ENDa;

附录五

u4:

数据选择器模块程序

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYsig_controlIS

PORT(delta,square,sin:

INSTD_LOGIC;

d0,d1,d2:

INSTD_LOGIC_VECTOR(7DOWNTO0);

q:

OUTSTD_LOGIC_VECTOR(7DOWNTO0));

ENDsig_control;

ARCHITECTUREbehaveOFsig_controlIS

SIGNALsel:

STD_LOGIC_VECTOR(2DOWNTO0);

BEGIN

sel<=delta&square&sin;---------------------------并置

PROCESS(sel)

BEGIN

CASEselIS

WHEN"100"=>q<=d0;

WHEN"010"=>q<=d1;

WHEN"001"=>q<=d2;

WHENOTHERS=>NULL;

ENDCASE;

ENDPROCESS;

ENDbehave;

附录六

利用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

data=textread('F:

\ISEDesign\wave_generate\实验数据\SIN.txt');%采集路径

th=data(:

11);%数组全部采集,采集第11位

b=th';%转置

t=0:

2047;%点的个数

subplot(312)

plot(t,b);

gridon

data=textread('F:

\ISEDesign\wave_generate\实验数据\SQUARE.txt');%采集路径

th=data(:

11);%数组全部采集,采集第11位

c=th';%转置

t=0:

2047;%点的个数

subplot(313)

plot(t,c);

gridon

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1