信号发生器实验报告.docx

上传人:b****5 文档编号:6355022 上传时间:2023-01-05 格式:DOCX 页数:17 大小:357.05KB
下载 相关 举报
信号发生器实验报告.docx_第1页
第1页 / 共17页
信号发生器实验报告.docx_第2页
第2页 / 共17页
信号发生器实验报告.docx_第3页
第3页 / 共17页
信号发生器实验报告.docx_第4页
第4页 / 共17页
信号发生器实验报告.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

信号发生器实验报告.docx

《信号发生器实验报告.docx》由会员分享,可在线阅读,更多相关《信号发生器实验报告.docx(17页珍藏版)》请在冰豆网上搜索。

信号发生器实验报告.docx

信号发生器实验报告

 

信号发生器设计

 

1.设计任务

设计并制作一台多功能信号发生器,电路组成框图如图所示。

图1信号发生器框图

1.基本要求

(1)制作完成一路方波信号输出,频率范围100Hz~100kHz;

(2)输出信号波形用示波器观察无明显失真;

(3)数码管显示方波的频率;

(4)可使用按键调高调低输出频率,步进100Hz。

2.发挥部分

(1)制作完成一路正弦波信号输出,频率范围100Hz~100kHz,输出信号波形用示波器观察无明显失真,数码管显示正弦波的频率。

(2)制作完成一路三角波信号输出,频率范围100Hz~100kHz,输出信号波形用示波器观察无明显失真,数码管显示三角波的频率。

 

2.设计思考

研究题目后,我们将其分为几块:

大致为:

信号输入模块,信号分频模块,信号输出模块三个模块

我们使用VHDL语言,利用QuartusII中由程序建模块的功能,FPGA及SmartSOPC实验箱来完成此次设计。

设计的流程图如下所示:

图一.设计流程图

FPGA中的波形发生器控制电路,它通过外来控制信号和高速时钟信号,向波形数据ROM发出地址信号,输出波形的频率由发出的地址信号的速度决定;当以固定频率扫描输出地址时,模拟输出波形是固定频率,而当以周期性时变方式扫描输出地址时,则模拟输出波形为扫频信号。

波形数据ROM中存有发生器的波形数据,如正弦波或三角波数据。

当接受来自FPGA的地址信号后,将从数据线输出相应的波形数据,地址变化得越快,则输出数据的速度越快,从而使D/A输出的模拟信号的变化速度越快。

波形数据ROM可以由多种方式实现,如在FPGA外面外接普通ROM;由逻辑方式在FPGA中实现(如例11-1);或由FPGA中的EAB模块担当,如利用LPM_ROM实现。

相比之下,第1种方式的容量最大,但速度最慢;,第2种方式容量最小,但速度最最快;第3种方式则兼顾了两方面的因素;

D/A转换器负责将ROM输出的数据转换成模拟信号,经滤波电路后输出。

输出波形的频率上限与D/A器件的转换速度有重要关系,本例采用DAC0832器件。

DAC0832是8位D/A转换器,转换周期为1µs,其引脚信号以及与FPGA目标器件典型的接口方式如附图2-15所示。

其参考电压与+5V工作电压相接(实用电路应接精密基准电压)。

DAC0832的引脚功能简述如下:

ILE(PIN19):

数据锁存允许信号,高电平有效,系统板上已直接连在+5V上。

WR1、WR2(PIN2、18):

写信号1、2,低电平有效。

XFER(PIN17):

数据传送控制信号,低电平有效。

VREF(PIN8):

基准电压,可正可负,-10V~+10V。

RFB(PIN9):

反馈电阻端。

IOUT1/IOUT2(PIN11、12):

电流输出1和2。

D/A转换量是以电流形式输出的,所以必须如实验结构图NO.5C所示的连接方式将电流信号变为电压信号。

AGND/DGND(PIN3、10):

模拟地与数字地。

在高速情况下,此二地的连接线必须尽可能短,且系统的单点接地点须接在此连线的某一点上。

例11-1中的正弦波波型数据由64个点构成,此数据经DAC0832,并经滤波器后,可在示波器上观察到光滑的正弦波(若接精密基准电压,可得到更为清晰的正弦波形)。

 

3.实验过程

首先根据设计原理,完成基础部分,完成波形发生器和扫频信号源的设计,仿真测试及实验系统上的硬件测试。

(1)、在QuartusII中建立一个工程项目文件.qpf,并在该项目下新建VHDL源程序文件输入源程序代码并保存。

因为我们的设计需要三个模块,所以需要三个程序。

因此我们建立三个VHDL源程序文件。

各模块源程序见附录。

(2)、编译正确后,我们建立一个总的工程ep1c12_27_signal_generator,再在其中加入程序,对其编译,再选择File--create--createsymbolfileforcurrentfile,对相应程序建立模块,将三模块在同一Blockdiagram/Schematicfile中连接起来,分频数设为48000000,添加INPUT和OUTPUT引脚。

