EDA键盘扫描

合集下载

#eda实验箱介绍

#eda实验箱介绍

前言本实验教材总体结构主要由三部分组成:其中第一部分是教案系统的简单介绍;第二部分是软件的安装及使用;第三部分为实验部分;在实验部分中其实验由易至难可分为基础类实验、应用类实验、模拟类实验和综合类实验。

本系统采用模拟与数字以及单片机相结合的设计思想,利用模块化组合设计,使得该实验系统操作简单,灵活,显示直观。

本实验系统主要是为了让学生通过实验了解并掌握MAX+plus II的逻辑输入方法,编译及仿真原理,PAC Designerr软件的使用,以及器件下载等基本内容;实验由简到难,由分离到综合,从而逐步提高学生实验能力和实验水平。

第一部分教案系统介绍一、配套硬件要求:1、PC机:要求586或以上的微机,内存需64MB以上,硬盘需1G以上。

2、示波器:20M示波器。

3、单片机仿真器。

二、NC-EDA-2000C型实验箱实验箱基本配套:NC-EDA-2000C实验箱一台;电源线一根;PAC、CPLD/FPGA 下载电缆各一根;RS-232电缆一根;实验指导书一本;实验连线30根。

2、系统结构组成:NC-EDA-2000C实验箱组成框图3、实验箱结构特点说明:芯片结构板:实验箱采用Altara公司的EP1K10TC100—3芯片,位于实验箱组成框图的14所示位置,具的低内核电压、低功耗的特点。

芯片内门电路高达1万门,内部使用RAM作电路结构,速度高达几百MHZ,其输出可用管脚已全部开放,位于芯片的四周,用户可以根据自己的要求和芯片本身的功能自己任意定义管脚。

同时为了体现实验箱的可扩展性,在芯片的两边各有一个34脚的IDE插口,可以通过数据排线与其它应用模块相连接,其具体的管脚如下图所示:其下载口位于实验箱组成框图的7所示位置。

EP1K10TC100—3芯片的管脚分见附图1。

显示类模块:实验箱中有液晶显示模块<LCD);8位7段数码管显示输出;;8位发光二极管<LED灯)等几个显示模块。

其功能是为了显示其实验的结果。

键盘扫描程序实验报告

键盘扫描程序实验报告

一、实验目的1. 理解键盘扫描的基本原理。

2. 掌握使用C语言进行键盘扫描程序设计。

3. 学习键盘矩阵扫描的编程方法。

4. 提高单片机应用系统的编程能力。

二、实验原理键盘扫描是指通过检测键盘矩阵的行列状态,判断按键是否被按下,并获取按键的值。

常见的键盘扫描方法有独立键盘扫描和矩阵键盘扫描。

独立键盘扫描是将每个按键连接到单片机的独立引脚上,通过读取引脚状态来判断按键是否被按下。

矩阵键盘扫描是将多个按键排列成矩阵形式,通过扫描行列线来判断按键是否被按下。

这种方法可以大大减少引脚数量,降低成本。

本实验采用矩阵键盘扫描方法,使用单片机的并行口进行行列扫描。

三、实验设备1. 单片机开发板(如51单片机开发板)2. 键盘(4x4矩阵键盘)3. 连接线4. 调试软件(如Keil)四、实验步骤1. 连接键盘和单片机:将键盘的行列线分别连接到单片机的并行口引脚上。

2. 编写键盘扫描程序:(1)初始化并行口:将并行口设置为输入模式。

(2)编写行列扫描函数:逐行扫描行列线,判断按键是否被按下。

(3)获取按键值:根据行列状态,确定按键值。

(4)主函数:调用行列扫描函数,读取按键值,并根据按键值执行相应的操作。

3. 调试程序:将程序下载到单片机,观察键盘扫描效果。

五、实验程序```c#include <reg51.h>#define ROW P2#define COL P3void delay(unsigned int ms) {unsigned int i, j;for (i = 0; i < ms; i++)for (j = 0; j < 123; j++);}void scan_key() {unsigned char key_val = 0xFF;ROW = 0xFF; // 初始化行delay(1); // 延时消抖key_val = ROW & COL; // 获取按键值ROW = 0x00; // 初始化行delay(1); // 延时消抖key_val = ROW & COL; // 获取按键值ROW = 0x00; // 初始化行delay(1); // 延时消抖key_val = ROW & COL; // 获取按键值ROW = 0x00; // 初始化行delay(1); // 延时消抖key_val = ROW & COL; // 获取按键值}void main() {while (1) {scan_key();if (key_val != 0xFF) {// 执行按键对应的操作}}}```六、实验结果与分析1. 实验结果:程序下载到单片机后,按键按下时,单片机能够正确读取按键值。

eda主要代码

eda主要代码

矩阵键盘扫描主要代码分析:--数字分频器,对系统时钟进行适当分频,得1~10KHz左右的时钟进行矩阵键盘扫描process(clk)--分频器的进程variable cnt:integer range 0 to 500000;BEGINIF rst='0' then cnt:=0;else if clk'event and clk='1' thenIF cnt=499999 THENclkreg<=not clkreg;cnt:=0;ELSEcnt:=cnt+1;END IF;END IF;END IF;end process;--行扫描循环process(clkreg)beginif clkreg'event and clkreg = '1' thencase rowreg iswhen "1110" => rowreg <= "1101";when "1101" => rowreg <= "1011";when "1011" => rowreg <= "0111";when "0111" => rowreg <= "1110";when others => rowreg <= "1110";end case;end if;end process;row <= rowreg;com <= column&rowreg;--对行扫描信号和列扫描信号进行CASE语句判断。

得到是否有键被按下,输出按键按--键指示信号和按键的编码--数码管显示process(clkreg)beginif clkreg'event and clkreg = '1' thencase com iswhen "11010111" => display <= "11000000"; --数码管显示0when "11101011" => display <= "11111001"; --数码管显示1when "11011011" => display <= "10100100"; --数码管显示2when "10111011" => display <= "10110000"; --数码管显示3when "11101101" => display <= "10011001";--数码管显示4when "11011101" => display <= "10010010"; --数码管显示5when "10111101" => display <= "10000010"; --数码管显示6when "11101110" => display <= "11111000"; --数码管显示7when "11011110" => display <= "10000000"; --数码管显示8when "10111110" => display <= "10010000"; --数码管显示9when "10110111" => display <= "01111111"; --数码管显示.when "01111101" => display <= "10111001"; --数码管显示+when "01111011" => display <= "10111010"; --数码管显示enterwhen others => null;end case;end if;end process;weixuan<=q;交通灯控制代码分析:1、时钟分频代码:process(clk)variable cnt1 : integer range 0 to 50000000;beginif (clk'event and clk='1') thenif cnt1=24999999 thenclk_1<=not clk_1;cnt1:=0;else cnt1:=cnt1+1;end if;end if;end process;--产生1Hz的时钟频率,时间为一秒。

键盘扫描原理

键盘扫描原理

键盘扫描原理
键盘是计算机输入设备中最常用的一种,它通过将人们的按键操作转换成计算机可以识别的信号,从而实现了人机交互。

而键盘的核心部分就是键盘扫描原理,它是如何实现的呢?
首先,我们需要了解键盘的工作原理。

当我们按下键盘上的某一个按键时,就会产生一个按键信号,这个信号会通过键盘的电路传输到计算机主机上。

而键盘扫描原理就是指计算机是如何检测到这个按键信号的。

键盘扫描原理的核心就是矩阵扫描。

键盘上的每一个按键都对应着一个电路,这些电路会以矩阵的形式排列在键盘的背后。

当我们按下某一个按键时,对应的电路就会闭合,从而产生一个按键信号。

计算机会通过扫描这个矩阵来检测到按键信号的产生。

具体来说,计算机会以一定的频率扫描键盘上的每一个按键,检测它们是否产生了按键信号。

这个扫描的频率通常很高,所以我们按下按键时几乎可以立即得到响应。

一旦计算机检测到有按键信号产生,它就会将这个信号转换成相应的键值,从而实现了按键的输入。

除了矩阵扫描,现代键盘还采用了一些其他技术来提高性能和稳定性。

比如采用了多种防抖动技术,防止因按键抖动而产生误操作;采用了多种按键轮询技术,提高了按键的灵敏度和反应速度;还采用了多种按键编码技术,提高了按键的识别准确性和稳定性。

