EDA课程设计键盘扫描电路设计.docx
《EDA课程设计键盘扫描电路设计.docx》由会员分享,可在线阅读,更多相关《EDA课程设计键盘扫描电路设计.docx(9页珍藏版)》请在冰豆网上搜索。
![EDA课程设计键盘扫描电路设计.docx](https://file1.bdocx.com/fileroot1/2022-12/12/6c865bfe-cbe5-4fa7-841a-6cb67ea1ada0/6c865bfe-cbe5-4fa7-841a-6cb67ea1ada01.gif)
EDA课程设计键盘扫描电路设计
EDA课程设计--键盘扫描电路设计
电子课程设计
—键盘扫描电路设计
学院:
班级:
姓名:
学号:
指导老师:
2009年12月
rst:
instd_logic;
clk_in:
instd_logic;
keyin:
instd_logic_vector(3downto0);
scan:
outstd_logic_vector(3downto0);
leds:
outstd_logic_vector(3downto0);
state:
outstd_logic;
VGA:
outstd_logic_vector(3downto0)
);
endkeyboard4_4;
architecturekeyboard4_4_archofkeyboard4_4is
--
--*********************************************
componentdebouncing
port(key:
INSTD_LOGIC;
clk,clr:
INSTD_LOGIC;
dly_out:
OUTSTD_LOGIC);
endcomponent;
--*********************************************
--
signalclkfrq:
std_logic;
signalcntscn:
std_logic_vector(1downto0);
signalscnlin:
std_logic_vector(3downto0);
signalcntfrq:
std_logic_vector(14downto0);
--signalcntfrq:
std_logic_vector(3downto0);
signallednum:
std_logic_vector(7downto0);
signalkey_tmp:
std_logic_vector(3downto0);
signalclk:
std_logic;
signalcntfrq1:
std_logic_vector(5downto0);
begin
VGA<="0101";--键盘功能选择
scan<=notscnlin;
lednum<=scnlin&(notkey_tmp);
--key_tmp<=keyin;
--debounuingckt
debounuing:
block
begin
U1:
debouncingPORTMAP(
KEY=>keyin(0),
DLY_OUT=>key_tmp(0),
clr=>rst,
clk=>CLK
);
U2:
debouncingPORTMAP(
KEY=>keyin
(1),
dly_out=>key_tmp
(1),
clr=>rst,
clk=>CLK
);
U3:
debouncingPORTMAP(
key=>keyin
(2),
dly_out=>key_tmp
(2),
clr=>rst,
clk=>CLK
);
U4:
debouncingPORTMAP(
key=>keyin(3),
dly_out=>key_tmp(3),
clr=>rst,
clk=>CLK
);
ENDblockdebounuing;
--
--******************************************************
--
process(rst,clk_in)--晶振为40MHz,进行40000分频产生去抖时钟(1000Hz)
begin
ifrst='0'then
cntfrq<=(others=>'0');
elsifrising_edge(clk_in)then
if(cntfrq="100111000011111"ornot(key_tmp="1110"orkey_tmp="1101"orkey_tmp="1011"orkey_tmp="0111"))then
--if(cntfrq="100111000011111"orkey_tmp="1111")then
--ifcntfrq="1111"then
cntfrq<=(others=>'0');
clk<=notclk;--去抖时钟
else
cntfrq<=cntfrq+1;
endif;
endif;
endprocess;
process(rst,clk)--去抖时钟,50分频,形成扫描时钟
begin
ifrst='0'then
clkfrq<='0';
cntfrq1<=(others=>'0');
elsifrising_edge(clk)then
ifcntfrq1="11000"then
cntfrq1<=(others=>'0');
clkfrq<=notclkfrq;
else
cntfrq1<=cntfrq1+1;
endif;
endif;
endprocess;
process(rst,clkfrq)--根据扫描时钟产生扫描线
begin
ifrst='0'then
cntscn<="00";
elsifrising_edge(clkfrq)then
ifcntscn="11"then
cntscn<="00";
else
cntscn<=cntscn+1;
endif;
casecntscnis
when"00"=>scnlin<="0001";
when"01"=>scnlin<="0010";
when"10"=>scnlin<="0100";
when"11"=>scnlin<="1000";
whenothers=>null;
endcase;
endif;
endprocess;
process(rst,clkfrq)--根据按键点亮相应的leds
begin
if(rst='0')then
leds<=not"1111";
elsifclkfrq'eventandclkfrq='0'then
caselednumis
when"00010001"=>
leds<=not"0001";--1
when"00010010"=>
leds<=not"0010";--2
when"00010100"=>
leds<=not"0011";--3
when"00011000"=>
leds<=not"1010";--A
when"00100001"=>
leds<=not"0100";--4
when"00100010"=>
leds<=not"0101";--5
when"00100100"=>
leds<=not"0110";--6
when"00101000"=>
leds<=not"1011";--B
when"01000001"=>
leds<=not"0111";--7
when"01000010"=>
leds<=not"1000";--8
when"01000100"=>
leds<=not"1001";--9
when"01001000"=>
leds<=not"1100";--C
when"10000001"=>
leds<=not"1110";--*
when"10000010"=>
leds<=not"0000";--0
when"10000100"=>
leds<=not"1111";--#
when"10001000"=>
leds<=not"1101";--D
whenothers=>
null;
endcase;
endif;
endprocess;
process(rst,key_tmp)
begin
if(rst='0')then
state<='1';
elsif(key_tmp="1110"orkey_tmp="1101"orkey_tmp="1011"orkey_tmp="0111")then
state<='0';
elsif(key_tmp="1111")then
state<='1';
endif;
endprocess;
endkeyboard4_4_arch;
一、心得体会
经过两周的课程设计,由于是第一次,过程有点曲折,有点累,但最后能得到理想的结果,心里感到特别高兴。
因为是课程设计,需要制定一个最合理的方案。
这就锻炼了我们理论分析、比较,联系实际情况的能力。
由于需要各个方面的材料和数据,我们需要运用各种手段去查找资料,这增长了我们自学的能力。
在电路的生成和调试过程中,我们遇到了各种问题,通过对种种问题的解决,我们在工程实际的层次上更进一步理解理论知识。
我们不仅更好地理解了所学的理论知识,更重要的是把知识从书中提炼出来运用到生活当中,这是一种质的飞跃。
在这次课程设计当中也离不开老师的帮助,他们尽心尽责给了我很大的帮助,非常感谢。