您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页电子钟时间设定和显示程序

电子钟时间设定和显示程序

来源:华佗小知识


实验名称:电子钟时间设计

实验目的:

实验设备:

实验原理:

这个电子钟电路分成四个模块方式来讨论: 七段显示器电路设计

电子钟时间计数&显示电路设计 弹跳消除电路设计

电子钟电路设计:时间设定 (1) 七段显示器电路设计

六个共阳极型七段显示器组成放入电子钟,程序如下: BCD七段显示信号

SEG <= \"1000000\" WHEN NUM = 0 ELSE

\"1111001\" WHEN NUM = 1 ELSE \"0100100\" WHEN NUM = 2 ELSE \"0110000\" WHEN NUM = 3 ELSE \"0011001\" WHEN NUM = 4 ELSE \"0010010\" WHEN NUM = 5 ELSE \"0000010\" WHEN NUM = 6 ELSE \"1111000\" WHEN NUM = 7 ELSE \"0000000\" WHEN NUM = 8 ELSE \"0010000\" WHEN NUM = 9 ELSE \"0001000\" WHEN NUM = 10 ELSE \"0000011\" WHEN NUM = 11 ELSE \"1000110\" WHEN NUM = 12 ELSE \"0100001\" WHEN NUM = 13 ELSE \"0000110\" WHEN NUM = 14 ELSE \"0001110\" WHEN NUM = 15 ELSE \"1111111\";

S <= Q(15 DOWNTO 13);

扫描信号SEL <= \"111110\" WHEN S=0 ELSE \"111101\" WHEN S=1 ELSE \"111011\" WHEN S=2 ELSE \"110111\" WHEN S=3 ELSE \"101111\" WHEN S=4 ELSE \"011111\" WHEN S=5 ELSE \"111111\";

(2)时间计数&显示电路设计

1.模块方块与Component ,Port Map指令

COMPONENT COUNTER60

PORT(

);

CP BIN S

CLR EC CY60

: IN STD_LOGIC; : OUT

STD_LOGIC_VECTOR (5 DOWNTO 0);

: IN STD_LOGIC; : IN STD_LOGIC; : IN STD_LOGIC; : OUT STD_LOGIC

END COMPONENT; COMPONENT COUNTER24

PORT(

);

CP BIN S

CLR EC CY24

: IN STD_LOGIC; : OUT

STD_LOGIC_VECTOR (5 DOWNTO 0);

: IN STD_LOGIC; : IN STD_LOGIC; : IN STD_LOGIC; : OUT STD_LOGIC

END COMPONENT;

2.描电路和ENB信号

ENB <= \"001\" WHEN (S=0 OR S=1) ELSE \"010\" WHEN (S=2 OR S=3) ELSE \"100\" WHEN (S=4 OR S=5) ELSE \"000\";

BIN <= DBS WHEN ENB = \"001\" ELSE --选择秒、分、时 DBM WHEN ENB = \"010\" ELSE DBH WHEN ENB = \"100\" ELSE \"000000\";

依照ENB的那个BIT为HIGH,将它对应的时间数输出给BIN。例如,ENB(1)=1时,将代表“分”数的时间,DBM输出给BIN.. 3.BCD选择

挑选BCD码左半边或右半边4个BIT的动作,也是由原先的扫描信号S来决定的。 SELECT_BCD : Block BEGIN NUM <= BCD(3 DOWNTO 0) WHEN (S=0 OR S=2 OR S=4) ELSE BCD(7 DOWNTO 4); End Block SELECT_BCD; 4.BCD—>七段显示码 转换

(3) 弹跳消除电路设计

KEY信号经过两级的D触发器延迟后,然后再用RS触发器作处理. Debounce块语句是用于消除弹跳,

Differential块语句是微分电路.

(4) 电子钟电路设计:时间设定,时间显示

电子钟设计有时间显示外,还拥有时间设定的功能。 1.外部按钮:

KEY(0)::负责作复位(CLEAR)时间之用。

