根据VHDL的键盘扫描及显示电路

合集下载

VHDL数码管动态扫描显示实验完整版

VHDL数码管动态扫描显示实验完整版

学生实验报告实验课名称:VHDL硬件描述语言实验项目名称:七段数码管译码扫描显示专业名称:电子科学与技术班级:***学号:***学生姓名:***教师姓名:***__2020__年_11_月_06_日组别_____________________同组同学_______________________实验日期_____年___月___日实验室名称______________成绩_____一、实验名称:七段数码管译码扫描显示二、实验目的与要求:实验目的:通过对译码和串行扫描电路的设计,理解多位数码管串行扫描输出的工作原理以及七段数码管的译码以及串行扫描输出的设计方法。

实验要求:通过VHDL编程,实现7段数码管的译码输出,并通过所设计的串行扫描控制,对8个7段数码管扫描输出,要求8个数码管从左到右分别显示“1”、“2” 、“3” 、“4” 、“5” 、“6” 、“7” 、“8”,并且每一位都对应有一个显示控制端,当控制端为高电平时,对应数码管点亮,否则熄灭。

具体接口如下所示:clk:时钟输入端,此信号是串行扫描的同步信号。

data_control[7..0]:8个分别控制数码管显示的输入信号;led_addr[7..0]:对8个数码管进行串行扫描的输出控制信号;seg7_data[6..0]:驱动7段数码管各显示段的输出信号;首先在QuartusII上进行功能和时序仿真,之后通过器件及其端口配置下载程序到SOPC开发平台中。

在硬件实现中,要求:1. 用实验平台的8个数码管输出显示(共阴接法),并且用其下方的8个按键分别控制对应数码管的显示与否。

注:采用I/O模式5实现输入控制和输出显示方式。

为了实现数码管的串行扫描,必须把数码管连接成串行控制输出电路。

2. 扫描所用的时钟信号采用实验平台的clock0时钟资源:可以通过跳线选择不同的时钟频率,此频率不能选择的太高或太低,频率太低将不满足人眼视觉暂留特性的要求,频率太高,器件速度跟不上,地址和数据无法在1个时钟周期大部分时间内对准,造成显示模糊不清。

VHDL --计数显示电路

VHDL --计数显示电路

实验二计数显示电路一设计要求:设计一个输出为3位BCD码的计数显示电路。

该计数显示电路由三个模块构成:(1)十进制计数器(BCD_CNT)(2)七段显示译码器电路(DEC_LED)(3)分时总线切换电路(SCAN)。

二设计思路及原理:根据逻辑图采用层次化的设计方法,电路原理如图所示。

图1电路原理图长度为0~999的三位BCD码加法计数器,输出数据总线的宽度为12位。

将12位二进制数据总线经过分时总线切换电路模块,分时后的4位8421BCD送到七段显示译码器电路,计数值译为对应的编码,并在LED数码管上显示出对应的十进制数。

LED数码管共有七个输入端(a~g),三个数码管采用扫描显示方法,按个位、十位、百位的次序依次显示12位二进制的低四位、中间四位和高四位。

图2是源程序的RTL级电路图。

整个设计分十进制计数器模块(BCD_CNT)、分时总线切换电路模块(SCAN)和七段显示译码器电路模块(DEC_LED)构成。

总的输入为十进制计数器时钟clk,异步复位清零信号reset,分时总线切换电路时钟CL。

在reset信号为0期间,在每个clk的上升沿计数器将加1。

在每个cl的上升沿将会改变对三个数码管的扫描选通。

总的输出为数码管选通信号sel(三位),输出到七段数码管的数据信号ledout(七位)。

图2为了检验系统的正确与否,这里还添加了四个输出:十进制计数器输出c1(四位)、c2(四位)、c3(四位),分时总线切换电路一个输出q(四位),它是对计数器输出c1、c2、c3进行分时输出。

分时选通个、十、百位的数码管并将相应要显示的数据输出到七段显示译码器电路(DEC_LED),由此实现数码管的动态扫描显示。