总的来说,键盘扫描原理是键盘工作的核心,它通过矩阵扫描等技术实现了对按键信号的检测和转换,从而实现了人机交互。

随着技术的不断发展,键盘的性能和稳定性会不断提高,为人们的使用体验带来更多的便利和舒适。

键盘扫描芯片

键盘扫描芯片

键盘扫描芯片键盘扫描芯片是一种用于扫描和控制键盘的集成电路芯片。

它通常嵌入在电脑、手机和其他类似设备的键盘部分。

键盘扫描芯片的功能主要包括以下几个方面:1. 扫描键盘:键盘扫描芯片将键盘上每一个按键都与一个特定的电路连接起来,通过扫描该电路的状态,可以检测到用户是否按下某个按键。

2. 解码按键:扫描芯片一旦检测到按键按下,就会将按键的码值转换为计算机可以识别的数据,然后传输给计算机或其他设备。

3. 键盘状态检测:键盘扫描芯片可以检测键盘上多个按键同时按下的情况,并且能够正确解析这些按键的状态。

4. 控制键盘发光:一些键盘扫描芯片还可以控制键盘上的背光灯或指示灯的亮灭,以提高键盘的可视性。

5. 噪声消除:键盘扫描芯片还可以通过消除按键产生的电磁干扰和噪声,提高键盘的信号质量。

键盘扫描芯片的工作原理主要分为以下几个步骤:1. 扫描电路:键盘扫描芯片通过一组复用电路,逐个扫描键盘上的每一个按键。

具体来说,它会按照一定的频率依次给每一个按键提供电流,然后通过检测电路的电流变化来确定该按键是否被按下。

2. 码值解码:一旦检测到按键按下,键盘扫描芯片会根据每个按键电路的位置和连接关系,将按键的码值转换为对应的计算机可识别的数据。

这样,计算机就能够知道用户按下了哪个按键。

3. 数据传输:键盘扫描芯片将解码后的数据传输给计算机或其他设备。

通常,它会通过串行或并行接口与计算机通信,并根据协议协商好的数据格式传输数据。

键盘扫描芯片的优势主要有以下几点:1. 高效稳定:键盘扫描芯片使用电路扫描的方式,可以快速稳定地扫描和检测键盘上的每一个按键,提高键盘的反应速度和稳定性。

2. 节省成本:键盘扫描芯片的集成度高、体积小,能够将多个功能集成在一个芯片中,减少了所需的电路板面积和元器件数量,从而降低了成本。

3. 可靠性:键盘扫描芯片可以通过软件算法和硬件检测机制,准确判断键盘上按键的状态,避免误操作和按键冲突,提高整个系统的可靠性。

EDA课程设计键盘扫描及显示完整程序

EDA课程设计键盘扫描及显示完整程序

EDA课程设计键盘扫描及显示完整程序第一篇:EDA课程设计键盘扫描及显示完整程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USESTD_LOGIC_ARITH.ALL;USESTD_LOGIC_UNSIGNED.ALL;ENTITYKEYBOARD IS PORT(CLK_1K : IN STD_LOGIC;CLK_40K : IN STD_LOGIC;KEY_LIE : IN STD_LOGIC_VECTOR(3 DOWNTO 0);START :OUT STD_LOGIC;KEY_HANG :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);DATA_P : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);DISP_DATA : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);DISP_SEL : OUT STD_LOGIC_VECTOR(1 downto 0);END;ARCHITECTURE RTL OF KEYBOARD IS SIGNAL INT : STD_LOGIC;SIGNAL CLK_SEL : STD_LOGIC;SIGNAL START_REG:STD_LOGIC;SIGNAL SIGNAL SIGNAL SIGNAL DISP_SEL_REG:STD_LOGIC_VECTOR(1 DOWNTO 0);DATA_L,DATA_H:STD_LOGIC_VECTOR(3 DOWNTO 0);DATA_TMP:STD_LOGIC_VECTOR(3 DOWNTO 0);KEY_HANG__TMP:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL DISP_DATA_REG:STD_LOGIC_VECROR(3 DOWNTO 0);SIGNAL KEY_CODE:STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL DATA_P_REG:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGIN KEY_CODE<=KEY_HANG_TMP&KEY_LIE;DATA_P<=DATA_P_REG; START<=START_REG;KEY_HANG<=KEY_HANG_TMP;DISP_SEL<=DISP_SEL_REG;CLK_SEL<=CLK_1K AND(NOT INT);PROCESS(CLK_SEL,CLK_40,INT)VARIABLE STATE : INTEGER RANG 0 TO 3;BEGIN IF RISING_EDGE(CLK_40K)THEN INT<= NOT(KEY_LIE(3)AND KEY_LIE(2)AND KEY_LIE(1)AND KEY_LIE(0));END IF;IF RISING_EDGE(CLK_SEL)THEN CASE STATE IS WHEN 0=>KEY_HANG_TMP<=“1110”;STATE :=1;WHEN 1 =>KEY_HANG_TMP<=“1101”;STATE :=2;WHEN 3 =>KEY_HANG_TMP<=“1011”;STATE :=3;WHEN 4=>KEY_HANG_TMP<=“0111”;STATE :=0;END CASE;END IF;END PROCESS;PROCESS(CLK_40K , INT)VARIABLE STATE :INTEGER RANGE 0 TO 3;VARIABLE COUNTER : INTEGER RANGE 0 TO 31;BEGIN IF INT='0' THENSTATE:=0;COUNTER:=0;ELSIF RISING_EDGE(CLK_40K)THEN CASE STATE ISWHEN 0 => DATA_TMP <= DATA_L;STATE:=1;WHEN 1 =>CASE KEY_CODE ISWHEN “01110111” =>DATA_L <=“0001”;DATA_H <=DATA_TMP; STATE:=2;WHEN “01111011” => DATA_L <=“0010”; DATA_H <=DATA_TMP; STATE:=2;WHEN “01111101” => DATA_L <=“0011”; DATA_H <=DATA_TMP; STATE:=2;WHEN “01111110” => DATA_L <=“0100”; DATA_H <=DATA_TMP; STATE:=2;WHEN “10110111” => DATA_L <=“0101”; DATA_H <=DATA_TMP; STATE:=2;WHEN “10111011” => DATA_L <=“0110”; DATA_H <=DATA_TMP; STATE:=2;WHEN “10111101” => DATA_L <=“0111”; DATA_H <=DATA_TMP; STATE:=2;WHEN “10111110” => DATA_L <=“1000”; DATA_H <=DATA_TMP; STATE:=2;WHEN “11010111” => DATA_L <=“1001”;DATA_H <=DATA_TMP; STATE:=2;WHEN “11011011” => DATA_L <=“0000”;DATA_H <=DATA_TMP; STATE:=2;WHEN “11011101” =>IF DATA_H =“1001” THEN IF DATA_L=“1001” THEN DATA_H<=“1001”;DATA_L<=“1001”;ELSE DATA_L<=DATA_L + 1; END IF;ELSIF DATA_L=“1001” THEN DATA_L<=“0000”;DATA_H<=DATA_H+1; ELSEDATA_L<=DATA_L+1;DATA_H<=DATA_H;END IF;STATE:=2;WHEN “11011110” =>IF DATA_H=“1001” THEN DATA_H<=“1001”;ELSE DATA_L<=DATA_L;DATA_H<= DATA_H+1;END IF; STATE:=2;WHEN “11100111” =>IF DATA_L=“0000” AND DATA_H=“0000” THEN DATA_L<=“0000”;DATA_H<=“0000”;ELSIF DATA_L=“0000” THEN DATA_L<=“1001”;DATA_H<= DATA_H-1;ELSEDATA_L <=DATA_L-1;DATA_H<=DATA_H;END IF;STATE:=2;WHEN “11101011”=>IF DATA_H=“0000” THENDATA_H<=“0000”;ELSEDATA_L<=DATA_L;DATA_<=DATA_H-1;END IF;STATE:2;WHEN “11101110” =>DATA_L<=DATA_L;DATA_H<=DATA_H;DATA_P_REG<=DATA_H&DATA_L;START_REG<='1';STATE:=2;WHEN“11101101” =>DATA_L<=“0000”;DATA_H<=“0000”;STATE:=2;WHEN OTHERS =>STATE:=2;END CASE;WHEN 2 =>IF COUNTER=31 THENCOUNTER:=0;STATE:=3;ELSECOUNTER:=COUNTER+1;STSTE:=2;END IF;WHEN 3 =>START_REG<='0';STATE:=3;END CASE;END IF;END PROCESS;PROCESS(CLK_1K,DATA_L,DATA_H)VARIABLE STATE: INTEGER RANGE 0 TO 1;BEGINIF RISING_EDGE(CLK_1K)THENCASE STATE ISWHEN 0 =>DISP_SEL_REG<=“10”;DISP_DATA_REG<=DATA_L;STATE:=1;WHEN 1 =>DISP_SEL_REG<=“01”;DISP_DATA_REG<=DATA_H;STATA:=0;END CASE;END IF;END PROCESS;PROCESS(CLK_1K,DISP_DATA_REG)BEGIN IF RISING_EDGE(CLK_1K)THENCASE DISP_DATA_REG ISWHEN “0000”=>DISP_DATA<=“1111110” WHEN “0001”=>DISP_DATA<=“0110000” WHEN “0010”=>DISP_DATA<=“1101101” WHEN “0011”=>DISP_DATA<=“1111001” WHEN “0100”=>DISP_DATA<=“0110011” WHEN “0101”=>DISP_DATA<=“1011011” WHEN “0110”=>DISP_DATA<=“1011111” WHEN “0111”=>DISP_DATA<=“1110000” WHEN “1000”=>DISP_DATA<=“1111111” WHEN “1001”=>DISP_DATA<=“1111011” WHEN OTHERS =>DISP_DATA<=“0000000” END CASE;END IF;END PROCESS;END;第二篇:EDA课程设计考试序号:28自动打铃系统设计说明书学生姓名:周文江学号:14112502521专业班级:1102报告提交日期:2013.11.26湖南理工学院物电学院目录一、题目及要求简介...............3 1.设计题目.....................3 2.总体要求简介 (3)二、设计方案说明 (3)三、系统采用器件以及模块说明.........3 1.系统框图............4 2.选择的FPGA芯片及配置.........4 3.系统端口和模块说明 (5)四、各部分仿真结果 (5)五、调试及总结 (6)六、参考文献 (7)七、附录 (7)一、题目及要求简介1、设计题目设计一个多功能自动打铃系统2、总体要求简介① 基本计时和显示功能(24小时制显示),包括:1.24小时制显示2.动态扫描显示;3.显示格式:88-88-88 ② 能设置当前时间(含时、分)③ 能实现基本打铃功能,规定:06:00起床铃,打铃5s二、设计方案说明本次设计主要采用Verilog HDL硬件描述性语言、分模块法设计的自动打铃系统。

