|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
vhdl语言的时钟 ; }% N! x8 j$ l. S
K; q! L9 N7 j( \) P
library ieee;; F* ~* z5 G6 e7 j# t% T* J
use ieee.std_logic_1164.all;' f! ~) g7 m+ ?6 Z* X O% m% h
use ieee.std_logic_unsigned.all; --库和程序包
! y0 g" |# @( t--实体
! C. w! o' {# n$ |7 sentity sz is
# O! h! h; y$ a0 W8 s port
1 m z* P( E9 o( z$ | (0 F6 m; t; e _% l; n& f& a; K
clk ,enb,key,key1,key2,clr:in std_logic ; --输入端口的定义3 {+ y0 [7 Q' b N+ S( W
sk: out integer range 0 to 8; --测试扫描信号的频率输出端口
! q' V# X: V8 M# O% ]6 w Q ut std_logic_vector (7 downto 0);--段码的输出端口定义
0 Y* B5 d/ T7 i9 r2 A- k& b s: out std_logic_vector (7 downto 0);--位码的输出端口定义
) _# C" @# t |! V' l8 V- o: y test ut std_logic);
3 Y4 x9 x" ^+ b Aend entity sz;! {& T& c- D1 q6 P( \& E# }, C
--结构体& m1 K* k" `9 |0 g4 [; s/ l
architecture one of sz is / p, O; P0 p% U2 \ w. f; ]9 N' O
signal cnt_1k : integer range 0 to 50000 ; --定义产生1Khz信号计数值的信号
! t0 v' f0 Q6 l8 _ signal compete_1ms: std_logic;--完成1ms的标志: j/ ~! N2 r/ I# W( [" Y' ?/ k
signal flag_fp,min_fp,hour_fp: std_logic;--为按键控制而定义一个标准逻辑型信号
5 l$ s% K O3 ?) E3 [+ ^4 S signal flag_1s,flag_1k,sec_flag ,min_flag : std_logic :='0';--1s和1ms ,秒的进位,分的进--位标志位
' b) G9 e# C8 @/ _* v1 a signal smiao :integer range 0 to 8;--扫描信号& l6 E0 x$ R, f, ?0 v. h& Y- W( ~
signal sec_cnt,min_cnt,num1,cnt_num :integer range 0 to 60;--秒的计数,分的计数
9 Z1 o A2 V8 h+ I* U, f2 ~ @3 E2 w. ] signal hour_cnt :integer range 0 to 24;--小时的计数& t5 Q. Q. h! R. d; H
signal sc_L ,sc_h,min_L ,min_h,hour_L,hour_H :integer range 0 to 9;
5 i1 [4 ?! R0 t3 s* I8 v" O--秒,分,时分离后的个位与十位
/ k* s7 I+ o, I4 y4 s) ]# l( j 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);
* _& p. J' N: U1 ~/ Q$ `' n9 y/ h--秒,分,时分离后的个位与十位的段码
9 \. s' h- U. d1 j8 _! T begin
/ @6 V# L: n7 @' E9 T( n$ I --分频 ,50mhz分成1khz的信号,并且它的占空比为50%
7 \ H! c& \& e) L& a process (clk)4 ?) a1 i3 `6 K3 _% p0 i5 J9 d
begin * b' r. A# d7 O/ z( O) \
if clk'event and clk ='1' then
6 P3 H' {8 O. Z cnt_1k<=cnt_1k+1; 3 M' P" {( I6 e" }, M+ }
if cnt_1k =50000 then --计数1khz值
+ _. V3 C. R" [, T( y) h cnt_1k<=0;
. V, o" y% P% F9 u4 u5 L compete_1ms<='1';
+ y/ o" k" W5 \# ^6 v else
. m7 o/ o) X, A8 i+ J6 {1 \4 ^ if cnt_1k<25000 then
# w2 g1 u8 X# k! n5 p flag_1k<='0'; --cnt_1k小于2500时flag_1k置05 Y6 Y% s% j" ^2 w' v* k7 y1 H
else 1 |) C) a8 U; g ? \% B: \
flag_1k<='1';--否则置高
0 N S9 A0 [2 G end if;
" T+ P8 u4 {# k compete_1ms<='0'; / g( G$ T* m* w5 ]4 x! o! |, \
end if;
& S8 v$ ]* t1 n! Y! Q/ e end if;/ `3 w! ?' u5 V8 {1 h2 o5 d6 U
end process;
0 e6 Z* f' S5 |" V
: g6 `0 C; }6 k8 [0 Y. I% a--产生1s的信号
, J) c7 Y$ k9 \- M process (compete_1ms)
, L; l" }; G$ h5 m variable cnt_1s: integer range 0 to 1000;
# h0 h' t- y F/ i$ }2 E% L" ~3 k begin
: z/ \, |& W9 _8 s5 ]8 \: Z4 ] if compete_1ms'event and compete_1ms='1' then --对1kz的信号进行计数
7 I: d+ ]. ^3 z7 c$ g# Y8 F cnt_1s :=cnt_1s +1;
( o! H& T& m3 w% }+ a9 x if cnt_1s =1000 then cnt_1s :=0; ) W) Q0 t$ u3 B/ w( M
else if cnt_1s<500 then flag_1s<='0'; --产生1s信号并且占空比为50%,1 E# c6 J8 z' K I
else flag_1s<='1';" D' v" [( w/ P7 r0 e
end if;$ n b! K/ L4 k
end if;. O/ }. e+ f3 Y9 H
end if;
, J8 P2 s5 ]0 P& E; s test<=flag_1s;--测试秒的信号是否产生5 {+ j" h6 J! t$ P/ b5 X
end process; # s, I4 n p' _+ }6 k- o" G
--按键控制秒的信号 . a: e& s, ~. q) t& v
process (enb ,key,flag_1s)/ Q/ a3 G. f: l0 t- Y% W& ]
begin! X1 i# z" ]# K4 c1 d8 s5 v
if enb='1' then 8 L7 i: F5 q) S# d
flag_fp<=flag_1s;--enb为高时送出的是1秒的信号
" B+ i8 I/ W: b else
6 ^- M' L) N! E flag_fp<=not key; --否则送出的是按键的信号. z' U7 r0 g% h3 b
end if;7 b6 s5 k0 I' f3 N4 x1 |9 [
end process;/ I; o$ a/ T+ Q0 ]
--按键控制分的信号
" c; @. Z, \1 \7 uprocess (enb ,key1,sec_flag)' u# p$ b) T$ Y2 m& t# C- u0 m: o
begin
]+ D- I3 G) w/ c: v3 l if enb='1' then + M1 S l: m. l' k/ u" Z/ ?# b
min_fp<=sec_flag;--enb为高时送出的是1分钟的信号
4 Z% @: }8 i$ U; a else 5 h; ~% F) f: c; C) i6 R/ \3 X8 s
min_fp<=not key1; --否则送出的是按键的信号
5 d6 D& _2 }" G0 K" @2 X, ^1 E end if;1 O$ d1 U( x+ s8 o
-- test<=min_fp;--测试按键或者是秒的进位信号
# P: _8 {, @4 R4 M8 h' |' q) wend process;
" s/ F+ F% d! W6 ~! k5 vprocess (enb ,key2,min_flag)
2 ?6 f. O5 n: Y0 ?6 g begin
& F8 i6 k0 O3 _1 X8 T- F% A if enb='1' then
: a* y3 ~) J$ ?! _3 @ hour_fp<=min_flag;--enb为高时送出的是1小时的信号( s' p+ m: M8 |8 D
else m6 d) ]) x( N8 I. @
hour_fp<=not key2; --否则送出的是按键的信号 5 n! I9 |# a. e
end if;
4 u$ p6 M$ H' g; F -- test<=hour_fp;--测试按键或者是分的进位信号
; N- S2 p) ^7 z- @. m% \end process;: [# V5 w8 J' w0 s4 o
--秒的计数
3 B+ v8 ~) X/ C4 I$ F& ?process(flag_fp)
^9 t; U7 x- ebegin
. l8 r2 i2 h/ B* Gif flag_fp'event and flag_fp='1' then
7 }! j9 P2 N L$ ^% c; u if sec_cnt=59 then sec_cnt<=0; sec_flag<='1';--秒是否到了1分钟,秒的标志位置为1
8 \5 E, \* e" e# E7 |0 |' s" {, ?+ n else sec_cnt<=sec_cnt+1 ; sec_flag<='0'; --否则秒加1,秒的标志位置为0
7 q$ T! s# u) B& o ?& ^6 Q end if;) Z3 u* h6 k$ n( T8 `
end if;
# T- {) e3 M- ]' Y8 J sc_L <=sec_cnt mod 10; --秒的个位
( q7 C( F4 T- n! f; q sc_h<= integer (sec_cnt/10);-- 秒的十位
0 O8 z; i- ^: B7 a5 ~5 ~; hend process;, u. l5 C' {! Y, Z) P* P( z
--分的计数
8 m+ `2 ~' d1 u4 g3 { process(min_fp)# x0 x% h+ T* d0 Z8 T2 I
begin
* t( P" U- h6 r9 E, y--if enb='1' then --只加按键的控制秒的数值变化3 r( o. r* u4 a/ v9 W* n4 u
if min_fp'event and min_fp='1' then 9 ?- t% N- r, ^/ h
if min_cnt=59 then min_cnt<=0; min_flag<='1';--分是否到了1小时,小时的标志位置为11 A$ W* b' ?7 i" R) r6 } L
else min_cnt<=min_cnt+1; min_flag<='0';--否则分加1,小时的标志位置为0( j1 T2 l b8 N5 ^" N+ C w
end if;
0 K& J0 ]3 r1 u8 {; M) } end if;
/ D( @; g: c S+ z8 s) q+ z -- end if;3 s3 _8 P4 V# t" K! @
min_L <= min_cnt mod 10;--分的个位) e8 {. P5 r" G: d% t/ `
min_h<= integer(min_cnt/10);-- 分的十位 7 G& E% y0 f [4 E/ O
end process;% J( \7 u) }: ]- f
1 c7 G3 ?7 w1 R8 Z7 n. m$ g0 v: z
--小时的计数* i5 h" V5 o$ t, K
process(hour_fp)6 `3 @, f$ @+ `' j9 a9 K
begin
$ B7 P* l5 ^: p' A' ]3 m; a -- if enb='1' then --只加按键的控制秒的数值变化; T+ E1 x0 g) m I& _ F/ ]
if hour_fp'event and hour_fp='1' then / o0 U5 H: t! W$ w$ W( Q
if hour_cnt =23 then hour_cnt<=0;--小时是否到了24小时
' g0 y/ u/ V" o8 A" E6 Q else hour_cnt<=hour_cnt +1; --否则小时加1- d! }7 s2 H/ Z% t+ |
end if; W1 i, [ t6 E; i
end if;8 @, Z$ r. r" p9 D
hour_L <= hour_cnt mod 10;--分的个位2 v( k: o3 \1 t! A9 g
hour_h<= integer (hour_cnt/10);-- 分的十位
6 v% _! y& R4 l' h7 Oend process;7 ^: r- b0 @/ r. |4 i- C; s
--产生动态扫描信号
( p8 ?" ]6 f* [" g( Q, @process (flag_1k). ^( c% C' G, T' o; Y- [$ _* a
begin
$ y$ \ n; z( a* A% k& P( r if flag_1k'event and flag_1k='1' then --对1khz信号进行计数
6 q- P9 n, p7 S; M# g$ T if smiao=7 then smiao<=0;
. c1 s% I V. ?" |: s5 A4 ^& s else smiao<=smiao+1;
$ j" M' c$ }: r) Q) ~ end if;
" g1 h5 x' `- A0 p5 v+ ]8 a* e end if;3 q, K' k' N0 H
sk<=smiao;--测试扫描信号
+ r5 ]# A7 H/ u$ qend process;9 a& \- h8 O! U
--时钟的秒和分,小时的个位和十位的数码管的段码! v% A) k3 q7 j9 ~$ @
PROCESS(sc_l,sc_h,min_l,min_h,hour_l,hour_h)
+ K: K( i. u4 v5 w% l6 G0 SBEGIN
( ?' k% N/ x9 f: b6 X: e- j3 ?--秒低位段码 ^( P( P( ~) u# Z: r6 l. f( E
CASE(sc_l) IS ( }2 [, ?) H6 q& x
WHEN 0 => sc_l_q<="00000011"; --0的共阳数码管的段码
, O+ W( ^: K$ a$ ^$ hWHEN 1 => sc_l_q<="10011111"; --1的共阳数码管的段码/ Q5 ], e6 e; n4 P( }: @
WHEN 2 => sc_l_q<="00100101"; --2的共阳数码管的段码
* e! t2 ?" g! ]+ r" J5 E) EWHEN 3 => sc_l_q<="00001101"; --3的共阳数码管的段码
* ~; A; y% f6 fWHEN 4 => sc_l_q<="10011001"; --4的共阳数码管的段码
2 |! z1 V: ] t# r8 }# Y. bWHEN 5 => sc_l_q<="01001001"; --5的共阳数码管的段码
8 { J8 O/ |, A5 F) y% oWHEN 6 => sc_l_q<="01000001"; --6的共阳数码管的段码. Z2 e* y3 J5 j
WHEN 7 => sc_l_q<="00011111"; --7的共阳数码管的段码% j e2 Z: c- E: ?3 ?8 r4 _
WHEN 8 => sc_l_q<="00000001"; --8的共阳数码管的段码
: J9 G5 U6 V( A" |WHEN 9 => sc_l_q<="00001001"; --9的共阳数码管的段码
) k+ M; X! `2 K* P8 {' RWHEN OTHERS => NULL; * Q, |1 ?# v: E, m
END CASE;
* w5 w M- R8 P, N; ~1 G# U--秒高位段码 4 Y- q9 S; ?: I7 D
CASE(sc_h) IS
4 J" o+ }/ n$ h- ^WHEN 0 => sc_h_q<="00000011"; --0的共阳数码管的段码' a) h) n' M6 Y$ }: f7 }
WHEN 1 => sc_h_q<="10011111";--1的共阳数码管的段码
3 D9 }: I. e9 {5 cWHEN 2 => sc_h_q<="00100101"; --2的共阳数码管的段码# h4 N) d# w7 ^' D
WHEN 3 => sc_h_q<="00001101";--3的共阳数码管的段码
1 S8 C$ c4 [, s8 b+ `WHEN 4 => sc_h_q<="10011001"; --4的共阳数码管的段码1 f+ G' m' R# w, `5 N: p
WHEN 5 => sc_h_q<="01001001"; --5的共阳数码管的段码
3 Z$ o% S3 Q0 B1 L/ d F1 q% _WHEN OTHERS => NULL;
}; o4 R! h, I: v5 R `( _END CASE; % Z) C" [2 q* }+ i
--分低位段码
5 h. k* n) S5 W8 T& H6 u: V' N- @CASE(min_l) IS
3 [7 M& a e3 a! J, U0 ~3 hWHEN 0 => min_l_q<="00000011"; --0的共阳数码管的段码0 v% ?9 I% @! v2 b& \
WHEN 1 => min_l_q<="10011111"; --1的共阳数码管的段码
/ _1 O) S* b; Y" y; Y0 v U PWHEN 2 => min_l_q<="00100101"; --2的共阳数码管的段码' Y8 N" @1 P+ [0 E' E
WHEN 3 => min_l_q<="00001101"; --3的共阳数码管的段码- y1 Z, n" O( \$ a6 ^. W, u1 Y. j) ^
WHEN 4 => min_l_q<="10011001"; --4的共阳数码管的段码; h7 w+ _ l1 ?( _
WHEN 5 => min_l_q<="01001001"; --5的共阳数码管的段码
. T* @8 ?# h2 o3 tWHEN 6 => min_l_q<="01000001"; --6的共阳数码管的段码
+ J% B" z: ?# Q5 _7 ?) }2 k6 bWHEN 7 => min_l_q<="00011111"; --7的共阳数码管的段码
8 j1 f! T$ o4 G, f/ u( FWHEN 8 => min_l_q<="00000001"; --8的共阳数码管的段码
% w" n$ S7 K1 a% ^WHEN 9 => min_l_q<="00001001"; --9的共阳数码管的段码
6 g3 H4 U: E7 R# M+ _WHEN OTHERS => NULL; # D, ?& _2 ? m5 ?
END CASE;
# f/ n6 B% G4 Z- \) D/ B, U--分高位段码
& B5 t- }0 ^$ F0 S5 D) `) q7 eCASE(min_h) IS
/ p9 S0 f4 a) K+ FWHEN 0 => min_h_q<="00000011"; --0的共阳数码管的段码4 D3 F6 m, g+ b% P- n- I
WHEN 1 => min_h_q<="10011111";--1的共阳数码管的段码 " s6 O2 k, ?# i9 k: c
WHEN 2 => min_h_q<="00100101";--2的共阳数码管的段码
. F+ V2 g: F6 IWHEN 3 => min_h_q<="00001101";--3的共阳数码管的段码
4 _: m P3 ]0 ZWHEN 4 => min_h_q<="10011001"; --4的共阳数码管的段码4 D \, N& U4 t% P
WHEN 5 => min_h_q<="01001001"; --5的共阳数码管的段码
" h2 W8 g8 d& b/ I6 }WHEN OTHERS => NULL;
) R$ u+ |" \# u3 K7 D( _END CASE; ' ?5 U1 o, y. @! d# v* b0 r
--小时低位段码4 J5 i5 J( a/ s
CASE(hour_l) IS - D- _$ p/ I9 c7 B
WHEN 0 => hour_l_q<="00000011"; --0的共阳数码管的段码$ K+ ~7 C0 A% h$ F7 I! g- Y
WHEN 1 => hour_l_q<="10011111"; --1的共阳数码管的段码
) R) q; h# A6 |' l2 }; Z2 FWHEN 2 => hour_l_q<="00100101"; --2的共阳数码管的段码$ t+ d B7 N: j* m7 |( G
WHEN 3 => hour_l_q<="00001101"; --3的共阳数码管的段码
3 w" N/ H* O: U$ v3 _( k/ FWHEN 4 => hour_l_q<="10011001"; --4的共阳数码管的段码
3 o, _& X$ Z/ i; WWHEN 5 => hour_l_q<="01001001"; --5的共阳数码管的段码
! }0 m) X& w7 N$ B3 kWHEN 6 => hour_l_q<="01000001"; --6的共阳数码管的段码
( `; G! L0 O- b2 e+ K tWHEN 7 => hour_l_q<="00011111"; --7的共阳数码管的段码+ I! e1 I4 A2 [# T% I
WHEN 8 => hour_l_q<="00000001"; --8的共阳数码管的段码2 b- N( M( Z R
WHEN 9 => hour_l_q<="00001001"; --9的共阳数码管的段码% p; }9 R1 u7 x5 M, C
WHEN OTHERS => NULL; 5 h- h* p. s% |4 w+ r1 M% [
END CASE; 8 j8 U: p% H6 X2 i
--小时的高位段码
# L9 ]) U- A! S* `3 `8 D; BCASE(hour_h) IS ! n+ g3 H2 P- X6 V
WHEN 0 => hour_h_q<="00000011";--0的共阳数码管的段码
/ ]4 B# v3 N7 JWHEN 1 => hour_h_q<="10011111"; --1的共阳数码管的段码
' s. I$ F) o! {) Y9 F; g& }; u) YWHEN 2 => hour_h_q<="00100101";--2的共阳数码管的段码% ?' K3 j% s) K6 K9 U) D0 ^' P' [
WHEN OTHERS => NULL; 8 Q7 a& m/ k3 ]8 P5 ?- j6 Q
END CASE; 8 d+ T. E: p/ [
END PROCESS;: E/ ~ p! F) y, A, z# W/ \
--此进程为数码管动态显示 4 @+ i! B2 c6 F% ]
PROCESS(smiao)
. c6 _9 P7 ^8 {# h* HBEGIN 2 n/ S9 v0 U6 K1 P5 B Q; F, y
CASE smiao IS 0 ], ~+ x- C% ~# H0 X
WHEN 0 => S<="01111111";Q<=sc_l_q; --第1位数码管显示秒的低位
, C! g! ^) m; l2 {: jWHEN 1 => S<="10111111";Q<=sc_h_q; --第2位数码管显示秒的高位
( r1 I% i9 m- m; F+ f2 oWHEN 2 => S<="11011111";Q<="11111101"; --第3位数码管显示“-”& B. e7 Y U# R
WHEN 3 => S<="11101111";Q<=min_l_q; --第4位数码管显示分的低位
H& A0 i- c# h/ X& i6 C' xWHEN 4 => S<="11110111";Q<=min_h_q; --第5位数码管显示分的高位
$ x8 \. I, P- x! x3 qWHEN 5 => S<="11111011";Q<="11111101"; --第6位数码管显示“-” - d$ x; O- e; a2 y
WHEN 6 => S<="11111101";Q<=hour_l_q; --第7位数码管显示小时的低位
7 j& R/ k! O% ]1 wWHEN 7 => S<="11111110";Q<=hour_h_q; --第8位数码管显示小时的高位 m6 m) ~( R. G3 R* _* |
WHEN OTHERS => NULL;
! [5 H( ]; c) t% ?* J3 m# kEND CASE;
; n& D- w, l6 S1 S; Aend process;
2 T4 Q b! x* ~/ A3 `/ r! Gend architecture one;
4 ]! x2 p" a7 D7 Y2 @2 Y
: }9 x& i8 O G( I |
|