利用键盘控制点阵进行汉字显示

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

中北大学
课程设计说明书
学生姓名:刘锦峰学号:08060441X40 学院: 信息商务学院
专业: 电子科学与技术
题目: 利用键盘控制点阵进行汉字显示
指导教师:王红亮段俊萍职称: 讲师
2011 年 6 月 24 日
目录
1.课程设计目的 (2)
2.课程设计内容及要求 (2)
2.1设计内容 (2)
2.2设计要求 (2)
3.设计方案及实现情况 (2)
3.1设计思路 (2)
3.2工作原理及框图 (2)
3.3各模块功能描述 (4)
3.4仿真结果 (12)
3.5试验箱验证情况 (14)
4.课程设计总结 (16)
5.参考文献…………………………………………………………………………
1 6
1、课程设计目的
1.学习操作数字电路设计实验开发系统,掌握点阵显示模块的工作原理及应用。

2.掌握组合逻辑电路、时序逻辑电路的设计方法。

3.学习掌握可编程器件设计的全过程。

2、课程设计内容和要求
2.1、设计内容
用VHDL语言编写程序,使键盘控制点阵显示模块显示汉字。

2.2、设计要求
1.学习掌握键盘控制模块、点阵显示模块的工作原理及应用;
2. 熟练掌握VHDL编程语言,编写键盘控制模块的控制逻辑;
3. 仿真所编写的程序,模拟验证所编写的模块功能;
4. 下载程序到芯片中,硬件验证所设置的功能,能够实现汉字显示;
5. 整理设计内容,编写设计说明书。

3、设计方案及实现情况
3.1、设计思路
通过键盘扫描程序的行输出与列输入就可以确认按键的状态,再通过键盘处理程序便可识别键值。

将产生的键值信号送到4-16译码器,经过译码器译码将
键值通过LED点阵显示出来。

3.2、工作原理及框图
3.2.1、矩阵式键盘的工作原理
矩阵式键盘又叫行列式键盘,是用I/O口线组成的行、列矩阵结构,在每根
行线与列线的交叉处,二线不直接相通而是通过一个按键跨接接通。

采用这种矩
阵结构只需M根行输出线和N根列输入线,就可连接M×N个按键。

通过键盘扫
描程序的行输出与列输入就可确认按键的状态,再通过键盘处理程序便可识别键
值。

如图1
图1 4×8矩阵键盘电路原理图
键盘译码电路,主要是根据当按键时键盘会输出四个KIN值(KIN3—KIN0)
和三个SEL值(SEL2—SEL0)。

这些构成了键盘的参数。

反过来就可以以这些参
数来确定具体的键值。

有了键盘参数表,要写出键盘译码电路的VHDL程序就非
常容易了,尤其针对有表可以对照的电路设计,只要使用CASE-WHEN或WHEN-ELSE
语句,便可轻松完成设计。

表1 键盘参数表
SEL2-SEL0 KIN3-KIN0 对应的按键SEL2-SEL0 KIN3-KIN0 对应的按键
000 1110 0
100
1110 MEM 1101 6 1101 8 1011 LAST 1011 E 0111 CTRL 0111 EMPTY4
001 1110 1
101
1110 ESC 1101 7 1101 9
1011 STEP 1011 F 0111 EMPTY1 0111 SHIFT
010 1110 2
110
1110 4 1101 REG 1101 A 1011 C 1011 NEXT 0111 EMPTY2 0111 NONE
011 1110 3
111
1110 5 1101 EXEC 1101 B 1011 D 1011 ENTER 0111 EMPTY3 0111 NONE
3.2.2、点阵的工作原理
点阵式LED显示器采用逐行扫描式工作。

要使点阵显示出一个字符的编程方法是:首先选通第一行;接着,向行码锁存器写入该行的字型码(即列数据)。

然后,按相同的方式选通第二行,写第二行的字型码……由此类推,直到写完所有行的字型码,完成一个字符的显示。

如果要使多个点阵循环显示多个字符,只要把显示的各个字符按顺序安排在显示缓冲区,然后根据显示的字符去查表,再按一定的时序向各个字形行码锁存器和行扫描器输入相应的字形行码和行扫描码,便可达到目的。