键盘扫描输入实验

键盘扫描输入实验

4.1键盘扫描输入实验4.1.1 实验目的1.学习复杂数字系统的设计方法;2.掌握矩阵式键盘输入列阵的设计方法。

4.1.2 实验设备PC微机一台,TD-EDA试验箱一台,SOPC开发板一块。

4.103 实验内容在电子,控制,信息处理等各种系统中,操作人员经常需要想系统输入数据和命令,以实现人机通信。

实现人机通信最常用的输入设备是键盘。

在EDA技术的综合应用设计中,常用的键盘输入电路独立式键盘输入电路、矩阵式键盘输入电路和“虚拟式”键盘输入电路。

所谓矩阵是键盘输入电路,就是将水平键盘扫描线和垂直输入译码线信号的不同组合编码转换成一个特定的输入信号值或输入信号编码,利用这种行列矩阵结构的键盘,只需N 个行线和M个列线即可组成NXM按键,矩阵式键盘输入电路的优点是需要键数太多时,可以节省I/O口线;缺点是编程相对困难。

本实验使用TD-EDA实验系统的键盘单元设计一个4x4的矩阵键盘的扫描译码电路。

此设计包括键盘扫描模块和扫描码锁存模块,原理如图4-1-1。

每按下键盘列阵的一个按键立即在七段数码管上显示相应的数据。

