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

vhdl语言的时钟

[复制链接]

该用户从未签到

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

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-12 05:00 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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