计
2作者: 日期:
个人收集整理,勿做商业用途
电子课程设计
—键盘扫描电路设计
学院: 班级: 姓名: 学号: 指导老师:
3
个人收集整理,勿做商业用途
2009年12月
4
个人收集整理,勿做商业用途
目
录
1. 设计任务与要求 ...................................... 1
2. 功能模块 ............................................ 3. 选择器件 ............................................ 4. 功能模块 ............................................ 5. 设计总体电路图 ...................................... 6. 心得体会 ........................................... 5
2
3
5
8
10
个人收集整理,勿做商业用途
设计任务与要求
1、 键盘按钮数为4,系统时钟10MHz 2、
能识别出所按按钮
3、 按钮被按下后,视为此按钮输入一次,若按钮长时间不松,(时限1S) 后每隔0.5S视为再次输入,直至按钮松开
4、 要求能对按钮按下时指令的抖动能正确处理。对持续时间小于
50ms 的
输入不作响应; 5、 各键设置不同优先级,多键同时按下时,视为优先级较高的按键被按 下;
功能模块
其VHDL语言如下:
library ieee;
use ieee.std
」o gic_1164.all;
use ieee.std_logic_ un sig ned.all;
use ieee.std_logic_ un sig ned.all;
en tity keyboard4_4 is
port(
rst : in std
」o gic;
6
个人收集整理,勿做商业用途
clk_in : in std
」o gic;
7
个人收集整理,勿做商业用途
keyi n :
in std_logic_vector(3 downto 0);
sca n out
std
」ogic_vector(3 downto 0);
leds : out std_logic_vector(3 dow nto 0);
state : :
out std_logic;
VGA out std_logic_vector(3 dow nto 0)
);
end keyboard4_4;
architecture keyboard4_4_arch of keyboard4_4 is
*********************************************
comp onent debo uncing
port( key : IN STD_LOGIC ;
clk,clr : IN STD_LOGIC ;
dly_out : OUT STD_LOGIC );
end comp onent ;
*********************************************
sig nal clkfrq std_logic;
sig nal cn tsc n
std
」o gic_vector(1 dow nto 0);
sig nal sen li n
sig nal entfrq
」o gic_vector(3 dow nto 0);
std」o gic_vector(14 dow nto 0);
std
8
个人收集整理,勿做商业用途
--sig nal cntfrq : std
」o gic_vector(3 dow nto 0);
sig nal led num : std
」o gic_vector(7 dow nto 0);
std
sig nal key_tmp :
」o gic_vector(3 dow nto 0);
sig nal clk : std_logic;
sig nal cn tfrq1 : std
」o gic_vector(5 dow nto 0);
beg in
VGA <= \"0101\";
--键盘功能选择
sca n <= not sen li n;
led num <= sen li n & (not key_tmp);
-- key_tmp <= keyi n;
--debo unuing ckt
debo unuing : block
beg in
U1: debou ncing PORT MAP (
KEY => keyi n(0),
DLY_OUT => key_tmp(0),
clr=>rst,
clk => CLK
);
9
个人收集整理,勿做商业用途
U2: debou ncing PORT MAP (
KEY => keyi n(1),
10
个人收集整理,勿做商业用途
dly_out => key_tmp(1), clr=>rst,
clk => CLK
);
U3: debou ncing PORT MAP (
key => keyi n(2),
dly_out => key_tmp(2), clr=>rst,
clk => CLK
);
U4: debou ncing PORT MAP (
key => keyi n(3),
dly_out => key_tmp(3), clr=>rst,
clk => CLK
);
END block debo unuing ;
******************************************************
process(rst,clk_i n)--
晶振为40MHz进行40000分频产生去抖时钟
(1000Hz)
11
个人收集整理,勿做商业用途
beg in
if rst = 'O' the n
cntfrq <= (others => '0');
elsif risin g_edge(clk_i n) the n
if (cntfrq = \"100111000011111\" or not (key_tmp=\"1110\" or
key_tmp=\"1101\" or key_tmp=\"1011\" or key_tmp=\"0111\") ) the n
--if (cntfrq = \"100111000011111\" or key_tmp=\"1111\" ) the n
--if cntfrq = \"1111\" the n
cntfrq <= (others => '0');
clk <= n ot elk;--
去抖时钟
else
cntfrq <= cntfrq + 1;
end if;
end if;
end process;
process(rst,clk)
-- 去抖时钟,50分频,形成扫描时钟
begi n
if rst = '0' the n
clkfrq <= '0';
cn tfrq1 <= (others => '0');
12
个人收集整理,勿做商业用途
elsif risin g_edge(clk) the n
13
个人收集整理,勿做商业用途
if cntfrql = \"11000\" then
cn tfrql <= (others => '0');
clkfrq <= not clkfrq;
else
cn tfrql <= cn tfrql + 1;
end if;
end if;
end process;
process(rst,clkfrq)--
根据扫描时钟产生扫描线
beg in
if rst = '0' the n
cn tscn <= \"00\";
elsif risin g_edge(clkfrq) the n
if cntscn = \"11\" the n
cntscn <= \"00\";
else
cn tsc n <= cn tsc n+1;
end if;
case cn tsc n is
when \"00\" => senlin <= \"0001\";
14
个人收集整理,勿做商业用途
when \"01\" => senlin <= \"0010\";
15
个人收集整理,勿做商业用途
when \"10\" => senlin <= \"0100\";
when \"11\" => senlin <= \"1000\";
whe n others => n ull;
end ease;
end if;
end process;
process(rst, elkfrq)--
根据按键点亮相应的leds
beg in
if(rst = 'O' ) then
leds <= n ot\"1111\";
elsif elkfrq'eve nt and elkfrq = 'O' the n
ease led num is
when \"00010001\"=>
leds <= n ot\"0001\";
--1
when \"00010010\"=>
leds <= n ot\"0010\";
--2
when \"00010100\"=>
leds <= n ot\"0011\";
--3
when\"00011000\"=>
leds <= n ot\"1010\"; --A
16
个人收集整理,勿做商业用途
when \"00100001\"=>
leds <= n ot\"0100\"; when \"00100010\"=>
leds <= n ot\"0101\"; when \"00100100\"=>
leds <= n ot\"0110\"; when \"00101000\"=>
leds <= n ot\"1011\"; when \"01000001\"=>
leds <= n ot\"0111\"; when \"01000010\"=>
leds <= n ot\"1000\"; when\"01000100\"=>
leds <= n ot\"1001\"; when\"01001000\"=>
leds <= n ot\"1100\"; when\"10000001\"=>
leds <= n ot\"1110\"; --4
--5
--6
--B
--7
--8
--9
--C
--*
17
个人收集整理,勿做商业用途
when \"10000010\"=>
18
个人收集整理,勿做商业用途
leds <= n ot\"0000\";
--0
whe n \"10000100\"=>
leds <= n ot\"1111\"; --#
whe n \"10001000\"=>
leds <= n ot\"1101\"; --D
whe n others =>
null;
end case;
end if;
end process;
process(rst,key_tmp)
begi n
if(rst = '0' ) the n
state <= '1';
elsif (key_tmp=\"1110\" or key_tmp=\"1101\" or key_tmp=\"1011\" or key_tmp=\"0111\") the n
state <= '0';
elsif (key_tmp=\"1111\") the n
state <= '1';
end if;
19
个人收集整理,勿做商业用途
end process;
end keyboard4_4_arch;
三、心得体会
经过两周的课程设计,由于是第一次,过程有点曲折,有点累,但最后能得 到理想的结果,心里感到特别高兴。因为是课程设计,需要制定一个最合理的方 案。这就锻炼了我们理论分析、比较,联系实际情况的能力。由于需要各个方面 的材料和数据,我们需要运用各种手段去查找资料,这增长了我们自学的能力。 在电路的生成和调试过程中,我们遇到了各种问题,通过对种种问题的解决,我 们在工程实际的层次上更进一步理解理论知识。我们不仅更好地理解了所学的理 论知识,更重要的是把知识从书中提炼出来运用到生活当中, 这是一种质的飞跃。 在这次课程设计当中也离不开老师的帮助, 他们尽心尽责给了我很大的帮助,非 常感谢。
20
因篇幅问题不能全部显示,请点此查看更多更全内容