三实验步骤及VHDL源代码:(1)十进制计数器电路(BCD_CNT)模块:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity BCD_CNT isport(clk,reset:in std_logic;c1,c2,c3:out std_logic_vector(3 downto 0));end BCD_CNT;architecture cnt of BCD_CNT issignal cn1,cn2,cn3:std_logic_vector(3 downto 0);begincnt1:process(clk,reset)beginif(reset='1') then cn1<="0000";elsif(clk'event and clk='1') thenif(cn1<9) then cn1<=cn1+1;else cn1<="0000";end if;end if;end process cnt1;c1<=cn1;cnt2:process(cn1(3),reset)beginif(reset='1') then cn2<="0000";elsif(cn1(3)'event and cn1(3)='0') thenif(cn2<9) then cn2<=cn2+1;else cn2<="0000";end if;end if;end process cnt2;c2<=cn2;cnt3:process(cn2(3),reset)beginif(reset='1') then cn3<="0000";elsif(cn2(3)'event and cn2(3)='0') thenif(cn3<9) then cn3<=cn3+1;else cn3<="0000";end if;end if;end process cnt3;c3<=cn3;end cnt;(2)分时总线切换电路(SCAN)模块:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity SCAN isport( c1,c2,c3:in std_logic_vector(3 downto 0);cl:in std_logic;q:out std_logic_vector(3 downto 0);sel:out std_logic_vector(2 downto 0));end SCAN;architecture one of SCAN issignal cnt:std_logic_vector(1 downto 0);signal q_temp:std_logic_vector(3 downto 0);signal sel_temp:std_logic_vector(2 downto 0);beginp1:process(cl)beginif(cl'event and cl='1') thenif(cnt<2) then cnt<=cnt+1;else cnt<="00";end if;end if;end process p1;end one;(3)七段显示译码器电路(DEC_LED)模块:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity DEC_LED isport( q:in std_logic_vector(3 downto 0);ledout:out std_logic_vector(6 downto 0));end DEC_LED;architecture one of DEC_LED isbeginprocess(q) --七段译码电路begincase q iswhen "0000" => ledout<="0111111"; --根据七段数码管亮灭正确为ledout赋值when "0001" => ledout<="0000110";when "0010" => ledout<="1011011";when "0011" => ledout<="1001111";when "0100" => ledout<="1100110";when "0101" => ledout<="1101101";when "0110" => ledout<="1111101";when "0111" => ledout<="0000111";when "1000" => ledout<="1111111";when "1001" => ledout<="1101111";when others => null;end case;end process;end one;四仿真结果编译结束后,新建一个”Vector Waveform File”,根据程序中的输入和输出的信号,分别’insert node or bus ’进行设置。

实验二 键盘扫描实验

实验二  键盘扫描实验

实验二键盘扫描实验一、实验目的 熟悉 VHDL 的语法和编译排错,重点掌握组合逻辑中显示译码器的设计。

附加学习 键盘和数码管显示控制。

二、实验内容 1. 设计一个 BCD 码到 LED 的七段译码器,非 BCD 值时仅 G 段亮(输出为“—” ) 。

2. 下载验证键盘显示实验。

3. 改写程序,将学号的数据固定地显示在 1-8 位数码管上。

4. 将 F 键功能改为换向键,即可以控制数字滚动显示的方向。

三、实验步骤 1. 用文本输入法,在键盘显示程序的译码部分,分别用三种语法填写 BCD 到 LED 的译 码器。

三种语法为 When else、With select、Case,建议使用模板。

每一种都需编 译通过提交程序。

2. 选一种语法,编译,绑定引脚,下载验证结果。

3. 改写程序,将 0--7 的数据固定地显示在 1-8 位数码管上。

编译、下载验证结果。

4. 将 F 键功能改为换向键,即可以控制数字滚动显示的方向。

编译、下载验证结果。