图2 点阵字符的显示
3.2.3、程序框图
图3 程序总图
3.3、各模块功能描述
3.3.1、分频模块
此模块对时钟信号进行分频,产生时序信号。

图4 分频模块图程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity fenpin is
port(clk:in std_logic;
divclk:out std_logic);
end fenpin;
architecture dclk_arch of fenpin is
begin
process(clk)
variable cnt:std_logic_vector(1 downto 0);
variable a:std_logic;
begin
if clk'event and clk='1' then
if a='0' then
if cnt="11" then
a:='1';
else
cnt:=cnt+1;
end if;
elsif a='1' then
if cnt="00" then
a:='0';
else
cnt:=cnt-1;
end if;
end if;
end if;
divclk<=a;
end process;
end dclk_arch;
3.3.2、CNT模块
此模块产生选通信号和键盘扫描信号,键盘扫描信号的变化顺序为000-001-010-011-100-101-110-111,由sel2&sel1&sel0来决定。

依次循环变化来扫描8列按键。

其中sel3无影响。

图5 CNT模块图程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity cnt is
port( clk:in std_logic;
sel3,sel2,sel1,sel0:out std_logic); end cnt;
architecture cnt_arch of cnt is
begin
process(clk)
variable cn:std_logic_vector(3 downto 0); begin
if clk'event and clk='1' then
if cn="1111" then
cn:="0000";
else
cn:=cn+1;
end if;
end if;
sel0<=cn(0);
sel1<=cn(1);
sel2<=cn(2);
sel3<=cn(3);
end process;
end cnt_arch;
3.3.3、键盘译码模块
当按下数字键时,键盘所产生的的输出KIN3--KIN0跟扫描信号SEL3--SEL0结合,编译成与数字键键值相对应数字的二位二进制码,传给到显示模块。