模块如下所示:

图二.信号输入模块

图三.分频模块

图四.信号输出模块

(3)选择目标器件并对相应的引脚进行锁定,在这里在这里所选择的目标器件为Altera公司Cyclone系列的EP1C12Q240C8芯片,引脚锁定,将未使用的管脚设置为三态输入。

引脚锁定如下图所示:

图五.工程中引脚锁定图

硬件实验中注意DAC0832及滤波电路须接+/-12V电压。

然后将实验系统左下角选择插针处用短路帽短路“D/A直通”,而“滤波1”,“滤波0”处通过短路或不接短路帽达到不同的滤波方式。

将示波器的地与EDA实验系统的地相接,信号端与“AOUT”信号输出端相接;建议CLK接clock0,由此50MHz频率,此频率扫描波形数据;CLK1接clock5,由此接“1024Hz”,此频率决定扫频速度;选电路模式1;KK接键8,当为高电平时,正弦波点频输出,11位输入数据DATA由键3、键2和键1控制,信号源的输出频率由此3键输入的12位二进制数决定,数值越大,输出频率越高;“FD0”时为最高频率;键8低电平时,正弦波扫频输出,扫频速度由clock5的频率决定。

输向0832的8位数据由DD输出。

(4)、再设计中插入一个LPM_ROM模块,将原例中的波形数据放在内部ROM中。

必要时增加波形点数,以利低频输出时,仍保持良好波形。

波形数据可由其它方式自动生成,然后重复以上的测试和硬件实验。

建立途径是:

tools--magawizardplug_Inmanager--create--storage下的LPM_ROM。

其程序如下见附录。

(5)、对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。

设计整体模块图如下:

图六.设计整体图

四.实验器材

 

5.实验故障

我们按照要求连接实验各模块后,在示波器上未能显示我们要求得到的正弦波形。

故障1.D/A模块与SmartSOPC实验箱核心模块件电阻没有连接

解决:

我们用跳线按顺序连接了各个引脚

但是这样做完后,并没有出现正弦波形。

故障2.地线连接不够好

解决:

加强了地线的连接

做完此工作后,波形可以出现了。

6.实验心得

 

附录:

信号输入模块源程序

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_Arith.ALL;

USEIEEE.STD_LOGIC_Unsigned.ALL;

ENTITYsine_testIS

PORT(

clock:

INSTD_LOGIC;--系统时钟

key:

INSTD_LOGIC_VECTOR(3DOWNTO0);

select01:

OUTSTD_LOGIC;--发送数据使能.

data:

OUTSTD_LOGIC_VECTOR(11DOWNTO0);--要发送的数据

seg:

OUTSTD_LOGIC_VECTOR(7DOWNTO0);--数码管段码输出。

dig:

OUTSTD_LOGIC_VECTOR(7DOWNTO0)--数码管位码输出。

);

END;

ARCHITECTUREoneOFsine_testIS

SIGNALdata_r:

STD_LOGIC_VECTOR(11DOWNTO0);

SIGNALselect01_r:

STD_LOGIC;

SIGNALseg_r,dig_r:

STD_LOGIC_VECTOR(7DOWNTO0);

SIGNALcount:

STD_LOGIC_VECTOR(16DOWNTO0);--时钟分频计数器.

SIGNALdout1,dout2,dout3:

STD_LOGIC_VECTOR(3DOWNTO0);--消抖寄存器

SIGNALbuff:

STD_LOGIC_VECTOR(3DOWNTO0);--边沿检测寄存器

SIGNALcnt:

STD_LOGIC_VECTOR(1DOWNTO0);--数码管扫描计数器.

SIGNALdisp_dat:

STD_LOGIC_VECTOR(3DOWNTO0);--数码管扫描显存

SIGNALdiv_clk:

STD_LOGIC;--分频时钟

SIGNALkey_edge:

STD_LOGIC_VECTOR(3DOWNTO0);

BEGIN

PROCESS(clock)--时钟分频部分.

BEGIN

IFRISING_EDGE(clock)THEN

IFcount<120000THEN

count<=count+1;

div_clk<='0';

ELSE

count<=B"0_0000_0000_0000_0000";

div_clk<='1';

ENDIF;

ENDIF;

ENDPROCESS;

----------------------------------<<按键消抖部分

PROCESS(clock)

BEGIN

IFRISING_EDGE(clock)THEN

IFdiv_clk='1'THEN

dout1<=key;

dout2<=dout1;

dout3<=dout2;

ENDIF;

ENDIF;

ENDPROCESS;

PROCESS(clock)--按键边沿检测部分

BEGIN

IFRISING_EDGE(clock)THEN