四、实验硬件图图 1 4x4 键盘图 2 数码管动态显示原理框图一种推荐的适配卡连线如下表所示: 输 信 号 CLK1 入 对应芯片引 入 名 端子名 端 子 名 PIN_A20 10HZ 功 能 时钟 输 信 号 出 名 对应芯片 引 入 功 端 子 名 端子名 PIN_C1 PIN_B1 PIN_C3 PIN_E5 PIN_B3 PIN_B4 PIN_A16 PIN_C17 PIN_A17 PIN_A18 PIN_A7 PIN_A8 PIN_A9 PIN_A10 C D E F G H C1 C2 C3 C4 R1 R2 R3 R4 键盘行 能 段选 段选 段选 段选 段选 段选 键盘列LED_SEG[2] LED_SEG[3] LED_SEG[4]LED_BIT[0] PIN_G4 LED_BIT[1] PIN_E3 LED_BIT[2] PIN_D2 LED_BIT[3] PIN_C2 LED_BIT[4] PIN_B2 LED_BIT[5] PIN_C4 LED_BIT[6] PIN_E6 LED_BIT[7] PIN_A3 LED_SEG[0] PIN_G3 LED_SEG[1] PIN_E4BIT1 BIT2 BIT3 BIT4 BIT5 BIT6 BIT7 BIT8 A B位选 1 位选 2 位选 3 位选 4 位选 5 位选 6 位选 7 位选 8 段选 段选LED_SEG[5] LED_SEG[6] LED_SEG[7] KEYCOL[0] KEYCOL[1] KEYCOL[2] KEYCOL[3] KEYROW[1] KEYROW[2] KEYROW[3] KEYROW[4]五、实验文件(需要填写译码部分) KEYSCAN 时钟扫描程序 文件名:KEYSCAN.VHD library IEEE; use IEEE.std_logic_1164.all; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity KEYSCAN is port ( CLK1: in STD_LOGIC; KEYROW1,KEYROW2,KEYROW3,KEYROW4: in STD_LOGIC;--键盘行接口 KEYCOL: out STD_LOGIC_VECTOR (3 DOWNTO 0);--键盘列接口 LED_BIT: out STD_LOGIC_VECTOR (7 DOWNTO 0); --LED 位选接口 LED_SEG: out STD_LOGIC_VECTOR (7 DOWNTO 0)); --LED 段选接口 end KEYSCAN; architecture KEYSCAN_ARCH of KEYSCAN is SIGNAL SEG : STD_LOGIC_VECTOR (6 DOWNTO 0);--LED 段选 SIGNAL BIT : STD_LOGIC_VECTOR (2 DOWNTO 0);--LED 位选 SIGNAL NUM : STD_LOGIC_VECTOR (3 DOWNTO 0);--显示数字 SIGNAL COUNT : STD_LOGIC_VECTOR (4 DOWNTO 0);--计数脉冲 SIGNAL COUNT0 : STD_LOGIC; --计数脉冲最低位 LSB SIGNAL COL: STD_LOGIC_VECTOR (1 DOWNTO 0); --键盘列begin --计数器模块 PROCESS (CLK1) BEGIN IF CLK1'event AND CLK1 = '1' THEN COUNT <= COUNT+1; END IF; END PROCESS; --计数器模块 --键盘模块 COL <=COUNT(3 DOWNTO 2); KEYCOL <= "1110" WHEN COL = 0 ELSE "1101" WHEN COL = 1 ELSE "1011" WHEN COL = 2 ELSE "0111" WHEN COL = 3 ELSE "1111"; COUNT0 <= COUNT(0); PROCESS (count0,COUNT,KEYIN1,KEYIN2) BEGIN IF COUNT0'event and (COUNT0 = '1')THEN --分四行扫描 IF (KEYROW1 = '0') and (COUNT(1) = '0') THEN NUM(3 DOWNTO 2)<= "00"; NUM(1 DOWNTO 0) <= COUNT(3 DOWNTO 2); --COUNT(1 DOWNTO 0)只起分频延时的作用 ELSIF (KEYROW2 = '0') and (COUNT(1) = '0') THEN NUM(3 DOWNTO 2)<= "01"; NUM(1 DOWNTO 0) <= COUNT(3 DOWNTO 2); ELSIF (KEYROW3 = '0') and (COUNT(1) = '0') THEN NUM(3 DOWNTO 2)<= "10"; NUM(1 DOWNTO 0) <= COUNT(3 DOWNTO 2); ELSIF (KEYROW4 = '0') and (COUNT(1) = '0') THEN NUM(3 DOWNTO 2)<= "11"; NUM(1 DOWNTO 0) <= COUNT(3 DOWNTO 2); END IF; END IF; END PROCESS; --键盘模块--显示模块 BIT <= COUNT(4 DOWNTO 2); --位选扫描信号 LED_BIT <= "11111110" WHEN BIT = 0 ELSE "11111101" WHEN BIT = 1 ELSE "11111011" WHEN BIT = 2 ELSE "11110111" WHEN BIT = 3 ELSE "11101111" WHEN BIT = 4 ELSE "11011111" WHEN BIT = 5 ELSE "10111111" WHEN BIT = 6 ELSE "01111111" WHEN BIT = 7 ELSE "11111111"; --译码部分请填写完整 --pgfedcba --参考码表 0-f 十六进制 --3FH 06H 5BH 4FH --6FH 77H 7CH 39H --参考码表 0-f 二进制 --0111111 0000110 1011011 --1111111 1101111 1110111--位选扫描信号译码66H 6DH 7DH 07H 5EH 79H 71H 1001111 11111007FH1100110 1101101 1111101 0000111 0111001 1011110 1111001 1110001--译码部分完,输出到 LED 段选,同时选通位选端 LED_SEG(6 DOWNTO 0)<=SEG; LED_SEG(7) <= '0'; --显示模块 end KEYSCAN_ARCH; 六、实验注意事项 程序较大,结合电路理解很费时间,应事先预习。

