北邮数电实验报告VHDL.docx

上传人:b****4 文档编号:4268579 上传时间:2023-05-06 格式:DOCX 页数:32 大小:348.53KB
下载 相关 举报
北邮数电实验报告VHDL.docx_第1页
第1页 / 共32页
北邮数电实验报告VHDL.docx_第2页
第2页 / 共32页
北邮数电实验报告VHDL.docx_第3页
第3页 / 共32页
北邮数电实验报告VHDL.docx_第4页
第4页 / 共32页
北邮数电实验报告VHDL.docx_第5页
第5页 / 共32页
北邮数电实验报告VHDL.docx_第6页
第6页 / 共32页
北邮数电实验报告VHDL.docx_第7页
第7页 / 共32页
北邮数电实验报告VHDL.docx_第8页
第8页 / 共32页
北邮数电实验报告VHDL.docx_第9页
第9页 / 共32页
北邮数电实验报告VHDL.docx_第10页
第10页 / 共32页
北邮数电实验报告VHDL.docx_第11页
第11页 / 共32页
北邮数电实验报告VHDL.docx_第12页
第12页 / 共32页
北邮数电实验报告VHDL.docx_第13页
第13页 / 共32页
北邮数电实验报告VHDL.docx_第14页
第14页 / 共32页
北邮数电实验报告VHDL.docx_第15页
第15页 / 共32页
北邮数电实验报告VHDL.docx_第16页
第16页 / 共32页
北邮数电实验报告VHDL.docx_第17页
第17页 / 共32页
北邮数电实验报告VHDL.docx_第18页
第18页 / 共32页
北邮数电实验报告VHDL.docx_第19页
第19页 / 共32页
北邮数电实验报告VHDL.docx_第20页
第20页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

北邮数电实验报告VHDL.docx

《北邮数电实验报告VHDL.docx》由会员分享,可在线阅读,更多相关《北邮数电实验报告VHDL.docx(32页珍藏版)》请在冰点文库上搜索。

北邮数电实验报告VHDL.docx

北邮数电实验报告VHDL

数电实验—简易函数发生器

实验报告

 

 

姓名:

李亚东

班级:

2011211116

学号:

2011210466

班内序号:

22

一、任务要求

设计制作一个简易信号发生器。

基本要求:

1.利用实验板上的DAC(TLV5638)设计实现一个信号产生电路,从DA_A输出稳定的三角波。

2.输出信号Vopp=4V,可用一个btn按钮选择输出信号频率为2500Hz,1000Hz,500Hz,波形每个周期大于100个点,线性良好。

3.数码管显示当前输出信号频率值。

提高要求:

1.分别从DA_A和DA_B同时输出三角波和正弦波,可用一个btn按钮选择输出信号频率为2500Hz,1000Hz,500Hz,波形每个周期大于100个点,没有明显失真。

2.数码管显示当前输出信号频率值。

3.自拟其它功能。

二、系统设计

1.设计思路

将整个函数信号发生器分成6个模块实现,数码管显示模块,三角波产生模块,正弦波产生模块,状态选择模块,分频模块,并串转换模块,每个模块用VHDL语言设计完成后生成相应符号文件,在一个原理图文件中调用这些自创符号,并连接成一个整体,实现系统功能btn0控制状态的转换,输出2500Hz,1000Hz,500Hz的波形,btn1产生复位信号。

2.总体设计框图

数码管

Out

3.分块设计

本设计共使用了六个模块,下面分别说明:

a)三角波产生模块:

本模块主要功能是输出三角波波形,每个时钟上升沿输出一个12位数据,每个三角波周期总共输出125个点,符合要求中波形每个周期大于100个点的要求,利用一个可逆计数器实现,设计时设置一变量flg作为工作状态标志,在flg为0时,当检测到时钟上升沿进行加65操作;为1时,进行减65操作。

b)正弦波产生模块:

本模块的主要功能是输出正弦波波形。

每个周期125个点,采用穷举的方式用Scilab算出12位的正弦波的取样值,做成数据表,每个时钟上升沿采用查表输出数据,程序简单效率高。

c)分频模块:

本模块主要功能是输出四个分频时钟clk_out32,clk_out,clk_1k,clk_100。