4.1.1 实验步骤1. 运行Quartus II 软件,分别建立新工程,选择File->New菜单,创建VHDL描述语言设计文件,分别编写JPSCAN.VHD、REG.VHD.2.扫描码锁存模块REG的VHDL源程序如下;--输入锁存器VHDL源程序:REGVHDLLIBRARY IEEE;USB IEEE.STD-LOGIC-1164.ALL;ENTITY REG ISPORT ( RCLK : IN STD-LOGIC; --扫描时钟YXD : IN STD-LOGIC-VECTOR(3 DOWNTO 0); --Y 列消抖输入DATA : IN STD-LOGIC-VECTOR(7 DOWNTO 0); --输入数据LED : OUT STD-LOGIC- VECTOR(7 DOWNTO 0)); --锁存数据输出END ENTITY REG;ARCHITECTURE BEHV OF REG ISSIGNAL RST : STD-LOGIC; --锁存器复位清零SIGNAL OLDDATA : STD-LOGIC- VECTOR(7 DOWNTO 0); --锁存器旧数据SIGNAL NEWDATA : STD-LOGIC- VECTOR(7 DOWNTO 0); --锁存器新数据BEGINPROCESS(RCLK)BEGINIF RCLK’EVENT AND RCLK=’1’THENRST<=YXD(3)AND YXD(2)AND YXD(1))AND YXD(0); --判断是否有按键END IF;END PROCESS;PROCESS(RST) ISBEGINIF(RST=‘1’)THEN --RST=1没有按键按下NEWDATA<=OLDDATA;ELSEOLDDATA<=DATA; --RST=0有按键按下打入新据END IF;LED<=NEWDATA;END PORCESS;END ARCHIECTUBE BEHV;3. 键盘扫描模块JPSCAN的VHDL源程序如下;--键盘扫描电路的VHDL源程序;JPSCAN.VHDLIBRARY IEEE;USB IEEE-STD-LOGIC-1164-ALL;USB IEEE-STD-LOGIC-ARITH-ALL;USB IEEE-STD-LOGIC-UNSIGNED-ALL;ENTITY JPSCAN ISPORT(SCLK : IN STD-LOGIC --系统时钟:1KHZ YLINE : IN STD-LOGIC-VECTOR(4 DOWN 1); --Y列按键输入RCLK : OUT STD-LOGIC; --X行键盘扫描时钟YXD : OUT STD-LOGIC-VECTOR(3 DOWN 0); --Y列消抖输出DATA : OUT STD-LOGIC-VECTOR(7 DOWN 0); --数字输出XROW : OUT STD-LOGIC-VECTOR(4 DOWN 1); --X行键盘扫描END ENTITY JPSCAN;ARCHITECTURE BEHV OF JPSCAN ISCOMPONENT JPXD IS --控制电路工作时钟:512HzSIGNAL KEY-SCAN:STD-LOGIC-VECTOR(1 DOWNTO 0); --键盘扫描时钟信号--“00-01-10-11”SIGNAL CLK-JPXD : STD-LOGIC; --去抖电路工作时钟SIGNAL Y-XD : STD-LOGIC-VECTOR(3 DOWNTO 0); --键盘列输入去抖后的寄存器SIGNAL X-SCAN : STD-LOGIC-VECTOR(3 DOWNTO 0) --键盘行扫描输出寄存器--1110-1101-1011-0111 SIGNAL VALUE : STD-LOGIC-VECTOR(7 DOWNTO 0); --按键译码数值寄存器BEGINDATA<=VALUE;COUNTER:BLOCK IS --信息扫描发生器SIGNAL Q :STD-LOGIC-VECTOR(6 DOWNTO 0); --计数器实现分频BEGINPROCESS(SCLK)ISBEGINIF SCLK’EVENT AND SCLK=’THENQ<=Q+1;END IF;CLK<=Q(0); --控制电路工作时钟:512Hz,系统时钟的二分频CLK-JPXD<=Q(2); --去抖时钟信号,大约128HzKEY-SCAN<=Q(6 DOWNTO 5); --产生键盘扫描信号00-01-10-11,大约16Hz END PROCESS;X-SCAN<=”1110”WHEN KEY-SCAN=”00”ELSE”1101”WHEN KEY-SCAN=”01”ELSE”1011”WHEN KEY-SCAN=”10”ELSE”0111”WHEN KEY-SCAN=”11”ELSE“1111”XROW(4 DOWNTO 1)<=X-SCAN(3 DOWNTO 0); --X行扫描END BLOCK COUNTER;JPXDMK:BLOCK IS --键盘去抖模块BEGINU1:JPXD PORT MAP(D-IN=>YLINE(1),D-OUT=>Y-XD(0),CLK=>CLK-JPXD);U2:JPXD PORT MAP(D-IN=>YLINE(2),D-OUT=>Y-XD(1),CLK=>CLK-JPXD);U3:JPXD PORT MAP(D-IN=>YLINE(3),D-OUT=>Y-XD(2),CLK=>CLK-JPXD);U4:JPXD PORT MAP(D-IN=>YLINE(4),D-OUT=>Y-XD(3),CLK=>CLK-JPXD);YXD(3 DOWNTO 0)<=Y-XD(3 DOWNTO 0);RCLK<=CLK; --键盘扫描时钟等于控制电路工作时钟:512Hz END BLOCK JPXDMK;KEY-DECODER : BLOCK IS --键盘译码模块SIGNAL Z:STD-LOGIC-VECTOR(5 DOWNTO 0);BEGINPORCESS(CLK)BEGINZ<=KEY-SCAN&Y-XD;IF CLK’EVENT AND CLK=’1’THENCASE Z ISWHEN”001110”=>VALUE<=”00111111”; --0WHEN”011110”=>VALUE<=”00000110”; --1WHEN”101110”=>VALUE<=”01011011”; --2WHEN”111110”=>VALUE<=”01001111”; --3WHEN”001101”=>VALUE<=”01100110”; --4WHEN”011101”=>VALUE<=”01101101”; --5WHEN”101101”=>VALUE<=”01111101”; --6WHEN”111101”=>VALUE<=”00000111”; --7WHEN”001001”=>VALUE<=”01111111”; --8WHEN”011011”=>VALUE<=”01101111”; --9WHEN”101011”=>VALUE<=”01110111”; --AWHEN”111011”=>VALUE<=”01111100”; --BWHEN”000111”=>VALUE<=”00111001”; --CWHEN”010111”=>VALUE<=”01011110”; --DWHEN”100111”=>VALUE<=”01111001”; --EWHEN”110111”=>VALUE<=”01110001”; --FWHEN OTHERS => VALUS<=”00000000”; --OTHER END CASE;END IF;END PROCESS;END BLOCK KEY-DECODER;END ARCHITECTURE BEHV;4. 上述程序中键盘消抖模块JPXD的VHDL源程序如下:--键盘输入消抖电路的VHDL源程序。

eda矩阵键盘扫描课程设计

eda矩阵键盘扫描课程设计

eda矩阵键盘扫描课程设计一、课程目标知识目标:1. 让学生理解EDA矩阵键盘的基本原理和结构;2. 使学生掌握矩阵键盘扫描的方法和技巧;3. 帮助学生掌握利用EDA工具进行矩阵键盘电路设计和仿真。

技能目标:1. 培养学生运用EDA工具进行矩阵键盘电路搭建和调试的能力;2. 培养学生分析并解决矩阵键盘扫描过程中出现问题的能力;3. 提高学生团队协作和沟通表达能力,能就矩阵键盘扫描问题进行有效讨论。

情感态度价值观目标:1. 培养学生对电子技术课程的兴趣和热情,激发学生主动探究精神;2. 培养学生严谨的科学态度和良好的学习习惯;3. 增强学生的创新意识,鼓励学生勇于尝试新的设计方法和思路。

课程性质分析:本课程为电子技术课程的一部分,以实践操作为主,理论联系实际,旨在培养学生的电子技术应用能力。

学生特点分析:学生处于高中年级,具有一定的电子技术基础和动手能力,对新鲜事物充满好奇,善于团队合作。

教学要求:结合学生特点,注重实践与理论相结合,强调学生的动手能力和问题解决能力,提高学生的创新意识和团队协作能力。

通过本课程的学习,使学生能够达到上述课程目标,为后续电子技术课程的学习打下坚实基础。

二、教学内容1. 理论知识:- 矩阵键盘的工作原理与结构;- 键盘扫描方法:行扫描和列扫描;- EDA工具的使用方法及电路仿真基本操作。

2. 实践操作:- 利用EDA工具设计矩阵键盘电路;- 矩阵键盘电路的搭建与调试;- 键盘扫描程序编写与优化。

3. 教学大纲安排:- 第一章:矩阵键盘原理及结构介绍(1课时)- 第二章:键盘扫描方法分析(1课时)- 第三章:EDA工具的使用及电路仿真(2课时)- 第四章:矩阵键盘电路设计与搭建(2课时)- 第五章:键盘扫描程序编写与调试(2课时)4. 教材关联:- 《电子技术基础》第四章:数字电路基础;- 《电子技术实验教程》第六章:矩阵键盘与显示电路设计。

教学内容确保科学性和系统性,结合课程目标,注重理论与实践相结合。

电子键盘的扫描原理

电子键盘的扫描原理

电子键盘的扫描原理电子键盘是现代计算机和其他电子设备中常见的输入设备之一,其工作原理是通过扫描来检测用户按下的按键,并将按键信息传输给相关设备进行处理。

本文将介绍电子键盘的扫描原理及其工作流程。

一、电子键盘的基本结构电子键盘通常由一组按键和控制电路组成。

按键通常被分为几行和几列,并通过金属导线或薄膜电路板连接到控制电路。

每个按键都有一个唯一的标识符,如字符、数字或功能键。

二、键盘扫描的工作原理电子键盘通过扫描技术来检测用户按下的按键。

简单来说,扫描过程分为两个步骤:行扫描和列扫描。

1. 行扫描在行扫描阶段,控制电路将一个个地激活每一行线路,从第一行开始直到最后一行。

当一行被激活时,与该行相对应的列被连接到控制电路上的输入端。

如果没有按键按下,该列电路将保持高电平。

如果有按键按下,该列电路将变为低电平。

2. 列扫描在列扫描阶段,控制电路逐列地检测每一列线路的电平状态。

如果某列电路检测到低电平,则表示该列对应的按键被按下。

控制电路将记录下按下按键所在的行和列信息。

三、键盘扫描的工作流程电子键盘的扫描工作流程可以简要概括如下:1. 初始化开始时,控制电路保持所有行线路为高电平状态,并等待用户按下按键。

2. 行扫描控制电路依次激活每一行线路,从第一行到最后一行。

对于每一个激活的行,控制电路会检查每一列线路的电平状态。

3. 检测按键如果有按键被按下,控制电路将记录下按下按键所在的行和列信息,并将其保存在缓存中。

4. 输出按键信息一旦扫描完成,控制电路将按下按键的信息传输给相关设备进行进一步处理。

比如,在计算机中,操作系统会接收到按键信息,并将其转化为相应的字符或指令。

四、扫描速度和反馈机制电子键盘的扫描速度通常非常快,以保证用户在快速输入时不会出现按键丢失或错位的情况。

现代的电子键盘通常采用多级的硬件扫描技术,使得扫描速度更快,响应更准确。

另外,一些高级电子键盘还会提供按键反馈机制,比如机械键盘中的轴体触发,通过物理机械结构产生明显的触感和声音反馈,以增强用户的输入体验。

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

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

EDA课程设计键盘扫描电路设计电子课程设计—键盘扫描电路设计学院:班级:姓名:学号:指导老师:12月目录1.设计任务与要求 (1)2.功能模块 (2)3.选择器件 (3)4.功能模块 (5)5.设计总体电路图 (8)6.心得体会 (10)一、设计任务与要求1、键盘按钮数为4,系统时钟10MHz;2、能识别出所按按钮;3、按钮被按下后,视为此按钮输入一次,若按钮长时间不松,(时限1S)后每隔0.5S视为再次输入,直至按钮松开;4、要求能对按钮按下时指令的抖动能正确处理。

对持续时间小于50ms的输入不作响应;5、各键设置不同优先级,多键同时按下时,视为优先级较高的按键被按下;二、功能模块图3 模块delta其VHDL语言如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_unsigned.all;entity keyboard4_4 isport(rst : in std_logic;clk_in : in std_logic;keyin : in std_logic_vector(3 downto 0);scan : out std_logic_vector(3 downto 0);leds : out std_logic_vector(3 downto 0);state : out std_logic;VGA : out std_logic_vector(3 downto 0) );end keyboard4_4;architecture keyboard4_4_arch of keyboard4_4 is----********************************************* component debouncingport( key : IN STD_LOGIC ;clk,clr : IN STD_LOGIC ;dly_out : OUT STD_LOGIC ) ;end component ;--*********************************************。

eda实验 键盘扫描

eda实验 键盘扫描

2.实验程序:library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_arith.all;use IEEE.std_logic_unsigned.all;entity Keyboard isport(db:inout std_logic_vector(31 downto 0);clk:in std_logic;sel_out: out std_logic_vector(7 downto 0);ga:out std_logic_vector(6 downto 0);A: IN STD_LOGIC_VECTOR(2 DOWNTO 0);Din: IN STD_LOGIC_VECTOR(3 DOWNTO 0);EN: IN STD_LOGIC;ENTER: IN STD_LOGIC);end Keyboard;architecture Keyboard_arch of Keyboard issignal sel:std_logic_vector(7 downto 0);signal data:std_logic_vector(3 downto 0);signal freq:std_logic_vector(7 downto 0); COMPONENT WORKport( A: IN STD_LOGIC_VECTOR(2 DOWNTO 0);Din: IN STD_LOGIC_VECTOR(3 DOWNTO 0);EN: IN STD_LOGIC;ENTER: IN STD_LOGIC;Dout7: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);Dout6: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);Dout5: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);Dout4: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);Dout3: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);Dout2: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);Dout1: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);Dout0: OUT STD_LOGIC_VECTOR(3 DOWNTO 0));end COMPONENT;beginfrequence:blockbeginprocess(clk)beginif clk'event and clk='1' thenfreq<=freq+1;end if;end process;sel<=freq(7 downto 0);end block frequence;U1:WORKPORT MAP(A,Din,EN,ENTER,db(31 downto 28),db(27 downto 24),db(19 downto 16),db(15 downto 12),db(11 downto 8),db(7 downto 4),db(3 downto 0));mulselect:blockbegindata<=db(31 downto 28) when sel=0 elsedb(27 downto 24) when sel=1 elsedb(23 downto 20) when sel=2 elsedb(19 downto 16) when sel=3 elsedb(15 downto 12) when sel=4 elsedb(11 downto 8) when sel=5 elsedb(7 downto 4) when sel=6 elsedb(3 downto 0);end block mulselect;sel_out<=sel;decode:blockbeginga<="1000000" when data=0 else"1111001" when data=1 else"0100100" when data=2 else"0110000" when data=3 else"0011001" when data=4 else"0010010" when data=5 else"0000010" when data=6 else"1111000" when data=7 else"0000000" when data=8 else"0010000" when data=9 else"1111111" when data=10 else"1111111" when data=11 else"1111111" when data=12 else"1111111" when data=13 else"1111111" when data=14 else"1111111";end block decode;keyscan:block ----------键值输出电路部分signal ount:std_logic_vector(18 downto 0);signal key_precess:std_logic;signal move:std_logic;signal key_data:std_logic_vector(3 downto 0);signal kxy:std_logic_vector(5 downto 0);beginkey_pressed<='1'when col="111" else '0'key<=sel&col;process (clk,key_pressed)beginif clk'event and clk='1' thenif key_pressed='0' thencase key iswhen "000011"=> data<="0001";when "000101"=> data<="0010";when "000110"=> data<="0011";when "001011"=> data<="0100";when "001101"=> data<="0101";when "001110"=> data<="0110";when "010011"=> data<="0111";when "010101"=> data<="1000";when "010110"=> data<="1001";when "011011"=> data<="1010";when "011101"=> data<="1011";when "011110"=> data<="1100";when others=>null;end case;end if;end if;end process;process(key_pressed)beginif clk'event and clk='1' thenif key_pressed='0' then count<=(others=>'0');move<='0';elseif count="111111111111111111" then move<='1';count<=(other=>'0'); else count<=count+1;end if;end if;end if;end process;process(move)beginif move'event and move='1' then key_data<=data;end if;end process;end block keyscan;end Keyboard_arch;3.实验结果。