VHDL计数显示电路

VHDL计数显示电路

计数显示电路的VHDL设计课程名称:VHDL数字系统设计与测试练习题目:计数显示电路设计学生姓名:冯姣学号:1101120461一、设计功能与要求设计一个输出为3位BCD码的计数显示电路。

该计数显示电路由三个模块构成:1、十进制计数器(BCD_CNT)2、七段显示译码器电路(DEC_LED)3、分时总线切换电路(SCAN)。

根据逻辑图采用层次化的设计方法,简单的电路原理如图1示。

图1 计数显示电路原理图1二、设计思路整个设计分十进制计数器模块(BCD_CNT)、分时总线切换电路模块(SCAN)和七段显示译码器电路模块(DEC_LED)构成。

总的输入为十进制计数器时钟clk_1k,异步复位清零信号rst_n,分时总线切换电路时钟clk_1m。

在rst信号为0期间,在每个clk的上升沿计数器将加1。

在每个clk_1k的上升沿将会改变对三个数码管的扫描选通。

总的输出为数码管选通信号sel(三位),输出到七段数码管的数据信号led(七位)。

根据设计思路,绘制较详细的原理图如图2。

图2 计数显示电路原理图2三、程序与仿真结果1.十进制计数器设计该模块完成bcd码的计数过程,每当系统时钟的上升沿到来,计数器的低位加1,满10进位,依次类推完成计数功能,复位信号使计数器清零。

