北邮数电实验报告VHDLWord下载.docx
《北邮数电实验报告VHDLWord下载.docx》由会员分享,可在线阅读,更多相关《北邮数电实验报告VHDLWord下载.docx(32页珍藏版)》请在冰点文库上搜索。
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:
cs:
OUTSTD_LOGIC;
data_tri:
INSTD_LOGIC_VECTOR(11DOWNTO0);
--三角波
data_sin:
--正弦波
data_out:
OUTSTD_LOGIC
);
ENDconvert;
ARCHITECTUREbingoOFconvertIS
SIGNALstate:
INTEGERRANGE0TO3;
--Setreferencevoltageto2.048V
SHAREDVARIABLEcontrol:
STD_LOGIC_VECTOR(15DOWNTO0):
="
1101000000000010"
;
SIGNALflg0:
STD_LOGIC;
SIGNALflg:
SIGNALchannel:
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='
IF(state=0)THEN
IF(delay_count=199)THEN
flg0<
ELSE
delay_count:
=delay_count+1;
ENDIF;
ENDIF;
ENDIF;
ENDPROCESSbegin_delay;
work_delay:
PROCESS(clk_in,reset)--工作延时4个时钟周期
VARIABLEdelay4:
delay4:
flg<
IF(state=3)THEN
IF(delay4=2)THEN
flg<
delay4:
=delay4+1;
ELSE
delay4:
flg<
ENDPROCESSwork_delay;
p:
PROCESS(clk_in,reset)
VARIABLEcs_0:
STD_LOGIC:
='
VARIABLEtemp:
INTEGERRANGE0TO15:
)THEN--初始化
cs_0:
cs<
=cs_0;
state<
channel<
temp:
casestateis
when0=>
IF(flg0='
state<
=1;
ENDIF;
when1=>
data_tmp<
=control;
cs_0:
cs<
when2=>
IF(temp=0)THEN--并串转换
IF(channel='
data_tmp<
0101"
&
data_sin;
ELSE
1100"
data_tri;
ENDIF;
cs_0:
cs<
when3=>
cs_0:
IF(flg='
=2;
endcase;
IF(cs_0='
IF(temp=0)THEN
temp:
=15;
=temp-1;
IF(state=1)THEN--输出16位串行数据
IF(temp=15)THEN
data_out<
=NOTdata_tmp(temp);
ELSE
=data_tmp(temp);
ENDIF;
IF(temp=0)THEN
state<
=3;
ELSIF(state=2)THEN--输出16位串行数据
channel<
=NOTchannel;
--转换频道
ENDPROCESSp;
ENDbingo;
delta.vhd:
ENTITYdeltaIS
OUTSTD_LOGIC_VECTOR(11DOWNTO0)
ENDdelta;
ARCHITECTUREaOFdeltaIS
p1:
PROCESS(clk_in)
VARIABLEdata:
STD_LOGIC_VECTOR(11DOWNTO0);
VARIABLEflg:
IF(clk_in'
IF(flg='
data:
=data+65;
IF(data="
111110111110"
flg:
000000000000"
data:
=data-65;
data_tri<
=data;
ENDPROCESSp1;
ENDa;
fenpin.vhd:
ENTITYfenpinIS
clk:
state:
INSTD_LOGIC_VECTOR(1DOWNTO0);
clk_out32:
--并行
clk_out:
--串行
clk_1k:
clk_100:
ENDfenpin;
ARCHITECTUREaOFfenpinIS
SIGNALclk_2500s:
--12.5M
SIGNALclk_1000s:
--5M
SIGNALclk_500s:
--2.5M
SIGNALclk_tmp:
--clk_out
SIGNALclk_1ks:
SIGNALclk_100s:
SIGNALtmp_4:
SIGNALtmp_10:
INTEGERRANGE0TO9;
SIGNALtmp_2:
INTEGERRANGE0TO1;
SIGNALtmp_40:
INTEGERRANGE0TO39;
SIGNALtmp_2500:
INTEGERRANGE0TO2499;
SIGNALtmp_10s:
PROCESS(state)
casestateis
when"
00"
=>
clk_out32<
=clk_2500s;
clk_tmp<
01"
10"
=clk_1000s;
11"
=clk_500s;
whenothers=>
clk_out32<
endcase;
ENDPROCESSP;
PROCESS(clk)
IF(clk'
eventANDclk='
IFtmp_4=3THEN
tmp_4<
=0;
=tmp_4+1;
IFtmp_4<
2THEN
clk_2500s<
p2:
IFtmp_10=9THEN
tmp_10<
=tmp_10+1;
IFtmp_10<
5THEN
clk_1000s<
ENDPROCESSp2;
p3:
PROCESS(clk_1000s)
IF(clk_1000s'
eventANDclk_1000s='
IFtmp_2=1THEN
tmp_2<
=tmp_2+1;
IFtmp_2<
1THEN
clk_500s<
ENDPROCESSp3;
p4:
PROCESS(clk_tmp)--clk_out
IF(clk_tmp'
eventANDclk_tmp='
IFtmp_40=39THEN
tmp_40<
=tmp_40+1;
IFtmp_40<
20THEN
clk_out<
ENDPROCESSp4;
p5:
PROCESS(clk_500s)
IF(clk_500s'
eventANDclk_500s='
IFtmp_2500=2499THEN
tmp_2500<
=tmp_2500+1;
IFtmp_2500<
1250THEN
clk_1k<
--1khz
clk_1ks<
ENDPROCESSp5;
p6:
PROCESS(clk_1ks)
IF(clk_1ks'
eventANDclk_1ks='
IFtmp_10s=9THEN
tmp_10s<
=tmp_10s+1;
IFtmp_10s<
clk_100<
clk_100s<
--100hz
ENDPROCESSp6;
shuma.vhd;
ENTITYshumaIS
seg:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
cat:
OUTSTD_LOGIC_VECTOR(5DOWNTO0)
ENDshuma;
ARCHITECTUREaOFshumaIS
SIGNALseg_tmp1:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALseg_tmp2:
SIGNALseg_tmp3:
SIGNALseg_tmp4:
SIGNALcount:
seg_tmp1<
1101101"
--2
seg_tmp2<
1011011"
--5
seg_tmp3<
1111110"
--0
seg_tmp4<
seg_t