键盘驱动程序

键盘驱动程序

长沙理工大学课程设计(论文)任务书课程:__________ EDA基础课程设计 ____________题目:___________ 键盘驱动程序_____________电气学院电子信息工程专业__________ 班任务起止日期:2011年__6月12日至2011年6月24日学生姓名_______________ 指导教师__________ 肖鸿学号 _____________ 2011年6月4日课题内容及要求:主要内容:在本课程设计中使用Altera公司的EP2C35系列的FPGA芯片,利用SOPC-NIOSII-EP2C35开发板PS2键盘接口等资源,实现一个键盘驱动程序。

基本技能掌握:1掌握键盘扫描程序的设计2掌握键盘扫描码的显示基本功能要求1禾U用外接键盘实现键盘按键的选择2利用8位动态七段码管显示实现按键扫描码的显示扩展功能选择性要求1利用16*16点阵显示实现按键字符的显示课题完成后应提交的文件和图表(或设计图纸):1论文2图表:键盘驱动原理框图键盘驱动电路图键盘按键扫描码列表3程序:键盘扫描VHDL程序七段显示器译VHDL程序主要参考文献:(由指导老师选定)1《SOPCIIEDA实验指导书》(第二版)2《SOPCII使用手册》(第二版)3 .c n/elec/eda/eda new_m/4《EDA技术基础》.谭会生编著.湖南大学出版社,20045《EDA技术实用教程(第二版),潘松、黄继业编著,科学出版社,2005同组设计者:注:1、此任务书应由指导教师填写。

2、此任务书必须在课程设计开始前下达给学生。

学生送交成果日期_____________学生签名_____________。

4×4键盘扫描电路设计

4×4键盘扫描电路设计

设计项目成绩评定表设计报告书目录一、设计目的 (3)二、设计思路 (3)三、设计内容 (4)3.1、原理分析 (4)3.1 1、4* 4键盘的扫描 (4)3.1.2、扫描结果的显示 (5)3.1.3、电路符号 (5)3.1.4、数码管地址选择控制信号 (6)3.2、程序设计 (6)3.3、管脚分配 (10)四、系统调试与结果 (11)五、主要元器件与设备 (12)六、课程设计体会 (13)七、参考文献 (13)一、设计目的1、掌握常用的输入设备—行列式键盘接口电路的实现方法。

2、学习较复杂的数字系统设计方法。

二、设计思路如下图所示为“4 * 4键盘”模拟图。

行“kbrow”有四行:kbrow0、kbrow1、kbrow2、kbrow3。

列“kbcol”有四列:kbcol0、kbcol1、kbcol2、kbcol3 通过给四行赋值循环地对每行进行扫描,例如:通过行线赋值为“1000”时,这样就使得第0行“0键、1键、2键、3键”处在高电平的状态下。

此时如果0键被按下,那么就有第0列输出为高电平。

即四位kbcol输出为“1000”,获取键值为“0”然后在7段数码管上显示出来。

图1 4 * 4键盘三、设计内容3.1、原理分析在数字系统设计中,4*4矩阵键盘是一种常见的输入装置,通常作为系统的输入模块。

对应于键盘上每一个键的识别,一般采用扫描的方法来实现。

下面介绍一种用列信号进行扫描时的基本原理和流程,如图2所示。

当进行列扫描时,扫描信号由列引脚进入键盘,以1000、0100、0010、0001的顺序每次扫描不同的一列,然后读取行引脚的点评信号,以此可以判断是哪个按键被按下。

例如,当扫描行信号独处的值为“0000”时,表示正在扫描“89AB”一列,如果该列没有按键被按下,则由行信号读出的值为“0000”;反之,如果按键“9”被按下时,则该行信号读出的值为“0110”。

图2 4 * 4键盘及行列代码3.1 1、4* 4键盘的扫描在这一部分中,利用时钟信号进行扫描和频率计数器的计数来完成对键盘的扫描。

EDA矩阵键盘

EDA矩阵键盘

实验十五矩阵键盘接口电路的设计一、实验目的1、了解普通4×4键盘扫描的原理。

2、进一步加深七段码管显示过程的理解。

3、了解对输入/输出端口的定义方法。

一、实验原理实现键盘有两种方案:一是采用现有的一些芯片实现键盘扫描;再就是用软件实现键盘扫描。

作为一个嵌入系统设计人员,总是会关心产品成本。

目前有很多芯片可以用来实现键盘扫描,但是键盘扫描的软件实现方法有助于缩减一个系统的重复开发成本,且只需要很少的CPU 开销。

嵌入式控制器的功能能强,可能充分利用这一资源,这里就介绍一下软键盘的实现方案。

