您的当前位置:首页正文

EDA课程设计--键盘扫描电路设计

2024-10-18 来源:威能网
EDA课程设计--键盘扫描电路设

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

因篇幅问题不能全部显示,请点此查看更多更全内容