打印
[Actel FPGA]

FPGA 电子钟设计的程序

[复制链接]
3211|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
稳定分析|  楼主 | 2009-8-13 11:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
孤独行者| | 2009-8-23 17:20 | 只看该作者
--*****************************************************************
--文件名: watch.vhd
--文件描述:本文件为电子设计而开发的多功能数字钟VHDL语言完整源代码
--该数字钟实现的功能有时间,秒表,闹钟,年月日的显示设置等
--开发小组:信科04-3班    吴喆    张力文   王腾腾
--时间:2007年7月
--*********************************************************************


LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_UNSIGNED;

ENTITY watch IS
PORT(clk,scanclk,clr,clock,sclock,data,pause,m_add,h_add,mclock,hclock:IN STD_LOGIC;
  music:OUT STD_LOGIC;
     row:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
     led:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
  leda:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END watch;

ARCHITECTURE Behavioral OF watch IS
SIGNAL clk_div2,clk_div1:STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL clk_div3:STD_LOGIC_VECTOR(4 DOWNTO 0);
SIGNAL clk0,clk1,nomusic,year:STD_LOGIC;
SIGNAL month:STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL hh,hl,mh,ml,sh,sl:STD_LOGIC_VECTOR(3 DOWNTO 0);--时分秒
SIGNAL shh,shl,smh,sml,ss:STD_LOGIC_VECTOR(3 DOWNTO 0);--闹钟时分秒
SIGNAL ssh,ssl,fs,msh,msl:STD_LOGIC_VECTOR(3 DOWNTO 0);--秒表时分秒
SIGNAL nhh,nhl,nlh,nll,yh,yl,dh,dl:STD_LOGIC_VECTOR(3 DOWNTO 0);--年月日
SIGNAL dispcnt:STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL num:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL numh:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL a,b,c,d:INTEGER range 0 to 9;

使用特权

评论回复
板凳
孤独行者| | 2009-8-23 17:20 | 只看该作者
BEGIN
P1:PROCESS(clk)       ----产生脉冲信号
   BEGIN
       IF rising_edge(clk) THEN
               clk_div1<=clk_div1+'1';
      IF ( clk_div1 = "1111101000")THEN
      clk_div1 <= (others=>'0');
                  clk_div3<=clk_div3+'1';
      END IF;
      IF(  clk_div3 = "10100")  THEN
      clk0 <= NOT clk0;    ----产生1ms脉冲信号
      clk_div3 <=  (others=>'0');
      clk_div2<=clk_div2+'1';
      END IF;
      IF(  clk_div2 = "1111101000")   THEN
       clk_div2 <= (others=>'0');
       clk1 <= NOT clk1;   ----产生1s脉冲信号
      END IF;
       END IF;
END PROCESS P1;

使用特权

评论回复
地板
孤独行者| | 2009-8-23 17:20 | 只看该作者
http://share.dzkf.cn/down/2008/0708/file_3457.html


或者:


--*****************************************************************
--文件名: watch.vhd
--文件描述:本文件为电子设计而开发的多功能数字钟VHDL语言完整源代码
--该数字钟实现的功能有时间,秒表,闹钟,年月日的显示设置等
--开发小组:信科04-3班    吴喆    张力文   王腾腾
--时间:2007年7月
--*********************************************************************


LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_UNSIGNED;

ENTITY watch IS
PORT(clk,scanclk,clr,clock,sclock,data,pause,m_add,h_add,mclock,hclock:IN STD_LOGIC;
  music:OUT STD_LOGIC;
     row:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
     led:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
  leda:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END watch;

ARCHITECTURE Behavioral OF watch IS
SIGNAL clk_div2,clk_div1:STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL clk_div3:STD_LOGIC_VECTOR(4 DOWNTO 0);
SIGNAL clk0,clk1,nomusic,year:STD_LOGIC;
SIGNAL month:STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL hh,hl,mh,ml,sh,sl:STD_LOGIC_VECTOR(3 DOWNTO 0);--时分秒
SIGNAL shh,shl,smh,sml,ss:STD_LOGIC_VECTOR(3 DOWNTO 0);--闹钟时分秒
SIGNAL ssh,ssl,fs,msh,msl:STD_LOGIC_VECTOR(3 DOWNTO 0);--秒表时分秒
SIGNAL nhh,nhl,nlh,nll,yh,yl,dh,dl:STD_LOGIC_VECTOR(3 DOWNTO 0);--年月日
SIGNAL dispcnt:STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL num:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL numh:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL a,b,c,d:INTEGER range 0 to 9;


BEGIN
P1:PROCESS(clk)       ----产生脉冲信号
   BEGIN
       IF rising_edge(clk) THEN
               clk_div1<=clk_div1+'1';
      IF ( clk_div1 = "1111101000")THEN
      clk_div1 <= (others=>'0');
                  clk_div3<=clk_div3+'1';
      END IF;
      IF(  clk_div3 = "10100")  THEN
      clk0 <= NOT clk0;    ----产生1ms脉冲信号
      clk_div3 <=  (others=>'0');
      clk_div2<=clk_div2+'1';
      END IF;
      IF(  clk_div2 = "1111101000")   THEN
       clk_div2 <= (others=>'0');
       clk1 <= NOT clk1;   ----产生1s脉冲信号
      END IF;
       END IF;
END PROCESS P1;

P2:PROCESS(clk1,clr)    ---60秒计数器
   BEGIN
        IF(clr='1')AND(sclock = '0')AND(data='0') THEN
            sl<="0000";
            sh<="0000";
        ELSIF rising_edge(clk1)THEN
             IF sl="1001"THEN
    IF(sh="0101")THEN
               sh<="0000";
             ELSE
                 sh<=sh+'1';
    END IF;
                sl<="0000";
             ELSE
                sl<=sl+'1';
             END IF;
  END IF;
END PROCESS P2;

使用特权

评论回复
5
孤独行者| | 2009-8-23 17:21 | 只看该作者
P3:PROCESS(clk1,clr,sh,sl,m_add)   --60分计数器
BEGIN
IF (clr='1')AND(sclock = '0')AND(data='0')THEN
ml<="0000";
mh<="0000";
ELSIF rising_edge(clk1)THEN
IF(((sh="0101")AND(sl="1001"))OR(m_add='1'))THEN
IF((mh="0101")AND(ml="1001"))THEN
  mh<="0000";ml<="0000";
ELSIF ml="1001" THEN
  mh <= mh+'1';
  ml <= "0000";
ELSE   
  ml<=ml+'1';
END IF;
END IF;
END IF;
END PROCESS  P3;

使用特权

评论回复
6
孤独行者| | 2009-8-23 17:21 | 只看该作者
P4:PROCESS(clk1,clr,mh,ml,sh,sl,h_add)    --24 时计数器
BEGIN
IF (clr='1')AND(sclock = '0')AND(data='0')THEN
hl<="0000";
hh<="0000";
ELSIF rising_edge(clk1)THEN
IF(((sh="0101")AND(sl="1001")AND(mh="0101")AND(ml="1001"))OR(h_add='1'))THEN
    IF((hh="0010")AND(hl="0011"))THEN
    hh<="0000";hl<="0000";   
    ELSIF(hl="1001")THEN
   hh <= hh +'1';
   hl <= "0000";
    ELSE
   hl<=hl+'1';
    END IF;
END IF;
END IF;
END PROCESS P4;

使用特权

评论回复
7
孤独行者| | 2009-8-23 17:21 | 只看该作者
P5:PROCESS(clk0,clr,sclock)    ---毫秒计数器
   BEGIN
        IF  (clr='1')AND(sclock='1')  THEN
            msl<="0000";
            msh<="0000";
   fs <="0000";
        ELSIF rising_edge(clk0) THEN
   IF sclock = '1' THEN
             IF (msl="1001")AND(pause='0') THEN
    IF(msh="1001")THEN
     if(fs="1001")THEN
      fs<="0000";
     ELSE     
            fs<=fs+'1';
     END IF;   
     msh<="0000";  
    ELSE
                 msh<=msh+'1';
    END IF;
                msl<="0000";
             ELSE
                msl<=msl+'1';
             END IF;
    END IF;
  END IF;
END PROCESS P5;

使用特权

评论回复
8
孤独行者| | 2009-8-23 17:21 | 只看该作者
P6:PROCESS(clk0,clr,msh,msl,fs,sclock)     --s 计数器
BEGIN
IF (clr='1')AND(sclock='1')THEN
ssl<="0000";
ssh<="0000";
ELSIF rising_edge(clk0)THEN
  IF (sclock = '1')AND(pause='0')THEN
IF((fs="1001")AND(msh="1001")AND(msl="1001"))THEN
    IF((ssh="0101")AND(ssl="1001"))THEN
    ssh<="0000";ssl<="0000";   
    ELSIF(ssl="1001")THEN
   ssh <= ssh +'1';
   ssl <= "0000";
    ELSE
   ssl<=ssl+'1';
    END IF;
END IF;
END IF;
END IF;
END PROCESS P6;

使用特权

评论回复
9
孤独行者| | 2009-8-23 17:22 | 只看该作者
P7:PROCESS(clock,clk1)       ---设置闹钟时间
BEGIN
IF rising_edge( clk1 ) THEN
   IF ( ( clock = '1')AND(mclock = '1')) THEN
  IF( sml = "1001" ) THEN
   IF(smh="0101") THEN
    smh <="0000";
   ELSE
    smh <= smh+'1';
   END IF;
   sml <= "0000";
  ELSE
   sml <= sml + '1';--nomusic <= '1';
  END IF;
END IF;
   IF (( clock = '1') AND (hclock = '1'))THEN
  IF( (shh="0010")AND(shl ="0011") ) THEN
   shh <= "0000";shl <= "0000";
  ELSIF(shl="1001") THEN
    shh <= shh+'1';
    shl <= "0000";
  ELSE
   shl <= shl + '1';
  END IF;
END IF;
END IF;
END PROCESS P7;

使用特权

评论回复
10
孤独行者| | 2009-8-23 17:22 | 只看该作者
P8:PROCESS(clk1)  --闹钟音乐
BEGIN
IF rising_edge( clk1 ) THEN
IF((shl = hl )AND(shh = hh)AND(sml = ml )AND(smh = mh)AND(nomusic = '0')) THEN
  music <= '1';
  ss <= sml + "0001";
  IF (clock = '1') THEN
   music <= '0';
   nomusic <= '1';
  END IF;
END IF;
IF(ml = ss) THEN
   music <= '0';
   nomusic <= '0';
END IF;
END IF;
END PROCESS P8;

使用特权

评论回复
11
孤独行者| | 2009-8-23 17:22 | 只看该作者
P9:PROCESS(clk1,yh,yl,a,b,c,d) ---闰年,月份判断
VARIABLE q,w:INTEGER range 0 to 30 := 0 ;
VARIABLE count:INTEGER range 0 to 100 :=0;
BEGIN
IF((yh="0000")AND(yl="0010"))THEN
  month<="00";
ELSIF((yh="0000")AND(yl="0100"))OR((yh="0000")AND(yl="0110"))OR((yh="0000")AND(yl="1001"))OR((yh="0001")AND(yl="0001"))THEN
  month<="01";
ELSE
  month<="10";
END IF;

使用特权

评论回复
12
孤独行者| | 2009-8-23 17:22 | 只看该作者
IF (c=0)AND(d=0) THEN
  count := INTEGER(10*a+ 1*b);
  q:=INTEGER(count / 4 );
  w:=INTEGER(4*q);
  IF(count = w)  THEN
   year <= '0';
  ELSE
   year <= '1';
  END IF;
ELSE
  count := INTEGER(10*c+ 1*d);
  q:=INTEGER(count / 4 );
  w:=INTEGER(4*q);
  IF(count = w)THEN
   year <= '0';
  ELSE
   year <= '1';
  END IF;
END IF;
END PROCESS P9;

使用特权

评论回复
13
孤独行者| | 2009-8-23 17:23 | 只看该作者
P10:PROCESS(clk1,clr,hh,hl,data,month,year) ---年月日
BEGIN
        IF(clr='1')AND(data ='1')  THEN
   yh<="0000";yl<="0001";
            dh<="0000";dl<="0001";
          nhh<="0010";nhl<="0000";
   nlh<="0000";nll<="0000";
        ELSIF rising_edge(clk1) THEN
      IF ((data='1')AND(pause='1')) THEN
        IF (month="00") THEN
     IF(year='0')THEN
     IF(dh="0010")AND(dl="1001")THEN
      dl<="0001";dh<="0000";
     ELSIF(dl="1001")THEN
         dl<="0000";dh<=dh+'1';
     ELSE
            dl<=dl+'1';
     END IF;
     ELSE
                 IF(dh="0010")AND(dl="1000")THEN
      dl<="0001";dh<="0000";
     ELSIF(dl="1001")THEN
         dl<="0000";dh<=dh+'1';
     ELSE
            dl<=dl+'1';
     END IF;
     END IF;
             ELSIF(month="01")THEN
                IF(dh="0011")AND(dl="0000")THEN
     dh<="0000";dl<="0001";
    ELSIF(dl="1001")THEN
         dl<="0000";dh<=dh+'1';
    ELSE
            dl<=dl+'1';
    END IF;
    ELSIF(month="10") THEN
    IF(dh="0011")AND(dl="0001")THEN
     dh<="0000";dl<="0001";
    ELSIF(dl="1001")THEN
         dl<="0000";dh<=dh+'1';
    ELSE
            dl<=dl+'1';
    END IF;
             END IF;
  END IF;

使用特权

评论回复
14
孤独行者| | 2009-8-23 17:23 | 只看该作者
IF(data='1')AND(mclock='1')THEN
    IF(yh="0001")AND(yl="0010")THEN
     yh<="0000";yl<="0001";
    ELSIF(yl="1001")   THEN
     yl<="0000";yh<=yh+'1';
    ELSE
     yl<=yl+'1';
    END IF;
      END IF;
        IF(data='1')AND(hclock='1')THEN
    IF(nll="1001") THEN
     IF(nlh="1001")THEN
      IF(nhl="1001")THEN
       nhl<="0000";nhh<=nhh+'1';
      ELSE
       nlh<="0000";nhl<=nhl+'1';
      END IF;
     ELSE
      nll<="0000";nlh<=nlh+'1';
     END IF;
    ELSE
     nll<=nll+'1';
    END IF;
      END IF;

使用特权

评论回复
15
孤独行者| | 2009-8-23 17:23 | 只看该作者
IF ((hh="0010")AND(hl="0011")AND(mh="0101")AND(ml="1001")AND(sh="0101")AND(sl="1001")) THEN
        IF (month="00") THEN
    IF(year='0')THEN
     IF(dh="0010")AND(dl="1001")THEN
      dl<="0001";dh<="0000";
      yl<=yl+'1';
     ELSIF(dl="1001")THEN
         dl<="0000";dh<=dh+'1';
     ELSE
            dl<=dl+'1';
     END IF;
     ELSE
                 IF(dh="0010")AND(dl="1000")THEN
      dl<="0001";dh<="0000";
      yl<=yl+'1';
     ELSIF(dl="1001")THEN
         dl<="0000";dh<=dh+'1';
     ELSE
            dl<=dl+'1';
     END IF;
     END IF;
             ELSIF(month="01")THEN
                IF(dh="0011")AND(dl="0000")THEN
     dh<="0000";dl<="0001";
     IF(yl="1001")THEN
      yl<="0000";yh<="0001";
     ELSE
      yl<=yl+'1';
     END IF;
    ELSIF(dl="1001")THEN
         dl<="0000";dh<=dh+'1';
    ELSE
            dl<=dl+'1';
    END IF;

使用特权

评论回复
16
孤独行者| | 2009-8-23 17:23 | 只看该作者
ELSIF(month="10") THEN
    IF(dh="0011")AND(dl="0001")THEN
     dh<="0000";dl<="0001";
     IF(yh="0001")AND(yl="0010")THEN
      yl<="0001";yh<="0000";
      IF(nll="1001")THEN
       nll<="0000";
       IF(nlh="1001")THEN
        IF(nhl="1001")THEN
         nhl<="0000";nhh<=nhh+'1';
        ELSE
         nhl<=nhl+'1';
        END IF;
        nlh<="0000";
       ELSE
        nlh<=nlh+'1';
       END IF;
      ELSE
       nll<=nll+'1';
      END IF;  
     ELSE
      yl<=yl+'1';
     END IF;
    ELSIF(dl="1001")THEN
         dl<="0000";dh<=dh+'1';
    ELSE
            dl<=dl+'1';
    END IF;
             END IF;
    END IF;
  END IF;
END PROCESS P10;

使用特权

评论回复
17
孤独行者| | 2009-8-23 17:24 | 只看该作者
P11:PROCESS(scanclk)     ---  动态扫描时钟
BEGIN
IF rising_edge(scanclk)THEN
IF dispcnt="111"THEN
dispcnt<="000";
ELSE
dispcnt<=dispcnt+'1';
END IF;
END IF;
END PROCESS P11;

使用特权

评论回复
18
孤独行者| | 2009-8-23 17:24 | 只看该作者
P12:PROCESS(dispcnt,clock)     ---选择对应位BCD码
BEGIN
IF ( clock='1') THEN
IF dispcnt="000"THEN
    row<="00100000";numh<=shh;
ELSIF dispcnt="001"THEN
    row<="00010000";numh<=shl;
ELSIF dispcnt="010"THEN
    row<="00001000";num<=smh;
ELSIF dispcnt="011"THEN
    row<="00000100";num<=sml;
ELSE
     row<="00000000";num<="0000";
END IF;
ELSIF (sclock = '1')THEN
IF dispcnt="000"THEN
    row<="00100000";numh<=ssh;
ELSIF dispcnt="001"THEN
    row<="00010000";numh<=ssl;
--ELSIF dispcnt="010"THEN
    --row<="00001000";num<=fsh;
ELSIF dispcnt="011"THEN
    row<="00000100";num<=fs;
ELSIF dispcnt="100"THEN
    row<="00000010";num<=msh;
ELSIF dispcnt="101"THEN
    row<="00000001";num<=msl;
END IF;
ELSIF(data='1')THEN
IF dispcnt="000"THEN
    row<="10000000";numh<=nhh;
ELSIF dispcnt="001"THEN
    row<="01000000";numh<=nhl;
ELSIF dispcnt="010"THEN
    row<="00100000";numh<=nlh;
ELSIF dispcnt="011"THEN
    row<="00010000";numh<=nll;
ELSIF dispcnt="100"THEN
    row<="00001000";num<=yh;
ELSIF dispcnt="101"THEN
    row<="00000100";num<=yl;
ELSIF dispcnt="110"THEN
    row<="00000010";num<=dh;
ELSIF dispcnt="111"THEN
    row<="00000001";num<=dl;
END IF;
ELSE
IF dispcnt="000"THEN
    row<="00100000";numh<=hh;
ELSIF dispcnt="001"THEN
    row<="00010000";numh<=hl;
ELSIF dispcnt="010"THEN
    row<="00001000";num<=mh;
ELSIF dispcnt="011"THEN
    row<="00000100";num<=ml;
ELSIF dispcnt="100"THEN
    row<="00000010";num<=sh;
ELSIF dispcnt="101"THEN
    row<="00000001";num<=sl;
END IF;
END IF;
END PROCESS P12;

使用特权

评论回复
19
孤独行者| | 2009-8-23 17:24 | 只看该作者
WITH nhh SELECT    --年译码
a<=  1 WHEN"0001",  --1
  2 WHEN"0010",  --2
  3 WHEN"0011",  --3
  4 WHEN"0100",  --4
  5 WHEN"0101",  --5
  6 WHEN"0110",  --6
  7 WHEN"0111",  --7
  8 WHEN"1000",  --8
  9 WHEN"1001",  --9
  0 WHEN OTHERS;  --0

WITH nhl SELECT    --年译码
b<=  1 WHEN"0001",  --1
  2 WHEN"0010",  --2
  3 WHEN"0011",  --3
  4 WHEN"0100",  --4
  5 WHEN"0101",  --5
  6 WHEN"0110",  --6
  7 WHEN"0111",  --7
  8 WHEN"1000",  --8
  9 WHEN"1001",  --9
  0 WHEN OTHERS;  --0

WITH nlh SELECT    --年译码
c<=  1 WHEN"0001",  --1
  2 WHEN"0010",  --2
  3 WHEN"0011",  --3
  4 WHEN"0100",  --4
  5 WHEN"0101",  --5
  6 WHEN"0110",  --6
  7 WHEN"0111",  --7
  8 WHEN"1000",  --8
  9 WHEN"1001",  --9
  0 WHEN OTHERS;  --0

WITH nll SELECT    --年译码
d<=  1 WHEN"0001",  --1
  2 WHEN"0010",  --2
  3 WHEN"0011",  --3
  4 WHEN"0100",  --4
  5 WHEN"0101",  --5
  6 WHEN"0110",  --6
  7 WHEN"0111",  --7
  8 WHEN"1000",  --8
  9 WHEN"1001",  --9
  0 WHEN OTHERS;  --0

使用特权

评论回复
20
孤独行者| | 2009-8-23 17:24 | 只看该作者
--dp,g,f,e,d,c,b,a
WITH num SELECT    --SEG3--SEG6段7段译码器
led<="00000110"WHEN"0001",  --1
  "01011011"WHEN"0010",  --2
  "01001111"WHEN"0011",  --3
  "01100110"WHEN"0100",  --4
  "01101101"WHEN"0101",  --5
  "01111101"WHEN"0110",  --6
  "00000111"WHEN"0111",  --7
  "01111111"WHEN"1000",  --8
  "01101111"WHEN"1001",  --9
  "00111111"WHEN OTHERS;  --0

WITH numh SELECT    --SEG7--SEG10段7段译码器
leda<="00000110"WHEN"0001",  --1
  "01011011"WHEN"0010",  --2
  "01001111"WHEN"0011",  --3
  "01100110"WHEN"0100",  --4
  "01101101"WHEN"0101",  --5
  "01111101"WHEN"0110",  --6
  "00000111"WHEN"0111",  --7
  "01111111"WHEN"1000",  --8
  "01101111"WHEN"1001",  --9
  "00111111"WHEN OTHERS;  --0


END behavioral;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

165

帖子

0

粉丝