源程序如下:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity bcd_cnt isport(clk_1K,rst_n:in std_logic;out1,out2,out3:out std_logic_vector(3 downto 0));end bcd_cnt;architecture cnt of bcd_cnt issignal bcdh,bcdm,bcdl:std_logic_vector(3 downto 0);--bcd码高中低位beginprocess(clk_1K,rst_n) --bcd码计数器beginif rst_n='0' thenbcdl<="0000";bcdm<="0000";bcdh<="0000";elsif (clk_1K'event and clk_1K='1') thenif bcdl<"1001" thenbcdl<=bcdl+1;elsebcdl<="0000";if bcdm<"1001" thenbcdm<=bcdm+1;elsebcdm<="0000";if bcdh<"1001" thenbcdh<=bcdh+1;elsebcdh<="0000";end if;end if;end if;end if;end process;process(clk_1K,rst_n)--输出模块beginif rst_n='0' thenout1<="0000";out2<="0000";out3<="0000";elseout1<=bcdl;out2<=bcdm;out3<=bcdh;end if;end process;end cnt;在modelsim中进行行为仿真,得到时序图如下,从时序图上可以清楚的看出计数功能的正确实现,并且同步输出。

VHDI/设计电子密码锁

VHDI/设计电子密码锁

VHDI/设计电子密码锁作者:薛明明来源:《吉林省教育学院学报·上旬刊》 2012年第10期薛明明(伊犁师范学院物理系,新疆伊宁835000)摘要:随着科学的发展,当前电子产品发展的速度非常之快,尤其是可编程逻辑器件。

本文详细叙述了采用VHDL来进行可编程逻辑器件功能设计过程及VHDL的显著特点、电子密码锁的设计过程。

关键词:VHDL;可编程逻辑器件(PLD);MAX+PLUSⅡ;电子密码锁中图分类号:TP21文献标识码:A文章编号:1671—1580(2012)10—0148—03一、引言随着生产和科学技术的发展,复杂的逻辑系统越来越广泛地运用于科学和工程实践当中。

那么这样一来,必然要求整个电路从设计规模和复杂程度上有一个大幅度的提高而封装尺寸则尽量要求做到微小化。

为此,生产商必须采用少量的IC器件和面积尽可能小的PCB板来研制高集成化的复杂系统。

但是,从设计的角度来看,以往采用的那种电原理图的设计输入的门级描述方法却严重制约了产品的开发能力。

随着半导体技术的不断进步,现代电子产品的复杂度也在日益加大,一个电子系统可能由数万个中小规模通用集成电路构成,这就带来了体积大、功耗大、可靠性差的问题,解决这一问题的有效方法就是采用ASIC(Application Specific Integrated Circuits)芯片进行设计。

二、VHDL的特点可编程ASIC也称为可编程逻辑器件(Programmable Logic Device)。

可编程逻辑器件是70年代发展起来的一种新型逻辑器件,当初主要用以解决数字系统中各类存储问题,发展至今已经成为实现数字系统的一种重要手段。

可编程逻辑器件实现了设计阶段的硬件仿真(Emulation),使得微电子设计实现了早期集成和软硬件联合验证。

设计者可以快速地创建一个芯片设计的硬件模型,利用仿真软件将设计映射到可重复编程的电路器件中。

由此产生的虚拟硅片与真实芯片的功能一致,可以确保正确的时序关系,运行真实的软件。

基于VHDL的矩阵键盘及显示电路设计

基于VHDL的矩阵键盘及显示电路设计

基于VHDL的矩阵键盘及显示电路设计
张喜凤;屈宝鹏
【期刊名称】《现代电子技术》
【年(卷),期】2010(033)016
【摘要】为了有效防止机械式键盘按键抖动带来的数据错误,这里在Quartus Ⅱ开发环境下,采用VHDL语言设计了一种能够将机械式4×4矩阵键盘的按键值依次显示到8个7段数码管上的矩阵键盘及显示电路.仿真结果表明,所设计的矩阵键盘及显示电路成功地实现了按键防抖和按键数据的准确显示.以ACEX1K系列
EP1K30QC208芯片为硬件环境,验证了各项设计功能的正确性.
【总页数】3页(P14-16)
【作者】张喜凤;屈宝鹏
【作者单位】陕西国防工业职业技术学院,陕西,西安,710300;陕西国防工业职业技术学院,陕西,西安,710300
【正文语种】中文
【中图分类】TN710-34;TP332.1+2
【相关文献】
1.基于NIOSⅡ的矩阵键盘和液晶显示外设组件的设计 [J], 葛远香;胡开明
2.基于VHDL的键盘扫描及显示电路设计 [J], 樊国梁;张晓燕
3.基于FPGA的矩阵键盘控制器及显示电路的设计 [J], 王荣扬;吴国强
4.VHDL在显示屏控制电路设计中的应用 [J], 刘会军;贺洪江;赵琦
5.基于VHDL语言的英文字母显示电路设计 [J], 陆健;陆柳延
因版权原因,仅展示原文概要,查看原文内容请购买。

vhdl共阴极数码显示电路

vhdl共阴极数码显示电路

vhdl共阴极数码显示电路VHDL共阴极数码显示电路VHDL是一种硬件描述语言,用于描述数字电路和系统。

共阴极数码显示电路是一种常见的数字电路,用于显示数字和字母等字符。

在本文中,我们将介绍如何使用VHDL设计共阴极数码显示电路。

1. 共阴极数码管共阴极数码管是一种常见的数码管,它由多个LED组成,每个LED代表一个数字或字母。

共阴极数码管的阴极是共用的,而每个LED的阳极是独立的。

当某个LED的阳极接通时,它会发光,显示相应的数字或字母。

2. VHDL设计VHDL可以用于描述数字电路和系统。

在设计共阴极数码显示电路时,我们需要使用VHDL描述每个LED的控制信号。

以下是一个简单的VHDL代码示例:entity common_cathode isport (a, b, c, d, e, f, g : out std_logic;num : in integer range 0 to 9);end common_cathode;architecture Behavioral of common_cathode isbegincase num iswhen 0 =>a <= '0';b <= '0';c <= '0';d <= '0';e <= '0';f <= '0';g <= '1';when 1 =>a <= '1';b <= '0';c <= '0';d <= '1';e <= '1';f <= '1';g <= '1';when 2 =>a <= '0';b <= '0';c <= '1';d <= '0';e <= '0';f <= '1';g <= '0';when 3 =>a <= '0';b <= '0';c <= '0';d <= '0';e <= '1';f <= '1';g <= '0';when 4 =>a <= '1';b <= '0';c <= '0';d <= '1';e <= '1';f <= '0';g <= '0';when 5 =>a <= '0';b <= '1';c <= '0';d <= '0';e <= '1';f <= '0'; g<= '0';when 6 =>a <= '0';b <= '1';c <= '0';d <= '0';e <= '0';f <= '0'; g<= '0';when 7 =>a <= '0';b <= '0';c <= '0';d <= '1';e <= '1';f <= '1'; g<= '1';when 8 =>a <= '0';b <= '0';c <= '0';d <= '0';e <= '0';f <= '0'; g<= '0';when 9 =>a <= '0';b <= '0';c <= '0';d <= '1';e <= '1';f <= '0'; g<= '0';when others =>a <= '0';b <= '0';c <= '0';d <= '0';e <= '0';f <= '0'; g<= '0';end case;end Behavioral;在上面的代码中,我们定义了一个实体common_cathode,它有7个输出端口a、b、c、d、e、f、g和一个输入端口num。

vhdl共阴极数码显示电路

vhdl共阴极数码显示电路

VHDL共阴极数码显示电路一、引言数字显示电路是现代电子设备中常见的基础电路之一,它能将数字信号转换为人们可以直观理解的数字显示形式。

在数字显示电路中,共阴极数码显示电路是一种常见且重要的设计方式。

本文将深入探讨VHDL共阴极数码显示电路的设计原理及实现过程。

二、设计原理1. 共阴极数码管共阴极数码管是一种常见的数字显示器件,它由多个发光二极管(LED)组成。

每个数码管有7个LED芯片,用于显示0-9的数字。

共阴极数码管在数码显示电路中通过编码器和驱动器来驱动。

2. VHDL编程语言VHDL(VHSIC Hardware Description Language)是一种用于描述数字电路和系统设计的硬件描述语言。

VHDL具有强大的描述能力,可以将电路的结构和功能以类似代码的方式进行描述。

在设计共阴极数码显示电路时,可以使用VHDL语言进行编程。

三、设计过程1. 数码管驱动器设计数码管驱动器是实现数码管显示的关键组件,它通过有效的时间分配控制数码管的亮灭。

数码管驱动器可以使用有限状态机来实现,通过组合电路和时钟信号进行运行控制。

2. VHDL编程实现利用VHDL编程语言,可以将数码管驱动器的功能进行描述和实现。

首先需要定义数码管的输入和输出信号,包括时钟信号、使能信号和数据输入信号。

然后利用VHDL语言的结构体和组合逻辑运算符来实现数码管驱动器的状态转换和输出控制。

3. 时序约束设计在VHDL编程中,由于电路的运行速度和时钟频率的要求,需要进行时序约束设计。

通过设置时序约束,可以保证电路在不同条件下的稳定工作。

时序约束包括时钟延迟、数据传输延迟和时钟周期等方面的约束。

4. 仿真和验证在进行VHDL编程后,需要利用仿真工具进行电路的仿真和验证。

通过对电路进行不同输入条件和时钟频率下的仿真,可以验证电路的正确性和稳定性。

如果仿真结果符合预期,则可以进入下一阶段的电路实现。

四、实例应用共阴极数码显示电路在实际应用中有广泛的应用场景。

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

_ 广西工学院

EDA 课程设计

说 明 书

设计题目 基于VHDL的键盘扫描 及显示电路

系 别 电控系 专业班级 __________________ 学生姓名 __________________ 学 号 __________________ 指导教师 __________________ 日 期 __________________ _ 基于VHDL的键盘扫描及显示电路 一、工作原理: 可编程器件的KEY_HANG[3..0]行信号输出端不停循环输出“1110”“1101”“1011”“0111”。当没有键按下时可编程器件的KEY_LIE[3..0]列信号输入端检测到的是“1111”。当有按键按下时,如按下1,此时KEY_HANG[3..0]行信号输出为“0111”,即KEY_HANG[3..0]的3管脚为“0”,可由电路看出,此时输入端KEY_LIE[3..0]检测到的将是“0111”。KEY_LIE[3..0]的3管脚为0,可以在编写程序时,将输出信号KEY_HANG[3..0]与输入信号KEY_LIE[3..0]同时判断,比如可以认为当数据“KEY_HANG&KEY_LIE”为“01110111”时,可译码成数据1,。同理可得其他按键的编码。根据不同数据的编码译成不同的数据。 名称 IO属性 描述 备注 clk in 输入时钟,1K和40K频率 KEY_HANG[3..0] out 矩阵键盘的扫描输入端口

KEY_LIE[3:0] in 矩阵键盘的扫描输出端口 START out 数据输出标志 DISP out 数码管译码显示译码7bit _ DATA[6..0] 输出 DASP SEL[1..0] out 数码管扫描输出 2bit

CLK_1K

CLK_40K CLK_1K START

KEY_HANG[3..0] CLE_40K DATA_P[7..0] DISP DATA[6..0] KEY_LIE DASP SEL[1..0] _

二、设计思路: 1.循环输出行信号,检测列信号输入,将行列信号相并。 2.译键值。 3.去抖动。在译没一个键值后,为了防止抖动,加了一个计算环节,一旦检测到列信号后,译码,紧跟着进入计数环节,此时键抖动不会进入其他环节,这样可以防止抖动。 4.数码管译码、循环显示。 电路的具体功能罗列如下: 1) 采用4×4矩阵键盘作为操作数和操作符的输入设备。 2) 采用2位8段数码管作为输出显示设备,显示按下的数字及简单的功能。 3) 由于所有键盘在按下或者弹起的时候均有按键抖动,所以应该采用去抖电路,当检测到有按键按下去的时候,应该延时20ms后,再进行检测,如果仍有键盘按键被按下去的话,则进行键盘读值。 矩阵键盘模块key_4_4的RTL电路图如下 所示。 _ 当CLK_1K上升沿到来时状态转为state0,然后判断列与非后的值,看是否有按键按下,如果有输入数据,则自动启动20ms的计数器,当计满数后,产生一个指示信号,此信号为1bit,高电平有效。当读到此指示信号后,便再次将row信号锁存至寄存器,便得到键盘的一个返回值。如果row没有变化,则state转换为state2,对第二行进行按键扫描。依此类推,扫描第三行与第四行。 因为普通的按键都是接触式的,当按键闭合或释放时,上下接触面都会产生一个很短暂的抖动,如图2.2所示,这个抖动时间一般都会持续5-10ms,虽然这个抖动时间很短,但对于FPGA工作在50M的高频率上的器件来说,还是可以捕捉的到的。为了使CPU对于一次按键操作只处理一次,在软件中必须加入去除抖动处理。 _ 图2.2 按键闭合时产生的抖动