图6 键盘译码程序框图
程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity ym is
port(kin3,kin2,kin1,kin0:in std_logic;
clk:in std_logic;
sel3,sel2,sel1,sel0:in std_logic;
p:out std_logic_vector(1 downto 0));
end ym;
architecture ym_arch of ym is
signal a:std_logic_vector(3 downto 0);
signal b:std_logic_vector(3 downto 0);
signal q:std_logic_vector(1 downto 0);
signal m:std_logic_vector(7 downto 0);
begin
a<=kin3&kin2&kin1&kin0;
b<=sel3&sel2&sel1&sel0;
m<=a&b;
process(clk)
begin
if clk'event and clk='1'then
case m is
when"11100000"=>q<="00";
when"11100001"=>q<="01";
when"11100010"=>q<="10";
when"11100011"=>q<="11";
when others =>q<=q;
end case;
end if;
p<=q;
end process;
end ym_arch;
3.3.4、显示模块
此模块对应产生列字符扫描信号
图7 显示模块程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity cora is
port(ch:in std_logic_vector(1 downto 0);
clk:in std_logic;
se0,se1,se2,se3:in std_logic;
q:out std_logic_vector(15 downto 0));
end cora;
architecture corn_arc of cora is
signal sel:std_logic_vector(3 downto 0);
begin
sel<=se3&se2&se1&se0;
process(ch,sel,clk)
variable cnt,bnt:integer range 0 to 1000;
begin
if clk'event and clk='1' then
case ch is
when "00"=>
case sel is
when "0000"=>q<="0000000000000000"; when "0001"=>q<="0000001110000000"; when "0010"=>q<="0000001110000000"; when "0011"=>q<="0000001110000000"; when "0100"=>q<="0000001110000000"; when "0101"=>q<="1111111111111110"; when "0110"=>q<="1111111111111110"; when "0111"=>q<="1110001110001110"; when "1000"=>q<="1110001110001110"; when "1001"=>q<="1110001110001110"; when "1010"=>q<="1111111111111110"; when "1011"=>q<="1111111111111110";
when "1101"=>q<="0000001110000000"; when "1110"=>q<="0000001110000000"; when "1111"=>q<="0000000000000000"; when others=>null;
end case;
when "01"=>
case sel is
when "0000"=>q<="0000000000000000"; when "0001"=>q<="0000110001100000"; when "0010"=>q<="0000110001100000"; when "0011"=>q<="0000110001100000"; when "0100"=>q<="0111110001111110"; when "0101"=>q<="0111110001111110"; when "0110"=>q<="0000110001100000"; when "0111"=>q<="0000110001100000"; when "1000"=>q<="0000110001100000"; when "1001"=>q<="0000110001100000"; when "1010"=>q<="0000110001100000"; when "1011"=>q<="0001100001100100"; when "1100"=>q<="0011000001100110"; when "1101"=>q<="0110000001111111"; when "1110"=>q<="1100000001111111"; when "1111"=>q<="0000000000000000"; when others=>null;
end case;
when "10"=>
case sel is
when "0000"=>q<="0000001100000000"; when "0001"=>q<="0000001110000000";
when "0011"=>q<="1111111111111111"; when "0100"=>q<="1111111111111111"; when "0101"=>q<="0000001110000000"; when "0110"=>q<="0000001110000000"; when "0111"=>q<="0000001110000000"; when "1000"=>q<="0000011100000000"; when "1001"=>q<="0000011111000000"; when "1010"=>q<="0000111001110000"; when "1011"=>q<="0000111000111000"; when "1100"=>q<="0001110000011100"; when "1101"=>q<="0011100000001110"; when "1110"=>q<="0111000000001110"; when "1111"=>q<="0000000000000000"; when others=>null;
end case;
when "11"=>
case sel is
when "0000"=>q<="0011000111000100"; when "0001"=>q<="0011000111000110"; when "0010"=>q<="1111111111111111"; when "0011"=>q<="0110000000000110"; when "0100"=>q<="0110011111100110"; when "0101"=>q<="0010011111100100"; when "0110"=>q<="0000000011100000"; when "0111"=>q<="0000000011000000"; when "1000"=>q<="0111111111111110"; when "1001"=>q<="0111111111111110"; when "1010"=>q<="0000000011000000"; when "1011"=>q<="0000000011000000";
when "1101"=>q<="0000110011000000"; when "1110"=>q<="0000011111000000"; when "1111"=>q<="0000000000000000"; when others=>null;
end case;
when others=>null;
end case;
end if;
end process;
end corn_arc;
3.4、仿真结果
3.4.1、分频模块仿真图
图8 分频模块仿真图
3.4.2、CNT模块仿真图
图9 CNT模块仿真图3.4.3、键盘译码模块仿真图
图10 键盘译码模块仿真图3.4.4、显示模块仿真图
图11 显示模块仿真图
3.4.5、总电路仿真图
图12 总电路仿真图
3.5、实验箱验证情况
将写好的程序仿真保存后建立一个.gdf文件,将所有的程序框图连接起来(如图4)。

然后仿真,无误后,选择芯片类型。

分配管脚,然后再仿真,无错后。

根据所分配的管脚在实验箱上把线连接好(如图18),最后把程序下载到FPGA 中,运行并观察结果。

图13 硬件连线图
在本次实验中,我只用了0、1、2、3,四个键来实现显示,当按下这些键时其
显示的结果是
图14 显示汉字“中”图15 显示汉字“北”
图16 显示汉字“大”图17 显示汉字“学”
4、课程设计总结
通过本次课程设计,学会了操作数字电路设计实验开发系统,掌握了点阵显示模块的工作原理及应用和组合逻辑电路、时序逻辑电路的设计方法以及键盘控制模块的工作原理及应用;理解了键盘和点阵的逻辑工作原理。

熟练掌握了VHDL编程语言,编写出键盘控制模块的控制逻辑和点阵显示逻辑的VHDL程序,仿真成功并下载到FPGA中。

最终在实验箱上成功实现了硬件验证所设置的功能----汉字显示。

5、参考文献
1.侯伯亨,顾新.VHDL硬件描述语言与数字逻辑电路设计. 西安:西安电子科技大学出版社,1999
2.求是科技.CPLD/FPGA应用开发技术与工程实践.北京:人民邮电出版社,2005
3.罗苑棠.CPLD/FPGA常用模块与综合系统设计实例精讲.北京:电子工业出版社,2007
4.任勇峰,庄新敏.VHDL与硬件实现速成.北京:国防工业出版社,2005
[文档可能无法思考全面,请浏览后下载,另外祝您生活愉快,工作顺利,万事如意!]。

相关文档
最新文档