西工大数电实验第三次实验实验报告.docx
《西工大数电实验第三次实验实验报告.docx》由会员分享,可在线阅读,更多相关《西工大数电实验第三次实验实验报告.docx(13页珍藏版)》请在冰豆网上搜索。
西工大数电实验第三次实验实验报告
数电实验3
一.实验目的
了解顶层电路设计采用的原理图输入方法,各电路模块可以采用原理图或硬件描述语言输入方法实现一个简易计时电路。
二.实验设备
1.Quartus开发环境
2.ED0开发板
三.实验内容
基本要求:
由四个数码管显示的计时电路,低两位按照20进制设计,高两位按照11进制设计;
附加要求1:
该计时电路具有校准功能,可以按1Hz频率校准高两位的显示,可以按10Hz频率校准低两位的显示;
附加要求2:
高两位的进制可以任意设置(不需要重编译电路)。
附加要求3:
在计数到达某整点值时例如0300的时刻(该值可以根据老师的要求设置),4盏LED灯一起按照10Hz闪烁5秒钟。
四.实验原理
1:
主计时器以及功能实现模块代码
LIBRARYIEEE;
USEIEEE.std_logic_1164.ALL;
USEIEEE.std_logic_ARITH.ALL;
USEIEEE.std_logic_UNSIGNED.ALL;
ENTITYcounttIS
port(clk:
instd_logic;
data_in:
INSTD_LOGIC_VECTOR(4DOWNTO0);--设置高两位进制的变量输入
data_in1,data_in2:
INSTD_LOGIC;--设置1HZ校准高两位m=1250000,10HZ校准低两位m=2500000,输入为1时进行校准
data_out1,data_out2,data_out3,data_out4,data_out5:
outstd_logic_vector(3downto0));--1,2,3,4为从高到低四个数码管.5为led灯输出
ENDcountt;
ARCHITECTUREfwmOFcounttIS
CONSTANTm0:
INTEGER:
=25000000;--默认1HZm=25000000测试使用m=2
CONSTANTm1:
INTEGER:
=2500000;--选择10HZm=2500000
BEGIN
PROCESS(clk,data_in,data_in1,data_in2)
VARIABLEm:
INTEGER:
=25000000;--时钟计时设定频率使用的常数
VARIABLEmm:
INTEGER:
=25000000;--时钟计时设定频率使用的常数
VARIABLEcout:
INTEGER:
=0;--计数器cout
VARIABLEcout1:
INTEGER:
=0;--计数器cout1
VARIABLEi:
INTEGER:
=0;--计数器i
VARIABLEk1:
INTEGER:
=0;--记录1号数码管数值对应的十进制数
VARIABLEk2:
INTEGER:
=0;--记录2号数码管数值对应的十进制数
VARIABLEtmp3:
INTEGER:
=0;--记录3号数码管数值对应的十进制数
VARIABLEtmp4:
INTEGER:
=0;--记录4号数码管数值对应的十进制数
VARIABLEj:
INTEGER:
=11;--记录高两位进制,默认为11进制
VARIABLEled:
INTEGER:
=0;--用来记录led灯的状态
BEGIN
--检测进制--
CASEdata_inis
--WHEN"00001"=>j=1;一进制?
?
?
WHEN"00010"=>j:
=2;
WHEN"00011"=>j:
=3;
WHEN"00100"=>j:
=4;
WHEN"00101"=>j:
=5;
WHEN"00110"=>j:
=6;
WHEN"00111"=>j:
=7;
WHEN"01000"=>j:
=8;
WHEN"01001"=>j:
=9;
WHEN"01010"=>j:
=10;
WHEN"01011"=>j:
=11;
WHEN"01100"=>j:
=12;
WHEN"01101"=>j:
=13;
WHEN"01110"=>j:
=14;
WHEN"01111"=>j:
=15;
WHEN"10000"=>j:
=16;
WHEN"10001"=>j:
=17;
WHEN"10010"=>j:
=18;
WHEN"10011"=>j:
=19;
WHEN"10100"=>j:
=20;
WHEN"10101"=>j:
=21;
WHEN"10110"=>j:
=22;
WHEN"10111"=>j:
=23;
WHEN"11000"=>j:
=24;
WHENOTHERS=>j:
=11;--只设置24个进位可能性,其余情况为默认11进制.
endcase;
--工作段--
IFclk'EVENTANDclk='1'THEN
cout:
=cout+1;--计数器+1
--将用于记录的十进制数字转换为二进制数--
--低两位--
casetmp3is
when0=>data_out3<="0000";
when1=>data_out3<="0001";
whenothers=>data_out3<="1110";
endcase;
casetmp4is
when0=>data_out4<="0000";
when1=>data_out4<="0001";
when2=>data_out4<="0010";
when3=>data_out4<="0011";
when4=>data_out4<="0100";
when5=>data_out4<="0101";
when6=>data_out4<="0110";
when7=>data_out4<="0111";
when8=>data_out4<="1000";
when9=>data_out4<="1001";
whenothers=>data_out4<="1110";
endcase;
--高两位--
casek1is
when0=>data_out1<="0000";
when1=>data_out1<="0001";
when2=>data_out1<="0010";
when3=>data_out1<="0011";
when4=>data_out1<="0100";
when5=>data_out1<="0101";
when6=>data_out1<="0110";
when7=>data_out1<="0111";
when8=>data_out1<="1000";
when9=>data_out1<="1001";
whenothers=>data_out1<="1110";
endcase;
casek2is
when0=>data_out2<="0000";
when1=>data_out2<="0001";
when2=>data_out2<="0010";
when3=>data_out2<="0011";
when4=>data_out2<="0100";
when5=>data_out2<="0101";
when6=>data_out2<="0110";
when7=>data_out2<="0111";
when8=>data_out2<="1000";
when9=>data_out2<="1001";
whenothers=>data_out2<="1110";
endcase;
--0300时4盏led10hz闪烁10s--
ifk1=1andk2=3andtmp3=0andtmp4=0then
led:
=1;
endif;
ifled/=0then
cout1:
=cout1+1;
ifled<101then
ifled=100then
led:
=0;
endif;
ifcout1<=m1then
data_out5<="0000";
else
led:
=led+1;
ifcout1<=m1*2then
data_out5<="1111";
else
led:
=led+1;
cout1:
=0;
endif;
endif;
endif;
endif;
--设置1HZ校准高两位,--
ifdata_in1='1'then
m:
=m0;
ifi<=jthen
ifcout<=m*ithen
k1:
=i/10;
k2:
=i-k1*10;
else
i:
=i+1;
endif;
else
i:
=0;
cout:
=0;
k1:
=0;
k2:
=0;
endif;
--10HZ校准低两位m=2500000,--如果在进行高位校准的同时检测到进行低位校准的信号,则同时进行校准
ifdata_in2='1'then
mm:
=m1;
ifi<=19then
ifcout<=mm*ithen
ifi<10then
tmp3:
=0;
tmp4:
=tmp4+1;
else
tmp3:
=1;
tmp4:
=i-10;
endif;
else
i:
=i+1;
endif;
else
i:
=0;
cout:
=0;
tmp3:
=0;
tmp4:
=0;--清空计数器i.以及tmp3,tmp4--
--高两位使用十进制数k1,k2进行计数--
k2:
=k2+1;--低两位满20后高两位个位k2加一
endif;
endif;
else
--data_in1=0,只进行低位校准,不进行高位校准
ifdata_in2='1'then
mm:
=m1;
ifi<=19then
ifcout<=mm*ithen
ifi<10then
tmp3:
=0;
tmp4:
=tmp4+1;
else
tmp3:
=1;
tmp4:
=i-10;
endif;
else
i:
=i+1;
endif;
else
i:
=0;
cout:
=0;
tmp3:
=0;
tmp4:
=0;--清空计数器i.以及tmp3,tmp4--
--高两位使用十进制数k1,k2进行计数--
k2:
=k2+1;--低两位满20后高两位个位k2加一
endif;
else
--data_in1=0,data_in2=0正常模式--
--正常工作模式--
--低两位使用十进制数tmp进行计数--
ifi<=19then
ifcout<=m*ithen
ifi<10then
tmp3:
=0;
tmp4:
=tmp4+1;
else
tmp3:
=1;
tmp4:
=i-10;
endif;
else
i:
=i+1;
endif;
else
i:
=0;
cout:
=0;
tmp3:
=0;
tmp4:
=0;--清空计数器i.以及tmp3,tmp4--
--高两位使用十进制数k1,k2进行计数--
k2:
=k2+1;--低两位满20后高两位个位k2加一
endif;
--高两位控制--
--高两位的个位向十位进位--
ifk2=10then
k1:
=k1+1;
k2:
=0;
endif;
--检测是否达到进制要求--
if(k1*10+k2)>=jthen
k1:
=0;
k2:
=0;--到达进制要求后清空k1k2
endif;
endif;
endif;
endif;
ENDPROCESS;
ENDfwm;
--endpoweredbytuzixini20143021702014302171—
2.七段译码器模块代码如下
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYsevendecoderIS
PORT(data_in:
INSTD_LOGIC_VECTOR(3DOWNTO0);
dis_out:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDsevendecoder;
ARCHITECTUREfwmOFsevendecoderIS
BEGIN
PROCESS(data_in)
BEGIN
CASEdata_inIS
WHEN"0000"=>dis_out<="1000000";--显示0
WHEN"0001"=>dis_out<="1111001";--显示1
WHEN"0010"=>dis_out<="0100100";--显示2
WHEN"0011"=>dis_out<="0110000";--显示3
WHEN"0100"=>dis_out<="0011001";--显示4
WHEN"0101"=>dis_out<="0010010";--显示5
WHEN"0110"=>dis_out<="0000010";--显示6
WHEN"0111"=>dis_out<="1111000";--显示7
WHEN"1000"=>dis_out<="0000000";--显示8
WHEN"1001"=>dis_out<="0010000";--显示9
WHEN"1010"=>dis_out<="0001000";--显示A
WHEN"1011"=>dis_out<="0000011";--显示b
WHEN"1100"=>dis_out<="1000110";--显示C
WHEN"1101"=>dis_out<="0100001";--显示d
WHEN"1110"=>dis_out<="0000110";--显示E
WHEN"1111"=>dis_out<="0001110";--显示F
WHENOTHERS=>dis_out<="1111111";--灭灯,不显示
ENDCASE;
ENDPROCESS;
endfwm;
五.实验结果
1.将使用VHDL语言设计出来的两个模块生成其对应的原件符号.
主模块:
接收时钟信号,高位进制指定信号,高位校准信号,低位校准信号.输出四个数码管对应的数字的二进制数以及控制4个led灯的信号.
七段译码器译码模块:
接收主模块输出的二进制数字信号,将其译码称为所需要的七段码并输出;
新建原理图插入之前生成的主模块以及译码模块,并将其设置成为顶层电路.
原理图如下:
在计算机上完成模拟实验之后,分配针脚后重新进行编译,
然后将程序下载到DE0开发板上进行验证。
验证结果无误。
六.故障排除&实验心得
本次的实验相对来说难度较大,基本的实验要求比较好实现,但是附加要求就要难了很多,尤其是需要将它们互相配合实现.最好的方法是使用顶层电路设计采用原理图输入方法,各电路模块可以采用原理图或硬件描述语言输入方法实现.但是由于这是第一次接触分模块的电路设计不太熟悉所以没能做到把实验中需要实现的东西详细分成一个个的模块,最终只是设计了一个主模块以及一个七段译码器模块搭配使用进行相关功能的实现.这样的话带来的最大问题是主模块的VHDL代码过长,无论是编写代码的过程或者调试改错的过程难度都比较大,而且代码会很难理解别人一般根本无法读懂.虽然是实现了实验要求实现的内容,但是维护改动起来会十分麻烦.
通过本次的实验使得我们对于VHDL以及QUARTUS的使用有了更近一步的了解.对于顶层电路设计以及模块化设计有了初步的认识,但是使用的还不是很熟练,还需要以后更多的学习,练习,使用.