clk_out是波形的每一点的并行值输出频率,当输出2500hz波形时,其值为2500*125=312.5khz,clk_out32是clk_out的40倍频,是并串转换的频率,当输出2500hz频率时,其值为12.5Mhz,clk_1k是扫描6个数码管的频率,取1khz可以取得比较好的显示效果,clk_100是频率选择模块的频率,分频时设计一个计数变量,若4分频,则设变量为0~3,0,1时输出低电平,2,3时输出高电平。

 

d)数码管显示模块:

本模块是选择相应的频率时在数码管上显示相应的频率。

 

e)状态转换模块:

本模块功能是转换不同状态,输出不同频率波形,用一个2位的vector表示状态,由于总共只有3种频率,所以使状态0和1输出频率相同。

 

f)并串转换模块:

 

本模块将上级输入的12位并行数据信号转换为串行输出,以供TLV5638进行DA转换。

按下btn1后,系统重置,经过两次状态转换。

state0是一个等待状态,系统等待200个时钟周期之后进入state1,系统将把TLV5638的触发信号cs置成有效电平0,允许数据写入,这个状态主要用来写TLV5638的控制寄存器,将它的参考电平设为2.048V,接着系统进入state3,cs置成高电平,停止数据写入,这个状态等待4个时钟周期,因为时钟频率是clk_out的40倍频,接着进入state2,开始并串转换,输出16位串行数据后又进入state3,此时转换频道,等待4个周期再进入state2。

在TLV5638自身允许输入的状态下,依次使用DAC_A和DAC_B输出三角波和正弦波数据。

在它自身禁止输入的状态下,进程将TLV5638的触发信号置成无效电平,并不输出。

三、总体电路图

四、仿真波形及分析

1.三角波输出仿真情况

从仿真波形可以看出,输出的12位并行数据从65到130,再到195…符合设计要求。

2.正弦波输出仿真情况

从仿真波形可以看出,输出的12位并行数据从111111111111到111111111101,再到111111111101…符合设计要求。

3.并串转换输出仿真情况

从仿真波形可以看出,当输入的三角波和正弦波数据分别为000100101001和000000000010时,输出的串行数据data_out为000000000010000100101001…符合设计要求。

4.分频输出仿真情况(以输出2500hz频率为例)

从仿真波形可以看出,当state为0时,clk_out32为clk的4分频,即12.5Mhz,clk_1k,clk_100与clk_out由于和clk频率相差太大,无法从仿真波形上看出。

符合设计要求。

 

5.数码管扫描仿真情况(以输出2500hz为例)

从仿真波形可以看出,seg按照1101101,1011011,1111110,1111110循环变化,cat按照110111,111011,111101,111110循环变化,符合设计要求。

6.状态转换仿真情况

从仿真波形可以看出,当不断按下btn0时,state在0,1,2,3循环转换,符合设计要求。

 

五、源程序

convert.vhd:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

ENTITYconvertIS

PORT

clk_in:

INSTD_LOGIC;

reset:

INSTD_LOGIC;

cs:

OUTSTD_LOGIC;

data_tri:

INSTD_LOGIC_VECTOR(11DOWNTO0);--三角波

data_sin:

INSTD_LOGIC_VECTOR(11DOWNTO0);--正弦波

data_out:

OUTSTD_LOGIC

);

ENDconvert;

ARCHITECTUREbingoOFconvertIS

SIGNALstate:

INTEGERRANGE0TO3;

--Setreferencevoltageto2.048V

SHAREDVARIABLEcontrol:

STD_LOGIC_VECTOR(15DOWNTO0):

="1101000000000010";

SIGNALflg0:

STD_LOGIC;

SIGNALflg:

STD_LOGIC;

SIGNALchannel:

STD_LOGIC;

SIGNALdata_tmp:

STD_LOGIC_VECTOR(15DOWNTO0);

BEGIN

begin_delay:

PROCESS(clk_in,reset)--开始延时200个时钟周期

VARIABLEdelay_count:

INTEGERRANGE0TO199;

BEGIN

IF(reset='1')THEN

delay_count:

=0;

flg0<='0';