buff<=dout1ORdout2ORdout3;

ENDIF;

ENDPROCESS;

key_edge<=NOT(dout1ORdout2ORdout3)ANDbuff;

PROCESS(clock)--按键1

BEGIN

IFRISING_EDGE(clock)THEN

IFkey_edge(0)='1'THEN--下降沿检测

data_r(11DOWNTO8)<=data_r(11DOWNTO8)+1;

ENDIF;

ENDIF;

ENDPROCESS;

PROCESS(clock)--按键2

BEGIN

IFRISING_EDGE(clock)THEN

IFkey_edge

(1)='1'THEN--下降沿检测

data_r(7DOWNTO4)<=data_r(7DOWNTO4)+1;

ENDIF;

ENDIF;

ENDPROCESS;

PROCESS(clock)--按键3

BEGIN

IFRISING_EDGE(clock)THEN

IFkey_edge

(2)='1'THEN--下降沿检测

data_r(3DOWNTO0)<=data_r(3DOWNTO0)+1;

ENDIF;

ENDIF;

ENDPROCESS;

PROCESS(clock)--按键4

BEGIN

IFRISING_EDGE(clock)THEN

IFkey_edge(3)='1'THEN--下降沿检测

select01_r<=NOTselect01_r;

ENDIF;

ENDIF;

ENDPROCESS;

PROCESS(clock)--数码管扫描显示部分

BEGIN

IFRISING_EDGE(clock)THEN

IFdiv_clk='1'THEN

cnt<=cnt+1;

ENDIF;

ENDIF;

ENDPROCESS;

PROCESS(clock)

BEGIN

IFRISING_EDGE(clock)THEN

IFdiv_clk='1'THEN

CASEcntIS--选项择扫描显示数据.

WHEN"00"=>disp_dat<=data_r(11DOWNTO8);--第一个数码管.

WHEN"01"=>disp_dat<=data_r(7DOWNTO4);--第二个数码管.

WHEN"10"=>disp_dat<=data_r(3DOWNTO0);--第三个数码管

WHEN"11"=>disp_dat<="000"&select01_r;--第八个数码管

ENDCASE;

CASEcntIS--选择数码管显示示位.

WHEN"00"=>dig_r<="01111111";--选择第一个数码管显示

WHEN"01"=>dig_r<="10111111";--选择第二个数码管显示

WHEN"10"=>dig_r<="11011111";--选择第三个数码管显示

WHEN"11"=>dig_r<="11111110";--选择第八个数码管显示

ENDCASE;

ENDIF;

ENDIF;

ENDPROCESS;

PROCESS(disp_dat)--七段译码

BEGIN

CASEdisp_datIS

WHENX"0"=>seg_r<=X"c0";--显示0

WHENX"1"=>seg_r<=X"f9";--显示1

WHENX"2"=>seg_r<=X"a4";--显示2

WHENX"3"=>seg_r<=X"b0";--显示3

WHENX"4"=>seg_r<=X"99";--显示4

WHENX"5"=>seg_r<=X"92";--显示5

WHENX"6"=>seg_r<=X"82";--显示6

WHENX"7"=>seg_r<=X"f8";--显示7

WHENX"8"=>seg_r<=X"80";--显示8

WHENX"9"=>seg_r<=X"90";--显示9

WHENX"a"=>seg_r<=X"88";--显示a

WHENX"b"=>seg_r<=X"83";--显示b

WHENX"c"=>seg_r<=X"c6";--显示c

WHENX"d"=>seg_r<=X"a1";--显示d

WHENX"e"=>seg_r<=X"86";--显示e

WHENX"f"=>seg_r<=X"8e";--显示f

WHENOTHERS=>seg_r<=X"FF";

ENDCASE;

ENDPROCESS;

seg<=seg_r;

dig<=dig_r;

select01<=select01_r;

data<=data_r;

END;

分频模块源程序

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;--这3个程序包足发应付大部分的VHDL程序设计

USEIEEE.STD_LOGIC_Arith.ALL;

USEIEEE.STD_LOGIC_Unsigned.ALL;

ENTITYint_divIS

GENERIC(N:

Integer:

=3);--此处定义了一个默认值N=3,即电路为3分频电路;

Port

(Clockin:

INSTD_LOGIC;

ClockOut:

OUTSTD_LOGIC

);

END;

 

ARCHITECTUREDeviderOFint_divIS

SIGNALCounter:

IntegerRANGE0TON-1;

SIGNALTemp1,Temp2:

STD_LOGIC;--信号的声明在结构体内,进程外部

BEGIN

PROCESS(Clockin)

BEGIN

IFRISING_EDGE(Clockin)THEN

IFCounter=N-1THEN

counter<=0;

Temp1<=NotTemp1;

ELSE

Counter<=Counter+1;

ENDIF;