由图中可以看出,最简单的去抖方法就是每隔一段时间读一次键盘,时间间隔大于10ms即可。如果连续两次检测都有按键被按下,则可以肯定有按键被按下,而且也进入闭合稳定期。 三、数码管显示译码模块设计 数码管显示译码电路主要用来对实际的二进制数据装换为8段数码管的实际显示控制码,采用两个2位的8段共阴极数码管,数码管的显示方式有两种:静态显示和动态显示。具体如下: 静态显示方式:所谓静态显示就是指无论是多少位数码管,同时处于显示状态。 静态显示的优点是:数码管显示无闪烁,亮度高,软件控制比较容易;缺点是:需要的硬件电路较多(每一个数码管都需要一个锁存器),将造成很大的不便,同时由于所有数码管都处于被点亮状态,所以需要的电流很大,当数码管的数量增多时,对电源的要求也就随之增高。所以,在大部分的硬件电路设计中,很少采用静态显示方式。 动态显示方式:所谓动态显示,是指无论在任何时刻只有一个数码管处于显示状态,每个数码管轮流显示。 动态显示的优点是:硬件电路简单(数码管越多,这个优势越明显),由于每个时刻 _ 只有一个数码管被点亮,所以所有数码管消耗的电流较小;缺点是:数码管亮度不如静态显示时的亮度高,例如有8个数码管,以1秒为单位,每个数码管点亮的时间只有1/8秒,所以亮度较低;如果刷新率较低,会出现闪烁现象;如果数码管直接与单片机连接,软件控制上会比较麻烦等。 显示译码方式如下: 1) 时钟上升沿到来时分别对位选和段选进行译码。 2) 将输入的2bite位选数据译码成4比特数据控制数码管的2位,由于是共阴极数码管要选定相应的数码管则使该位位低电平,其它位为高电平即可,如:0000译码为0111_1111,对应于实验板上的左边第一位数码管。 3) 将输入的4bite段选数据译码为8比特数据控制8个LED的亮灭,最高位接A,最低位接小数点位DP。若要显示0则对应的译码为 8’b1111_1100。

