|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
vhdl语言的时钟 $ o7 g2 j7 h: r. e" T- X. N
: C$ w6 b6 K, ^! x
library ieee;+ L; { ?: Z5 U) ]8 }3 A5 t$ l
use ieee.std_logic_1164.all;
( ]8 M6 u! B, A: `use ieee.std_logic_unsigned.all; --库和程序包6 r5 b- D0 a" t7 m; j! l0 n
--实体
% ?5 {5 q- _3 J s# v fentity sz is 1 f! X9 Q' A# V+ }; T
port
" _* J$ z" ~& \: m8 Q! e (
) [+ ], T9 H3 ?$ s clk ,enb,key,key1,key2,clr:in std_logic ; --输入端口的定义
i# j# S1 O/ G2 X5 T) M sk: out integer range 0 to 8; --测试扫描信号的频率输出端口
2 }) r9 N' I5 i4 \ Q ut std_logic_vector (7 downto 0);--段码的输出端口定义
* s+ D0 a, R* `& g7 V9 x3 u% X4 }. @' g s: out std_logic_vector (7 downto 0);--位码的输出端口定义( F% M4 k4 ~; R
test ut std_logic);
9 p/ y: B ~3 T5 ` d- S2 ]end entity sz;
. U' f7 B; q; `4 U" N--结构体
- ?) y# O& k: v1 R7 _* |architecture one of sz is
+ d0 y2 u2 \, k" O signal cnt_1k : integer range 0 to 50000 ; --定义产生1Khz信号计数值的信号0 Z) t: ^. R8 G
signal compete_1ms: std_logic;--完成1ms的标志+ n) h% T! g0 L0 E2 ]- K
signal flag_fp,min_fp,hour_fp: std_logic;--为按键控制而定义一个标准逻辑型信号
* ~" P- S# p% j3 [5 J signal flag_1s,flag_1k,sec_flag ,min_flag : std_logic :='0';--1s和1ms ,秒的进位,分的进--位标志位. \+ J V4 W$ D- u- x6 G; m9 C9 T0 Y; `
signal smiao :integer range 0 to 8;--扫描信号* j2 G* z' C( W6 Y$ B7 `
signal sec_cnt,min_cnt,num1,cnt_num :integer range 0 to 60;--秒的计数,分的计数" a, r$ K- v: M7 e
signal hour_cnt :integer range 0 to 24;--小时的计数5 `& ^8 v4 H/ i1 J' T6 L( x
signal sc_L ,sc_h,min_L ,min_h,hour_L,hour_H :integer range 0 to 9;
3 o/ U% ]3 @" T7 n( {* r2 h# q--秒,分,时分离后的个位与十位3 T$ h9 d d2 M2 Z
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);3 R3 ^6 W% {3 ?
--秒,分,时分离后的个位与十位的段码
' A) X; U) H4 O! }$ f z; P- ]1 E begin 7 g% D9 ?5 y# J
--分频 ,50mhz分成1khz的信号,并且它的占空比为50%" h8 y' z3 k9 i
process (clk)0 |8 x/ _, a7 z- R5 B4 X" Y) F1 z5 |
begin ( z7 _9 b5 r6 S5 P7 H- g0 c
if clk'event and clk ='1' then ! r' p; R3 `+ ~ U2 P) R4 g! y! d1 Q
cnt_1k<=cnt_1k+1; J: E/ `! U+ X; f/ O
if cnt_1k =50000 then --计数1khz值
[9 ]8 Q: ^, o4 C. W cnt_1k<=0;
8 A5 r- X3 \5 v0 M* O8 |! X compete_1ms<='1';
7 ^& F! i k. T# A else
, Y% h! T D7 R% h) X* g if cnt_1k<25000 then
: g: D d1 u0 b( ^ flag_1k<='0'; --cnt_1k小于2500时flag_1k置0
1 o7 T6 I5 p! d$ A else M& Z3 e4 G+ ~9 |
flag_1k<='1';--否则置高
) `, R( U" A7 e) e C1 W3 e3 j% Z; V end if;
/ s* _0 m, ~' E3 q0 [ compete_1ms<='0';
3 R4 E* c( {1 [ end if;7 _: |- m$ k' z T. u
end if;
0 V! g: z* k2 r' J3 O+ k( L& c end process;" `& d ?4 |0 [0 T$ `; Z
8 m9 M. {* F/ {" A- g# h+ B1 q/ L! F
--产生1s的信号' j$ Q' e' f% P
process (compete_1ms) b! Q. w# `. n. v
variable cnt_1s: integer range 0 to 1000;
8 e& v: I: x3 N9 T4 Y: d" H! M1 V1 ] begin
9 w4 }1 P% _, h% i8 F* e! v! e" M if compete_1ms'event and compete_1ms='1' then --对1kz的信号进行计数) ~( V* A: ?1 h5 s r8 V
cnt_1s :=cnt_1s +1;
3 M( E# e0 V2 w: X if cnt_1s =1000 then cnt_1s :=0;
" V8 y! _4 i: a {3 @; z else if cnt_1s<500 then flag_1s<='0'; --产生1s信号并且占空比为50%,
$ A; u5 [, J2 U& R- Z6 o else flag_1s<='1';
7 ~# F/ h- I E2 e end if;
8 Q8 x% i4 f8 Z( }: K end if;8 K! k& a6 x! a: S x0 Y
end if;
$ U7 ^3 \9 m" Y D test<=flag_1s;--测试秒的信号是否产生
- L+ j! b& {( P9 D) v1 p. i: t. | end process; ; q# K7 }$ m# i: b- X; S) o
--按键控制秒的信号
2 u" M) l4 o% C, P6 H" a2 U, c+ c9 Eprocess (enb ,key,flag_1s). z6 R* |* @! Q$ O9 ^7 R
begin6 j% c" U3 b$ J/ n. z
if enb='1' then 3 l* v: p; R% x( ~! \
flag_fp<=flag_1s;--enb为高时送出的是1秒的信号: J! ~) \/ I. p. M+ ]" R8 d2 d2 A
else & Q* L! b! G0 {* ]* T
flag_fp<=not key; --否则送出的是按键的信号
6 W8 C2 j4 Z2 V& X: o+ n# [ end if;6 X$ \ n. z0 X8 I7 K" v( |
end process;
. j" W( ?7 b9 q# s6 F5 W --按键控制分的信号. H7 J% H; |) [1 x2 T
process (enb ,key1,sec_flag)
1 @9 _3 k$ X2 p4 L# Y' s! D begin
' o: m( @- v4 G+ H% O$ _1 ]. X if enb='1' then
+ @ m- t5 {" S& Q4 V6 a0 e+ y) [ min_fp<=sec_flag;--enb为高时送出的是1分钟的信号
( e$ j9 i9 {. I3 E1 f else 1 F/ V# t7 w% b5 X4 ]
min_fp<=not key1; --否则送出的是按键的信号
`* X5 D# D Q( Z4 s- D; w- p/ q+ Z end if;
. g2 `1 n7 I5 C -- test<=min_fp;--测试按键或者是秒的进位信号9 F$ C8 i z3 a' l( m$ @
end process;
. ~4 s8 n4 ]! T- yprocess (enb ,key2,min_flag)+ J2 |( N R( {5 w* l
begin
7 \( K* ]% n* O$ i9 @$ \4 Z* E if enb='1' then
) {7 S2 ?& N( |8 I# ? hour_fp<=min_flag;--enb为高时送出的是1小时的信号6 q5 H8 m$ W } P) p/ f* n
else
7 |! C. O% s, q hour_fp<=not key2; --否则送出的是按键的信号
3 Q* B+ [; Z) n7 Z3 G. ~6 ?" [ end if;
6 K4 S! g9 X/ U# ?1 C4 k -- test<=hour_fp;--测试按键或者是分的进位信号% h. X4 |5 B7 G5 z, ]8 B
end process;
0 O& e: N' w S4 \; B+ Q" w--秒的计数
$ f9 j( d) h$ p" h* i7 b, Y6 Jprocess(flag_fp)
4 I' W1 H, [* Q8 T% Ybegin
' C. r' _( N# ]6 B$ d: @7 k# aif flag_fp'event and flag_fp='1' then - P2 ?6 e5 c- b0 m7 u- K+ }
if sec_cnt=59 then sec_cnt<=0; sec_flag<='1';--秒是否到了1分钟,秒的标志位置为17 v. `+ k& _! d3 ^+ |5 B- R
else sec_cnt<=sec_cnt+1 ; sec_flag<='0'; --否则秒加1,秒的标志位置为08 V5 P7 N# I7 f( J
end if;7 A/ } C# B8 w- [9 M
end if;; N7 C0 q6 c: |8 U, P
sc_L <=sec_cnt mod 10; --秒的个位% f9 p7 A+ j1 v9 m) A7 @
sc_h<= integer (sec_cnt/10);-- 秒的十位 4 L+ ?& C" `* X5 }/ G& M
end process;
]. o: Z! J W* y0 c--分的计数
1 Q5 }5 `# s- a, F. q process(min_fp)
* k) Y& K" e3 M begin . s5 t4 P ~; ^0 l( N
--if enb='1' then --只加按键的控制秒的数值变化1 v# X0 E, i. P# N. Y' h+ r
if min_fp'event and min_fp='1' then ) F) C; C8 S* p- {
if min_cnt=59 then min_cnt<=0; min_flag<='1';--分是否到了1小时,小时的标志位置为19 E9 ]6 k) N& I' k+ g
else min_cnt<=min_cnt+1; min_flag<='0';--否则分加1,小时的标志位置为0. L' ^" g6 `! L# [ ]
end if;
" j0 @ L! d7 a9 @+ b end if;
* I3 U% {' ~ E4 U0 `, P: r: D; [ -- end if;9 ]4 P& ^, N! n V3 M: v
min_L <= min_cnt mod 10;--分的个位
, ?5 ^. T& i0 ]2 ~/ U# n min_h<= integer(min_cnt/10);-- 分的十位
& |' ?$ M4 v# ^ P end process;" z8 N# P; _: E1 P; z
E! @, K& X1 d' \4 }% s+ V( V0 t--小时的计数
6 x0 X8 K" ]$ v- C! ^ process(hour_fp)7 y% s) @) S6 X+ F4 m% K
begin / @3 O& T) J: P7 h5 i( B* `, M
-- if enb='1' then --只加按键的控制秒的数值变化 d4 N2 O, E- F6 d) H9 g
if hour_fp'event and hour_fp='1' then 2 Q; i7 ?6 S& A4 n$ t
if hour_cnt =23 then hour_cnt<=0;--小时是否到了24小时
' ~) Y6 v0 M% J! S else hour_cnt<=hour_cnt +1; --否则小时加1
+ e- p/ y' M" B; N% o end if;; S3 u5 J5 y2 c9 |2 q* Y; T* j7 O
end if;
5 ]/ J# C* D4 xhour_L <= hour_cnt mod 10;--分的个位
2 q3 u; n- p; Khour_h<= integer (hour_cnt/10);-- 分的十位
, U7 U) Z, a7 a2 l" {end process;
/ u _1 }% B2 E--产生动态扫描信号
* Y1 Y% ]% y! c- C Q6 Y; rprocess (flag_1k)$ R& r# z# G3 p# g$ ~
begin
- h7 B( m5 ]3 N7 z- W3 M if flag_1k'event and flag_1k='1' then --对1khz信号进行计数
0 m4 Y# T# x2 m8 m; ^6 Q9 S% n/ n if smiao=7 then smiao<=0;
$ H; C" ~" X- I% j5 l7 U else smiao<=smiao+1;; @4 L/ \% y7 G: o k6 d
end if;
\7 A+ c+ E& P& U8 N c+ V end if;
) Q$ b2 A2 M5 r: s5 `. }. Q sk<=smiao;--测试扫描信号
1 x% y( v2 F; @ x& O* M$ iend process;6 ^# h! I. A# \; c5 p. T# t# \
--时钟的秒和分,小时的个位和十位的数码管的段码; v5 l2 B7 V! t" K8 r1 @
PROCESS(sc_l,sc_h,min_l,min_h,hour_l,hour_h)
9 Z* H/ t( d% ]9 jBEGIN
6 i/ y5 _$ t W6 r, U( n--秒低位段码
8 G3 r5 P& z$ T: ]. pCASE(sc_l) IS + z! J6 i! @' x+ i* H
WHEN 0 => sc_l_q<="00000011"; --0的共阳数码管的段码4 B. V c' ~6 Z/ r6 f: E
WHEN 1 => sc_l_q<="10011111"; --1的共阳数码管的段码: H4 A; J( r0 K% F% Q0 G4 F
WHEN 2 => sc_l_q<="00100101"; --2的共阳数码管的段码
) k' Z$ H* A8 I0 A1 _/ v9 fWHEN 3 => sc_l_q<="00001101"; --3的共阳数码管的段码
7 H% }* ~' w4 C; V6 Q' eWHEN 4 => sc_l_q<="10011001"; --4的共阳数码管的段码# Q8 \! e; c% m) e
WHEN 5 => sc_l_q<="01001001"; --5的共阳数码管的段码
: p6 Q" E. w! Q/ o+ X P! @WHEN 6 => sc_l_q<="01000001"; --6的共阳数码管的段码 {& o& O- x% q0 e
WHEN 7 => sc_l_q<="00011111"; --7的共阳数码管的段码& Q& Z' U/ [5 ^9 D( L
WHEN 8 => sc_l_q<="00000001"; --8的共阳数码管的段码 ?# C( ]8 V% ~5 i& B
WHEN 9 => sc_l_q<="00001001"; --9的共阳数码管的段码
. V( f1 g- ?. ~ YWHEN OTHERS => NULL; # z% b! h# q5 g* [& B
END CASE;
, o8 b6 z; _8 M% v& m; U--秒高位段码 ]. M8 z% ` v5 d
CASE(sc_h) IS : T) T1 S$ @7 _( U r7 W3 y/ c
WHEN 0 => sc_h_q<="00000011"; --0的共阳数码管的段码: C4 o9 m" B' g& |0 b! `
WHEN 1 => sc_h_q<="10011111";--1的共阳数码管的段码
! }9 M) b- h. p" G, k! wWHEN 2 => sc_h_q<="00100101"; --2的共阳数码管的段码
0 O7 I+ v4 M5 S. o# \% vWHEN 3 => sc_h_q<="00001101";--3的共阳数码管的段码
& P/ U' Q! g4 c6 \8 ]WHEN 4 => sc_h_q<="10011001"; --4的共阳数码管的段码
- K: @5 R D# z0 v4 V# P3 uWHEN 5 => sc_h_q<="01001001"; --5的共阳数码管的段码1 i" S3 Y* J: H2 X- U0 L: N& L6 H
WHEN OTHERS => NULL;
3 ~3 ~! D# z' REND CASE; / D% a# d1 l% |, C$ r1 A/ B# g- r
--分低位段码
. \/ W* H, _3 B% W& }CASE(min_l) IS 1 @) ~! v8 l5 n8 l
WHEN 0 => min_l_q<="00000011"; --0的共阳数码管的段码
, v, u3 S; ], Z1 }8 A$ `WHEN 1 => min_l_q<="10011111"; --1的共阳数码管的段码1 J& k8 L9 S' f7 P
WHEN 2 => min_l_q<="00100101"; --2的共阳数码管的段码* f, \6 C' M1 C, s
WHEN 3 => min_l_q<="00001101"; --3的共阳数码管的段码
: r3 D1 }0 y3 ]& ]! ?. fWHEN 4 => min_l_q<="10011001"; --4的共阳数码管的段码
3 n) A: i3 O! vWHEN 5 => min_l_q<="01001001"; --5的共阳数码管的段码
' d" R+ a U8 P$ o) k, Y: ]WHEN 6 => min_l_q<="01000001"; --6的共阳数码管的段码
# s* |' \. q& R+ X* k" WWHEN 7 => min_l_q<="00011111"; --7的共阳数码管的段码! W0 t: g9 [. v
WHEN 8 => min_l_q<="00000001"; --8的共阳数码管的段码' {7 h7 [3 y# g1 `; z$ p
WHEN 9 => min_l_q<="00001001"; --9的共阳数码管的段码" D. f# C1 r- K$ V9 ^1 P$ t- J
WHEN OTHERS => NULL; . | ^' ?( S0 g( Q( q+ J$ h" ] S
END CASE;
1 X7 p+ [6 |/ C9 M' C9 `' K--分高位段码
9 M4 E( c0 b2 {2 ZCASE(min_h) IS : q |8 b e0 x6 J5 E) `! y
WHEN 0 => min_h_q<="00000011"; --0的共阳数码管的段码0 h0 q& Q8 P+ H- Y5 \% I
WHEN 1 => min_h_q<="10011111";--1的共阳数码管的段码 + a" @, ~8 p- U$ e( P# F3 q4 A$ l
WHEN 2 => min_h_q<="00100101";--2的共阳数码管的段码& @, Q* l( ^/ h( F+ [* K. j
WHEN 3 => min_h_q<="00001101";--3的共阳数码管的段码
! D6 T q9 [) m1 F& p- k) \$ O0 sWHEN 4 => min_h_q<="10011001"; --4的共阳数码管的段码
2 l4 x% |7 M6 X. n9 yWHEN 5 => min_h_q<="01001001"; --5的共阳数码管的段码 U j+ J" \; M/ r4 [ H
WHEN OTHERS => NULL; / m9 p& {) \$ L9 ^
END CASE;
- W* O' ^0 {, j# I& Q+ r--小时低位段码
5 ^) M8 b; a; F& `+ m, r& `$ m+ YCASE(hour_l) IS
: X4 d5 o7 p3 n# Q3 DWHEN 0 => hour_l_q<="00000011"; --0的共阳数码管的段码
2 N" Y4 N, y" a" ]; aWHEN 1 => hour_l_q<="10011111"; --1的共阳数码管的段码( O& ]8 P8 w* G$ d6 h
WHEN 2 => hour_l_q<="00100101"; --2的共阳数码管的段码
, T6 M) d" C7 I/ l! aWHEN 3 => hour_l_q<="00001101"; --3的共阳数码管的段码
9 t3 E7 \, e( h* UWHEN 4 => hour_l_q<="10011001"; --4的共阳数码管的段码
% h- {& @" {2 ]- T8 \) ]! @- u! yWHEN 5 => hour_l_q<="01001001"; --5的共阳数码管的段码9 F$ S- d* V/ p9 l9 \9 m
WHEN 6 => hour_l_q<="01000001"; --6的共阳数码管的段码* M$ _% U1 r+ { }! T9 d
WHEN 7 => hour_l_q<="00011111"; --7的共阳数码管的段码
& o/ j5 Y) r$ tWHEN 8 => hour_l_q<="00000001"; --8的共阳数码管的段码
% y/ q" C0 g' r, m y% A4 LWHEN 9 => hour_l_q<="00001001"; --9的共阳数码管的段码
" [: p3 ~! T4 p% f0 Y A- BWHEN OTHERS => NULL; 4 }7 _5 n6 d. w* o% y0 r* G3 J
END CASE; - g5 M1 z5 |( N7 b6 ^
--小时的高位段码
6 R8 R: {5 @$ A. d* U- J' HCASE(hour_h) IS . Q' Y) |) u3 J6 y8 g
WHEN 0 => hour_h_q<="00000011";--0的共阳数码管的段码
& ~/ |/ i; ~" I* m7 u: IWHEN 1 => hour_h_q<="10011111"; --1的共阳数码管的段码
4 U* b3 x. Q& d5 lWHEN 2 => hour_h_q<="00100101";--2的共阳数码管的段码/ Z5 O4 y. Z% }. P$ x" i
WHEN OTHERS => NULL; % I* F$ w& W4 u' [3 A3 |8 W t
END CASE;
! q' _! K e8 D: ^( D8 z$ z3 uEND PROCESS;
3 S5 {7 k- F: {1 e2 Q$ v--此进程为数码管动态显示
' ], u4 ?' z u# k; B( V G4 q% APROCESS(smiao)
5 o; t7 g+ B+ [0 `& [BEGIN
6 E3 v! D! ]) ~2 dCASE smiao IS 9 s6 e% }: D+ _3 [
WHEN 0 => S<="01111111";Q<=sc_l_q; --第1位数码管显示秒的低位
8 N$ _( m/ C# ZWHEN 1 => S<="10111111";Q<=sc_h_q; --第2位数码管显示秒的高位1 s& [3 l4 _% [9 K
WHEN 2 => S<="11011111";Q<="11111101"; --第3位数码管显示“-”
& B/ V# X5 P: G4 L9 o5 QWHEN 3 => S<="11101111";Q<=min_l_q; --第4位数码管显示分的低位! L3 B" t9 {0 r8 t z' R: K% J, R
WHEN 4 => S<="11110111";Q<=min_h_q; --第5位数码管显示分的高位
7 W) _! q; g6 X- Z( ]8 K% U! T9 O# oWHEN 5 => S<="11111011";Q<="11111101"; --第6位数码管显示“-”
6 Y, m; |7 k/ O% l; E2 P- aWHEN 6 => S<="11111101";Q<=hour_l_q; --第7位数码管显示小时的低位
6 S6 b, _5 e& _6 oWHEN 7 => S<="11111110";Q<=hour_h_q; --第8位数码管显示小时的高位7 f$ U9 S+ `6 E F
WHEN OTHERS => NULL;
# W, a2 ]0 R0 L& O/ \3 Z5 i8 mEND CASE;
! {# H/ O1 H/ g6 V1 Zend process;
9 \# I3 A2 q& ~0 Q! I1 i9 @end architecture one;+ q2 p7 C/ r' O6 j1 N9 G! H! J0 e
1 H6 ^1 ?8 b+ x( U1 O2 M! v
|
|