北邮数电实验下LED点阵风扇的设计与实现.docx
《北邮数电实验下LED点阵风扇的设计与实现.docx》由会员分享,可在线阅读,更多相关《北邮数电实验下LED点阵风扇的设计与实现.docx(33页珍藏版)》请在冰豆网上搜索。
北邮数电实验下LED点阵风扇的设计与实现
数字电路与逻辑设计实验
实验报告
实验名称:
Ied点阵风扇的设计与实现
学院:
电子工程学院
专业:
电子科学与技术
班级:
班内序号:
学号:
姓名:
北京邮电大学
2015年11月9日
一、任务要求3...
1.基本要求:
3...
2.提高要求:
3...
二、系统设计3...
1.设计思路3...
2.总体框图4...
3.分块设计7...
三、仿真波形及波形分析8...
四、源程序(包括注释)1.2.
五、功能说明及资源利用情况2..3
1.功能说明2..3.
2.资源利用情况2..4.
六、故障及问题分析2..5.
七、总结和结论2..7.
1.总结2..7.
2.结论2..7.
1.基本要求:
(1)用8*8点阵模拟风扇转动,并采用双色点阵显示。
(2)风扇转动方式如图1所示,包括四个点阵显示状态并按顺序循环显示。
风扇转动速度根据环境温度分为4档,其中1档的四个显示状态之间的切换时间为2秒,2档为1秒,3档为0.5秒,4档为静止不动。
(3)环境温度通过2个BTN按键设置,一个用来增加,一个用来减少,
温度可设置范围为10C~40C,温度精度为1C,并用两个数码管进行温度显示。
风扇根据不同的温度自动采用不同的转动速度,其中20C~24C
对应1档,25C~29C对应2档,30C~40C对应3档,10C~19C对应4档,用一个数码管显示档位。
(4)定时模式:
在风扇不同转动速度下,可以通过按键切换进入定时模
式。
定时时间可设置范围为20~59秒,采用两个数码管进行倒计时,当倒计时结束后,风扇状态保持静止不动。
(5)设置开关键。
风扇开机初始状态为20C、1档,并有不小于5秒的开机音乐。
关机状态为点阵全灭。
OOO<0000OOo<0000000<0000OOO
∙000OOOO∙000ocoo∙ooo0000∙000
图1
2.提高要求:
(1)设计LED风扇的其他工作模式。
(2)利用实验板上的温度传感器代替按键直接获取温度数据,实现对LED
风扇四档转速的自动控制。
(3)用数码管实时显示温度传感器的温度数据,精度为0.1C。
(4)
自拟其他功能。
1.设计思路
在LED点阵风扇的设计与实现中,首先进行了分频器的设计:
由于所使用电路板的时钟频率为50MHz而需要使用的点阵、数码管扫描频率为1kHz,扇叶切换频率分别为2Hz、1Hz和0.5Hz,故首先将时钟频率进行四次分频。
然后是按键控制温度调节部分的实现,由于题中要求温度在10-40之间的两位数,所以在Vhdl的程序设计中将这两位数拆成两个四位的BCD码,并用temerature_h和temperature」来分别表示,每当需要温度增减时,通过控制这两个信号来实现温度的变化。
接着是倒计时部分:
同样是使用两个四位BCD码来表示,并且创建了一个标准信号来记录倒计时是否结束,以此来完成倒计时结束后风扇的停止转动。
以温度的输入来实现档位的选择,首先判断记录倒计时的信号值,若倒计时结束,则选择4档;否则,判断高位的温度值,当其为1、3、4时均有分别对应的档位,当起为2时再用对应的CASE语句来判断档位。
点阵显示部分:
根据档位的判断来选择合适的时钟控制风扇扇叶的旋转速度,用IkHz的时钟来对点阵的行进行扫描,低频时钟用来切换风扇扇叶的四个图形。
数码管显示:
6个数码管稳定显示需要至少300Hz频率的时钟,故用IkHz时钟来扫描数码管,温度的高低位数字、时间的高低位数字以及档位,都通过一个译码器来输出对应数码管显示数字的7位向量,使得当时钟扫描到某一个数码管时,可以正确地显示要表达的数字。
音乐播放:
使用蜂鸣器播放音乐同样也需要两个时钟来完成对应功能,一个时钟来完成节拍的表达,另一个时钟来输出乐音的音调,如C、DE、F
等,使得当节拍的时钟到来时能够输出对应简谱中的音调。
2.总体框图
3.
系统顶层框图
(1)
系统对外接口图
(2)逻辑划分框图
蜂鸣器
P14、p15
BTN^
BTNo
温度
控制
P5
(4)流程图
节拍、音调
分频p12、
时钟Clk
p13
IkHz
频器*
p1,p2,p3,p4
HZ
0.5Hz
开关Clr
temperature」
LI档位
—►
da
ng
P6
IemPeratUre_l
p10
Ir1
!
Iimeh
d倒
■
译
数码
计
码
I~k
管p9
时
►
器
:
ime_l
p8
Seg
p7
StaH
ten
时钟COUr
选择器*
点阵
p11
4.分块设计
pl:
将50MHZ勺时钟Clk分500000次频变为为IkHz的时钟clk_1kHz,来完成对点阵行row以及6个数码管Cat的扫描。
若CIr=‘0'即关机状态,则输出时钟及计数变量均置零;否则当时钟上升沿到来时,计数变量开始计数,时钟也开始输出。
p2:
将IkHz的cIk_1kHz分500次频,输出频率为2Hz的cIk_2Hz,来完成风扇3档转速的输出。
同样为使关机状态点阵全灭,需先判断Clr的值。
p3:
将cIk_2Hz二分频,输出频率为1Hz的cIk_1Hz,来完成风扇2档转速的输出。
p4:
将cIk_1Hz二分频,输出频率为0.5Hz的clk_half1Hz来完成风扇1档转速的输出。
p5:
为防止由于按键抖动带来的按键一次增加或减少温度过多,使用2Hz
的时钟来判断按键是否正在使用以实现按键的防抖。
同样,首先使用IF语句
要判断Clr的值,如果为0,则温度变为20C;否则当2Hz的时钟上升沿到来时,若同时表达温度上升的输入信号temp_UP为1,则接着判断其高位是否为0100。
若高位为0100则,温度输出值保持40C不变,不再累加;否则温度的个位增加1,当个位满足1010时,置零且十位增加1。
同理,当表达温度下降的输入信号temp_down为1时也如此判断,区别在于判断其最小值是否为10,并且相减时判断低位为1111时,则十位减一,个位置为0101。
这样的判断语句的设置,能够实现关机时数码管全灭,由按键来控制温度的增减,并且温度范围为10~40C的实验要求。
p6:
档位判断模块,当表达倒计时结束的信号count_end为1时,档位输出为0,其他的档位输入由一个嵌套的CASE语句来完成。
温度的十位数字为0001、0011、0100即1、3、4时,档位输出分别为00、11、11即4、3、3档,十位为其他数字即2时,再判断个位数字以此来实现输出1档和2档。
此模块可以实现由温度到档位的判断选择。
p7:
倒计时模块,直接置入一个倒计时数字30,Start变化时开始倒计时,
未完成实验20~59s可调节要求。
当CIr为0时即关机状态下,COunt_end置零,time_h和time_l为1111,不显示;若clr为1即开机状态下,start为1,则开始倒计时,倒计时算法与降低温度类似,但需区分出1s->0s时,
使COunt_end为1,标志倒计时结束,到达0s时需保持时间不变。
如果start为0,为开启倒计时状态,则将时间置为30。
p8:
译码器,由于数码管现实的档位、倒计时时间的高低位以及温度的高低位,均为4位BCe码,故需要将它们转换为能够在数码管上显示的对应数字,使用5个CASE语句来进行选择输出。
p9:
数码管扫描,首先判断开关机状态,若为开机则判断Start是否为1,Start为0时只显示档位和温度;Start为1时,全部显示。
然后将1kHz时钟6分频,每个时钟上升沿代表了扫描到一个Cat,若显示,则将其置为0其余为1,输出对应从译码器得到的7位编码。
p10:
使用CASE语句根据档位来选择输出时钟,dang为00时,输出时钟为0,扇叶静止;dang为01时,表示1档,输出时钟为CIk_haIf1Hz;dang为10时,表示2档,输出时钟为CIk_1Hz;dang为11时,表示3档,输出时钟为CIk_2Hz。
p11:
点阵显示模块,在开机状态下,使用1kHz时钟循环扫描点阵行,每扫描到某一行,点亮对应列的Ied灯,以此来实现在点阵上稳定显示某一图案。
于此同时,用档位决定的低频时钟来扫描4幅图案,每一图案对应着自己的行列编码,以此来用低频时钟控制扇叶扫描的速率。
p12:
节拍分频器,为得到24Hz的节拍频率,对时钟进行分频系数为2083332的分频,使得得到的节拍每记24个数约为1S。
p13:
依据输入的tone分频系数来对clk进行分频,以实现beep对不同音调的输出。
p14:
以tape的时钟为输入时钟,输出对应节拍上音乐的分频系数。
p15:
对beep输出音调的时钟频率,以实现音乐的输出。
三、仿真波形及波形分析
p1:
由于分频系数为50000过高,无法进行仿真。
p2:
由于分频系数为500过高,无法进行仿真。
p3:
2Hz->1Hz,Clr置零时无时钟输出,其他时刻对时钟进行二分频。
3IWiLlitιc∣r∣ff∣Ci⅛⅛:
Γι∣*ι∏e
图3
p5:
温度调节模块,temp_up为1时,temperature」在时钟上升沿到来时增加;temp_down为1时,temperature」在时钟上升沿到来时减少;CIr为0时,温度重新置为20。
图4
p6:
档位选择模块,当CoUnt_end为1时,dang输出为0即4档;当温度输入为10~40C以外的数值时,由于总体程序中已有限制,故未考虑该情况,输出档位均为1,其余情况下dang输出为1、2、3分别代表1档、2档、3档,仿真情况符合实验要求。
图5
p7:
开机时若Start为1,则开始倒计时;若Start为O则时间重新置为30,Start为1,则继续开始倒计时,符合实验要求。
图6p8:
4位BCD码与7位显示码之间对应正确。
图7
p9:
由于Seg不存在真实数值,无法仿真,故仅仿真数码管Cat的显示。
当Start为1时扫描5个数码管,当start为0时扫描3个数码管,符合设计思路。
图8
p10:
档位选择器,输出时钟无确切数值,故无法仿真。
p11:
点阵扫描与图案切换时钟频率相差过大,故无法进行仿真。
p12:
节拍分频器,分频系数过大,故无法仿真。
p13:
音调分频,分频系数过大,故无法仿真。
p14:
输出信号为整形数值,故无法仿真。
p15:
tone_clk无有效时钟数值,故无法进行仿真。
四、源程序(包括注释)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYfanIS
PORT(
clk,clr:
INSTD_lOGIC;--clr==>SW0
temp_up,temp_down:
INSTD_LOGIC;--temp_up==>BTN1;temp_down==>BTN0;
start:
INSTD_LOGIC;--start==>SW7
seg:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);--控制数字显示
cat:
OUTSTD_LOGIC_VECTOR(5DOWNTO0);--共阴极数码管
row:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
colr:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
colg:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
beep:
OUTSTD_LOGIC);
ENDfan;
ARCHITECTUREdisplayOFfanIS分频1SIGNALclk_1kHz:
STD_LOGIC;
SIGNALclk_out1:
STD_LOGIC;
分频2
SIGNALclk_2Hz:
STD_LOGIC;
SIGNALclk_out2:
STD_LOGIC;
分频3
SIGNALclk_1Hz:
STD_LOGIC;
SIGNALclk_out3:
STD_LOGIC;
分频4
SIGNALclk_half1Hz:
STD_LOGIC;
SIGNALclk_out4:
STD_LOGIC;
温度输入调节
SIGNALtemperature_h:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALtemperature_l:
STD_LOGIC_VECTOR(3DOWNTO0);档位选择SIGNALcount_end:
STD_LOGIC;
SIGNALdang:
STD_LOGIC_VECTOR(1DOWNTO0);倒计时
SIGNALtime_h:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALtime_l:
STD_LOGIC_VECTOR(3DOWNTO0);数码管显示SIGNALdang_seg:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALtime_h_seg:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALtime_l_seg:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALtemperature_h_seg:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALtemperature_l_seg:
STD_LOGIC_VECTOR(6DOWNTO0);风扇转速时钟输出SIGNALclk_out:
STD_LOGIC;
点阵显示
SIGNALrow_temp,colr_temp,colg_temp:
STD_LOGIC_VECTOR(7DOWNTO0);
节拍分频SIGNALtape_clk:
STD_LOGIC;
音调分频
SIGNALtone_tmp:
INTEGERRANGE0TO64000;
SIGNALtone_clk:
STD_LOGIC;
BEGIN
分频1:
将50MHz时钟频率分为1KHz
p1:
PROCESS(clk,clr)
VARIABLEtmp1:
INTEGERRANGE0TO24999;
BEGIN
IFclr='0'THENtmp1:
=0;clk_1kHz<='0';
ELSIFclk'EVENTANDclk='1'THEN
IFtmp1=24999THENtmp1:
=0;clk_out1<=NOTclk_out1;
ELSEtmp1:
=tmp1+1;
ENDIF;clk_1kHz<=clk_out1;
ENDIF;
ENDPROCESSp1;
分频2:
利用1kHz时钟分得2Hz时钟
p2:
PROCESS(clk_1kHz,clr)
VARIABLEtmp2:
INTEGERRANGE0TO249;
BEGIN
IFclr='0'THENtmp2:
=0;clk_2Hz<='0';
ELSIFclk_1kHZ'EVENTANDclk_1kHz='1'THEN
IFtmp2=249THENtmp2:
=0;clk_out2<=NOTclk_out2;
ELSEtmp2:
=tmp2+1;
ENDIF;clk_2Hz<=clk_out2;
ENDIF;
ENDPROCESSp2;
分频3:
利用2Hz时钟分得1Hz时钟
p3:
PROCESS(clk_2Hz,clr)
BEGIN
IFclr='0'THENclk_out3<='0';
ELSIFclk_2Hz'EVENTANDclk_2Hz='1'THENclk_out3<=NOTclk_out3;
ENDIF;
clk_1Hz<=clk_out3;
ENDPROCESSp3;
分频4:
利用1Hz时钟分得0.5Hz时钟
p4:
PROCESS(clk_1Hz,clr)
BEGIN
IFclr='0'THENclk_out4<='0';
ELSIFclk_1Hz'EVENTANDclk_1Hz='1'THENclk_out4<=NOTclk_out4;
ENDIF;clk_half1Hz<=clk_out4;
ENDPROCESSp4;温度输入调节
p5:
PROCESS(clk_2Hz,clr)
VARIABLEtemperature_h_temp,temperature_l_temp:
STD_LOGIC_VECTOR(3
DOWNTO0);
BEGIN
IFclr='0'THENtemperature_h_temp:
="0010";temperature_l_temp:
="0000";
ELSIF(clk_2Hz'EVENTANDclk_2Hz='1')THEN
IFtemp_up='1'THEN
IFtemperature_h_temp="0100"THENtemperature_h_temp:
="0100";temperature_l_temp:
="0000";
ELSEtemperature_l_temp:
=temperature_l_temp+"0001";
IFtemperature_l_temp="1010"THEN
temperature_l_temp:
="0000";temperature_h_temp:
=temperature_h_temp+"0001";
ENDIF;
ENDIF;
ENDIF;
IFtemp_down='1'THEN
IF(temperature_h_temp="0001"ANDtemperature_l_temp="0000")THENtemperature_h_temp:
="0001";temperature_l_temp:
="0000";
ELSEtemperature_l_temp:
=temperature_l_temp-"0001";
IFtemperature_l_temp="1111"THEN
temperature_l_temp:
="1001";temperature_h_temp:
=temperature_h_temp-"0001";
ENDIF;
ENDIF;
ENDIF;
ENDIF;
temperature_h<=temperature_h_temp;
temperature_l<=temperature_l_temp;
ENDPROCESSp5;
档位选择p6:
PROCESS(clk_2Hz,count_end)
BEGIN
IFcount_end='1'THENdang<="00";
ELSE
CASEtemperature_hIS
WHEN"0001"=>dang<="00";--1-0
WHEN"0011"=>dang<="11";--3-3
WHEN"0100"=>dang<="11";--4-3
WHENOTHERS=>--2
CASEtemperature_lIS
WHEN"0000"=>dang<="01";--0-1
WHEN"0001"=>dang<="01";--1-1
WHEN"0010"=>dang<="01";--2-1
WHEN"0011"=>dang<="01";--3-1
WHEN"0100"=>dang<="01";--4-1
WHENOTHERS=>dang<="10";--5,6,7,8,9-2
ENDCASE;
ENDCASE;
ENDIF;
ENDPROCESSp6;
倒计时p7:
PROCESS(clk_1Hz,start,clr)
VARIABLEtime_h_temp,time_l_temp:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
IFclr='0'THENcount_end<='0';time_h_temp:
="1111";time_l_temp:
="1111";
ELSE
IFclk_1Hz'EVENTANDclk_1Hz='1'THEN
IFstart='1'THEN
IF(time_h_temp="0000"ANDtime_l_temp="0001")THENtime_h_temp:
="0000";time_l_temp:
="0000";count_end<='1';
ELSE
IF(time_h_temp="0000"ANDtime_l_temp="0000")THENtime_h_temp:
="0000";time_l_temp:
="0000";
ELSE
IFtime_l_temp="0000"THENtime_l_temp:
="1001";time_h_temp:
=time_h_temp-"0001";
ELSEtime_l_temp:
=time_l_temp-"0001";
ENDIF;
ENDIF;
ENDIF;
ELSEtime_h_temp:
="0011";time_l_temp:
="0000";count_end<='0';
ENDIF;
ENDIF;
ENDIF;
time_l<=time_l_temp;time_h<=time_h_temp;ENDPROCESSp7;
译码器p8:
PROCESS(dang,time_h,time_l,temperature_h,temperature_l)
BEGIN
CASEdangIS
WHEN"00"=>dang_seg<="0110011";--num4
WHEN"01"=>dang_seg<="0110000";--num1
WHEN"10"=>dang_seg<="1101101";--num2
WHEN"11"=>dang_seg<="1111001";--num3
WHENOTHERS=>dang_seg<="0000000";
ENDCASE;
CASEtime_hIS
WHEN"0000"=>time_h_seg<="1111110";--0
WHEN"0001"=>time_h_seg<="0110000";--1
WHEN"0010"=>time_h_seg<="1101101";--2
WHEN"0011"=>time_h_seg<="1111001";--3
WHEN"0100"=