图15-1 简单键盘电路通常在一个键盘中使用了一个瞬时接触开关,并且用如图15-1 所示的简单电路,微处理器可以容易地检测到闭合。

当开关打开时,通过处理器的I/O 口的一个上拉电阻提供逻辑1;当开关闭合时,处理器的/IO 口的输入将被拉低得到逻辑0。

可遗憾的是,开关并不完善,因为当它们被按下或者被释放时,并不能够产生一个明确的1 或者0。

尽管触点可能看起来稳定而且很快地闭合,但与微处理器快速的运行速度相比,这种动作是比较慢的。

当触点闭合时,其弹起就像一个球。

弹起效果将产生如图15-2 所示的好几个脉冲。

弹起的持续时间通常将维持在5ms∼30ms 之间。

如果需要多个键,则可以将每个开关连接到微处理器上它自己的输入端口。

然而,当开关的数目增加时,这种方法将很快使用完所有的输入端口。

图15-2 按键抖动键盘上阵列这些开关最有效的方法(当需要5 个以上的键时)就形成了一个如图15-3 所示的二维矩阵。

当行和列的数目一样多时,也就是方型的矩阵,将产生一个最优化的布列方式(I/O 端被连接的时候)。

一个瞬时接触开关(按钮)放置在每一行与线一列的交叉点。

矩阵所需的键的数目显然根据应用程序而不同。

每一行由一个输出端口的一位驱动,而每一列由一个电阻器上拉且供给输入端口一位。

图15-3 矩阵键盘键盘扫描的实现过程如下:对于4×4键盘,通常连接为4行、4列,因此要识别按键,只需要知道是哪一行和哪一列即可,为了完成这一识别过程,我们的思想是,首先固定输出4行为高电平,然后输出4列为低电平,在读入输出的4行的值,通常高电平会被低电平拉低,如果读入的4行均为高电平,那么肯定没有按键按下,否则,如果读入的4行有一位为低电平,那么对应的该行肯定有一个按键按下,这样便可以获取到按键的行值。

堪称一绝的键盘扫描方法

堪称一绝的键盘扫描方法

堪称一绝的键盘扫描方法
键盘扫描是计算机视觉系统中经常使用的一种技术,它的作用是检测
用户输入的键盘输入,从而实现用户与计算机的交互。

目前,键盘扫描技
术有许多种形式,它们的特点是方式不同,用于输入控制信息的类型也不同。

其中最为出色的键盘扫描方法之一就是时序扫描。

时序扫描是一种用以检测用户输入的键盘扫描方法,它具有以下特点:
1、可以识别出按下的每个按钮:通过识别连接在芯片上的每一排的
按钮,可以检测到按下的每一个按钮,并能够识别出其它按键的状态;
2、具有低成本:时序扫描不需要复杂而昂贵的硬件,也不需要任何
软件,只要在芯片上使用一些简单的电路就可以实现;
3、可用于多行键盘:时序扫描可以非常方便地支持多行键盘,而且
用户还可以使用灯光状态监视器来指示按键状态。

4、具有高可靠性:在使用时序扫描技术进行键盘扫描时,用户可以
忽略硬件布线和失效的可能性,这是其他技术无法实现的;
5、可以使用多种程序进行实现:时序扫描可以使用不同的芯片、不
同的程序,以及不同的键盘应用来实现控制;
6、可以在低压下工作:时序扫描可以在低电压和低功耗的情况下工作,具有非常好的电气性能。

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

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

EDA课程设计--键盘扫描电路设计电子课程设计—键盘扫描电路设计学院:班级:姓名:学号:指导老师:2009年12月目录1.设计任务与要求 (1)2.功能模块 (2)3.选择器件 (3)4.功能模块 (5)5.设计总体电路图 (8)6.心得体会 (10)一、设计任务与要求1、键盘按钮数为4,系统时钟10MHz;2、能识别出所按按钮;3、按钮被按下后,视为此按钮输入一次,若按钮长时间不松,(时限1S)后每隔0.5S视为再次输入,直至按钮松开;4、要求能对按钮按下时指令的抖动能正确处理。

对持续时间小于50ms的输入不作响应;5、各键设置不同优先级,多键同时按下时,视为优先级较高的按键被按下;二、功能模块图3 模块delta其VHDL语言如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_unsigned.all;entity keyboard4_4 isport(rst : in std_logic;clk_in : in std_logic;keyin : in std_logic_vector(3 downto 0); scan : out std_logic_vector(3 downto 0); leds : out std_logic_vector(3 downto 0);state : out std_logic;VGA : out std_logic_vector(3 downto 0) );end keyboard4_4;architecture keyboard4_4_arch of keyboard4_4 is----********************************************* component debouncingport( key : IN STD_LOGIC ;clk,clr : IN STD_LOGIC ;dly_out : OUT STD_LOGIC ) ;end component ;--*********************************************--signal clkfrq : std_logic;signal cntscn : std_logic_vector(1 downto 0);signal scnlin : std_logic_vector(3 downto 0);signal cntfrq : std_logic_vector(14 downto 0);--signal cntfrq : std_logic_vector(3 downto 0); signal lednum : std_logic_vector(7 downto 0);signal key_tmp : std_logic_vector(3 downto 0);signal clk : std_logic;signal cntfrq1 : std_logic_vector(5 downto 0); beginVGA <= "0101"; --键盘功能选择scan <= not scnlin;lednum <= scnlin & (not key_tmp);-- key_tmp <= keyin;--debounuing cktdebounuing : blockbeginU1: debouncing PORT MAP (KEY => keyin(0) ,DLY_OUT => key_tmp(0) ,clr=>rst,clk => CLK);U2: debouncing PORT MAP (KEY => keyin(1) ,dly_out => key_tmp(1) ,clr=>rst,clk => CLK);U3: debouncing PORT MAP (key => keyin(2) ,dly_out => key_tmp(2) ,clr=>rst,clk => CLK);U4: debouncing PORT MAP (key => keyin(3) ,dly_out => key_tmp(3) ,clr=>rst,clk => CLK);END block debounuing ;----****************************************************** --process(rst,clk_in) -- 晶振为40MHz,进行40000分频产生去抖时钟(1000Hz)beginif rst = '0' thencntfrq <= (others => '0');elsif rising_edge(clk_in) thenif (cntfrq = "100111000011111" or not (key_tmp="1110" or key_tmp="1101" or key_tmp="1011" or key_tmp="0111") ) then--if (cntfrq = "100111000011111" or key_tmp="1111" ) then --if cntfrq = "1111" thencntfrq <= (others => '0');clk <= not clk;--去抖时钟elsecntfrq <= cntfrq + 1;end if;end if;end process;process(rst,clk) --去抖时钟,50分频,形成扫描时钟beginif rst = '0' thenclkfrq <= '0';cntfrq1 <= (others => '0');elsif rising_edge(clk) thenif cntfrq1 = "11000" thencntfrq1 <= (others => '0');clkfrq <= not clkfrq;elsecntfrq1 <= cntfrq1 + 1;end if;end if;end process;process(rst,clkfrq) -- 根据扫描时钟产生扫描线 beginif rst = '0' thencntscn <= "00";elsif rising_edge(clkfrq) thenif cntscn = "11" thencntscn <= "00";elsecntscn <= cntscn+1;end if;case cntscn iswhen "00" => scnlin <= "0001";when "01" => scnlin <= "0010";when "10" => scnlin <= "0100";when "11" => scnlin <= "1000";when others => null;end case;end if;end process;process(rst, clkfrq) -- 根据按键点亮相应的leds beginif(rst = '0' ) thenleds <= not"1111";elsif clkfrq'event and clkfrq = '0' thencase lednum iswhen "00010001" =>leds <= not"0001"; --1when "00010010" =>leds <= not"0010"; --2when "00010100" =>leds <= not"0011"; --3when "00011000" =>leds <= not"1010"; --Awhen "00100001" =>leds <= not"0100"; --4 when "00100010" =>leds <= not"0101"; --5 when "00100100" =>leds <= not"0110"; --6 when "00101000" =>leds <= not"1011"; --Bwhen "01000001" =>leds <= not"0111"; --7 when "01000010" =>leds <= not"1000"; --8 when "01000100" =>leds <= not"1001"; --9 when "01001000" =>leds <= not"1100"; --Cwhen "10000001" =>leds <= not"1110"; --*when "10000010" =>leds <= not"0000"; --0when "10000100" =>leds <= not"1111"; --#when "10001000" =>leds <= not"1101"; --Dwhen others =>null;end case;end if;end process;process(rst,key_tmp)beginif(rst = '0' ) thenstate <= '1';elsif (key_tmp="1110" or key_tmp="1101" or key_tmp="1011" or key_tmp="0111") thenstate <= '0';elsif (key_tmp="1111") thenstate <= '1';end if;end process;end keyboard4_4_arch;三、心得体会经过两周的课程设计,由于是第一次,过程有点曲折,有点累,但最后能得到理想的结果,心里感到特别高兴。

