|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
vhdl语言的时钟
8 U& P) b* g; C. o' M. X+ W. ]
6 A+ b8 B5 c5 s$ k& V$ dlibrary ieee;
! |8 @5 {% R5 W. a6 Z* Suse ieee.std_logic_1164.all;5 a* _0 {$ P" _. C4 A6 v9 l
use ieee.std_logic_unsigned.all; --库和程序包
. h; X+ c# ?+ `' v$ y--实体
9 G, t( u& F: `( M4 ventity sz is % U" i, V% l; P( _
port
8 T# b* a8 [, U (
6 K6 I& G$ z; F. R clk ,enb,key,key1,key2,clr:in std_logic ; --输入端口的定义
+ y J5 d% C+ F9 G, @ sk: out integer range 0 to 8; --测试扫描信号的频率输出端口6 V% _( | N3 l& P5 A* z" K3 M
Q ut std_logic_vector (7 downto 0);--段码的输出端口定义: E! J9 a9 u& ~) @/ q) G
s: out std_logic_vector (7 downto 0);--位码的输出端口定义
. _0 c) R: y5 Y( D test ut std_logic);
6 B3 q, ~4 \" }) [# tend entity sz;# s- \: _" s: ?1 ~$ n M
--结构体( T3 b8 O% ^( w9 A! H
architecture one of sz is
& u5 t% F G4 t2 p5 m signal cnt_1k : integer range 0 to 50000 ; --定义产生1Khz信号计数值的信号/ \0 l) ~+ x: z+ K
signal compete_1ms: std_logic;--完成1ms的标志
4 r7 p9 }+ U8 [: F signal flag_fp,min_fp,hour_fp: std_logic;--为按键控制而定义一个标准逻辑型信号0 h. n1 z$ R5 ?; X1 g
signal flag_1s,flag_1k,sec_flag ,min_flag : std_logic :='0';--1s和1ms ,秒的进位,分的进--位标志位7 d% [7 I5 T( `) a
signal smiao :integer range 0 to 8;--扫描信号
1 ]7 i4 L! z7 D! F1 T signal sec_cnt,min_cnt,num1,cnt_num :integer range 0 to 60;--秒的计数,分的计数; H! C4 V/ M5 q
signal hour_cnt :integer range 0 to 24;--小时的计数
; _* E! T- H) O8 W signal sc_L ,sc_h,min_L ,min_h,hour_L,hour_H :integer range 0 to 9;
& H0 G. M! E4 Z1 r6 Z! g! c3 p8 w--秒,分,时分离后的个位与十位
]; R$ ^0 m% o2 R& k2 m) x signal sc_L_q ,sc_h_q,min_L_q ,min_h_q,hour_L_q,hour_H_q :std_logic_vector( 7 downto 0);6 \/ _; r# C! [
--秒,分,时分离后的个位与十位的段码0 `& s% d4 x- O: d
begin ' Z0 N4 ]+ x- d6 l
--分频 ,50mhz分成1khz的信号,并且它的占空比为50%6 }/ T: ]; \2 ?0 n% q
process (clk)- M& d: U; A3 a+ |# O% X6 ~
begin 4 F. Y9 i- n" p& y \' T% S
if clk'event and clk ='1' then
, r5 y: k% [; N$ g# `$ U3 [1 n: }- | cnt_1k<=cnt_1k+1;
5 {5 l$ `( \3 O8 g" h if cnt_1k =50000 then --计数1khz值
+ m% Z3 j) y* d' D1 C cnt_1k<=0; ! ~$ J }7 f8 ~) T
compete_1ms<='1';7 |# G4 [- |, s
else
4 `, j! A' O1 `1 q3 V u if cnt_1k<25000 then
: w6 p5 @0 {9 B4 n6 |' q/ t flag_1k<='0'; --cnt_1k小于2500时flag_1k置0 t( e+ c: [) F$ J8 T
else " V# Y% X' q+ l1 B# A. `8 G" `5 i
flag_1k<='1';--否则置高5 W3 Y S3 C* ]# l
end if;
8 ^) C, _, r2 E5 C compete_1ms<='0';
! F3 Z* M; G" E9 [& V, t8 | end if;
1 Y+ X/ j- [4 K2 i$ f G end if;# b: [" W6 i) H8 j. k, U) ~3 w
end process;0 }) q% t/ m0 D/ m( D3 Y L3 z
& S5 p' J) ] q
--产生1s的信号4 w+ t1 H5 Y d/ w
process (compete_1ms)+ i7 [2 }1 o' X" Q% n& x2 [
variable cnt_1s: integer range 0 to 1000; 9 k6 _: i" y: o8 E9 y# p
begin
. u* i3 D6 R W) m. L: Y8 y9 R5 A if compete_1ms'event and compete_1ms='1' then --对1kz的信号进行计数
5 [. d3 A6 n1 ]. y( e cnt_1s :=cnt_1s +1;. r. K7 d6 A% _3 x8 v# B
if cnt_1s =1000 then cnt_1s :=0; 8 S/ \) i+ c' V; u
else if cnt_1s<500 then flag_1s<='0'; --产生1s信号并且占空比为50%,
7 h9 k; W, D/ z% E3 B% q, a else flag_1s<='1';
# g0 q; D. Q" |. a4 Z end if;: }, ?8 ` s' _, M
end if;
9 H# E5 ~# c# { end if;
. k4 N" i1 y$ V$ l, \ test<=flag_1s;--测试秒的信号是否产生- `8 Z" o+ q% q
end process; g9 m+ K- E- Q/ `- z
--按键控制秒的信号
6 E; x6 I: ?4 H Rprocess (enb ,key,flag_1s)
* J* K& O" _' Q$ j/ ~0 V) z* C+ \ begin- H/ P; X, ]" X
if enb='1' then
- J$ k- H' f: n3 X$ Z2 f7 ? flag_fp<=flag_1s;--enb为高时送出的是1秒的信号 Z. K, M6 n) j
else
- _6 C. `% ^6 H% w6 r. Q; v flag_fp<=not key; --否则送出的是按键的信号
6 d" s: A+ t. u7 W end if;0 m b% s6 |( B
end process;
$ N8 W8 A9 G" l --按键控制分的信号
# x2 @( I6 r* Z6 a9 sprocess (enb ,key1,sec_flag)
( `$ d1 |# x$ \8 \6 @ begin. P( |. j+ K: H! H
if enb='1' then
/ \- `6 h' J l min_fp<=sec_flag;--enb为高时送出的是1分钟的信号6 R* u0 k/ f4 }, E
else
# ?8 d' X X6 I$ a5 C5 d min_fp<=not key1; --否则送出的是按键的信号
& c* d! o% e0 b# |( d! P end if;
6 {! o; d9 o- l' ^ -- test<=min_fp;--测试按键或者是秒的进位信号
% V1 f9 b2 x+ z3 \) S+ hend process;
3 e- D. w. ] _' wprocess (enb ,key2,min_flag)* c7 y- a8 R0 _) P* l
begin: l/ N! ^& e7 a: A
if enb='1' then
0 q, a/ l4 ^' H# S hour_fp<=min_flag;--enb为高时送出的是1小时的信号& m J4 y) b5 j& e( P& V
else
' U7 v' J5 h6 ~1 t4 q6 ~ hour_fp<=not key2; --否则送出的是按键的信号 ' v6 U) a) {: P- V( X
end if;9 d8 n( g5 ?. N' q# z
-- test<=hour_fp;--测试按键或者是分的进位信号
% b$ F$ [/ ]1 T3 `/ hend process;8 f% L, D8 b, ^
--秒的计数
3 U$ b/ p) E L$ @process(flag_fp)7 E$ K8 n+ \! S+ b
begin8 ]% k+ L2 s& g. G0 C
if flag_fp'event and flag_fp='1' then
5 y* L! S7 y; ~ if sec_cnt=59 then sec_cnt<=0; sec_flag<='1';--秒是否到了1分钟,秒的标志位置为1
/ f' T, b$ L. @' L5 O. } else sec_cnt<=sec_cnt+1 ; sec_flag<='0'; --否则秒加1,秒的标志位置为0
: R6 e- A5 Q3 r5 t/ }0 v end if;
" i" I3 h0 K( eend if;
! ]) C5 ^, ? u. J) H* }; x: c) k) Z sc_L <=sec_cnt mod 10; --秒的个位4 y" K4 `9 Y7 t2 c
sc_h<= integer (sec_cnt/10);-- 秒的十位
. A& {8 `; {9 G/ E- A+ F3 Z/ Wend process;3 B- V4 r3 U2 C3 c) }
--分的计数 4 `! s/ l' t& S5 M) Y3 |6 h
process(min_fp): Z% ]# t9 o; b6 H4 }
begin
. O6 i4 F* W! b9 t- ]--if enb='1' then --只加按键的控制秒的数值变化/ y1 j) ]3 }: T/ o1 l
if min_fp'event and min_fp='1' then 9 N/ f; B; {% L3 i8 x. U
if min_cnt=59 then min_cnt<=0; min_flag<='1';--分是否到了1小时,小时的标志位置为1
. ?6 Q1 g0 O6 b1 {, W else min_cnt<=min_cnt+1; min_flag<='0';--否则分加1,小时的标志位置为0
( x6 `5 K$ m. f7 P9 h end if;
1 z( N c N7 ]5 W0 {1 D) _ end if;, e8 }0 I- R/ r! X+ i
-- end if;
; s* k4 ^% W* ?9 R$ m* D min_L <= min_cnt mod 10;--分的个位* c2 |( O4 ?! G1 n1 t
min_h<= integer(min_cnt/10);-- 分的十位
2 }4 `. u% h4 S# r* H end process;
+ J0 M' G5 f& C
5 r% h! x( y3 G4 z--小时的计数
) X' N# X) v' T s process(hour_fp)& P1 ]9 A+ j. \3 {2 [, O
begin
7 w' l/ |- \* O0 e5 A! T' f. T; u -- if enb='1' then --只加按键的控制秒的数值变化1 h- ~2 B( m8 A- W
if hour_fp'event and hour_fp='1' then
G- v! o( ]0 ?3 D2 H if hour_cnt =23 then hour_cnt<=0;--小时是否到了24小时
- R- I. C' O* B5 ?7 t3 f5 L) _& a else hour_cnt<=hour_cnt +1; --否则小时加1$ K: }% }$ w1 H L
end if;
; w0 k6 z9 _7 F* ~5 Y* _& d end if;
4 E3 p) H" F! I# ?# Chour_L <= hour_cnt mod 10;--分的个位
$ W4 m. V. `" Ohour_h<= integer (hour_cnt/10);-- 分的十位 $ { }9 f/ l" A
end process;: C7 U( @/ N. Y
--产生动态扫描信号: g# q$ G1 j/ f* D$ d# Q6 N+ z
process (flag_1k)/ y# i8 \4 h7 @, l; Q' j5 W9 ^
begin
( P1 G9 F; h: Z+ H if flag_1k'event and flag_1k='1' then --对1khz信号进行计数
7 `, U( u# {8 w2 e, _ if smiao=7 then smiao<=0;
/ m8 }. S) N8 Y/ u' p' ` else smiao<=smiao+1;' s* w. N/ c- h$ K# ]- B
end if;
( W2 C. ]; r. j0 g- v end if;
) _4 ^' ?3 z" @4 `( G+ r( L ? sk<=smiao;--测试扫描信号/ M" X" Q: K5 R) N4 I& a* _ t
end process;
+ K9 P- K. P1 d0 H9 [: @% v( M--时钟的秒和分,小时的个位和十位的数码管的段码0 R8 F6 W/ g0 G; b' C
PROCESS(sc_l,sc_h,min_l,min_h,hour_l,hour_h)
, f1 O/ a3 ^) d7 O" s- bBEGIN + N7 ]; A. [7 R$ A6 A' K5 p9 ^
--秒低位段码5 C/ s) f; W1 F3 v) J" A7 l
CASE(sc_l) IS
/ Y8 z7 ?& U' [6 m: u% ~! X; aWHEN 0 => sc_l_q<="00000011"; --0的共阳数码管的段码
# q1 D6 g* Z7 i. X' Z6 ~WHEN 1 => sc_l_q<="10011111"; --1的共阳数码管的段码) h, V; O0 x( f
WHEN 2 => sc_l_q<="00100101"; --2的共阳数码管的段码
6 @1 q) h6 K! l6 j) z$ g. s" ]3 wWHEN 3 => sc_l_q<="00001101"; --3的共阳数码管的段码
1 Q: H% P8 Y' U( O) j3 G' PWHEN 4 => sc_l_q<="10011001"; --4的共阳数码管的段码, U5 X, V, I: w/ x7 t3 M2 e' u9 U2 k2 W, m
WHEN 5 => sc_l_q<="01001001"; --5的共阳数码管的段码
0 q! N+ M7 |' t: |WHEN 6 => sc_l_q<="01000001"; --6的共阳数码管的段码
0 ~* Q; E) s, @WHEN 7 => sc_l_q<="00011111"; --7的共阳数码管的段码$ E5 z- }5 @: `
WHEN 8 => sc_l_q<="00000001"; --8的共阳数码管的段码
' D+ L) B& c UWHEN 9 => sc_l_q<="00001001"; --9的共阳数码管的段码
, q9 Z/ P, W# f" K7 [4 P+ MWHEN OTHERS => NULL;
5 o- \9 u9 h! R5 N1 ?" xEND CASE;
0 N2 P" _* z3 K1 i7 S--秒高位段码
2 r3 S+ ^% m2 n4 z( N+ \! L1 o NCASE(sc_h) IS
4 z7 D9 n2 G7 M% D% @5 MWHEN 0 => sc_h_q<="00000011"; --0的共阳数码管的段码' S1 X( u& S" Q
WHEN 1 => sc_h_q<="10011111";--1的共阳数码管的段码 T6 d) e( m9 U! I/ p
WHEN 2 => sc_h_q<="00100101"; --2的共阳数码管的段码
/ J' M3 L% H- z/ N& b/ ]- i7 f4 rWHEN 3 => sc_h_q<="00001101";--3的共阳数码管的段码 . z6 N( c6 e* a7 r4 O
WHEN 4 => sc_h_q<="10011001"; --4的共阳数码管的段码& r; x! j5 ` s% i4 d& \5 G
WHEN 5 => sc_h_q<="01001001"; --5的共阳数码管的段码
) a- Q) M$ x, BWHEN OTHERS => NULL;
; q8 k' y( A- VEND CASE;
5 Y( P5 S% r8 }7 Y z0 Z( k9 d1 s--分低位段码8 V9 n! V8 [' `: B S
CASE(min_l) IS
8 D! Q1 g: c) d# q+ v" ~( tWHEN 0 => min_l_q<="00000011"; --0的共阳数码管的段码3 K. G2 M" E- V( K7 m6 L4 a; A
WHEN 1 => min_l_q<="10011111"; --1的共阳数码管的段码
- e( f) t& i5 B" B( h9 i' ], l+ RWHEN 2 => min_l_q<="00100101"; --2的共阳数码管的段码: P1 A3 ~& l3 U0 a
WHEN 3 => min_l_q<="00001101"; --3的共阳数码管的段码
5 V! u: u8 k7 a HWHEN 4 => min_l_q<="10011001"; --4的共阳数码管的段码7 d& \, j4 a: ~' e/ u( C- K
WHEN 5 => min_l_q<="01001001"; --5的共阳数码管的段码. c2 d+ B7 h/ M# Y1 i
WHEN 6 => min_l_q<="01000001"; --6的共阳数码管的段码
) N! e7 @3 G! d d# O5 T; @WHEN 7 => min_l_q<="00011111"; --7的共阳数码管的段码
/ W" L+ n! n2 xWHEN 8 => min_l_q<="00000001"; --8的共阳数码管的段码
% `" N* g# t6 o; ^! |/ [WHEN 9 => min_l_q<="00001001"; --9的共阳数码管的段码
- L1 g9 v) B' F( Z: KWHEN OTHERS => NULL; " S' a4 K9 Z( p& k; T
END CASE; ) E1 x* B8 g7 T) J3 c) f z _/ T
--分高位段码
5 a5 e6 j. U* E) P# N: A. G0 g1 sCASE(min_h) IS
1 @; x' M1 N) q+ i1 e3 YWHEN 0 => min_h_q<="00000011"; --0的共阳数码管的段码* Q. d9 C. d* T4 |) A: A" `
WHEN 1 => min_h_q<="10011111";--1的共阳数码管的段码 ) P& k! X1 y7 @8 l/ o
WHEN 2 => min_h_q<="00100101";--2的共阳数码管的段码
: i: B& a9 ]5 M: x6 YWHEN 3 => min_h_q<="00001101";--3的共阳数码管的段码: C$ r( D2 ]2 B
WHEN 4 => min_h_q<="10011001"; --4的共阳数码管的段码
- W, m3 ^7 e. S% |. v; p' Z% kWHEN 5 => min_h_q<="01001001"; --5的共阳数码管的段码4 V6 h4 i, T; U* T7 D
WHEN OTHERS => NULL; 2 d0 C+ @; j( K% `
END CASE; , K. A! T) u- W+ v2 {7 g; z
--小时低位段码0 g6 o; m" J6 {
CASE(hour_l) IS
. p1 P) s+ s1 H. y' u9 _6 g1 ]3 cWHEN 0 => hour_l_q<="00000011"; --0的共阳数码管的段码
, a% |! G; X6 T* t; K$ D8 CWHEN 1 => hour_l_q<="10011111"; --1的共阳数码管的段码: Y- v- r9 A" h7 x' M
WHEN 2 => hour_l_q<="00100101"; --2的共阳数码管的段码1 d, b/ H Q" a) [
WHEN 3 => hour_l_q<="00001101"; --3的共阳数码管的段码
- j" q) X, A. o- XWHEN 4 => hour_l_q<="10011001"; --4的共阳数码管的段码
" _) _' E: M7 U7 E2 D0 G ZWHEN 5 => hour_l_q<="01001001"; --5的共阳数码管的段码* p: N% {' T% q, P3 h: C2 e) q! C$ g) M) y
WHEN 6 => hour_l_q<="01000001"; --6的共阳数码管的段码
; T6 y7 O* Y7 Q$ _WHEN 7 => hour_l_q<="00011111"; --7的共阳数码管的段码
! d4 z/ f5 f6 S% j T' ^ M& q$ \' kWHEN 8 => hour_l_q<="00000001"; --8的共阳数码管的段码/ m+ T$ L; J: `( @0 \& A5 g+ c& }
WHEN 9 => hour_l_q<="00001001"; --9的共阳数码管的段码5 X- [) u N& p
WHEN OTHERS => NULL;
3 M- @1 d: Z! G+ q* ^6 FEND CASE; 5 l! n7 Z" M2 s9 V" E% E
--小时的高位段码( j8 d- A6 W" [" Z) R1 W
CASE(hour_h) IS
& e* {7 Q) e; @/ o; o% S6 yWHEN 0 => hour_h_q<="00000011";--0的共阳数码管的段码
& ^ d9 B) o5 i7 D5 t0 R% yWHEN 1 => hour_h_q<="10011111"; --1的共阳数码管的段码
3 A$ u- b6 r- y: `5 E% Z$ \5 PWHEN 2 => hour_h_q<="00100101";--2的共阳数码管的段码1 T5 p& X: K0 k7 L3 |6 ]4 K
WHEN OTHERS => NULL; / X' q9 V+ L$ Z! `6 J
END CASE; : Q8 A j( v- G& i# \
END PROCESS;' B" E$ [7 a% z5 K
--此进程为数码管动态显示 5 b4 w5 g# |' x8 N1 U; \' {
PROCESS(smiao) 4 \- i/ `4 n, `3 w: | i6 \
BEGIN j# m' |8 Y0 n5 D
CASE smiao IS 4 ?/ N. F( w! ~! X, {
WHEN 0 => S<="01111111";Q<=sc_l_q; --第1位数码管显示秒的低位7 e6 A9 P0 C: @: S
WHEN 1 => S<="10111111";Q<=sc_h_q; --第2位数码管显示秒的高位# X9 [0 w* y% i$ }2 e1 Z- d
WHEN 2 => S<="11011111";Q<="11111101"; --第3位数码管显示“-”% F6 \) S# ~2 }( E
WHEN 3 => S<="11101111";Q<=min_l_q; --第4位数码管显示分的低位
9 W9 {8 ~3 R" c4 K* J9 GWHEN 4 => S<="11110111";Q<=min_h_q; --第5位数码管显示分的高位( n; v# N f+ w& ]- t
WHEN 5 => S<="11111011";Q<="11111101"; --第6位数码管显示“-”
' a' t# ^- D! L9 M' fWHEN 6 => S<="11111101";Q<=hour_l_q; --第7位数码管显示小时的低位0 B! j5 B t5 m7 x2 l6 k
WHEN 7 => S<="11111110";Q<=hour_h_q; --第8位数码管显示小时的高位
4 w# k. ^9 H2 F4 o/ W3 _ WHEN OTHERS => NULL; ! K s! l2 G& [$ l; |" p4 [% _& @
END CASE; : X' L- |! a; Z7 W. U) |
end process;7 L! D! c1 p1 \, |) I
end architecture one;6 c0 d+ s A8 T; Y
( m8 K7 P; Q n- h6 H
|
|