1 绪论
1.1设计目的
本次设计的目的就是在掌握EDA实验开发系统的初步使用基础上,了解EDA技术,加深对计算机体系结构的理解。通过学习的VHDL语言结合电子电路的设计知识理论联系实际,掌握所学的课程知识,学习VHDL基本单元电路的综合设计应用。通过对实用数字钟的设计,巩固和综合运用计算机原理的基本理论和方法,理论联系实际,提高设计、分析、解决计算机技术实际问题的独立工作能力。
1.2设计要求
(1)熟练掌握VHDL语言的结构特点并能运用到具体实际中。
(2)学会利用复杂的可编程逻辑器件进行简单的电子系统设计。
(3)熟悉并掌握基于EDA实验开发系统设计实际问题的方法和步骤。
(4)通过设计过程提高自己运用所学知识来分析解决问题的能力。
1.3设计内容
本课程设计中使用Altera公司的EP2C35系列的FPGA芯片,利用SOPC-NIOSII-EP2C35开发板上的资源和QuartusII软件,实现一个多功能数字时钟。本设计的任务要求显示格式为 小时-分钟-秒钟,整点报时,报时时间为10秒,即从整点前10秒钟开始进行报时提示,喇叭开始发声,直到过整点时,在 5秒LED开始闪烁,过整点后,停止闪烁。系统时钟选择时钟模块的10KHz,要得到1Hz时钟信号,必须对系统时钟进行10,000次分频。调整时间的的按键用按键模块的S1和S2,S1调节小时,每按下一次,小时增加一个小时,S2调整分钟,每按下一次,分钟增加一分钟。另外用S8按键作为系统时钟复位,复位后全部显示00-00-00。扩展内容:用16*16点阵显示实现日期的动态显示用4×4键盘阵列键盘替换按键实现日期、时钟的调整,用液晶显示模块日期、时间的显示。
1.4设计环境
本次课题设计方要用到的开发环境是Altera公司的EDA设计工具软件QuartusII。
Altera公司的工作与EDA厂家紧密结合,使QuartusII软件可以与其它工业标准的设计输入、综合和校验工具相连接。设计者可以使用Altera或标准EDA输入工具进行设计,使用QuartusII编译器对Altera器件的设计进行编译,并使用Altera或其它EDA校验工具进行仿真。目前,QuartusII支持与Cadence,Mentor Graphics, Synopsys, Viewlogic等EDA工具接口。
QuartusII的设计输入、处理和校验功能都集中在统一的开发环境下,这样可以加快动态调试,缩短开发周期。
QuartusII软件支持多种硬件描述语言设计输入,包括VHDL,Verilog HDL和Altera自己的硬件描述语言AHDL。
QuartusII软件提供丰富的库单元供设计调用,其中包括74系列的全部器件和一些基本的逻辑门,多种特殊的逻辑宏功能(Macro-Function)以及新型的参数化的兆功能(Mage-Function).调用库单元进行设计,可以大大减轻工作量。
2 VHDL简介
2.1VHDL硬件描述语言简介
模块是VHDL的基本描述单位,用于描述某个设计的功能或结构及其与其他模块通信的外部端口。一个设计的结构可使用开关级原语、门级原语和用户定义的原语方式描述; 设计的数据流行为使用连续赋值语句进行描述; 时序行为使用过程结构描述。一个模块可以在另一个模块中使用。
说明部分用于定义不同的项,例如模块描述中使用的寄存器和参数。语句定义设计的功能和结构。说明部分和语句可以散布在模块中的任何地方;但是变量、寄存器、线网和参数等的说明部分必须在使用前出现。为了使模块描述清晰和具有良好的可读性, 最好将所有的说明部分放在语句前。本书中的所有实例都遵守这一规范。
在模块中,可用下述方式描述一个设计:
(1) 数据流方式;
(2) 行为方式;
(3) 结构方式;
(4) 上述描述方式的混合。
VHDL模型中的所有时延都根据时间单位定义。
在顺序过程中出现的语句是过程赋值模块化的实例。模块化过程赋值在下一条语句执行前完成执行。过程赋值可以有一个可选的时延。
时延可以细分为两种类型:
(1) 语句间时延: 这是时延语句执行的时延。
(2) 语句内时延: 这是右边表达式数值计算与左边表达式赋值间的时延。
在VHDL中可使用如下方式描述结构:
(1) 内置门原语(在门级);
(2) 开关级原语(在晶体管级);
(3) 用户定义的原语(在门级);
(4) 模块实例 (创建层次结构)。
3 各模块电路及其简介
3.1 分频器模块
图3.1 分频器模块
因为本实验选用频率为10KHZ,对于秒表的计时和进行数码管的动态扫描来说,频率都太大了,因此要将10KHz进行分频处理,本次设计将分成1Hz频率。
3.2 控制调节模块
图3.2 控制调节模块
本模块用于时间与日期的切换与时间的调节、日期的调节以及复位调节,其中K1用于时间与日期的切换,S1、S2用于时间的调节,S3、S4、S5用于日期的调节,最后S8为复位按键。
3.3 报警模块
图3.3 报警模块
报警模块中有两个报警输出,其一为蜂鸣器,在整点前十秒开始发声;其二为LED灯显示输出,在最后5秒按照一定的规律亮灯。本模块受到前一模块输出分、秒的控制。
3.4 数码管显示模块
图3.4 数码管显示模块
很显然,此模块是用来进行数码管显示的,先进行动态扫描,然后将程序中要求输出的部分通过7段数码管显示出来。其中K1用于控制显示部分是日期还是时间。比之于静态显示,动态显示有着不可替代的优点:占用数据线少,功耗
小。
3.5 16*16点阵控制模块
图3.5 16*16点阵控制模块
本模块用于控制后面的16*16点阵显示模块,其中keyc用于控制点阵的行扫描,S为4根数据总线,用于控制点阵数据的动态显示。
3.6 16*16点阵显示模块
图3.6 16*16点阵显示模块
该模块用于满足实验内容中用16*16点阵动态显示日期的要求。可以看出,输出为每一行的数据,通过动态扫描之后就可以动态的显示所有的16行数据。
4 设计步骤
4.1新建一个工程
(1)打开Quartus II 12.1sp1仿真软件,点击File=>New Project Wizard按钮创建一个新的工程。弹出如图所示对话框:
(2)再点击Next按钮出现下一对话框并将工程名和文件名都命名为zjh:
(3)然后再点击Next按钮出现下一对话框将Family设置为cycloneIII,将Package设置为FBGA,将Picount设置为780,将Speed grade设置为8并选择EP3C80F780C8器件,如图所示:
(4)最后点击Next=>Finish按钮完成新工程的创建。
4.2新建一个VHDL文件
(1)点击File=>New按钮出现如图所示对话框:
(2)选择VHDL File完成文件创建,创建完成后如图所示:
4.3VHDL程序的编译及仿真
4.3.1VHDL程序的编译
将编写好的符合实验要求的VHDL程序复制在上图所示的对话框内,然后点击Processing=>Start Compilation按钮开始进行编译,编译完成并确保程序无误后开始进行管脚分配。
4.3.2管脚分配
(1)点击Assignments=>Assignments Editor按钮出现如图所示对话框:
(2)再点击List、>>、OK按钮出现如图所示管脚分配对话框:
(3)然后按如下表所示的管脚顺序进行分配:
(4)分配完成后再进行一次编译以使管脚分配生效。
4.3.3下载与仿真
用下载线将电脑USB接口和试验箱VGA接口相连接,点击Tools=>Programmer按钮将Output File内的文件添加进去,再点击Start按钮将结果下载到试验箱内。
观察并操作试验箱看仿真结果能否满足数字时钟的设计需求。
5 心得与体会
这次的EDA课程设计是我大学的第三次课程设计,由于刚开始设计思路不清晰,对Quartus II 12.1sp1仿真软件的运用也不熟练而且相关的知识准备也不充分,所以拿到设计题目后感觉不知所措,不知道如何开始。但是通过一段时间的查阅资料和请教同学老师我发现设计多功能数字时钟也并不十分困难,在他们的帮助与指导下我的课程设计也就顺利的一步步展开。
通过这次课程设计让我体会到在实际的操作过程中,要把理论中所学的知识灵活地运用起来,在程序调试中会遇到各种各样的问题,而耐心就是我们最好的帮手,遇事不能急、不能慌,慢慢分析才能解决问题。这次课程设计提高了我解决问题的能力,使我学会了在设计中怎样去查找问题,然后怎样解决问题。
这次课程设计让我可以熟练的掌握了Quartus II 12.1sp1仿真软件的操作,也了解了如何运用VHDL语言和FPGA芯片去解决实际问题,总之通过这次课程设计自己还是有了不小的收获与提高。
6 参考文献
1 《SOPCIIEDA实验指导书》(第二版)
2 《SOPCII使用手册》(第二版)
3 http://jpkc.hdu.edu.cn/elec/eda/edanew_m/
4 《EDA技术基础》. 谭会生编著. 湖南大学出版社,2004
5 《EDA技术实用教程》(第三版),潘松、黄继业编著 ,科学出版社 ,2010
7附录
附录一 VHDL程序清单
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
--------------------------------------------------------------------
entity zjh is
port( Clk : in std_logic; --时钟输入
S8 : in std_logic; --复位输入
S1,S2 : in std_logic; --Change Hour, Minute
S3,S4,S5 : in std_logic; --Change Year, Month and Day
spk : out std_logic; --蜂鸣器
led : out std_logic_vector(3 downto 0); --整点输报时输出
Display : out std_logic_vector(7 downto 0); --七段码管显示输出
SEG_SEL : buffer std_logic_vector(2 downto 0); --七段码管扫描驱动
keyc : out std_logic_vector(3 downto 0);
keyr : out std_logic_vector(15 downto 0);
K1 : in std_logic --显示切换
);
end zjh;
--------------------------------------------------------------------
architecture behave of zjh is
signal Disp_Temp : integer range 0 to 15;
signal Disp_Decode : std_logic_vector(7 downto 0);
signal SEC1,SEC10 : integer range 0 to 9;
signal MIN1,MIN10 : integer range 0 to 9;
signal HOUR1,HOUR10 : integer range 0 to 9;
signal Year1,Year10 : integer range 0 to 9;
signal Month1,Month10: integer range 0 to 9;
signal Day1,Day10 : integer range 0 to 9;
signal Music_Count : std_logic_vector(2 downto 0);
signal Clk_Count1 : std_logic_vector(13 downto 0); --产生1Hz时钟的分频计数器
signal Clk1Hz : std_logic;
signal led_count : std_logic_vector(2 downto 0);
signal led_display : std_logic_vector(3 downto 0);
signal cdount : std_logic_vector(3 downto 0);
signal dount : std_logic_vector(12 downto 0);
signal s : std_logic_vector(3 downto 0);
signal m,d,y : integer range 0 to 31;
begin
process(Clk)
begin
if(Clk'event and Clk='1') then
if(Clk_Count1<10000) then
Clk_Count1<=Clk_Count1+1;
else
Clk_Count1<="00000000000001";
end if;
end if;
end process;
Clk1Hz<=Clk_Count1(13);
process(Clk1Hz,S8)
begin
if(S8='0') then --系统复位
SEC1<=0;
SEC10<=0;
MIN1<=0;
MIN10<=0;
HOUR1<=0;
HOUR10<=0;
Year10 <= 1;
Year1 <= 3;
Month10 <= 0;
Month1 <= 1;
Day10 <= 0;
Day1 <= 1;
elsif(Clk1Hz'event and Clk1Hz='1') then --正常运行
if (K1= '1') then
if(S3='0') then --调节年
if(Year1=9) then
Year1<=0;
Year10<=Year10+1;
elsif(Year10=9 and Year1=9) then
Year1<=0;
Year10<=0;
else
Year1<=Year1+1;
end if;
end if;
if(S4='0') then --调节月
if(Month1=9) then
Month1<=0;
Month10<=Month10+1;
elsif(Month10=1 and Month1=2) then
Month1<=0;
Month10<=0;
Year1<=Year1+1;
else
Month1<=Month1+1;
end if;
end if;
if(S5='0') then --调节日
if(Day1=9) then
Day1<=0;
Day10<=Day10+1;
elsif(Day10=3 and Day1=1) then
Day1<=0;
Day10<=0;
Month1<=Month1+1;
else
Day1<=Day1+1;
end if;
end if;
elsif (K1 = '0') then
if(S1='0') then --调节小时
if(HOUR1=9) then
HOUR1<=0;
HOUR10<=HOUR10+1;
elsif(HOUR10=2 and HOUR1=3) then
HOUR1<=0;
HOUR10<=0;
Day1<=Day1+1;
else
HOUR1<=HOUR1+1;
end if;
elsif(S2='0') then --调节分钟
if(MIN1=9) then
MIN1<=0;
if(MIN10=5) then
MIN10<=0;
HOUR1<=HOUR1+1;
else
MIN10<=MIN10+1;
end if;
else
MIN1<=MIN1+1;
end if;
end if;
end if;
if(SEC1=9) then
SEC1<=0;
if(SEC10=5) then
SEC10<=0;
if(MIN1=9) then
MIN1<=0;
if(MIN10=5) then
MIN10<=0;
if (HOUR10 >= 2 and HOUR1 >= 3) then
HOUR10 <= 0;
HOUR1 <= 0;
-- Day += 1;
if (Day10 = 3 and Day1 = 0) then
Day10 <= 0;
Day1 <= 1;
-- Month += 1;
if (Month10 = 1 and Month1 = 2) then
Month10 <= 0;
Month1 <= 1;
-- Year += 1;
if (Year10 = 9 and Year1 = 9) then
Year10 <= 0;
Year1 <= 0;
end if;
if (Year1 < 9) then
Year1 <= Year1 + 1;
elsif (Year1 = 9) then
Year10 <= Year10 + 1;
Year1 <= 0;
end if;
end if;
if (Month1 < 9) then
Month1 <= Month1 + 1;
elsif (Month1 = 9) then
Month10 <= Month10 + 1;
Month1 <= 0;
end if;
end if;
if (Day1 < 9) then
Day1 <= Day1 + 1;
elsif (Day1 = 9) then
Day10 <= Day10 + 1;
Day1 <= 0;
end if;
elsif (HOUR1 < 9) then
HOUR1 <= HOUR1 + 1;
elsif (HOUR1 = 9) then
HOUR1 <= 0;
HOUR10 <= HOUR10 + 1;
end if;
else
MIN10<=MIN10+1;
end if;
else
MIN1<=MIN1+1;
end if;
else
SEC10<=SEC10+1;
end if;
else
SEC1<=SEC1+1;
end if;
end if;
end process;
process(Clk)
begin
if(Clk'event and Clk='1') then
Music_Count<=Music_Count+1;
if(MIN10=5 and MIN1=9 and SEC10=5 and SEC1=0) then --在59分50秒开始提示
if((SEC1 MOD 2)=0) then --在偶数秒开始发声
SPK<=Music_Count(2); --嘀
else
SPK<='0';
end if;
elsif(MIN10=0 and MIN1=0 and SEC10=0 and SEC1=0) then
SPK<=Music_Count(1); --嗒
else
SPK<='0';
end if;
end if;
end process;
process(Clk)
begin
if(Clk1hz'event and Clk1hz='1') then
if(MIN10=5 and MIN1=9 and SEC10=5 and SEC1>4) then --在59分55秒开始提示
led_Count<=led_Count+1;
else
led_count<="000";
end if;
end if;
end process;
process(led_count)
begin
case (led_count) is
when "000"=>led_display<="0000";
when "001"=>led_display<="1001";
when "010"=>led_display<="0110";
when "011"=>led_display<="1010";
when "100"=>led_display<="0101";
when "101"=>led_display<="1111";
when others=>led_display<="0000";
end case;
led<=led_display;
end process;
process(SEG_SEL)
begin
if (K1 = '1') then
case (SEG_SEL+1) is
when "000"=>Disp_Temp<=Year10;
when "001"=>Disp_Temp<=Year1;
when "010"=>Disp_Temp<=10;
when "011"=>Disp_Temp<=Month10;
when "100"=>Disp_Temp<=Month1;
when "101"=>Disp_Temp<=10;
when "110"=>Disp_Temp<=Day10;
when "111"=>Disp_Temp<=Day1;
end case;
elsif (K1 = '0') then
case (SEG_SEL+1) is
when "000"=>Disp_Temp<=HOUR10;
when "001"=>Disp_Temp<=HOUR1;
when "010"=>Disp_Temp<=10;
when "011"=>Disp_Temp<=MIN10;
when "100"=>Disp_Temp<=MIN1;
when "101"=>Disp_Temp<=10;
when "110"=>Disp_Temp<=SEC10;
when "111"=>Disp_Temp<=SEC1;
end case;
end if;
end process;
process(Clk)
begin
if(Clk'event and Clk='1') then --扫描累加
SEG_SEL<=SEG_SEL+1;
Display<=Disp_Decode;
end if;
end process;
process(Disp_Temp) --显示转换
begin
case Disp_Temp is
when 0=>Disp_Decode<="00111111"; --0
when 1=>Disp_Decode<="00000110"; --1
when 2=>Disp_Decode<="01011011"; --2
when 3=>Disp_Decode<="01001111"; --3
when 4=>Disp_Decode<="01100110"; --4
when 5=>Disp_Decode<="01101101"; --5
when 6=>Disp_Decode<="01111101"; --6
when 7=>Disp_Decode<="00000111"; --7
when 8=>Disp_Decode<="01111111"; --8
when 9=>Disp_Decode<="01101111"; --9
when 10=>Disp_Decode<="01000000"; ---
when others=>Disp_Decode<="00000000"; --全灭
end case;
end process;
process(clk) --显示时序控制
begin
if clk'event and clk='1' then
dount<=dount+1;
if dount=8191 then
dount<="0000000000000";
if S=15 then
S<="0000";
else
s<=S+1;
end if;
s<=s+1;
else
s<=S;
end if;
if cdount<15 then
cdount<=cdount+1;
else
cdount<="0000";
end if;
end if;
keyc<=cdount;
end process;
process(s,cdount)
begin
m<=Month10*10+Month1;
d<=Day10*10+Day1;
y<=year10*10+year1;
if s="0000" then
case cdount is
when "0000"=>keyr<="1111111111111111";--20
when "0001"=>keyr<="1100111110011111";
when "0010"=>keyr<="1101011111101111";
when "0011"=>keyr<="1101101111110111";
when "0100"=>keyr<="1101110111110111";
when "0101"=>keyr<="1101111011101111";
when "0110"=>keyr<="1101111100011111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111000000011111";
when "1010"=>keyr<="1110111111101111";
when "1011"=>keyr<="1101111111110111";
when "1100"=>keyr<="1101111111110111";
when "1101"=>keyr<="1101111111110111";
when "1110"=>keyr<="1110111111101111";
when "1111"=>keyr<="1111000000011111";
when others=>keyr<="1111111111111111";
end case;
elsif s="0001" then
case y is
when 13=>
case cdount is
when "0000"=>keyr<="1111111111111111";--13
when "0001"=>keyr<="1111111111011111";
when "0010"=>keyr<="1111111111001111";
when "0011"=>keyr<="1100000000000111";
when "0100"=>keyr<="1111111111111111";
when "0101"=>keyr<="1111111111111111";
when "0110"=>keyr<="1111111111111111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1110011111001111";
when "1010"=>keyr<="1101111111110111";
when "1011"=>keyr<="1101111111110111";
when "1100"=>keyr<="1101111011110111";
when "1101"=>keyr<="1101111011110111";
when "1110"=>keyr<="1110000100001111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 14=>
case cdount is
when "0000"=>keyr<="1111111111111111";--14
when "0001"=>keyr<="1111111111011111";
when "0010"=>keyr<="1111111111001111";
when "0011"=>keyr<="1100000000000111";
when "0100"=>keyr<="1111111111111111";
when "0101"=>keyr<="1111111111111111";
when "0110"=>keyr<="1111111111111111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111100111111111";
when "1010"=>keyr<="1111101011111111";
when "1011"=>keyr<="1111101100111111";
when "1100"=>keyr<="1111101111011111";
when "1101"=>keyr<="1111101111101111";
when "1110"=>keyr<="1100000000000111";
when "1111"=>keyr<="1111101111111111";
when others=>keyr<="1111111111111111";
end case;
when 15=>
case cdount is
when "0000"=>keyr<="1111111111111111";--15
when "0001"=>keyr<="1111111111011111";
when "0010"=>keyr<="1111111111001111";
when "0011"=>keyr<="1100000000000111";
when "0100"=>keyr<="1111111111111111";
when "0101"=>keyr<="1111111111111111";
when "0110"=>keyr<="1111111111111111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1110011100000111";
when "1010"=>keyr<="1101111110110111";
when "1011"=>keyr<="1101111110110111";
when "1100"=>keyr<="1101111110110111";
when "1101"=>keyr<="1101111110110111";
when "1110"=>keyr<="1110000001110111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 16=>
case cdount is
when "0000"=>keyr<="1111111111111111";--16
when "0001"=>keyr<="1111111111011111";
when "0010"=>keyr<="1111111111001111";
when "0011"=>keyr<="1100000000000111";
when "0100"=>keyr<="1111111111111111";
when "0101"=>keyr<="1111111111111111";
when "0110"=>keyr<="1111111111111111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111000000011111";
when "1010"=>keyr<="1110111011101111";
when "1011"=>keyr<="1101111101110111";
when "1100"=>keyr<="1101111101110111";
when "1101"=>keyr<="1101111101110111";
when "1110"=>keyr<="1110000011001111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 17=>
case cdount is
when "0000"=>keyr<="1111111111111111";--17
when "0001"=>keyr<="1111111111011111";
when "0010"=>keyr<="1111111111001111";
when "0011"=>keyr<="1100000000000111";
when "0100"=>keyr<="1111111111111111";
when "0101"=>keyr<="1111111111111111";
when "0110"=>keyr<="1111111111111111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111111111110111";
when "1010"=>keyr<="1111111111110111";
when "1011"=>keyr<="1100111111110111";
when "1100"=>keyr<="1111000111110111";
when "1101"=>keyr<="1111111000110111";
when "1110"=>keyr<="1111111111000111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 18=>
case cdount is
when "0000"=>keyr<="1111111111111111";--18
when "0001"=>keyr<="1111111111011111";
when "0010"=>keyr<="1111111111001111";
when "0011"=>keyr<="1100000000000111";
when "0100"=>keyr<="1111111111111111";
when "0101"=>keyr<="1111111111111111";
when "0110"=>keyr<="1111111111111111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111001110011111";
when "1010"=>keyr<="1110110101101111";
when "1011"=>keyr<="1101111011110111";
when "1100"=>keyr<="1101111011110111";
when "1101"=>keyr<="1101111011110111";
when "1110"=>keyr<="1110110101101111";
when "1111"=>keyr<="1111001110011111";
when others=>keyr<="1111111111111111";
end case;
when 19=>
case cdount is
when "0000"=>keyr<="1111111111111111";--19
when "0001"=>keyr<="1111111111011111";
when "0010"=>keyr<="1111111111001111";
when "0011"=>keyr<="1100000000000111";
when "0100"=>keyr<="1111111111111111";
when "0101"=>keyr<="1111111111111111";
when "0110"=>keyr<="1111111111111111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1110011000001111";
when "1010"=>keyr<="1101110111110111";
when "1011"=>keyr<="1101110111110111";
when "1100"=>keyr<="1101110111110111";
when "1101"=>keyr<="1110111011101111";
when "1110"=>keyr<="1111000000011111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 20=>
case cdount is
when "0000"=>keyr<="1111111111111111";--20
when "0001"=>keyr<="1100111110011111";
when "0010"=>keyr<="1101011111101111";
when "0011"=>keyr<="1101101111110111";
when "0100"=>keyr<="1101110111110111";
when "0101"=>keyr<="1101111011101111";
when "0110"=>keyr<="1101111100011111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111000000011111";
when "1010"=>keyr<="1110111111101111";
when "1011"=>keyr<="1101111111110111";
when "1100"=>keyr<="1101111111110111";
when "1101"=>keyr<="1101111111110111";
when "1110"=>keyr<="1110111111101111";
when "1111"=>keyr<="1111000000011111";
when others=>keyr<="1111111111111111";
end case;
when 21=>
case cdount is
when "0000"=>keyr<="1111111111111111";--21
when "0001"=>keyr<="1100111110011111";
when "0010"=>keyr<="1101011111101111";
when "0011"=>keyr<="1101101111110111";
when "0100"=>keyr<="1101110111110111";
when "0101"=>keyr<="1101111011101111";
when "0110"=>keyr<="1101111100011111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111111111011111";
when "1010"=>keyr<="1111111111001111";
when "1011"=>keyr<="1100000000000111";
when "1100"=>keyr<="1111111111111111";
when "1101"=>keyr<="1111111111111111";
when "1110"=>keyr<="1111111111111111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
elsif s="0010" then
case cdount is
when"0000"=>keyr<="1111101110111111";
when"0001"=>keyr<="1111101111011111";
when"0010"=>keyr<="1111101111101111";
when"0011"=>keyr<="1111101111110011";
when"0100"=>keyr<="1111100000011100";
when"0101"=>keyr<="1111101111011101";
when"0110"=>keyr<="1111101111011101";
when"0111"=>keyr<="1111101111011101";
when"1000"=>keyr<="0000000000000001";
when"1001"=>keyr<="1111101111011101";
when"1010"=>keyr<="1111101111011101";
when"1011"=>keyr<="1111101111011101";
when"1100"=>keyr<="1111101111011101";
when"1101"=>keyr<="1111101111111101";
when"1110"=>keyr<="1111101111111111";
when"1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111"; --年
end case;
elsif s="0011" then
case m is
when 1=>
case cdount is
when "0000"=>keyr<="1111111111111111"; --列显示01
when "0001"=>keyr<="1111000000011111";
when "0010"=>keyr<="1110111111101111";
when "0011"=>keyr<="1101111111110111";
when "0100"=>keyr<="1101111111110111";
when "0101"=>keyr<="1101111111110111";
when "0110"=>keyr<="1110111111101111";
when "0111"=>keyr<="1111000000011111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111111111011111";
when "1010"=>keyr<="1111111111001111";
when "1011"=>keyr<="1100000000000111";
when "1100"=>keyr<="1111111111111111";
when "1101"=>keyr<="1111111111111111";
when "1110"=>keyr<="1111111111111111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 2=>
case cdount is
when "0000"=>keyr<="1111111111111111"; --列显示02
when "0001"=>keyr<="1111000000011111";
when "0010"=>keyr<="1110111111101111";
when "0011"=>keyr<="1101111111110111";
when "0100"=>keyr<="1101111111110111";
when "0101"=>keyr<="1101111111110111";
when "0110"=>keyr<="1110111111101111";
when "0111"=>keyr<="1111000000011111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1100111110011111";
when "1010"=>keyr<="1101011111101111";
when "1011"=>keyr<="1101101111110111";
when "1100"=>keyr<="1101110111110111";
when "1101"=>keyr<="1101111011101111";
when "1110"=>keyr<="1101111100011111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 3=>
case cdount is
when "0000"=>keyr<="1111111111111111"; --列显示03
when "0001"=>keyr<="1111000000011111";
when "0010"=>keyr<="1110111111101111";
when "0011"=>keyr<="1101111111110111";
when "0100"=>keyr<="1101111111110111";
when "0101"=>keyr<="1101111111110111";
when "0110"=>keyr<="1110111111101111";
when "0111"=>keyr<="1111000000011111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1110011111001111";
when "1010"=>keyr<="1101111111110111";
when "1011"=>keyr<="1101111111110111";
when "1100"=>keyr<="1101111011110111";
when "1101"=>keyr<="1101111011110111";
when "1110"=>keyr<="1110000100001111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 4=>
case cdount is
when "0000"=>keyr<="1111111111111111"; --列显示04
when "0001"=>keyr<="1111000000011111";
when "0010"=>keyr<="1110111111101111";
when "0011"=>keyr<="1101111111110111";
when "0100"=>keyr<="1101111111110111";
when "0101"=>keyr<="1101111111110111";
when "0110"=>keyr<="1110111111101111";
when "0111"=>keyr<="1111000000011111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111100111111111";
when "1010"=>keyr<="1111101011111111";
when "1011"=>keyr<="1111101100111111";
when "1100"=>keyr<="1111101111011111";
when "1101"=>keyr<="1111101111101111";
when "1110"=>keyr<="1100000000000111";
when "1111"=>keyr<="1111101111111111";
when others=>keyr<="1111111111111111";
end case;
when 5=>
case cdount is
when "0000"=>keyr<="1111111111111111"; --列显示05
when "0001"=>keyr<="1111000000011111";
when "0010"=>keyr<="1110111111101111";
when "0011"=>keyr<="1101111111110111";
when "0100"=>keyr<="1101111111110111";
when "0101"=>keyr<="1101111111110111";
when "0110"=>keyr<="1110111111101111";
when "0111"=>keyr<="1111000000011111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1110011100000111";
when "1010"=>keyr<="1101111110110111";
when "1011"=>keyr<="1101111110110111";
when "1100"=>keyr<="1101111110110111";
when "1101"=>keyr<="1101111110110111";
when "1110"=>keyr<="1110000001110111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 6=>
case cdount is
when "0000"=>keyr<="1111111111111111"; --列显示06
when "0001"=>keyr<="1111000000011111";
when "0010"=>keyr<="1110111111101111";
when "0011"=>keyr<="1101111111110111";
when "0100"=>keyr<="1101111111110111";
when "0101"=>keyr<="1101111111110111";
when "0110"=>keyr<="1110111111101111";
when "0111"=>keyr<="1111000000011111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111000000011111";
when "1010"=>keyr<="1110111011101111";
when "1011"=>keyr<="1101111101110111";
when "1100"=>keyr<="1101111101110111";
when "1101"=>keyr<="1101111101110111";
when "1110"=>keyr<="1110000011001111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 7=>
case cdount is
when "0000"=>keyr<="1111111111111111"; --列显示07
when "0001"=>keyr<="1111000000011111";
when "0010"=>keyr<="1110111111101111";
when "0011"=>keyr<="1101111111110111";
when "0100"=>keyr<="1101111111110111";
when "0101"=>keyr<="1101111111110111";
when "0110"=>keyr<="1110111111101111";
when "0111"=>keyr<="1111000000011111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111111111110111";
when "1010"=>keyr<="1111111111110111";
when "1011"=>keyr<="1100111111110111";
when "1100"=>keyr<="1111000111110111";
when "1101"=>keyr<="1111111000110111";
when "1110"=>keyr<="1111111111000111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 8=>
case cdount is
when "0000"=>keyr<="1111111111111111"; --列显示08
when "0001"=>keyr<="1111000000011111";
when "0010"=>keyr<="1110111111101111";
when "0011"=>keyr<="1101111111110111";
when "0100"=>keyr<="1101111111110111";
when "0101"=>keyr<="1101111111110111";
when "0110"=>keyr<="1110111111101111";
when "0111"=>keyr<="1111000000011111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111001110011111";
when "1010"=>keyr<="1110110101101111";
when "1011"=>keyr<="1101111011110111";
when "1100"=>keyr<="1101111011110111";
when "1101"=>keyr<="1101111011110111";
when "1110"=>keyr<="1110110101101111";
when "1111"=>keyr<="1111001110011111";
when others=>keyr<="1111111111111111";
end case;
when 9=>
case cdount is
when "0000"=>keyr<="1111111111111111"; --列显示09
when "0001"=>keyr<="1111000000011111";
when "0010"=>keyr<="1110111111101111";
when "0011"=>keyr<="1101111111110111";
when "0100"=>keyr<="1101111111110111";
when "0101"=>keyr<="1101111111110111";
when "0110"=>keyr<="1110111111101111";
when "0111"=>keyr<="1111000000011111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1110011000001111";
when "1010"=>keyr<="1101110111110111";
when "1011"=>keyr<="1101110111110111";
when "1100"=>keyr<="1101110111110111";
when "1101"=>keyr<="1110111011101111";
when "1110"=>keyr<="1111000000011111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 10=>
case cdount is
when "0000"=>keyr<="1111111111111111";--列显示10
when "0001"=>keyr<="1111111111011111";
when "0010"=>keyr<="1111111111001111";
when "0011"=>keyr<="1100000000000111";
when "0100"=>keyr<="1111111111111111";
when "0101"=>keyr<="1111111111111111";
when "0110"=>keyr<="1111111111111111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111000000011111";
when "1010"=>keyr<="1110111111101111";
when "1011"=>keyr<="1101111111110111";
when "1100"=>keyr<="1101111111110111";
when "1101"=>keyr<="1101111111110111";
when "1110"=>keyr<="1110111111101111";
when "1111"=>keyr<="1111000000011111";
when others=>keyr<="1111111111111111";
end case;
when 11=>
case cdount is
when "0000"=>keyr<="1111111111111111";--列显示11
when "0001"=>keyr<="1111111111011111";
when "0010"=>keyr<="1111111111001111";
when "0011"=>keyr<="1100000000000111";
when "0100"=>keyr<="1111111111111111";
when "0101"=>keyr<="1111111111111111";
when "0110"=>keyr<="1111111111111111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111111111011111";
when "1010"=>keyr<="1111111111001111";
when "1011"=>keyr<="1100000000000111";
when "1100"=>keyr<="1111111111111111";
when "1101"=>keyr<="1111111111111111";
when "1110"=>keyr<="1111111111111111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 12=>
case cdount is
when "0000"=>keyr<="1111111111111111";--列显示12
when "0001"=>keyr<="1111111111011111";
when "0010"=>keyr<="1111111111001111";
when "0011"=>keyr<="1100000000000111";
when "0100"=>keyr<="1111111111111111";
when "0101"=>keyr<="1111111111111111";
when "0110"=>keyr<="1111111111111111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1100111110011111";
when "1010"=>keyr<="1101011111101111";
when "1011"=>keyr<="1101101111110111";
when "1100"=>keyr<="1101110111110111";
when "1101"=>keyr<="1101111011101111";
when "1110"=>keyr<="1101111100011111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when others=>null;
end case;
elsif s="0100" then
case cdount is
when "0000"=>keyr<="1111111111111111"; --列显示月
when "0001"=>keyr<="1011111111111111";
when "0010"=>keyr<="1000111111111111";
when "0011"=>keyr<="1100000000000001";
when "0100"=>keyr<="1111000000000001";
when "0101"=>keyr<="1111110011011001";
when "0110"=>keyr<="1111110011011001";
when "0111"=>keyr<="1111110011011001";
when "1000"=>keyr<="1111110011011001";
when "1001"=>keyr<="1101110011011001";
when "1010"=>keyr<="1001110011011001";
when "1011"=>keyr<="1000000000000001";
when "1100"=>keyr<="1100000000000001";
when "1101"=>keyr<="1111111111111111";
when "1110"=>keyr<="1111111111111111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
elsif s="0101" then
case d is
when 1=>
case cdount is
when "0000"=>keyr<="1111111111111111"; --列显示01
when "0001"=>keyr<="1111000000011111";
when "0010"=>keyr<="1110111111101111";
when "0011"=>keyr<="1101111111110111";
when "0100"=>keyr<="1101111111110111";
when "0101"=>keyr<="1101111111110111";
when "0110"=>keyr<="1110111111101111";
when "0111"=>keyr<="1111000000011111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111111111011111";
when "1010"=>keyr<="1111111111001111";
when "1011"=>keyr<="1100000000000111";
when "1100"=>keyr<="1111111111111111";
when "1101"=>keyr<="1111111111111111";
when "1110"=>keyr<="1111111111111111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 2=>
case cdount is
when "0000"=>keyr<="1111111111111111"; --列显示02
when "0001"=>keyr<="1111000000011111";
when "0010"=>keyr<="1110111111101111";
when "0011"=>keyr<="1101111111110111";
when "0100"=>keyr<="1101111111110111";
when "0101"=>keyr<="1101111111110111";
when "0110"=>keyr<="1110111111101111";
when "0111"=>keyr<="1111000000011111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1100111110011111";
when "1010"=>keyr<="1101011111101111";
when "1011"=>keyr<="1101101111110111";
when "1100"=>keyr<="1101110111110111";
when "1101"=>keyr<="1101111011101111";
when "1110"=>keyr<="1101111100011111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 3=>
case cdount is
when "0000"=>keyr<="1111111111111111"; --列显示03
when "0001"=>keyr<="1111000000011111";
when "0010"=>keyr<="1110111111101111";
when "0011"=>keyr<="1101111111110111";
when "0100"=>keyr<="1101111111110111";
when "0101"=>keyr<="1101111111110111";
when "0110"=>keyr<="1110111111101111";
when "0111"=>keyr<="1111000000011111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1110011111001111";
when "1010"=>keyr<="1101111111110111";
when "1011"=>keyr<="1101111111110111";
when "1100"=>keyr<="1101111011110111";
when "1101"=>keyr<="1101111011110111";
when "1110"=>keyr<="1110000100001111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 4=>
case cdount is
when "0000"=>keyr<="1111111111111111"; --列显示04
when "0001"=>keyr<="1111000000011111";
when "0010"=>keyr<="1110111111101111";
when "0011"=>keyr<="1101111111110111";
when "0100"=>keyr<="1101111111110111";
when "0101"=>keyr<="1101111111110111";
when "0110"=>keyr<="1110111111101111";
when "0111"=>keyr<="1111000000011111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111100111111111";
when "1010"=>keyr<="1111101011111111";
when "1011"=>keyr<="1111101100111111";
when "1100"=>keyr<="1111101111011111";
when "1101"=>keyr<="1111101111101111";
when "1110"=>keyr<="1100000000000111";
when "1111"=>keyr<="1111101111111111";
when others=>keyr<="1111111111111111";
end case;
when 5=>
case cdount is
when "0000"=>keyr<="1111111111111111"; --列显示05
when "0001"=>keyr<="1111000000011111";
when "0010"=>keyr<="1110111111101111";
when "0011"=>keyr<="1101111111110111";
when "0100"=>keyr<="1101111111110111";
when "0101"=>keyr<="1101111111110111";
when "0110"=>keyr<="1110111111101111";
when "0111"=>keyr<="1111000000011111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1110011100000111";
when "1010"=>keyr<="1101111110110111";
when "1011"=>keyr<="1101111110110111";
when "1100"=>keyr<="1101111110110111";
when "1101"=>keyr<="1101111110110111";
when "1110"=>keyr<="1110000001110111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 6=>
case cdount is
when "0000"=>keyr<="1111111111111111"; --列显示06
when "0001"=>keyr<="1111000000011111";
when "0010"=>keyr<="1110111111101111";
when "0011"=>keyr<="1101111111110111";
when "0100"=>keyr<="1101111111110111";
when "0101"=>keyr<="1101111111110111";
when "0110"=>keyr<="1110111111101111";
when "0111"=>keyr<="1111000000011111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111000000011111";
when "1010"=>keyr<="1110111011101111";
when "1011"=>keyr<="1101111101110111";
when "1100"=>keyr<="1101111101110111";
when "1101"=>keyr<="1101111101110111";
when "1110"=>keyr<="1110000011001111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 7=>
case cdount is
when "0000"=>keyr<="1111111111111111"; --列显示07
when "0001"=>keyr<="1111000000011111";
when "0010"=>keyr<="1110111111101111";
when "0011"=>keyr<="1101111111110111";
when "0100"=>keyr<="1101111111110111";
when "0101"=>keyr<="1101111111110111";
when "0110"=>keyr<="1110111111101111";
when "0111"=>keyr<="1111000000011111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111111111110111";
when "1010"=>keyr<="1111111111110111";
when "1011"=>keyr<="1100111111110111";
when "1100"=>keyr<="1111000111110111";
when "1101"=>keyr<="1111111000110111";
when "1110"=>keyr<="1111111111000111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 8=>
case cdount is
when "0000"=>keyr<="1111111111111111"; --列显示08
when "0001"=>keyr<="1111000000011111";
when "0010"=>keyr<="1110111111101111";
when "0011"=>keyr<="1101111111110111";
when "0100"=>keyr<="1101111111110111";
when "0101"=>keyr<="1101111111110111";
when "0110"=>keyr<="1110111111101111";
when "0111"=>keyr<="1111000000011111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111001110011111";
when "1010"=>keyr<="1110110101101111";
when "1011"=>keyr<="1101111011110111";
when "1100"=>keyr<="1101111011110111";
when "1101"=>keyr<="1101111011110111";
when "1110"=>keyr<="1110110101101111";
when "1111"=>keyr<="1111001110011111";
when others=>keyr<="1111111111111111";
end case;
when 9=>
case cdount is
when "0000"=>keyr<="1111111111111111"; --列显示09
when "0001"=>keyr<="1111000000011111";
when "0010"=>keyr<="1110111111101111";
when "0011"=>keyr<="1101111111110111";
when "0100"=>keyr<="1101111111110111";
when "0101"=>keyr<="1101111111110111";
when "0110"=>keyr<="1110111111101111";
when "0111"=>keyr<="1111000000011111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1110011000001111";
when "1010"=>keyr<="1101110111110111";
when "1011"=>keyr<="1101110111110111";
when "1100"=>keyr<="1101110111110111";
when "1101"=>keyr<="1110111011101111";
when "1110"=>keyr<="1111000000011111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 10=>
case cdount is
when "0000"=>keyr<="1111111111111111";--列显示10
when "0001"=>keyr<="1111111111011111";
when "0010"=>keyr<="1111111111001111";
when "0011"=>keyr<="1100000000000111";
when "0100"=>keyr<="1111111111111111";
when "0101"=>keyr<="1111111111111111";
when "0110"=>keyr<="1111111111111111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111000000011111";
when "1010"=>keyr<="1110111111101111";
when "1011"=>keyr<="1101111111110111";
when "1100"=>keyr<="1101111111110111";
when "1101"=>keyr<="1101111111110111";
when "1110"=>keyr<="1110111111101111";
when "1111"=>keyr<="1111000000011111";
when others=>keyr<="1111111111111111";
end case;
when 11=>
case cdount is
when "0000"=>keyr<="1111111111111111";--列显示11
when "0001"=>keyr<="1111111111011111";
when "0010"=>keyr<="1111111111001111";
when "0011"=>keyr<="1100000000000111";
when "0100"=>keyr<="1111111111111111";
when "0101"=>keyr<="1111111111111111";
when "0110"=>keyr<="1111111111111111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111111111011111";
when "1010"=>keyr<="1111111111001111";
when "1011"=>keyr<="1100000000000111";
when "1100"=>keyr<="1111111111111111";
when "1101"=>keyr<="1111111111111111";
when "1110"=>keyr<="1111111111111111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 12=>
case cdount is
when "0000"=>keyr<="1111111111111111";--列显示12
when "0001"=>keyr<="1111111111011111";
when "0010"=>keyr<="1111111111001111";
when "0011"=>keyr<="1100000000000111";
when "0100"=>keyr<="1111111111111111";
when "0101"=>keyr<="1111111111111111";
when "0110"=>keyr<="1111111111111111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1100111110011111";
when "1010"=>keyr<="1101011111101111";
when "1011"=>keyr<="1101101111110111";
when "1100"=>keyr<="1101110111110111";
when "1101"=>keyr<="1101111011101111";
when "1110"=>keyr<="1101111100011111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 13=>
case cdount is
when "0000"=>keyr<="1111111111111111";--13
when "0001"=>keyr<="1111111111011111";
when "0010"=>keyr<="1111111111001111";
when "0011"=>keyr<="1100000000000111";
when "0100"=>keyr<="1111111111111111";
when "0101"=>keyr<="1111111111111111";
when "0110"=>keyr<="1111111111111111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1110011111001111";
when "1010"=>keyr<="1101111111110111";
when "1011"=>keyr<="1101111111110111";
when "1100"=>keyr<="1101111011110111";
when "1101"=>keyr<="1101111011110111";
when "1110"=>keyr<="1110000100001111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 14=>
case cdount is
when "0000"=>keyr<="1111111111111111";--14
when "0001"=>keyr<="1111111111011111";
when "0010"=>keyr<="1111111111001111";
when "0011"=>keyr<="1100000000000111";
when "0100"=>keyr<="1111111111111111";
when "0101"=>keyr<="1111111111111111";
when "0110"=>keyr<="1111111111111111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111100111111111";
when "1010"=>keyr<="1111101011111111";
when "1011"=>keyr<="1111101100111111";
when "1100"=>keyr<="1111101111011111";
when "1101"=>keyr<="1111101111101111";
when "1110"=>keyr<="1100000000000111";
when "1111"=>keyr<="1111101111111111";
when others=>keyr<="1111111111111111";
end case;
when 15=>
case cdount is
when "0000"=>keyr<="1111111111111111";--15
when "0001"=>keyr<="1111111111011111";
when "0010"=>keyr<="1111111111001111";
when "0011"=>keyr<="1100000000000111";
when "0100"=>keyr<="1111111111111111";
when "0101"=>keyr<="1111111111111111";
when "0110"=>keyr<="1111111111111111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1110011100000111";
when "1010"=>keyr<="1101111110110111";
when "1011"=>keyr<="1101111110110111";
when "1100"=>keyr<="1101111110110111";
when "1101"=>keyr<="1101111110110111";
when "1110"=>keyr<="1110000001110111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 16=>
case cdount is
when "0000"=>keyr<="1111111111111111";--16
when "0001"=>keyr<="1111111111011111";
when "0010"=>keyr<="1111111111001111";
when "0011"=>keyr<="1100000000000111";
when "0100"=>keyr<="1111111111111111";
when "0101"=>keyr<="1111111111111111";
when "0110"=>keyr<="1111111111111111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111000000011111";
when "1010"=>keyr<="1110111011101111";
when "1011"=>keyr<="1101111101110111";
when "1100"=>keyr<="1101111101110111";
when "1101"=>keyr<="1101111101110111";
when "1110"=>keyr<="1110000011001111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 17=>
case cdount is
when "0000"=>keyr<="1111111111111111";--17
when "0001"=>keyr<="1111111111011111";
when "0010"=>keyr<="1111111111001111";
when "0011"=>keyr<="1100000000000111";
when "0100"=>keyr<="1111111111111111";
when "0101"=>keyr<="1111111111111111";
when "0110"=>keyr<="1111111111111111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111111111110111";
when "1010"=>keyr<="1111111111110111";
when "1011"=>keyr<="1100111111110111";
when "1100"=>keyr<="1111000111110111";
when "1101"=>keyr<="1111111000110111";
when "1110"=>keyr<="1111111111000111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 18=>
case cdount is
when "0000"=>keyr<="1111111111111111";--18
when "0001"=>keyr<="1111111111011111";
when "0010"=>keyr<="1111111111001111";
when "0011"=>keyr<="1100000000000111";
when "0100"=>keyr<="1111111111111111";
when "0101"=>keyr<="1111111111111111";
when "0110"=>keyr<="1111111111111111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111001110011111";
when "1010"=>keyr<="1110110101101111";
when "1011"=>keyr<="1101111011110111";
when "1100"=>keyr<="1101111011110111";
when "1101"=>keyr<="1101111011110111";
when "1110"=>keyr<="1110110101101111";
when "1111"=>keyr<="1111001110011111";
when others=>keyr<="1111111111111111";
end case;
when 19=>
case cdount is
when "0000"=>keyr<="1111111111111111";--19
when "0001"=>keyr<="1111111111011111";
when "0010"=>keyr<="1111111111001111";
when "0011"=>keyr<="1100000000000111";
when "0100"=>keyr<="1111111111111111";
when "0101"=>keyr<="1111111111111111";
when "0110"=>keyr<="1111111111111111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1110011000001111";
when "1010"=>keyr<="1101110111110111";
when "1011"=>keyr<="1101110111110111";
when "1100"=>keyr<="1101110111110111";
when "1101"=>keyr<="1110111011101111";
when "1110"=>keyr<="1111000000011111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 20=>
case cdount is
when "0000"=>keyr<="1111111111111111";--20
when "0001"=>keyr<="1100111110011111";
when "0010"=>keyr<="1101011111101111";
when "0011"=>keyr<="1101101111110111";
when "0100"=>keyr<="1101110111110111";
when "0101"=>keyr<="1101111011101111";
when "0110"=>keyr<="1101111100011111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111000000011111";
when "1010"=>keyr<="1110111111101111";
when "1011"=>keyr<="1101111111110111";
when "1100"=>keyr<="1101111111110111";
when "1101"=>keyr<="1101111111110111";
when "1110"=>keyr<="1110111111101111";
when "1111"=>keyr<="1111000000011111";
when others=>keyr<="1111111111111111";
end case;
when 21=>
case cdount is
when "0000"=>keyr<="1111111111111111";--21
when "0001"=>keyr<="1100111110011111";
when "0010"=>keyr<="1101011111101111";
when "0011"=>keyr<="1101101111110111";
when "0100"=>keyr<="1101110111110111";
when "0101"=>keyr<="1101111011101111";
when "0110"=>keyr<="1101111100011111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111111111011111";
when "1010"=>keyr<="1111111111001111";
when "1011"=>keyr<="1100000000000111";
when "1100"=>keyr<="1111111111111111";
when "1101"=>keyr<="1111111111111111";
when "1110"=>keyr<="1111111111111111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 22=>
case cdount is
when "0000"=>keyr<="1111111111111111";--22
when "0001"=>keyr<="1100111110011111";
when "0010"=>keyr<="1101011111101111";
when "0011"=>keyr<="1101101111110111";
when "0100"=>keyr<="1101110111110111";
when "0101"=>keyr<="1101111011101111";
when "0110"=>keyr<="1101111100011111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1100111110011111";
when "1010"=>keyr<="1101011111101111";
when "1011"=>keyr<="1101101111110111";
when "1100"=>keyr<="1101110111110111";
when "1101"=>keyr<="1101111011101111";
when "1110"=>keyr<="1101111100011111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 23=>
case cdount is
when "0000"=>keyr<="1111111111111111";--23
when "0001"=>keyr<="1100111110011111";
when "0010"=>keyr<="1101011111101111";
when "0011"=>keyr<="1101101111110111";
when "0100"=>keyr<="1101110111110111";
when "0101"=>keyr<="1101111011101111";
when "0110"=>keyr<="1101111100011111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1110011111001111";
when "1010"=>keyr<="1101111111110111";
when "1011"=>keyr<="1101111111110111";
when "1100"=>keyr<="1101111011110111";
when "1101"=>keyr<="1101111011110111";
when "1110"=>keyr<="1110000100001111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 24=>
case cdount is
when "0000"=>keyr<="1111111111111111";--24
when "0001"=>keyr<="1100111110011111";
when "0010"=>keyr<="1101011111101111";
when "0011"=>keyr<="1101101111110111";
when "0100"=>keyr<="1101110111110111";
when "0101"=>keyr<="1101111011101111";
when "0110"=>keyr<="1101111100011111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111100111111111";
when "1010"=>keyr<="1111101011111111";
when "1011"=>keyr<="1111101100111111";
when "1100"=>keyr<="1111101111011111";
when "1101"=>keyr<="1111101111101111";
when "1110"=>keyr<="1100000000000111";
when "1111"=>keyr<="1111101111111111";
when others=>keyr<="1111111111111111";
end case;
when 25=>
case cdount is
when "0000"=>keyr<="1111111111111111";--25
when "0001"=>keyr<="1100111110011111";
when "0010"=>keyr<="1101011111101111";
when "0011"=>keyr<="1101101111110111";
when "0100"=>keyr<="1101110111110111";
when "0101"=>keyr<="1101111011101111";
when "0110"=>keyr<="1101111100011111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1110011100000111";
when "1010"=>keyr<="1101111110110111";
when "1011"=>keyr<="1101111110110111";
when "1100"=>keyr<="1101111110110111";
when "1101"=>keyr<="1101111110110111";
when "1110"=>keyr<="1110000001110111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 26=>
case cdount is
when "0000"=>keyr<="1111111111111111";--26
when "0001"=>keyr<="1100111110011111";
when "0010"=>keyr<="1101011111101111";
when "0011"=>keyr<="1101101111110111";
when "0100"=>keyr<="1101110111110111";
when "0101"=>keyr<="1101111011101111";
when "0110"=>keyr<="1101111100011111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111000000011111";
when "1010"=>keyr<="1110111011101111";
when "1011"=>keyr<="1101111101110111";
when "1100"=>keyr<="1101111101110111";
when "1101"=>keyr<="1101111101110111";
when "1110"=>keyr<="1110000011001111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 27=>
case cdount is
when "0000"=>keyr<="1111111111111111";--27
when "0001"=>keyr<="1100111110011111";
when "0010"=>keyr<="1101011111101111";
when "0011"=>keyr<="1101101111110111";
when "0100"=>keyr<="1101110111110111";
when "0101"=>keyr<="1101111011101111";
when "0110"=>keyr<="1101111100011111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111111111110111";
when "1010"=>keyr<="1111111111110111";
when "1011"=>keyr<="1100111111110111";
when "1100"=>keyr<="1111000111110111";
when "1101"=>keyr<="1111111000110111";
when "1110"=>keyr<="1111111111000111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 28=>
case cdount is
when "0000"=>keyr<="1111111111111111";--28
when "0001"=>keyr<="1100111110011111";
when "0010"=>keyr<="1101011111101111";
when "0011"=>keyr<="1101101111110111";
when "0100"=>keyr<="1101110111110111";
when "0101"=>keyr<="1101111011101111";
when "0110"=>keyr<="1101111100011111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111001110011111";
when "1010"=>keyr<="1110110101101111";
when "1011"=>keyr<="1101111011110111";
when "1100"=>keyr<="1101111011110111";
when "1101"=>keyr<="1101111011110111";
when "1110"=>keyr<="1110110101101111";
when "1111"=>keyr<="1111001110011111";
when others=>keyr<="1111111111111111";
end case;
when 29=>
case cdount is
when "0000"=>keyr<="1111111111111111";--29
when "0001"=>keyr<="1100111110011111";
when "0010"=>keyr<="1101011111101111";
when "0011"=>keyr<="1101101111110111";
when "0100"=>keyr<="1101110111110111";
when "0101"=>keyr<="1101111011101111";
when "0110"=>keyr<="1101111100011111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1110011000001111";
when "1010"=>keyr<="1101110111110111";
when "1011"=>keyr<="1101110111110111";
when "1100"=>keyr<="1101110111110111";
when "1101"=>keyr<="1110111011101111";
when "1110"=>keyr<="1111000000011111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when 30=>
case cdount is
when "0000"=>keyr<="1111111111111111";--30
when "0001"=>keyr<="1110011111001111";
when "0010"=>keyr<="1101111111110111";
when "0011"=>keyr<="1101111111110111";
when "0100"=>keyr<="1101111011110111";
when "0101"=>keyr<="1101111011110111";
when "0110"=>keyr<="1110000100001111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111000000011111";
when "1010"=>keyr<="1110111111101111";
when "1011"=>keyr<="1101111111110111";
when "1100"=>keyr<="1101111111110111";
when "1101"=>keyr<="1101111111110111";
when "1110"=>keyr<="1110111111101111";
when "1111"=>keyr<="1111000000011111";
when others=>keyr<="1111111111111111";
end case;
when 31=>
case cdount is
when "0000"=>keyr<="1111111111111111";--31
when "0001"=>keyr<="1110011111001111";
when "0010"=>keyr<="1101111111110111";
when "0011"=>keyr<="1101111111110111";
when "0100"=>keyr<="1101111011110111";
when "0101"=>keyr<="1101111011110111";
when "0110"=>keyr<="1110000100001111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111111111011111";
when "1010"=>keyr<="1111111111001111";
when "1011"=>keyr<="1100000000000111";
when "1100"=>keyr<="1111111111111111";
when "1101"=>keyr<="1111111111111111";
when "1110"=>keyr<="1111111111111111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
when others=>null;
end case;
elsif s="0110" then
case cdount is
when "0000"=>keyr<="1111111111111111"; --列显示显示日
when "0001"=>keyr<="1111111111111111";
when "0010"=>keyr<="1111111111111111";
when "0011"=>keyr<="1000000000000000";
when "0100"=>keyr<="1000000000000000";
when "0101"=>keyr<="1100111100111100";
when "0110"=>keyr<="1100111100111100";
when "0111"=>keyr<="1100111100111100";
when "1000"=>keyr<="1100111100111100";
when "1001"=>keyr<="1100111100111100";
when "1010"=>keyr<="1100111100111100";
when "1011"=>keyr<="1000000000000000";
when "1100"=>keyr<="1000000000000000";
when "1101"=>keyr<="1111111111111111";
when "1110"=>keyr<="1111111111111111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
elsif s="0111" then
case cdount is
when "0000"=>keyr<="1111111111111111";--kongbai
when "0001"=>keyr<="1111111111111111";
when "0010"=>keyr<="1111111111111111";
when "0011"=>keyr<="1111111111111111";
when "0100"=>keyr<="1111111111111111";
when "0101"=>keyr<="1111111111111111";
when "0110"=>keyr<="1111111111111111";
when "0111"=>keyr<="1111111111111111";
when "1000"=>keyr<="1111111111111111";
when "1001"=>keyr<="1111111111111111";
when "1010"=>keyr<="1111111111111111";
when "1011"=>keyr<="1111111111111111";
when "1100"=>keyr<="1111111111111111";
when "1101"=>keyr<="1111111111111111";
when "1110"=>keyr<="1111111111111111";
when "1111"=>keyr<="1111111111111111";
when others=>keyr<="1111111111111111";
end case;
end if;
end process;
end behave;
附录二 总体设计原理图
附录三 仿真结果图