基于FPGA的键盘扫描电路EDA课程设计

基于FPGA的键盘扫描电路EDA课程设计

目录1 课程设计综述——————————————————————2 1.1 课程设计的题目———————————————————— 21.2 题目要求——————————————————————— 22 方案选择———————————————————————— 23 整体电路的设计及分析——--——————————————— 3 3.1 顶层电路图—————————————————————— 33.2 各模块功能原理分析—————————————————— 44 心得体会——————————————————————— 121.课程设计综述1.1 课程设计的题目基于FPGA的键盘扫描电路。

1.3 题目要求(1)、键盘按钮数为4,系统时钟10MHz。

(2)、能识别出所按按钮。

(3)、按钮被按下后,视为此按钮输入一次,若按钮长时间不松,(时限1S)后每隔0.5S 视为再次输入,直至按钮松开。

(4)、要求能对按钮按下时指令的抖动能正确处理。

对持续时间小于50ms的输入不作响应。

(5)、各键设置不同优先级,多键同时按下时,视为优先级较高的按键被按下。

2.方案选择根据题目要求,需要4个按钮的键盘,通过查阅资料我选择通用的2*2行列式键盘,判断键盘中有无按键按下是通过行线送入扫描信号,然后从列线读取状态得到的。

其方法是依次给行线送低电平,检查列线的输入。

如果列线信号全为高电平,则代表低电平信号所在的行中无按键按下;如果列线有输入为低电平,则低电平信号所在的行和出现低电平的列的交点处有按键按下。

原理框图如下所示:由题知输入的是10MHz的系统时钟,我们需要通过一个分频器来输出一个1KHz的计数频率来扫描键盘以及一个40Hz(即25ms)的消除抖动的频率来计算是否属于抖动按键,计数值用来计算当前键盘扫描值,4按钮的话计数值则是00、01、10和11 ,若有按键信号发生则送计数值到按键检测电路和按键编码电路供确定按键位置用。

实验三 键盘扫描

实验三  键盘扫描

实验三键盘扫描&8位7段码管显示实验一实验目的1.进一步熟悉用Quartus II开发SOPC的基本流程。

2.进一步掌握PIO外设的使用方法。

3.熟悉对PIO的更复杂的操作过程。

4.掌握驱动8位七段码管的方法。

二硬件需求1.EDA/SOPC实验箱一台。

三实验原理实验中要用到4×4键盘,系统需要完成4×4键盘的扫描,确定有键按下后需要获取其键值,根据预先存放的键值表,逐个进行对比,从而进行按键的识别,并将相应的按键值进行显示。

键盘扫描的实现过程如下:对于4×4键盘,通常连接为4行、4列,因此要识别按键,只需要知道是哪一行和哪一列即可,为了完成这一识别过程,首先输出4列中的第一列为低电平,其它列为高电平,然后读取行值;然后再输出4列中的第二列为低电平,读取行值,依此类推,不断循环。

系统在读取行值的时候会自动判断,如果读进来的行值全部为高电平,则说明没有按键按下,否则如果读进来的行值发现不全为高电平,则说明键盘整列中必定有至少一个按键按下,读取此时的行值和当前的列值,即可判断到当前的按键位置。

获取到行值和列值以后,组合成一个8位的数据,根据实现不同的编码在对每个按键进行匹配,找到键值后在7段码管显示。

8位七段码管的显示是在程序中定时扫描显示的,为了使显示的过程简化,可以在程序中开辟8个存储区,用于存放8个七段码管对应值,然后每按下按键一次,则相应的值出现在最右边的七段码管上,原先的显示的值依次左移。

为了完成键盘的扫描和七段码管的正确显示,必须在原来CPU模块的基础上再加入一个定时器模块,用以产生周期性中断,在中断服务程序中完成键盘的扫描以及七段码管的扫描。

四实验内容本实验要完成的内容是设计一个CPU模块,该CPU需要加入一个定时器模块,用以产生周期性中断进行键盘扫描和七段码管的扫描显示。

实验要求能够在按下按键时获取其键值,然后在8个七段码管上正确显示按下的键值,每按键一次,原先显示的值整体左移,新的键值出现在8个七段码管的最右边。

eda矩阵键盘扫描课程设计

eda矩阵键盘扫描课程设计

eda矩阵键盘扫描课程设计一、课程目标知识目标:1. 让学生掌握EDA矩阵键盘扫描的基本原理,理解其电路构成及工作流程。

2. 学会运用已学知识,分析并设计简单的矩阵键盘扫描电路。

3. 了解矩阵键盘扫描技术在现实生活中的应用,培养对电子技术的兴趣。

技能目标:1. 培养学生动手操作能力,能独立完成矩阵键盘扫描电路的搭建与调试。

2. 提高学生的问题分析能力,学会运用矩阵键盘扫描技术解决实际问题。

3. 培养学生的团队合作精神,学会在团队中分享观点、交流经验。

情感态度价值观目标:1. 激发学生对电子科技的兴趣,培养其探索精神和创新意识。

2. 培养学生严谨的科学态度,注重实践操作,养成动手解决问题的习惯。

3. 引导学生关注社会问题,认识到科技对生活的改善作用,树立正确的价值观。

课程性质:本课程为实践性较强的电子技术课程,旨在通过矩阵键盘扫描技术的学习,培养学生的动手能力、问题分析能力和团队合作精神。

学生特点:本课程面向高年级学生,学生在前期课程中已具备一定的电子技术基础,具有较强的学习能力和实践操作能力。

教学要求:结合学生特点,注重理论与实践相结合,强调动手实践,提高学生的实际操作能力。

通过小组合作、讨论交流等形式,培养学生的团队合作精神和创新意识。

同时,关注学生的学习进度,及时调整教学策略,确保课程目标的实现。

在教学过程中,注重分解课程目标为具体的学习成果,以便进行有效的教学设计和评估。

二、教学内容1. 理论知识:- 矩阵键盘的原理及其在EDA技术中的应用。

- 矩阵键盘扫描电路的设计方法及其工作原理。

- 常见矩阵键盘扫描电路的电路图分析。

2. 实践操作:- 矩阵键盘扫描电路的搭建与调试。

- 键盘扫描程序编写及烧录。

- 键盘扫描电路与微控制器连接与通信。

3. 教学大纲安排:- 第一阶段:矩阵键盘原理学习,了解其在EDA技术中的应用,分析典型矩阵键盘扫描电路。

- 第二阶段:实践操作,分组进行矩阵键盘扫描电路的搭建、编程和调试。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1 绪论VHDL的英文全名是Very-High-Speed Integrated Circuit HardwareDescription Language,诞生于1982年。

1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。

自IEEE公布了VHDL的标准版本,IEEE-1076(简称87版)之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。

此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。

现在,VHDL和Verilog作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。

有专家认为,在新的世纪中,VHDL于Verilog语言将承担起大部分的数字系统设计任务。

VHDL主要用于描述数字系统的结构,行为,功能和接口。

除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。

VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。

在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。

这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。

FPGA(Field Programmable Gate Array)即现场可编程门阵列,它是在PAL、GAL、EPLD等可编程器件的基础上进一步发展的产物。

它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。

FPGA的使用非常灵活,同一片FPGA通过不同的编程数据可以产生不同的电路功能。

FPGA在通信、数据处理、网络、仪器、工业控制、军事和航空航天等众多领域得到了广泛应用。

随着功耗和成本的进一步降低,FPGA还将进入更多的应用领域。

本设计采用VHDL硬件语言的模块化思想,设计了PS2键盘扫描模块,七段LED动态显示模块以及16*16点阵显示模块。

2 课程设计指标主要内容:在本课程设计中使用Altera公司的EP2C35系列的FPGA芯片,利用SOPC-NIOSII-EP2C35开发板PS2键盘接口等资源,实现一个键盘驱动程序。