四、仿真 没有键按下时行循环输出“1110”“1101”“1011”“0111” _ 当随机按下时行保持所按下的状态不变

五、结论 这次EDA课程设计历时十天,学到很多很多的东西。同时不仅可以巩固以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次设计,进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。特别是当每一个子模块编写调试成功时,都会很高兴。在编写顶层文件的程序时,遇到了不少问题,特别是各元件之间的连接,以及信号的定义,总是有错误。排除困难后,程序编译就通过了。在波形仿真时,也遇到了一点困难,想要的结果不能在波形上得到正确的显示,后来,经过屡次的调试之后,才发现在写代码之前对信号的相位考虑不足。 通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独 _ 立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。 总的来说,这次设计还是比较成功的,在设计中遇到了很多问题,最后在老师的辛勤指导下,终于迎刃而解,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。最后,对给过我帮助的老师和所有同学再次表示忠心的感谢!

六、程序 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY HH IS PORT( _ CLK_1K : IN STD_LOGIC; -- 时钟输入1KHZ CLK_40K : IN STD_LOGIC; --时钟输入40K HZ 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 HH IS SIGNAL INT : STD_LOGIC; --列与非 信号 SIGNAL CLK_SEL : STD_LOGIC;--键值控制1khz的时钟信号 SIGNAL START_REG:STD_LOGIC; --数据输出标志信号 SIGNAL DISP_SEL_REG:STD_LOGIC_VECTOR(1 DOWNTO 0);--数码管显示扫描信号 SIGNAL DATA_L,DATA_H:STD_LOGIC_VECTOR(3 DOWNTO 0);--二-十进制 低位、高位信号

相关文档
最新文档