资源描述
EDA技术 课 程 设 计
题 目 简易计算器设计
系 (部) 信息工程系
班 级
姓 名
学 号
指导教师
2023 年 7 月 8 日至 7 月 12 日 共 1 周
EDA技术 课程设计任务书
一、设计题目、内容及规定
设计题目:简易计算器设计
内容及规定:
(1)基本设计内容1:设计简易通用型计算器,完毕对数据通路的架构,控制模块和运算器模块的设计,可进行加减乘除的基本运算。
(2)基本设计内容2:加入按键消除抖动的模块,并在实验箱或开发板上通过数码管显示计算器的输入数值与输出结果,实现一个完整的计算器。
(3)进阶设计内容:通过矩阵键盘实现数据的输入。
(4)进阶设计内容:实现有符号数的计算。
(5)进阶设计内容:实现浮点数的计算。
设计规定:
(1)根据任务规定拟定电路各功能模块;
(2)写出设计程序;
(3)分析时序仿真结果;
(4)提交设计总结。
二、设计原始资料
QuartusⅡ软件;EDA实验箱;计算机一台;
三、规定的设计成果(课程设计说明书、设计实物、图纸等)
课程设计说明书1份,不少于2023字,应包含设计原理分析、相关软件介绍、仿真波形分析,实验箱下载验证等。
四、进程安排
周1-周3: 查阅资料,上机编写并调试设计程序;
周4:整理、撰写说明书;
周5:课程设计答辩并提交设计说明书。
五、重要参考资料
[1].Voknei A.Pedroni.《VHDL数字电路设计教程》.电子工业出版社,2023.5
[2].潘松,黄继业.《EDA技术实用教程》(第二版).科学出版社,2023.2
[3].焦素敏.《EDA应用技术》.清华大学出版社,2023.4
指导教师(署名):
教研室主任(署名):
课程设计成绩评估表
出勤
情况
出勤天数
缺勤天数
成
绩
评
定
出勤情况及设计过程表现(20分)
课设答辩(20分)
设计成果(60分)
总成绩(100分)
提问
(答辩)
问题
情况
综
合
评
定
指导教师署名:
年 月 日
目 录
1 绪论 1
2 软件介绍 2
2.1 Quartus II介绍 2
2.2 ModelSim介绍 3
3 设计原理 5
4模块化设计分析 6
4.1键盘矩阵模块 6
4.2去抖模块设计 6
4.3 ALU模块设计 7
4.4 FSM模块设计 7
4.5 OP1模块设计 8
4.6 OP2模块设计 9
4.7 BIN模块设计 9
4.8 BCD模块设计 10
5 总结 11
参考文献 12
附录 13
1 绪论
硬件描述语言(hardware description language,HDL)是电子系统硬件行为描述,结构描述,数据流描述的语言。目前,运用硬件描述语言可以进行数字电子系统的设计。随着研究的进一步,运用硬件描述语言进行模拟电子系统设计或混合电子系统设计也正在探索中。国外硬件描述语言种类很多,有的从Pascal发展而来,也有一些从C语言发展而来。有些HDL成为IEEE标准,但大部分是公司标准。VHDL来源于美国军方,其他的硬件描述语言则多来源于民间公司。可谓百家争鸣,百花齐放。这些不同的语言传播到国内,同样也引起了不同的影响。在我国比较有影响的有两种硬件描述语言:VHDL语言和Verilog HDL语言。这两种语言已成为IEEE标准语言。
电子设计自动化(electronic design automation,EDA)技术的理论基础,设计工具,设计器件应是这样的关系:设计师用硬件描述语言HDL描绘出硬件的结构或硬件的行为,再用设计工具将这些描述综合映射成与半导体工艺有关的硬件配置文献,半导体器件FPGA则是这些硬件配置文献的载体。当这些FPGA器件加载,配置上不同的文献时,这个器件便具有了相应的功能。在这一系列的设计,综合,仿真,验证,配置的过程中,现代电子设计理论和现代电子设计方法贯穿于其中。以HDL语言表达设计意图,以FPGA作为硬件实现载体,以计算机为设计开发工具,以EDA软件为开发环境的现代电子设计方法日趋成熟。
VHDL语言的英文全名是Very High Speed Integrated Circuit Hardware Description Language,即超高速集成电路硬件描述语言。HDL发展的技术源头是:在HDL形成发展之前,已有了许多程序设计语言,如汇编,C,Pascal,Fortran,Prolog等。这些语言运营在不同硬件平台和不同的操作环境中,它们适合于描述过程和算法,不适合作硬件描述。CAD的出现,使人们可以运用计算机进行建筑,服装等行业的辅助设计,电子辅助设计也同步发展起来。在从CAD工具到EDA工具的进化过程中,电子设计工具的人机界面能力越来越高。在运用EDA工具进行电子设计时,逻辑图,分立电子原件作为整个越来越复杂的电子系统的设计已不适应。任何一种EDA工具,都需要一种硬件描述语言来作为EDA工具的工作语言。这些众多的EDA工具软件开发者,各自推出了自己的HDL语言。
2 软件介绍
2.1 Quartus II介绍
Quartus II 是Alter公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完毕从设计输入到硬件配置的完整PLD设计流程。
Quartus II提供了完全集成且于电路结构无关的开发环境,具有数字逻辑设计的所有特性,涉及:可运用原理图、结构框图、Verilog HDL、AHDL和VHDL完毕电路描述,并将其保存为设计实体文献;芯片(电路)平面布局连线编辑;LogicLock增量设计方法,用户可建立并优化系统,然后添加对原始系统的性能影响较小或无影响的后续模块;功能强大的逻辑综合工具;完备的电路功能仿真与时序逻辑仿真工具;定期/时序分析与关键途径延时分析;可使用SignalTap II逻辑分析工具进行嵌入式的逻辑分析;支持软件源文献的添加和创建,并将它们链接起来生成编程文献;使用组合编译方式可一次完毕整体设计流程;自动定位编译错误;高效的期间编程与验证工具;可读入标准的EDIF网表文献、VHDL网表文献盒Verilog网表文献;能生成第三方EDA软件使用的VHDL网表和Verilog网表文献。
Max+plus II 作为Altera的上一代PLD设计软件,由于其杰出的易用性而得到了广泛的应用。目前Altera已经停止了对Max+plus II 的更新支持。Quartus II 是Altera公司继Max+plus II之后开发的一种针对其公司生产的系列CPLD/PGFA器件的综合性开发软件,它的版本不断升级,从4.0版到10.0版,这里介绍的是Quartus II 8.0版,该软件有如下几个显著的特点:
1、Quartus II 的优点
该软件界面和谐,使用便捷,功能强大,是一个完全集成化的可编程逻辑设计环境,是先进的EDA工具软件。该软件具有开放性、与结构无关、多平台、完全集成化、丰富的设计库、模块化工具等特点,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完毕从设计输入到硬件配置的完整PLD设计流程。
Quartus II可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完毕设计流程外,提供了完善的用户图形界面设计方式。具有运营速度快,界面统一,功能集中,易学易用等特点。
2、Quartus II对器件的支持
Quartus II支持Altera公司的MAX 3000A系列、MAX 7000系列、MAX 9000系列、ACEX 1K系列、APEX 20K系列、APEX II系列、FLEX 6000系列、FLEX 10K系列,支持MAX7000/MAX3000等乘积项器件。支持MAX II CPLD系列、Cyclone系列、Cyclone II、Stratix II系列、Stratix GX系列等。支持IP核,包含了LPM/MegaFunction宏功能模块库,用户可以充足运用成熟的模块,简化了设计的复杂性、加快了设计速度。此外,Quartus II 通过和DSP Builder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。
3、Quartus II对第三方EDA工具的支持
对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三放EDA工具。
Altera的Quartus II可编程逻辑软件属于第四代PLD开发平台。该平台支持一个工作组环境下的设计规定,其中涉及支持基于Internet的协作设计。Quartus平台与Cadence、ExemplarLogic、 MentorGraphics、Synopsys和Synplicity等EDA供应商的开发工具相兼容。改善了软件的LogicLock模块设计功能,增添 了FastFit编译选项,推动了网络编辑性能,并且提高了调试能力。
2.2 ModelSim介绍
Mentor公司的ModelSim是业界最优秀的HDl语言仿真软件,它能提供和谐的仿真环境,是业界唯一的但内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术、和单一内核仿真技术,编译仿真速度快,编译的代码与平台无关,便于保护IP核,个性化的图形界面和用户接口,为用户加快调错提供强有力的手段,是FPGA/ASIC设计的首选仿真软件。
ModelSim重要特点:RTL和门级优化,本地编译结构,编译仿真速度快,跨平台跨版本仿真;单内核VHDL和Verilog混合仿真;源代码末班和助手,项目管理;集成了性能分析、波形比较、代码覆盖、数据流ChaseX、Signal Spay、虚拟对象Virual Object、Memory窗口、Assertion窗口、源码窗口显示信号值、信号条件断点等众多调试功能;C和Tcl/Tk接口、C调试;对SystemC的直接支持,和HDL任意混合;支持SystemVerilog的设计功能;对系统级描述语言的最全面支持,SystemVerilog、SystemC、PSL;可以单独或同事进行行为、RTL级、和门级的代码。
ModelSim分几种不同的版本:SE、PE、LE和OEM,其中SE是最高级的版本,而集成在 Actel、Atmel、Altera、Xilinx以及Lattice等FPGA厂商设计工具中的均是其OEM版本。SE版和OEM版在功能和性能方面有较大差别,比如对于大家都关心的仿真速度问题,以Xilinx公司提供的OEM版本ModelSim XE为例,对于代码少于40000行的设计,ModelSim SE 比ModelSim XE要快10倍;对于代码超过40000行的设计,ModelSim SE要比ModelSim XE快近40倍。ModelSim SE支持PC、UNIX和LINUX混合平台; Mentor Graphics公司提供业界最佳的技术支持与服务。
3 设计原理
本设计重要运用状态机进行整体设计,分部完毕,便于大家分组进行合作,此设计规定完毕对数据通路的架构,控制模块和运算器模块的设计,可进行加减乘除的基本运算。应用上周所学知识,运用状态机进行简易计算器的编写。简易计算器由键盘输入模块、键盘去抖动模块、状态机、计算模块、OP1、OP2模块、显示模块组成,结构清楚,易于编写。
简易计算器采用自顶向下的设计原则,检测按键次数时,以scancode从非空到空的跳变使计数器加一,第一运算数则在press_count=1时,将scancode装配到bcd码最低位bcd[3:0],在press_count=2时,装配到bcd[7:4],……
FSM在检测到+-×/键时,将bcd赋予bcd2,同时启动alu的操作alu_op。
FSM根据scancode进度,输出相应的outsel,选择显示不同的bcd数据。计算器模块化设计原理图如图3-1所示。
检测按键次数
press_count
第1运算数
bcd
FSM
第2运算数
bcd
bcd2
(+-*/) load
ALU
bcd
bcd2
alu_op
res
display
outsel
opkey
scancode
图3-1 简易计算器模块化设计原理图
4模块化设计分析
4.1 键盘矩阵模块
计算器输入数字和其他功能按键要用到很多按键,假如采用独立按键的方式,在这种情况下,编程会很简朴,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。矩阵键盘采用四条线作为行线,四条线作为列线组成键盘,在行线和列线的每个交叉点上设立一个按键。这样键盘上按键的个数就为4×4个。键盘模块采用4×4矩阵键盘,4位行线接上上拉电阻后接到高电平上,列线接上上拉电阻后依次给予低电平来判断哪个节点为低电平时即这个节点被按下,从而被读入到下一单元。
矩阵键盘模块原理图如图4-1所示,矩阵键盘仿真波形如图4-2所示。
图4-1 矩阵键盘模块原理图
图4-2 矩阵键盘仿真波形
4.2 去抖模块设计
作为机械开关的键盘,在开关启动或关闭的瞬间会出现电压抖动,消除抖动的方法一般有硬件和恶、软件的方法,一般进行软件解决,这样实现简朴、设计灵活、节约成本。
程序设计原理:按键去抖动关键在于提取稳定的电平状态,滤除抖动毛刺,对于一个按键信号,可以用一次脉冲对其进行取样,假如连续三次取样为低电平,则为低电平,假如不满足三次取样都为低,则认为按键稳定状态结束。去抖模块原理图如图4-3所示,仿真波形如图4-4所示。
图4-3 去抖模块原理图
图4-4 去抖模块仿真波形
4.3 ALU模块设计
ALU模块重要实现数据的加减乘除运算,用VHDL代码描述逻辑单元、算数单元、选择器单元,规定输入两组二进制数据,运用元件例化语句将设计的三个单元进行组合,建立一个包含所有元件的包集。ALU模块原理图如图4-5所示,仿真波形图如图4-6所示。
图4-5 ALU模块原理图
图4-6 ALU模块仿真波形
4.4 FSM模块设计
状态机由六个状态组成,重要是判断键盘输入的是数据还是运算符,从而来进行不同的运算,一方面判断第一个输入的数据是否为数字,若不是数据则等待,若是数据则进入下一个状态等键盘弹起后判断下一个数据为数字还是运算符,若是数据则将数据存入OP1,若是运算符,则将数据存入OP1和OP2,并等待下一个数据的到来,状态机中值得注意的是在进行数据运算时,将运算的数据要存入OP1和OP2中。FSM模块原理图如图4-7所示,FSM仿真波形图如图4-8所示。
图4-7 FSM模块原理图
图4-8 FSM模块仿真波形图
4.5 OP1模块设计
OP1模块的重要功能是实现数据的输入及存储,重要用来做被加数、被除数等,在第一次输入数据时,数据存入OP1等进行操作后,数据会被装载到OP1和OP2模块中,待数据被输入时更新OP1中的数据。OP1模块原理图如图4-9所示,仿真波形图如图4-10所示。
图4-9 OP1模块原理图
图4-10 OP1模块仿真波形
4.6 OP2模块设计
OP2模块的重要功能是用来存储运算完毕的数据,使计算器有连续计算的能力。当进行完一次运算后,此时OP2_LOAD为1,此时将运算完的数据装载到OP2模块中。OP2模块原理图如图4-11所示,仿真波形图如图4-12所示。
图4-11 OP2模块设计原理图
图4-12 OP2模块仿真波形图
4.7 BIN模块设计
二进制模块的功能是将二进制数字转化成BCD码。BIN模块原理图如图4-13,仿真波形图如图4-14。
图4-13 BIN模块原理图
图4-14 BIN模块仿真波形
4.8 BCD模块设计
BCD模块是将BCD码转化成二进制数字。BCD模块原理图如图4-14,仿真波形图如图4-15。
图4-14 BCD模块原理图
图4-15 BCD模块仿真波形
5 总结
这次的设计,给我的印象很深,通过这次课程设计,我对EDA这门课程有了很好很深的理解。通过做计算器,我对Quartus II和ModelSim应用更加熟悉了。
本次课程设计,规定做一个简易计算器,第一周一方面由北京至芯科技公司的老师来为我们讲解相关的知识,讲解做计算器的方法。通过老师的讲解我对本课题有了一定的了解。但是,在对该课题有一定的了解的前提下,也发现了很多问题。结识到理论与实践之间的差距,联系实际的应用去理解只是比一大堆理论来的直接与清楚明了。本简易计算器的设计,是用Quartus II软件进行代码编写、原理图设计,用ModelSim软件来实现仿真。通过对简易计算器设计,熟悉了Quartus II的运营环境,初步掌握了VHDL语言基本库函数的调用和编写基本程序等应用;明白了原理图和代码之间的关系;学会了做一个工程的一般环节,以及分模块化设计的好处。
最后,我要在这里对给我这次课程设计提供帮助的魏老师和王老师,尚有同学们说声真挚的感谢。正是由于你们的帮助和支持,我才干克服一个一个的困难和疑惑,直至本次课程设计圆满完毕。在这个过程中我学到了很多知识,不仅巩固了已有知识,并且强化了一些关于数学MATLAB软件应用方面的知识,非常感谢你们的帮助。
参考文献
[1] 乔庐峰,王志功.数字电路设计教程[M]. 北京电子工业出版社,2023
[2] 潘松,黄继业.EDA技术实用教程(第二版)[M]. 科学出版社,2023
[3] 焦素敏,EDA应用技术[M]. 北京清华大学出版社,2023
[4] 谭会生,张昌凡.EDA技术及应用[M]. 西安西安电子科技大学出版社,2023
[5] 曾繁泰,陈美金.VHDL程序设计[M]. 北京清华大学出版社,2023
附录
-------------------------------------键盘矩阵模块程序-----------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
ENTITY keys IS
PORT
(
clk : IN STD_LOGIC;
rst : IN STD_LOGIC;
row : IN STD_LOGIC_VECTOR(3 downto 0);
col : OUT STD_LOGIC_VECTOR(3 downto 0);
scancode : OUT STD_LOGIC_VECTOR(15 downto 0)
);
END keys;
ARCHITECTURE keys_architecture OF keys IS
signal current_state,next_state:std_logic_vector(1 downto 0);
signal enable:std_logic;
BEGIN
process(clk,rst,enable)
begin
if rst='1' then current_state<="00";
elsif clk'event and clk='1' and enable='0' then
current_state<=next_state;
end if;
end process;
process(rst,current_state,row)
begin
if rst='1' then col<="1111";
else
case current_state is
when "00" =>
col<="1110" ;
next_state<="01";
when "01" =>
col<="1101" ;
next_state<="10";
when "10" =>
col<="1011" ;
next_state<="11";
when "11" =>
col<="0111" ;
next_state<="00";
when others=>col<="1111";next_state<="00";
end case;
end if;
end process;
process(current_state,row)
begin
if rst='1' then scancode<=X"0000";enable<='0';
elsif current_state="00" then
case row is
when "1110"=>scancode<=X"0001";enable<='1';
when "1101"=>scancode<=X"0002";enable<='1';
when "1011"=>scancode<=X"0004";enable<='1';
when "0111"=>scancode<=X"0008";enable<='1';
when others=>scancode<=X"0000";enable<='0';
end case;
elsif current_state="01" then
case row is
when "1110"=>scancode<=X"0010";enable<='1';
when "1101"=>scancode<=X"0020";enable<='1';
when "1011"=>scancode<=X"0040";enable<='1';
when "0111"=>scancode<=X"0080";enable<='1';
when others=>scancode<=X"0000";enable<='0';
end case;
elsif current_state="01" then
case row is
when "1110"=>scancode<=X"0100";enable<='1';
when "1101"=>scancode<=X"0200";enable<='1';
when "1011"=>scancode<=X"0400";enable<='1';
when "0111"=>scancode<=X"0800";enable<='1';
when others=>scancode<=X"0000";enable<='0';
end case;
else
case row is
when "1110"=>scancode<=X"1000";enable<='1';
when "1101"=>scancode<=X"2023";enable<='1';
when "1011"=>scancode<=X"4000";enable<='1';
when "0111"=>scancode<=X"8000";enable<='1';
when others=>scancode<=X"0000";enable<='0';
end case;
end if;
end process;
END keys_architecture;
---------------------------------------去抖模块程序----------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY filter IS
PORT
(
clk : IN STD_LOGIC;
rst : IN STD_LOGIC;
scancode : IN STD_LOGIC_VECTOR(15 downto 0);
sc : OUT STD_LOGIC_VECTOR(15 downto 0)
);
END filter;
ARCHITECTURE filter_architecture OF filter IS
signal count: integer range 0 to 100001;
signal temp: STD_LOGIC_VECTOR(15 downto 0);
constant G1:integer :=100;
BEGIN
process(clk,rst,scancode)
begin
if rst='1' then count<=0;
elsif clk'event and clk='1'then
if scancode=X"0000" then count<=0;
elsif count<G1 then count<=count+1;
end if;
end if;
end process;
process(rst,count,scancode)
begin
if rst='1' then sc<=X"0000";temp<=X"0000";
else
case count is
when 0=>
temp<=scancode;
when G1=>
if temp = scancode then
sc<=temp;
else sc<=X"0000";
end if;
when others=>sc<=X"0000" ;
end case;
end if;
end process;
END filter_architecture;
-----------------------------------------ALU模块程序----------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
USE ieee.std_logic_arith.all;
ENTITY AUL IS
PORT
(
op1_in : IN STD_LOGIC_VECTOR(27 downto 0);
op2_in : IN STD_LOGIC_VECTOR(27 downto 0);
oprand:IN STD_LOGIC_VECTOR(2 downto 0);
AUL_OUT : OUT STD_LOGIC_VECTOR(27 downto 0)
);
END AUL;
ARCHITECTURE AUL_architecture OF AUL IS
BEGIN
process(oprand,op1_in,op2_in)
variable temp,temp1,temp2 : STD_LOGIC_VECTOR(27 downto 0);
variable t1,t2:integer range 0 to ;
variable t3:integer range 0 to ;
begin
case oprand is
when "000" => AUL_OUT<=op1_in;
when "001" =>
temp1:=op1_in;
temp2:=op2_in;
temp:=temp1+temp2;
AUL_OUT<=temp;
when "010" =>
t1:=conv_integer(op1_in);
t2:=conv_integer(op2_in);
if t2>=t1 then
t3:=t2-t1;
AUL_OUT<=conv_STD_LOGIC_VECTOR(t3,28);
else AUL_OUT<=X"8888888";
end if;
when "011" => t1:=conv_integer(op1_in);
t2:=conv_integer(op2_in);
t3:=t1*t2;
if t3<=99999999 then AUL_OUT<=conv_STD_LOGIC_VECTOR(t3,28);
else AUL_OUT<=X"8888888";
end if;
when "100" =>
t1:=conv_integer(op1_in);
t2:=conv_integer(op2_in);
if t2=0 then AUL_OUT<=X"8888888";
else t3:=t2/t1;AUL_OUT<=conv_STD_LOGIC_VECTOR(t3,28);
end if;
when others => AUL_OUT<=op1_in;
end case;
end process;
END AUL_architecture;
----------------------------------------FSM模块程序----------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY FSM IS
PORT
(
clk : IN STD_LOGIC;
rst : IN STD_LOGIC;
sc : IN STD_LOGIC_VECTOR(15 downto 0);
op1_add : OUT STD_LOGIC;
op1_clear : OUT STD_LOGIC;
op1_load : OUT STD_LOGIC;
op2_load : OUT STD_LOGIC;
oprand : OUT STD_LOGIC_VECTOR(2 downto 0)
);
END FSM;
ARCHITECTURE FSM_architecture OF FSM IS
signal current_state,next_state:STD_LOGIC_VECTOR(2 downto 0):="000";
signal key,number:STD_LOGIC;
signal operate:STD_LOGIC:='0';
signal temp0,temp1:STD_LOGIC_VECTOR(2 downto 0):="000";
BEGIN
process(sc)
begin
case sc is
when X"0000" =>key<='0';number<='0';
when X"0001" =>key<='1';number<='0';--"/"
when X"0002" =>key<='1';number<='0';--"X"
when X"0004" =>key<='1';number<='0';--"-"
when X"0008" =>key<='1';number<='0';--"+"
when X"0010" =>key<='1';number<='0';--"clear"
when X"0020" =>key<='1';number<='1';--"9"
when X"0040" =>key<='1';number<='1';--"6"
when X"0080" =>key<='1';number<='1';--"3"
when X"0100" =>key<='1';number<='1';--"0"
when X"0200" =>key<='1';number<='1';--"8"
when X"0400" =>key<='1';number<='1';--"5"
when X"0800" =>key<='1';number<='1';--"2"
when X"1000" =>key<='1';number<='0';--"="
when X"2023" =>key<='1';number<='1';--"7"
when X"4000" =>key<='1';number<='1';--"4"
when X"8000" =>key<='1';number<='1';--"1"
when others=>key<='0';number<='0';
end case;
end process;
process(clk,rst)
begin
if (rst = '1') then
current_state<="000";
elsif(clk'event
展开阅读全文