基本技能掌握:1 掌握键盘扫描程序的设计2 掌握键盘扫描码的显示基本功能要求1 利用外接键盘实现键盘按键的选择2 利用8位动态七段码管显示实现按键扫描码的显示扩展功能选择性要求1 利用16*16点阵显示实现按键字符的显示3 系统主题设计3.1、总体设计思路本课程设计全部采用VHDL硬件描述语言,本设计所采用的平台是基于NIOSII-EP3C40核心板为核心的Altera CycloneIII器件的一款嵌入式系统开发平台,主核芯片为Altera Cyclone III EP3C80F780C8 FPGA利用SOPC-NIOSII-EP2C35开发板PS2键盘接口等资源,实现一个键盘驱动程序。

总体设计如下图:图1 键盘驱动总体设计图3.2、PS2键盘扫描模块设计3.2.1 PS2时序逻辑PS2通信协议是一种双向同步串行通迅协议。

通迅的两端通过CLOCK(时钟信号端)同步,并通过DATA(数据端口)交换数据。

任何一方如果想要抑制另外一方的通迅时,只需要把CLOCK拉到低电平。

PS2标准,规范每笔数据传输包含起始位(start bit)、扫描码(scan code)、奇同位检查(odd parity)、以及终止位(stop bit)共计11位,并以双向串行数据传输的方式,达到通信的目的。

且当主机端(host)或从机端(slave)并无传送或接收数据时,数据传输端口及频率均将升为高电位。

图16-1所示为每一笔数据传输所包含之内容如下:Start:起始位,总为‘0’(低电平)Data0~Data7:8位数据位(低位在前,高位在后)Parity:奇偶校验位(为奇校验)Stop:停止位,总为‘ 1’(高电平)图2显示了PS2 串行传输的时序逻辑。

图2 PS2 串行传输标准3.2.2 PS2接口的物理特性PS2控制接口仅使用到两条传输端口,一为频率端口,另一则为数据端口如图3所示,且此传输埠必为三态(Tri-State)并具有双向(bidirectional)特性。

PS2 传输产品上,常见为鼠标与键盘,两者的驱动原理均相同,仅扫描码(scan code)不同。

Male (Plug)Female(Socket)6-pin Mini-DIN (PS2):1 - Data2 - Not Implemented3 - Ground4 - Vcc (+5V)5 - Clock6 - Not Implemented 图 3 PS2 端口脚位定义数据包的结构键盘的状态每改变一次,键盘至少会发出三个字节的数据包,在有键按下时会向主机发送该键的通码(Make Code),当键释放时发送断码(Break Code)。

例如:键“ A”的通码为0x1C,键“A”的断码为:0xF0, 0x1C,因此当要传送键“ A”时,键盘发送的数据包的代码是:0x1C,0xF0, 0x1C。

具体通码与断码参考附录A3.2.3 PS2键盘扫描程序设计键盘扫描程序设计采用了自上而下的模块设计方法,考虑需要设计以下几部分模块:串转并模块,判断控制模块、分拣接收模块,判断发送模块等。

这几部分的逻辑关系如图 4所示:图4 逻辑关系图键盘扫描程序是整个设计的核心,其设计流程图如下:图5 键盘扫描程序流程图具体程序设计见附件3.3、七段LED数码管模块设计3.3.1七段LED数码管七段数码管是电子开发过程中常用的输出显示设备。

在实验系统中使用的是两个四位一体、共阴极型七段数码管。

其单个静态数码管如下图4-1所示。

图6 静态七段数码管由于七段数码管公共端连接到GND(共阴极型),当数码管的中的那一个段被输入高电平,则相应的这一段被点亮。

反之则不亮。

四位一体的七段数码管在单个静态数码管的基础上加入了用于选择哪一位数码管的位选信号端口。

八个数码管的a、b、c、d、e、f、g、h、dp都连在了一起,8个数码管分别由各自的位选信号来控制,被选通的数码管显示数据,其余关闭。

数码管显示模块的电路原理如图4-2所示,表4-1是其数码管的输入与FPGA的管脚连接表。

图7 数字时钟信号模块电路原理3.3.2七段LED程序设计七段LED数码管的显示采用动态扫描方式,如图显示,八个七段LED的位选采用3-8译码器提供位选信号,数字时钟选择1KHZ作为扫描时钟,此时,由于每个灯闪烁的间隔时间低于人肉眼的最低分辨间隔,所以看得的八个数码管都显示着数据,程序设计流程图如下图所示:图 8 七段数码管动态显示流程图3.4、16*16点阵显示模块3.4.1 16*16点阵原理16*16点阵由此256个LED通过排列组合而形成16行*16列的一个矩阵式的LED阵列,俗称16*16点阵。

单个的LED的电路如下图13-1所示:图13-1 单个LED电路图由上图可知,对于单个LED的电路图当Rn输入一个高电平,同时Cn输入一个低电平时,电路形成一个回路,LED发光。

也就是LED点阵对应的这个点被点亮。

16*16点阵也就是由16行和16列的LED组成,其中每一行的所有16个LED的Rn端并联在一起,每一列的所有16个LED的Cn端并联在一起。

通过给Rn输入一个高电平,也就相当于给这一列所有LED输入了一个高电平,这时只要某个LED的Cn端输入一个低电平时,对应的LED就会被点亮。

具体的电路如下图13-2所示:图9 16*16点阵电路原理图当我们选中第一列后,根据要显示汉字的第一列中所需要被点亮的点对应的Rn置为高电平,则在第一列中需要被点亮的点就会被点亮。

依此类推,显示第二列、第三列……第N列中需要被点亮的点。

然后根据人眼的视觉原理,将每一列显示的点的间隔时间设为一定的值,那么我们就会感觉显示一个完整的不闪烁的汉字。

同时也可以按照这个原理来显示其它的汉字。

下图11-4是一个汉字显示所需要的时序图:图10 显示时序图在上图中,在系统时钟的作用下,首先选取其中的一列,将数据输入让这列的LED 显示其数据(当为高电平时LED发光,否则不发光)。

然后选取下一列来显示下一列的数据。

当完成一个16*16点阵的数据输入时,即列选择计数到最后一列后,再从第一列开始输入相同的数据。

这样只要第一次显示第一列的数据和第二次显示第一列的数据的时间足够短,那么人的眼睛就会看到第一列的数据总是显示的,而没有停顿现象。

同样的道理其它列也是这样,直到显示下一个汉字。

在实际的运用当中,一个汉字是由多个八位的数据来构成的,那么要显示多个汉字的时候,这些数据可以根据一定的规则存放到存储器中,当要显示这个汉字的时候只要将存储器中对应的数据取出显示即可。

本实验的示例程序依次显示的是“欢迎使用嵌入式SOC开发系统”。

数据量不大,所以没有放入存储器中,而在程序中直接输入对应的一个16位的数据。

示例程序的字库数据的格式如下图13-5所示:图11 字库格式3.4.3 实验点阵原理图在此实验中,16*16点阵由4个8*8点阵组成,考虑到LED电流功耗与FPGA电流功耗的关系,在实验的电路中加入驱动电路。

具体电路如下图13-6所示。

与FPGA的管脚连接如表13-1所示。

图12 16*16点阵电路图3.4.4 16*16点阵显示程序设计16*16点阵的程序流程图如下:图1316*16点阵的程序流程图4 仿真与调试分析5 课程设计总结回顾起此次课程设计,我仍感慨颇多。

从理论到实践,在整整两星期的日子里,可以说得是甜中苦更多,但是确实学到很多很多的东西。

不仅巩固了以前所学过的知识,为接下来的数电考试作准备,而且拓展了知识面,也算大开眼界了。

通过这次课程设计使我懂得了理论与实际相结合是最重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

设计过程中说不遇到困难那是吹牛皮,这毕竟第一次做的,就算不是第一次,我想也还是会有不小麻烦,在电子的世界中怎么学都不为过。

同时在设计过程中也发现了自己很多不足之处,比如对以前所学过的知识理解得不够深刻,掌握得不够牢固。

这些都值得我们去思考。

此次电子课程设计,我为此投入了最大的热情和精力,从到处找资料,求助学长到自己设计电路图,选择元器件,使用EWB仿真电路,每一个过程都经过我们的共同探讨,其过程中出现了不少矛盾,但在学问面前一切都显得不重要。

相关文档
最新文档