ENDIF;

IFfalling_edge(clockin)THEN

IFCounter=N/2THEN

Temp2<=NOTTemp2;

ENDIF;

ENDIF;

ENDPROCESS;

ClockOut<=Temp1XORTemp2;

END;

 

信号输出模块源程序

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_Arith.ALL;

USEIEEE.STD_LOGIC_Unsigned.ALL;

ENTITYsineIS

PORT(

clock:

INSTD_LOGIC;--系统时钟

swept_clk:

INSTD_LOGIC;--扫描时钟

select01:

INSTD_LOGIC;--攻能选择,波形产生&扫频.

data:

INSTD_LOGIC_VECTOR(11DOWNTO0);--频率控制.

dout:

OUTSTD_LOGIC_VECTOR(9DOWNTO0);--数据输出.

da_clk:

OUTSTD_LOGIC;--DA时钟输出

da_mode:

OUTSTD_LOGIC--D/A数据模式选择.

);

END;

ARCHITECTUREoneOFsineIS

COMPONENTsin_rom--元器件调用声明.

PORT

address:

INSTD_LOGIC_VECTOR(7DOWNTO0);

clock:

INSTD_LOGIC;

q:

OUTSTD_LOGIC_VECTOR(9DOWNTO0)

);

ENDCOMPONENT;

SIGNALload_count:

STD_LOGIC_VECTOR(11DOWNTO0);--数控分频器重装值

SIGNALscan_data:

STD_LOGIC_VECTOR(11DOWNTO0);--扫频控制值

SIGNALcount:

STD_LOGIC_VECTOR(11DOWNTO0);--数控分频计数器

SIGNALrom_clk:

STD_LOGIC;--ROM波表时钟

SIGNALaddr:

STD_LOGIC_VECTOR(7DOWNTO0);--ROM地址.

BEGIN

 

PROCESS(clock)

BEGIN

IFRISING_EDGE(clock)THEN--选择数控分频器初值.

IFselect01='1'THEN

load_count<=data;--由外部输入.

ELSE

load_count<=scan_data;--由内部扫频产生.

ENDIF;

ENDIF;

ENDPROCESS;

PROCESS(clock)--数控分频器.

BEGIN

IFRISING_EDGE(clock)THEN

IFcount=X"FFF"THEN

count<=load_count;

rom_clk<='1';

ELSE

count<=count+1;

rom_clk<='0';

ENDIF;

ENDIF;

ENDPROCESS;

PROCESS(clock)

BEGIN

IFRISING_EDGE(clock)THEN--产生ROM地址.

IFrom_clk='1'THEN

addr<=addr+1;

ENDIF;

ENDIF;

ENDPROCESS;

PROCESS(swept_clk)

BEGIN

IFRISING_EDGE(swept_clk)THEN

scan_data<=scan_data+1;

ENDIF;

ENDPROCESS;

U1:

sin_romPORTMAP(address=>addr,clock=>rom_clk,q=>dout);

da_clk<=rom_clk;--D/A时钟输出.

da_mode<='0';--D/A数据模式选择以二进制输入.

END;

 

LPM_ROM模块源程序

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYDACIS

PORT(CLK,CLK1,KK:

INSTD_LOGIC;

DATA:

INSTD_LOGIC_VECTOR(11DOWNTO0);

DD:

OUTINTEGERRANGE255DOWNTO0);

END;

ARCHITECTUREDACCOFDACIS

SIGNALQ:

INTEGERRANGE63DOWNTO0;

SIGNALD:

INTEGERRANGE255DOWNTO0;

SIGNALFSS:

STD_LOGIC;

SIGNALCOUNT12,DATA2,DATA1:

STD_LOGIC_VECTOR(11DOWNTO0);

BEGIN

PROCESS(FSS)

BEGIN

IF(FSS'EVENTANDFSS='1')THENQ<=Q+1;

ENDIF;

ENDPROCESS;

PROCESS(Q)

BEGIN

CASEQIS

WHEN00=>D<=255;WHEN01=>D<=254;WHEN02=>D<=252;WHEN03=>D<=249;

WHEN04=>D<=245;WHEN05=>D<=239;WHEN06=>D<=233;WHEN07=>D<=225;

WHEN08=>D<=217;WHEN09=>D<=207;WHEN10=>D<=197;WHEN11=>D<=186;

WHEN12=>D<=174;WHEN13=>D<=162;WHEN14=>D<=150;WHEN15=>D<=137;

WHEN16=>D<=124;WHEN17=>D<=112;WHEN18=>D<=99;WHEN19=>D<=87;

WHEN20=>D<=75;WHEN21=>D<=64;WHEN22=>D<=53;WHEN23=>D<=43;

WHEN24=>

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

当前位置:首页 > 党团工作 > 入党转正申请

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

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