KEY(1):负责时间调整,但必须是在时间调整模式之下。 KEY(2):负责切换正常时间计数和时间调整模式。 被调整的时间数字会产生闪烁:

以KEY(2)选择的数字,例如选“12:34:56”的分数“34”,它将产生闪烁效果,而“12”和“56”将固定显示不动。

被调整的时间数字之间互相。

2. 改变状态部分

状态变量Q是3Bits,且通常状态是“011”,每次Key2(2)按下一次时,状态变量Q减1,而Q(1),Q(0)才是传递线实际状态变量STATE的内容,所以程序写成:

STATE《=Q(1 DOWNTO 0);

而增加Q(2)位,是希望状态改变,而Q不断递减至“000”时,再递减时Q的值将变成7,这时程序将氢SET信号改设成1;

SET〈=‘1’WHEN Q=7 ELSE ‘0’;

除弹跳,微分部分

上述先将KEY(2)的信号送进除弹跳电路后,结果得到DLY_OUT信号,然后再将它送到微分电路得到DIFF,最后再和KEY92)微分,取得状态改烃的同步信号EC,程序应写成:

EC《=DIFF AND KEY(2);

控制是否闪烁的MATCH信号

由于希望KEY(2)按下时,被选到的调整数字产生闪烁的现象,所以在Rree_Counter程序方块里,编写产生控制闪烁需要的MATCH信号程序,如下所示:

MATCH<=’1’WHEN (S=0 OR S=1) AND STATE=”10”),ELSE ‘1’WHEN((S=2 OR S=3) AMD STATE=’01’)ELSE ‘1’WHEN((S=4 OR S=5) AMD STATE=”00”)ELSE ‘0’;

例如“秒数”的数字产生闪烁,状态变理就必须是STATE=“10”,而且扫描信号S是0或1的情形下,MATCH信号才能为1。

闪烁信号GLITTER

为了让被选到的的时间数字有闪烁效果,就必须先有一个合适的ON-OFF信号,这部分由Free_Counter程序方块的计数器,引出Q(21)给GLITTER: GLITTER《=Q(21);

因为所使用的时钟脉冲信号是4MHZ,则说明GLITTERz约是1上的信号,所以闪烁的效果应是每秒一次。

3. 1首先将原先的状态变量STATE(0),STATE(1)作与运算产生SC,这是因为只要STATE是“11”的计时模式,则SC是1,其余调整时间模式,SC是0。这时的SC就能拿来控制调整时间数值增加与否的KEY(1),程序如下: SC <= STATE(1) AND STATE (0); -- 计时状态 ADJ <= SEC AND (NOT SC) AND not Key(1); -- adjust

ADJ信号的组成还SEC信号,将使时间能够调整时,按着KEY(1)按钮不放时,时间计数能够以约1秒的速率递增。

2为了让每个“时”,“分”,“秒”能够有被调整的能力,如下程序:

ECS <= (SEC AND SC) OR (ADJ AND STATE(1) AND NOT STATE(0)); --计秒 ECM <= (CYS AND SC) OR (ADJ AND NOT STATE(1) AND STATE(0)); --计分

ECH <= (CYM AND SC) OR (ADJ AND NOT STATE(1) AND NOT STATE(0));--计时 以计秒的同步控制SEC信号为例,它的组成命令是:

ECS <= (SEC AND SC) OR (ADJ AND STATE(1) AND NOT STATE(0)); OR命令将它分成两个部分来讨论:

时钟正常计数时,是由“SEC AND S”命令负责正常计秒的动作,这是因为SEC是1HZ的脉冲波形,在正常的时钟计数下,SC等于1。

在时钟调整秒数的工作状态模式时,即STATE为“10”,这时由STATE配合KEY(1)按钮的衍生信号ADJ来负责手动调整秒数。

3、输出的显示用for-generate语句循环实现,将扫描一某个要显示的七段显示器,作输出显示处理,程序如下所示:

GEN:FOR I IN 0 TO 6 GENERATE SEGOUT(I)《=SEG(I) AND (EC OR (GLITTER OR NOT MATCH)); END GENERATE;

