北邮数电实验电子沙漏实验报告.docx
《北邮数电实验电子沙漏实验报告.docx》由会员分享,可在线阅读,更多相关《北邮数电实验电子沙漏实验报告.docx(32页珍藏版)》请在冰豆网上搜索。
北邮数电实验电子沙漏实验报告
数字电路与逻辑设计实验报告
选题:
电子沙漏的设计与实现
班级:
学号:
姓名:
序号:
2014年11月12日
一、任务要求:
1、相关知识:
沙漏是一种古老的计时工具,也是一种玩具。
电子沙漏用发光二极管表示沙粒,模拟沙漏的运动过程。
电子沙漏会像真正的沙漏一样,上部的沙粒(点亮的发光二极管)一粒一粒往下掉,下部的沙粒一粒一粒堆起来。
在结构上,两组各16个发光二极管分别排列成为两个三角形,如图1所示。
其中:
VD0~VD15位于上部,排列成倒三角形;VD0'~VD15'位于下部,排列成正三角形。
两个三角形的顶尖相对,组成沙漏形状。
当上部有一个发光二极管熄灭时,相应地下部就有一个发光二极管点亮,模拟了沙粒的运动。
2、基本要求:
1 采用8*8双色点阵显示电子沙漏的开机界面,如图2所示。
其中红色LED代表沙漏的上半部分沙粒VD0~VD15,绿色LED代表沙漏的下半部分VD0'~VD15'。
2 用拨码开关SW1模拟重力感应器。
当SW1为低电平时,沙粒从VD0~VD15向VD0'~VD15'移动;当SW1为高电平时,沙粒从VD0'~VD15'向VD0~VD15移动。
3 按键BTN0作为计时启动停止按键,启动后沙粒即可按照SW1设定的方向移动,以SW1为低电平时为例,LED移动的顺序与对应关系如图3的1~16所示(若SW1为高电平,则点阵显示移动顺序为16~1)。
每颗沙粒的移动时间为1秒,当移动到图3的16时,若SW1仍为低电平,则保持沙粒不动,但计时继续,直到SW1的电平发生变化或者BTN0计时停止。
4 设计实现一个60秒计时器,当按键BTN0启动时开始工作,用于在沙粒移动过程中进行计时校准,并用数码管DISP0~DISP1显示计时结果。
3、提高要求:
1 可以调节控制电子沙漏的流动速度。
2 用多种方式呈现电子沙漏界面。
3 自行设定沙粒的移动路径,显示每颗沙粒的移动过程。
4 外接重力感应器,实现真实的电子沙漏功能。
5 自拟其它功能。
2、系统设计:
总体框图:
输入
分块设计:
1 输入模块:
由btn按钮和拨码开关构成。
采用序列存储的方式存储相应的输入。
2 输入译码模块:
将输入的符号序列转化成先用状态,以便选取对应的计算方法;将输入的8421bcd码转化成相应的两位十进制数。
3 数码管、点阵显示模块:
将寄存器内的数进行输出到数码管上。
4 防抖模块:
在用按键输入时,所得到的信号可能会有抖动,因此加入此抖动电路。
流程图:
3、仿真波形及波形分析:
点阵显示采用行扫描模式
四、源程序:
----------------------------------------
--FileName:
ShaLou.vhd
--System:
QuartusII9.1
--Author:
WangHongjie2012210176
--Revision:
Version1.0,2014-11-3
----------------------------------------
libraryieee;
useieee.std_logic_1164.all;
entityshalouis
port(
clk:
instd_logic;--系统时钟
sw:
instd_logic;--拨码开关SW1控制沙粒移动方向
bto:
instd_logic;--启动暂停
bt1:
instd_logic;--复位
bt2:
instd_logic;--速度
lieh:
outstd_logic_vector(7downto0);--RED
liel:
outstd_logic_vector(7downto0);--GREEN
hang:
outstd_logic_vector(7downto0);--行扫描
a:
outstd_logic_vector(6downto0);--七段数码管
cat:
outstd_logic_vector(5downto0));--数码管选择
endentity;
Architectureaofshalouis
signaltemp:
integerrange0to49999;
signalclktmp:
std_logic;
signalclkout:
std_logic;
signaltemp1:
integerrange0to199;
signalclktmp1:
std_logic;
signalclkout1:
std_logic;
signaltemp2:
integerrange0to299;
signalclktmp2:
std_logic;
signalclkout2:
std_logic;
signalqt:
integerrange0to5;
signalbto_tmp:
std_logic;
signalbto_out:
std_logic;
signalqt1:
integerrange0to5;
signalbto_tmp1:
std_logic;
signalbto_out1:
std_logic;
signalqt2:
integerrange0to5;
signalbto_tmp2:
std_logic;
signalsudu:
integerrange0to2;
signalsudu_t:
integerrange0to299;
signalq:
integerrange0to60;
signalp:
integerrange0to16;
signalge:
integerrange0to9;
signalshi:
integerrange0to9;
signaldz_kongzhi:
integerrange0to7;
signalcat_kongzhi:
integerrange0to1;
begin
p1:
process(clk)--时钟
begin
ifclk'eventandclk='1'then
iftemp=49999then
temp<=0;clktmp<=notclktmp;
else
temp<=temp+1;
endif;
endif;
endprocessp1;
clkout<=clktmp;
p2:
process(clkout)--分频
begin
ifclkout'eventandclkout='0'then
iftemp1=199then
temp1<=0;
clktmp1<=notclktmp1;
else
temp1<=temp1+1;
endif;
endif;
endprocessp2;
clkout1<=clktmp1;
p3:
process(clkout1)
begin
ifclkout'eventandclkout='0'then
ifcat_kongzhi=0thencat_kongzhi<=1;
elsecat_kongzhi<=0;
endif;
ifdz_kongzhi=7thendz_kongzhi<=0;
elsedz_kongzhi<=dz_kongzhi+1;
endif;
endif;
endprocessp3;
p4:
process(clkout,qt,bto,qt1,bt1,qt2,bt2)
begin
ifclkout'eventandclkout='0'then
ifbto='1'then
ifqt=5then
else
qt<=qt+1;
endif;
ifqt=4then
bto_tmp<='1';
else
bto_tmp<='0';
endif;
else
qt<=0;
endif;
endif;
ifclkout'eventandclkout='0'then
ifbt1='1'then
ifqt1=5then
else
qt1<=qt1+1;
endif;
ifqt1=4then
bto_tmp1<='1';
else
bto_tmp1<='0';
endif;
else
qt1<=0;
endif;
endif;
ifclkout'eventandclkout='0'then
ifbt2='1'then
ifqt2=5then
else
qt2<=qt2+1;
endif;
ifqt2=4then
bto_tmp2<='1';
else
bto_tmp2<='0';
endif;
else
qt2<=0;
endif;
endif;
endprocess;
p5:
process(bto_tmp,bto_tmp1)
begin
if(bto_tmp'eventandbto_tmp='1')then
bto_out<=notbto_out;
else
bto_out<=bto_out;
endif;
if(bto_tmp1'eventandbto_tmp1='1')then
bto_out1<=notbto_out1;
else
bto_out1<=bto_out1;
endif;
if(bto_tmp2'eventandbto_tmp2='1')then
if(sudu=2)thensudu<=0;
elsesudu<=sudu+1;
endif;
endif;
endprocess;
p6:
process(sudu)
begin
casesuduis
when0=>sudu_t<=199;
when1=>sudu_t<=99;
when2=>sudu_t<=299;
endcase;
endprocess;
p7:
process(clkout,sudu_t)--fenpin
begin
ifclkout'eventandclkout='0'then
iftemp2=sudu_tthen
temp2<=0;
clktmp2<=notclktmp2;
else
temp2<=temp2+1;
endif;
endif;
endprocess;
clkout2<=clktmp2;
p8:
process(bto_out,clkout1,sw)--jishuqi
begin
if(bto_out='0')then
elsif(bto_out1='1')then
q<=0;p<=0;--q:
miaozhongjishu,p:
dianzhenzhuangtaijishu
elsif(q=60)then
else
if(clkout1'eventandclkout1='1')THEN
q<=q+1;
endif;
if(clkout2'eventandclkout2='1')THEN
if(sw='0')then
if(p<16)then
p<=p+1;
else
endif;
elsif(sw='1')then
if(p>0)then
p<=p-1;
else
endif;
endif;
endif;
endif;
endprocess;
shi<=q/10;
ge<=qrem10;
p9:
process(cat_kongzhi,ge,shi)
begin
ifcat_kongzhi=0then
cat<="011111";
casegeis
when0=>a<="1111110";--0
when1=>a<="0110000";--1
when2=>a<="1101101";--2
when3=>a<="1111001";--3
when4=>a<="0110011";--4
when5=>a<="1011011";--5
when6=>a<="1011111";--6
when7=>a<="1110000";--7
when8=>a<="1111111";--8
when9=>a<="1111011";--9
--whenothers=>a<="0000000";
endcase;
elsifcat_kongzhi=1then
cat<="101111";
caseshiis
when0=>a<="1111110";--0
when1=>a<="0110000";--1
when2=>a<="1101101";--2
when3=>a<="1111001";--3
when4=>a<="0110011";--4
when5=>a<="1011011";--5
when6=>a<="1011111";--6
when7=>a<="1110000";--7
when8=>a<="1111111";--8
when9=>a<="1111011";--9
--whenothers=>a<="0000000";
endcase;
endif;
endprocess;
p10:
process(p)
begin
casepis
when0=>
casedz_kongzhiis
when0=>hang<="01111111";
lieh<="11111110";liel<="00000000";
when1=>hang<="10111111";
lieh<="01111100";liel<="00000000";
when2=>hang<="11011111";
lieh<="00111000";liel<="00000000";
when3=>hang<="11101111";
lieh<="00010000";liel<="00000000";
when4=>hang<="11110111";
lieh<="00000000";liel<="00010000";
when5=>hang<="11111011";
lieh<="00000000";liel<="00111000";
when6=>hang<="11111101";
lieh<="00000000";liel<="01111100";
when7=>hang<="11111110";
lieh<="00000000";liel<="11111110";
whenothers=>hang<="11111111";
endcase;
when1=>
casedz_kongzhiis
when0=>hang<="01111111";
lieh<="11101110";liel<="00010000";
when1=>hang<="10111111";
lieh<="01111100";liel<="00000000";
when2=>hang<="11011111";
lieh<="00111000";liel<="00000000";
when3=>hang<="11101111";
lieh<="00010000";liel<="00000000";
when4=>hang<="11110111";
lieh<="00000000";liel<="00010000";
when5=>hang<="11111011";
lieh<="00000000";liel<="00111000";
when6=>hang<="11111101";
lieh<="00000000";liel<="01111100";
when7=>hang<="11111110";
lieh<="00010000";liel<="11101110";
whenothers=>hang<="11111111";
endcase;
when2=>
casedz_kongzhiis
when0=>hang<="01111111";
lieh<="11001110";liel<="00110000";
when1=>hang<="10111111";
lieh<="01111100";liel<="00000000";
when2=>hang<="11011111";
lieh<="00111000";liel<="00000000";
when3=>hang<="11101111";
lieh<="00010000";liel<="00000000";
when4=>hang<="11110111";
lieh<="00000000";liel<="00010000";
when5=>hang<="11111011";
lieh<="00000000";liel<="00111000";
when6=>hang<="11111101";
lieh<="00000000";liel<="01111100";
when7=>hang<="11111110";
lieh<="00110000";liel<="11001110";
whenothers=>hang<="11111111";
endcase;
when3=>
casedz_kongzhiis
when0=>hang<="01111111";
lieh<="11000110";liel<="00111000";
when1=>hang<="10111111";
lieh<="01111100";liel<="00000000";
when2=>hang<="11011111";
lieh<="00111000";liel<="00000000";
when3=>hang<="11101111";
lieh<="00010000";liel<="00000000";
when4=>hang<="11110111";
lieh<="00000000";liel<="00010000";
when5=>hang<="11111011";
lieh<="00000000";liel<="00111000";
when6=>hang<="11111101";
lieh<="00000000";liel<="01111100";
when7=>hang<="11111110";
lieh<="00111000";liel<="11000110";
whenothers=>hang<="11111111";
endcase;
when4=>
casedz_kongzhiis
when0=>hang<="01111111";
lieh<="10000110";liel<="01111000";
when1=>hang<="10111111";
lieh<="01111100";liel<="00000000";
when2=>hang<="11011111";
lieh<="00111000";liel<="00000000";
when3=>hang<="11101111";
lieh<="00010000";liel<="00000000";
when4=>hang<="11110111";
lieh<="00000000";liel<="00010000";
when5=>hang<="11111011";
lieh<="00000000";liel<="00111000";
when6=>hang<="11111101";
lieh<="00000000";liel<="01111100";
when7=>hang<="11111110";
lieh<="01111000";liel<="10000110";
whenothers=>hang<="11111111";
endcase;
when5=>
casedz_kongzhiis
when0=>hang<="01111111";
lieh<="10000010";liel<="01111100";
when1=>hang<="10111111";
lieh<="01111100";liel<="00000000";
when2=>hang<="11011111";
lieh<="00111000";liel<="00000000";
when3=>hang<="11101111";
lieh<="00010000";liel<="00000000";
when4=>hang<="11110111";
lieh<="00000000";liel<="00010000";
when5=>hang<="11111011";
lieh<="00000000";liel<="00111000";
when6=>hang<="11111101";
lieh<="00000000";liel<="01111100";
when7=>hang<="11111110";
lieh<="01111100";liel<="10000010";
whenothers=>hang<="11111111";
endcase;
when6=>
casedz_kongzhiis
when0=>hang<="01111111";
lieh<="00000010";lie