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. 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仿真电路,每一个过程都经过我们的共同探讨,其过程中出现了不少矛盾,但在学问面前一切都显得不重要。

相关文档
最新文档