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