找回密码
 注册
关于网站域名变更的通知
查看: 313|回复: 1
打印 上一主题 下一主题

vhdl语言的时钟

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-5-27 14:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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    Qut 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   testut 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

该用户从未签到

2#
发表于 2019-5-27 17:49 | 只看该作者
最近正在找这方面的资料 谢谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-9 20:36 , Processed in 0.140625 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表