扫描某个七段赤显示器时,若扣除P点的LED,则仅有七个LED需才虑,所以这时FOR循环控制变量I范围是:0~6。

某个LED可能会亮,除了SEL信号扫描到以年,还必须是下面某个组合: SEG(I) AND SC =1:这时代表该LED会亮,而且是在正常的时钟计时模式(STATE=“11”) SEG(I) AND GLITTER=1:这时代表该LED会亮而且会闪烁,代表目前是在时钟调整模式,而且正好在调整该数字。

SEG(I) AND NOT MATCH =1:若这个LED会亮,代表目前是在这钟调整模式,但不是在调该数字.

电子钟时间设定和现实程序如下:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL; USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

--**************************************************************

ENTITY Timer_Set is PORT( CP : IN STD_LOGIC; -- CLOCK SEGOUT : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- SEG7 Display O/P SELOUT : OUT STD_LOGIC_VECTOR(5 DOWNTO 0); -- Select SEG7 O/P NUMOUT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); -- Number Display Signal Key : IN STD_LOGIC_VECTOR(2 DOWNTO 0) -- Timer & Adjust & CLR );

END Timer_Set;

--************************************************************** ARCHITECTURE a OF Timer_Set IS COMPONENT COUNTER60 PORT( CP : IN STD_LOGIC; BIN : OUT STD_LOGIC_VECTOR (5 DOWNTO 0); S : IN STD_LOGIC; CLR : IN STD_LOGIC; EC : IN STD_LOGIC; CY60 : OUT STD_LOGIC ); END COMPONENT; COMPONENT COUNTER24 PORT( CP : IN STD_LOGIC; BIN : OUT STD_LOGIC_VECTOR (5 DOWNTO 0); S : IN STD_LOGIC; CLR : IN STD_LOGIC; EC : IN STD_LOGIC; CY24 : OUT STD_LOGIC ); END COMPONENT; SIGNAL BIN : STD_LOGIC_VECTOR (5 DOWNTO 0); --Binary O/P SIGNAL DBS : STD_LOGIC_VECTOR (5 DOWNTO 0); --Binary Sec O/P SIGNAL DBM : STD_LOGIC_VECTOR (5 DOWNTO 0); --Binary Min O/P SIGNAL DBH : STD_LOGIC_VECTOR (5 DOWNTO 0); --Binary Hr O/P SIGNAL ENB : STD_LOGIC_VECTOR (2 DOWNTO 0); --Enable Hr & Min & Sec O/P

SIGNAL SEC : STD_LOGIC; --1 Hz 脉冲 SIGNAL BCD : STD_LOGIC_VECTOR (7 DOWNTO 0); SIGNAL CLR : STD_LOGIC; --清除信号 SIGNAL CYS,CYM,CYH : STD_LOGIC; --SecMinHr进位信号 Signal S : STD_LOGIC_VECTOR(2 DOWNTO 0); --选择Segment 7 7 signal CPN : STD_LOGIC; signal rst : STD_LOGIC; signal QN : STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL NUM : STD_LOGIC_VECTOR( 3 DOWNTO 0); -- Number Display Signal SIGNAL SEG : STD_LOGIC_VECTOR( 6 DOWNTO 0); -- SEG7 Display Signal SIGNAL SEL : STD_LOGIC_VECTOR( 5 DOWNTO 0); -- Select SEG7 Signal SIGNAL SAMPLE, DLY_OUT, DIFF : STD_LOGIC; --Binary Signal STATE : STD_LOGIC_VECTOR (1 DOWNTO 0); --Timer 设定状态 --11 计时 --10 调秒 --01 调分 --00 调时? SIGNAL MATCH : STD_LOGIC; --比较调整时、分、秒 SIGNAL GLITTER : STD_LOGIC; --闪烁

BEGIN

PROCESS(CP,rst) BEGIN if rst='1' then QN<=\"0000\";