ELSIF(clk_in'eventANDclk_in='1')THEN

IF(state=0)THEN

IF(delay_count=199)THEN

flg0<='1';

ELSE

delay_count:

=delay_count+1;

ENDIF;

ENDIF;

ENDIF;

ENDPROCESSbegin_delay;

work_delay:

PROCESS(clk_in,reset)--工作延时4个时钟周期

VARIABLEdelay4:

INTEGERRANGE0TO3;

BEGIN

IF(reset='1')THEN

delay4:

=0;

flg<='0';

ELSIF(clk_in'eventANDclk_in='1')THEN

IF(state=3)THEN

IF(delay4=2)THEN

flg<='1';

ELSE

delay4:

=delay4+1;

ENDIF;

ELSE

delay4:

=0;

flg<='0';

ENDIF;

ENDIF;

ENDPROCESSwork_delay;

p:

PROCESS(clk_in,reset)

VARIABLEcs_0:

STD_LOGIC:

='1';

VARIABLEtemp:

INTEGERRANGE0TO15:

=0;

BEGIN

IF(reset='1')THEN--初始化

cs_0:

='1';

cs<=cs_0;

state<=0;

channel<='0';

temp:

=0;

ELSIF(clk_in'eventANDclk_in='1')THEN

casestateis

when0=>IF(flg0='1')THEN

state<=1;

ENDIF;

when1=>data_tmp<=control;

cs_0:

='0';

cs<=cs_0;

when2=>IF(temp=0)THEN--并串转换

IF(channel='0')THEN

data_tmp<="0101"&data_sin;

ELSE

data_tmp<="1100"&data_tri;

ENDIF;

cs_0:

='0';

cs<=cs_0;

ENDIF;

when3=>cs_0:

='1';

cs<=cs_0;

IF(flg='1')THEN

state<=2;

ENDIF;

endcase;

IF(cs_0='0')THEN

IF(temp=0)THEN

temp:

=15;

ELSE

temp:

=temp-1;

ENDIF;

IF(state=1)THEN--输出16位串行数据

IF(temp=15)THEN

data_out<=NOTdata_tmp(temp);

ELSE

data_out<=data_tmp(temp);

ENDIF;

IF(temp=0)THEN

state<=3;

ENDIF;

ELSIF(state=2)THEN--输出16位串行数据

IF(temp=15)THEN

data_out<=NOTdata_tmp(temp);

ELSE

data_out<=data_tmp(temp);

ENDIF;

IF(temp=0)THEN

state<=3;

channel<=NOTchannel;--转换频道

ENDIF;

ENDIF;

ENDIF;

ENDIF;

ENDPROCESSp;

ENDbingo;

delta.vhd:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

ENTITYdeltaIS

PORT

clk_in:

INSTD_LOGIC;

data_tri:

OUTSTD_LOGIC_VECTOR(11DOWNTO0)

);

ENDdelta;

ARCHITECTUREaOFdeltaIS

BEGIN

p1:

PROCESS(clk_in)

VARIABLEdata:

STD_LOGIC_VECTOR(11DOWNTO0);

VARIABLEflg:

STD_LOGIC;

BEGIN

IF(clk_in'eventANDclk_in='1')THEN

IF(flg='0')THEN

data:

=data+65;

IF(data="111110111110")THEN

flg:

='1';

ENDIF;

ELSE

IF(data="000000000000")THEN

flg:

='0';

ELSE

data:

=data-65;

ENDIF;

ENDIF;

data_tri<=data;

ENDIF;

ENDPROCESSp1;

ENDa;

fenpin.vhd:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

ENTITYfenpinIS

PORT

clk:

INSTD_LOGIC;

state:

INSTD_LOGIC_VECTOR(1DOWNTO0);

clk_out32:

OUTSTD_LOGIC;--并行

clk_out:

OUTSTD_LOGIC;--串行

clk_1k:

OUTSTD_LOGIC;

clk_100:

OUTSTD_LOGIC

);

ENDfenpin;

ARCHITECTUREaOFfenpinIS

SIGNALclk_2500s:

STD_LOGIC;--12.5M

SIGNALclk_1000s:

STD_LOGIC;--5M

SIGNALclk_500s:

STD_LOGIC;--2.5M

SIGNALclk_tmp:

STD_LOGIC;--clk_out

SIGNALclk_1ks:

STD_LOGIC;

SIGNALclk_100s:

STD_LOGIC;

SIGNALtmp_4:

INTEGERRANGE0TO3;

SIGNALtmp_10:

INTEGERRANGE0TO9;

SIGNALtmp_2:

INTEGERRANGE0TO1;

SIGNALtmp_40:

INTEGERRANGE0TO39;

SIGNALtmp_2500:

INTEGERRANGE0TO2499;

SIGNALtmp_10s:

INTEGERRANGE0TO9;

BEGIN

p:

PROCESS(state)

BEGIN

casestateis

when"00"=>clk_out32<=clk_2500s;clk_tmp<=clk_2500s;

when"01"=>clk_out32<=clk_2500s;clk_tmp<=clk_2500s;

when"10"=>clk_out32<=clk_1000s;clk_tmp<=clk_1000s;

when"11"=>clk_out32<=clk_500s;clk_tmp<=clk_500s;

whenothers=>clk_out32<=clk_2500s;clk_tmp<=clk_2500s;

endcase;

ENDPROCESSP;

p1:

PROCESS(clk)

BEGIN

IF(clk'eventANDclk='1')THEN

IFtmp_4=3THEN

tmp_4<=0;

ELSE

tmp_4<=tmp_4+1;

ENDIF;

IFtmp_4<2THEN

clk_2500s<='0';

ELSE

clk_2500s<='1';

ENDIF;

ENDIF;

ENDPROCESSp1;

p2:

PROCESS(clk)

BEGIN

IF(clk'eventANDclk='1')THEN

IFtmp_10=9THEN

tmp_10<=0;

ELSE

tmp_10<=tmp_10+1;

ENDIF;

IFtmp_10<5THEN

clk_1000s<='0';

ELSE

clk_1000s<='1';

ENDIF;

ENDIF;

ENDPROCESSp2;

p3:

PROCESS(clk_1000s)

BEGIN

IF(clk_1000s'eventANDclk_1000s='1')THEN

IFtmp_2=1THEN

tmp_2<=0;

ELSE

tmp_2<=tmp_2+1;

ENDIF;

IFtmp_2<1THEN

clk_500s<='0';

ELSE

clk_500s<='1';

ENDIF;

ENDIF;

ENDPROCESSp3;

p4:

PROCESS(clk_tmp)--clk_out

BEGIN

IF(clk_tmp'eventANDclk_tmp='1')THEN

IFtmp_40=39THEN

tmp_40<=0;

ELSE

tmp_40<=tmp_40+1;

ENDIF;

IFtmp_40<20THEN

clk_out<='0';

ELSE

clk_out<='1';

ENDIF;

ENDIF;

ENDPROCESSp4;

p5:

PROCESS(clk_500s)

BEGIN

IF(clk_500s'eventANDclk_500s='1')THEN

IFtmp_2500=2499THEN

tmp_2500<=0;

ELSE

tmp_2500<=tmp_2500+1;

ENDIF;

IFtmp_2500<1250THEN

clk_1k<='0';--1khz

clk_1ks<='0';

ELSE

clk_1k<='1';

clk_1ks<='1';

ENDIF;

ENDIF;

ENDPROCESSp5;

p6:

PROCESS(clk_1ks)

BEGIN

IF(clk_1ks'eventANDclk_1ks='1')THEN

IFtmp_10s=9THEN

tmp_10s<=0;

ELSE

tmp_10s<=tmp_10s+1;

ENDIF;

IFtmp_10s<5THEN

clk_100<='0';

clk_100s<='0';

ELSE

clk_100<='1';--100hz

clk_100s<='1';

ENDIF;

ENDIF;

ENDPROCESSp6;

ENDa;

shuma.vhd;

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

ENTITYshumaIS

PORT

clk_1k:

INSTD_LOGIC;

state:

INSTD_LOGIC_VECTOR(1DOWNTO0);

seg:

OUTSTD_LOGIC_VECTOR(6DOWNTO0);

cat:

OUTSTD_LOGIC_VECTOR(5DOWNTO0)

);

ENDshuma;

ARCHITECTUREaOFshumaIS

SIGNALseg_tmp1:

STD_LOGIC_VECTOR(6DOWNTO0);

SIGNALseg_tmp2:

STD_LOGIC_VECTOR(6DOWNTO0);

SIGNALseg_tmp3:

STD_LOGIC_VECTOR(6DOWNTO0);

SIGNALseg_tmp4:

STD_LOGIC_VECTOR(6DOWNTO0);

SIGNALcount:

INTEGERRANGE0TO3;

BEGIN

p1:

PROCESS(state)

BEGIN

casestateis

when"00"=>seg_tmp1<="1101101";--2

seg_tmp2<="1011011";--5

seg_tmp3<="1111110";--0

seg_tmp4<="1111110";--0

when"01"=>seg_tmp1<="1101101";--2

seg_t

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

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2