elsIF (cP'event AND cP='1') THEN QN <= QN +1; END IF ;

END PROCESS; rst<='1' when QN=\"1010\" ELSE '0'; CPN <= QN(3); Connection : Block SIGNAL ADJ,ECS,ECM,ECH,SC : STD_LOGIC; --adjust & Enable Sec & Min & Hr h

Begin U1: COUNTER60 PORT MAP(CPN,DBS,ENB(0),CLR,ECS,CYS); --计秒 U2: COUNTER60 PORT MAP(CPN,DBM,ENB(1),CLR,ECM,CYM); --计分 U3: COUNTER24 PORT MAP(CPN,DBH,ENB(2),CLR,ECH,CYH); --计时 \\

CLR <= NOT Key(0); -- 复位计时 SC <= STATE(1) AND STATE (0); -- 计时状态 ADJ <= SEC AND (NOT SC) AND not Key(1); -- adjust ECS <= (SEC AND SC) OR (ADJ AND STATE(1) AND NOT STATE(0)); --计秒 ECM <= (CYS AND SC) OR (ADJ AND NOT STATE(1) AND STATE(0)); --计分 ECH <= (CYM AND SC) OR (ADJ AND NOT STATE(1) AND NOT STATE(0));--计时 SELOUT <= SEL; -- Seg7 Disp Selection GEN: FOR I IN 0 TO 6 generate SEGOUT(I) <= SEG(I) AND (SC OR (GLITTER OR NOT MATCH)); END generate; SEGOUT(7) <= '0'; NUMOUT <= NUM; End Block Connection;

Free_Counter : Block --计数器 & 产生扫描信号 Signal Q : STD_LOGIC_VECTOR(24 DOWNTO 0); Signal DLY,SDLY : STD_LOGIC; Begin PROCESS (CPN) -- 计数器计数 Begin IF CPN'Event AND CPN='1' then DLY <= Q(21); SDLY <= Q(14); Q <= Q+1; --计数 END IF; END PROCESS; GLITTER <= Q(21); SEC <= Q(21) AND NOT DLY; --微分产生1Hz S <= Q(15 DOWNTO 13); --about 250 Hz SAMPLE <= Q(14) AND NOT SDLY; --取样信号? --扫描信号 SEL <= \"111110\" WHEN S=0 ELSE \"111101\" WHEN S=1 ELSE \"111011\" WHEN S=2 ELSE \"110111\" WHEN S=3 ELSE

\"101111\" WHEN S=4 ELSE \"011111\" WHEN S=5 ELSE \"111111\"; ENB <= \"001\" WHEN (S=0 OR S=1) ELSE \"010\" WHEN (S=2 OR S=3) ELSE \"100\" WHEN (S=4 OR S=5) ELSE \"000\"; BIN <= DBS WHEN ENB = \"001\" ELSE --选择秒、分、时 DBM WHEN ENB = \"010\" ELSE DBH WHEN ENB = \"100\" ELSE \"000000\"; --比较目前调整成何值 MATCH <= '1' WHEN ((S=0 OR S=1) AND STATE = \"10\") ELSE '1' WHEN ((S=2 OR S=3) AND STATE = \"01\") ELSE '1' WHEN ((S=4 OR S=5) AND STATE = \"00\") ELSE '0';

End Block Free_Counter;

Binary_BCD : Block BEGIN --二进制与BCD码的转换 BCD <= \"00000000\" WHEN BIN = 0 ELSE \"00000001\" WHEN BIN = 1 ELSE \"00000010\" WHEN BIN = 2 ELSE \"00000011\" WHEN BIN = 3 ELSE \"00000100\" WHEN BIN = 4 ELSE \"00000101\" WHEN BIN = 5 ELSE \"00000110\" WHEN BIN = 6 ELSE \"00000111\" WHEN BIN = 7 ELSE \"00001000\" WHEN BIN = 8 ELSE \"00001001\" WHEN BIN = 9 ELSE \"00010000\" WHEN BIN = 10 ELSE \"00010001\" WHEN BIN = 11 ELSE \"00010010\" WHEN BIN = 12 ELSE \"00010011\" WHEN BIN = 13 ELSE \"00010100\" WHEN BIN = 14 ELSE \"00010101\" WHEN BIN = 15 ELSE \"00010110\" WHEN BIN = 16 ELSE \"00010111\" WHEN BIN = 17 ELSE \"00011000\" WHEN BIN = 18 ELSE

\"00011001\" WHEN BIN = 19 ELSE \"00100000\" WHEN BIN = 20 ELSE \"00100001\" WHEN BIN = 21 ELSE \"00100010\" WHEN BIN = 22 ELSE \"00100011\" WHEN BIN = 23 ELSE \"00100100\" WHEN BIN = 24 ELSE \"00100101\" WHEN BIN = 25 ELSE \"00100110\" WHEN BIN = 26 ELSE \"00100111\" WHEN BIN = 27 ELSE \"00101000\" WHEN BIN = 28 ELSE \"00101001\" WHEN BIN = 29 ELSE \"00110000\" WHEN BIN = 30 ELSE \"00110001\" WHEN BIN = 31 ELSE \"00110010\" WHEN BIN = 32 ELSE \"00110011\" WHEN BIN = 33 ELSE \"00110100\" WHEN BIN = 34 ELSE \"00110101\" WHEN BIN = 35 ELSE \"00110110\" WHEN BIN = 36 ELSE \"00110111\" WHEN BIN = 37 ELSE \"00111000\" WHEN BIN = 38 ELSE \"00111001\" WHEN BIN = 39 ELSE \"01000000\" WHEN BIN = 40 ELSE \"01000001\" WHEN BIN = 41 ELSE \"01000010\" WHEN BIN = 42 ELSE \"01000011\" WHEN BIN = 43 ELSE \"01000100\" WHEN BIN = 44 ELSE \"01000101\" WHEN BIN = 45 ELSE \"01000110\" WHEN BIN = 46 ELSE \"01000111\" WHEN BIN = 47 ELSE \"01001000\" WHEN BIN = 48 ELSE \"01001001\" WHEN BIN = 49 ELSE \"01010000\" WHEN BIN = 50 ELSE \"01010001\" WHEN BIN = 51 ELSE \"01010010\" WHEN BIN = 52 ELSE \"01010011\" WHEN BIN = 53 ELSE \"01010100\" WHEN BIN = 54 ELSE \"01010101\" WHEN BIN = 55 ELSE \"01010110\" WHEN BIN = 56 ELSE \"01010111\" WHEN BIN = 57 ELSE \"01011000\" WHEN BIN = 58 ELSE \"01011001\" WHEN BIN = 59 ELSE \"00000000\"; END Block Binary_BCD;

SELECT_BCD : Block BEGIN NUM <= BCD(3 DOWNTO 0) WHEN (S=0 OR S=2 OR S=4) ELSE BCD(7 DOWNTO 4); End Block SELECT_BCD;

SEVEN_SEGMENT : Block -- Binary Code -> Segment 7 Code Begin --gfedcba SEG <= \"1000000\" WHEN NUM = 0 ELSE \"1111001\" WHEN NUM = 1 ELSE \"0100100\" WHEN NUM = 2 ELSE \"0110000\" WHEN NUM = 3 ELSE \"0011001\" WHEN NUM = 4 ELSE \"0010010\" WHEN NUM = 5 ELSE \"0000010\" WHEN NUM = 6 ELSE \"1111000\" WHEN NUM = 7 ELSE \"0000000\" WHEN NUM = 8 ELSE \"0010000\" WHEN NUM = 9 ELSE \"0001000\" WHEN NUM = 10 ELSE \"0000011\" WHEN NUM = 11 ELSE \"1000110\" WHEN NUM = 12 ELSE \"0100001\" WHEN NUM = 13 ELSE \"0000110\" WHEN NUM = 14 ELSE \"0001110\" WHEN NUM = 15 ELSE \"1111111\";

End Block SEVEN_SEGMENT;

Debounce : Block -- Timer Key Debounce SIGNAL D0, D1, S, R,DLY,NDLY : STD_LOGIC; Begin Process (CPN) Begin IF CPN'EVENT AND CPN='1' THEN IF SAMPLE = '1' THEN D1 <= D0; D0 <= Key(2); --二级延迟 S <= D0 AND D1; R <= NOT D0 AND NOT D1; END IF; END IF; End Process;

DLY <= R NOR NDLY; --RS 触发器 NDLY <=S NOR DLY; DLY_OUT <= DLY; --RS 触发器输出

End Block Debounce;

Differential : Block Signal D1,D0 : STD_LOGIC; BEGIN Process (CPN) Begin IF CPN'EVENT AND CPN='1' THEN D1 <= D0; D0 <= DLY_OUT; --二级延迟 END IF; End Process; DIFF <= D0 AND NOT D1; --微分 END Block Differential;

TimerSet : Block --Sec & Min & Hr Adjustment? Signal Q : STD_LOGIC_VECTOR (2 DOWNTO 0); Signal SET,EC : STD_LOGIC; Begin Process (CPN) Begin IF SET = '1' THEN Q <= \"011\"; ELSIF CPN'event AND CPN='1' THEN IF EC ='1' THEN Q <= Q-1; END IF; END IF; End Process; SET <= '1' WHEN Q=7 ELSE '0'; EC <= DIFF AND Key(2); -- TIMER KEY 微分 STATE <= Q(1 DOWNTO 0); -- Record Timer State End Block TimerSet;

END a;

除60计数程序如下

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL; USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

--******************************************************

ENTITY COUNTER60 IS PORT( CP : IN STD_LOGIC; --时钟脉冲 BIN : OUT STD_LOGIC_VECTOR (5 DOWNTO 0); --二进制 S : IN STD_LOGIC; --输出启动信号 CLR : IN STD_LOGIC; --清除信号 EC : IN STD_LOGIC; --使能计数信号 CY60 : OUT STD_LOGIC --计数60进位信号 );

END COUNTER60;

--*******************************************************

ARCHITECTURE a OF COUNTER60 IS SIGNAL Q : STD_LOGIC_VECTOR (5 DOWNTO 0) ; SIGNAL RST, DLY : STD_LOGIC; BEGIN PROCESS (CP,RST) -- 计数60 BEGIN IF RST = '1' THEN Q <= \"000000\"; -- 复位计数器 ELSIF CP'event AND CP = '1' THEN DLY <= Q(5); IF EC = '1' THEN Q <= Q+1; -- 计数值加1 END IF; END IF; END PROCESS; CY60 <= NOT Q(5) AND DLY; -- 进位信号微分 RST <= '1' WHEN Q=60 OR CLR='1' ELSE -- 复位信号设定 '0'; BIN <= Q WHEN S = '1' ELSE -- 计数输出 \"000000\"; END a;

除24计数程序如下

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL; USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

--******************************************************

ENTITY COUNTER24 IS PORT( CP : IN STD_LOGIC; --时钟脉冲 BIN : OUT STD_LOGIC_VECTOR (5 DOWNTO 0); --二进制 S : IN STD_LOGIC; --输出启动信号 CLR : IN STD_LOGIC; --清除信号 EC : IN STD_LOGIC; --使能计数信号 CY24 : OUT STD_LOGIC --计数24进位信号 );

END COUNTER24;

--*******************************************************

ARCHITECTURE a OF COUNTER24 IS SIGNAL Q : STD_LOGIC_VECTOR (4 DOWNTO 0) ; SIGNAL RST, DLY : STD_LOGIC; BEGIN PROCESS (CP,RST) -- 计数24 BEGIN IF RST = '1' THEN Q <= \"00000\"; -- 复位计数器 ELSIF CP'event AND CP = '1' THEN DLY <= Q(4); IF EC = '1' THEN Q <= Q+1; -- 计数值加1 END IF; END IF; END PROCESS; CY24 <= NOT Q(4) AND DLY; -- 进位信号微分 RST <= '1' WHEN Q=24 OR CLR='1' ELSE -- 复位信号设定 '0';

BIN <= ('0' & Q) WHEN S = '1' ELSE \"000000\"; END a;

-- 计数输出

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务