[FPGA] 写了一个星期的数字钟,太难写了,刚写出来。把他拉出来亮亮像

[复制链接]
 楼主| 胡斯哲 发表于 2014-12-6 21:32 | 显示全部楼层 |阅读模式
  1. LIBRARY  IEEE;
  2. USE IEEE.STD_LOGIC_1164.ALL;
  3. USE IEEE.STD_LOGIC_UNSIGNED.ALL;
  4. ENTITY Clock IS
  5. PORT(
  6.                 down,up,clk_28M:IN STD_LOGIC;
  7.             stop1,pun:BUFFER STD_LOGIC;
  8.                 sec0,sec1:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0);
  9.                 min0,min1:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0);
  10.                 hour0,hour1:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
  11.                 day0,day1:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0);
  12.                 mon0,mon1:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
  13.                 year0,year1:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
  14. );
  15. END ENTITY Clock;

  16. ARCHITECTURE bhv OF Clock IS       
  17.         SIGNAL clk,clk1,clk_60s_m,clk_60m_h,clk_24h_d,clk_day,clk_mon,clk_year,t:STD_LOGIC;
  18.         SIGNAL adj_bit:        STD_LOGIC_VECTOR(3 DOWNTO 0);
  19.         SIGNAL v60s,v60s1,v60m,v60m1:STD_LOGIC_VECTOR(5 DOWNTO 0);
  20.         SIGNAL v24h,v24h1:STD_LOGIC_VECTOR(5 DOWNTO 0);
  21.         SIGNAL vday,vday1,vmon,vmon1,vyear,vyear1:STD_LOGIC_VECTOR(5 DOWNTO 0):="000001";
  22.         SIGNAL a1s,a2s,a3s,a4s,a5s,a6s,punt:STD_LOGIC_VECTOR(2 DOWNTO 0);
  23.         SIGNAL stop,dis_MonAndYear,sec_rst,min_rst,hour_rst,day_rst,mon_rst,year_rst:STD_LOGIC;
  24.         BEGIN
  25. DIS_Mon_YEAR:
  26.                  PROCESS(up,down)        BEGIN                                --need the "down" and "up"is '1' in default
  27.                         IF  down='0' AND stop='0'THEN
  28.                         dis_MonAndYear<='1'; ELSE
  29.                         dis_MonAndYear<='0';
  30.                         END IF;
  31.                  END PROCESS;
  32.                
  33. Punctually:
  34.                 process(v60m,punt)
  35.                 variable b:integer range  4 downto 0;
  36.                 begin
  37.                         if v60m="000000" THEN b:=1;END IF;
  38.                         IF b=1 THEN pun<='0';END IF;
  39.                         IF punt=2 THEN pun<='1';b:=0;t<='1'; end if;
  40.                         IF punt=0 THEN t<='0';END IF;
  41.                 end process;       
  42.                                
  43. ADJUST1: PROCESS(up) BEGIN
  44.                         IF up' EVENT AND up='0' THEN
  45.                                         adj_bit<=adj_bit+1;stop<='1';stop1<='1';
  46.                                         IF adj_bit = 6 THEN
  47.                                         adj_bit<="0000";stop<='0';stop1<='0';
  48.                                         END IF;
  49.                         END IF;
  50.                 END PROCESS;
  51. ADJUST2:PROCESS(down) BEGIN
  52.                         IF down' EVENT AND down='0' THEN               
  53.                                 CASE adj_bit IS
  54.                                         WHEN "0001"=>v60s1<="000001";
  55.                                         WHEN "0010"=>v60m1<="000001";
  56.                                         WHEN "0011"=>v24h1<="000001";
  57.                                         WHEN "0100"=>vday1<="000011";
  58.                                         WHEN "0101"=>vmon1<="000010";
  59.                                         WHEN "0110"=>vyear1<="000010";
  60.                                         WHEN OTHERS=>NULL;
  61.                                 END CASE;
  62.                         END IF;
  63.                         IF v60s1="000001"  AND sec_rst='1'  THEN v60s1<="000000"; END IF;
  64.                         IF v60m1="000001"  AND min_rst='1'  THEN v60m1<="000000"; END IF;
  65.                         IF v24h1="000001"  AND hour_rst='1' THEN v24h1<="000000"; END IF;
  66.                         IF vday1="000011"  AND day_rst='1'  THEN vday1<="000001"; END IF;
  67.                         IF vmon1="000010"  AND mon_rst='1'  THEN vmon1<="000001"; END IF;
  68.                         IF vyear1="000010" AND year_rst='1' THEN vyear1<="000001";END IF;--need the "down" is '1' in default
  69.                 END PROCESS;
  70. ASI_DIS:
  71.                 PROCESS(clk1) BEGIN
  72.                 IF clk' EVENT AND clk='1' THEN
  73.                         IF adj_bit = 1 THEN a1s <=a1s+1 ;ELSE a1s<="000";END IF ;
  74.                         IF adj_bit = 2 THEN a2s <=a2s+1 ;ELSE a2s<="000";END IF ;
  75.                         IF adj_bit = 3 THEN a3s <=a3s+1 ;ELSE a3s<="000";END IF ;
  76.                         IF adj_bit = 4 THEN a4s <=a4s+1 ;ELSE a4s<="000";END IF ;
  77.                         IF adj_bit = 5 THEN a5s <=a5s+1 ;ELSE a5s<="000";END IF ;
  78.                         IF adj_bit = 6 THEN a6s <=a6s+1 ;ELSE a6s<="000";END IF ;
  79.                         if pun='0'     then punt<=punt+1; end if;
  80.                         IF t='1'         THEN punt<="000"; END IF;
  81.                 END IF;
  82.                 END PROCESS;
  83.                
  84. CLK1_1:        PROCESS(clk_28M)
  85.                         VARIABLE v28,v14:INTEGER range 2799999 DOWNTO 0; --++++++++
  86.                         BEGIN
  87.                                 IF clk_28M' EVENT AND clk_28M='1'       --++++++++
  88.                                         THEN
  89.                                         IF v28=2799999 THEN v28:=0;clk<='1';     --++++++++
  90.                                         ELSE v28:=v28+1;clk<='0';
  91.                                         END IF;
  92.                                         IF v14=1399999 THEN v14:=0;clk1<='1';     --++++++++
  93.                                         ELSE v14:=v14+1;clk1<='0';
  94.                                         END IF;
  95.                                 END IF;
  96.                 END PROCESS;
  97.        
  98. SEC:        PROCESS(clk,v60s1,v60m1)
  99.                         BEGIN
  100.                         IF  clk' EVENT AND clk='1'
  101.                         THEN
  102.                                 IF stop='0'OR v60s1="000001" THEN
  103.                                         sec_rst<='1';
  104.                                         if v60s=59 THEN v60s<="000000";clk_60s_m<='1';--59
  105.                                                 ELSE v60s<=v60s+1;clk_60s_m<='0';-------------__--1
  106.                                         END IF;
  107.                                 END IF;
  108.                                 IF v60s1="000000" THEN sec_rst<='0';END IF;
  109.                                
  110.                         END IF;
  111.                         IF stop='1' THEN clk_60s_m<=clk;END IF;
  112.                 END PROCESS;

  113. DIS_SEC:PROCESS(v60s,a1s,vmon,dis_MonAndYear)
  114.                 VARIABLE v,v1:STD_LOGIC_VECTOR(5 DOWNTO 0);                       
  115.                 BEGIN       
  116.                 IF dis_MonAndYear='0'  THEN
  117.                         IF a1s=2  OR adj_bit=0 OR adj_bit=2 OR adj_bit=3 OR adj_bit=4THEN    -----==========
  118.                                 IF v60s<10
  119.                                 then sec1<="11000000";v:=v60s;END IF;
  120.                                 IF v60s>9 AND v60s<20
  121.                                 then sec1<="11111001";v:=v60s-10;END IF;
  122.                                 IF v60s>19 AND v60s<30
  123.                                 then sec1<="10100100";v:=v60s-20;END IF;
  124.                                 IF v60s>29 AND v60s<40
  125.                                 then sec1<="10110000";v:=v60s-30;END IF;
  126.                                 IF v60s>39 AND v60s<50
  127.                                 then sec1<="10011001";v:=v60s-40;END IF;
  128.                                 IF v60s>49 AND v60s<60
  129.                                 then sec1<="10010010";v:=v60s-50;END IF;
  130.                                   CASE v is
  131.                                    WHEN"000000"=>sec0<="11000000";
  132.                                    WHEN"000001"=>sec0<="11111001";
  133.                                    WHEN"000010"=>sec0<="10100100";
  134.                                    WHEN"000011"=>sec0<="10110000";
  135.                                    WHEN"000100"=>sec0<="10011001";
  136.                                    WHEN"000101"=>sec0<="10010010";
  137.                                    WHEN"000110"=>sec0<="10000010";
  138.                                    WHEN"000111"=>sec0<="11111000";
  139.                                    WHEN"001000"=>sec0<="10000000";
  140.                                    WHEN"001001"=>sec0<="10010000";
  141.                                    WHEN OTHERS=>NULL;
  142.                                   END  CASE;
  143.                                 ELSE IF adj_bit = 1 THEN sec1<="11111111";sec0<="11111111";END IF;
  144.                         END IF;
  145.                 END IF;
  146.                         IF a5s=2  OR  dis_MonAndYear='1'THEN
  147.                                 sec0<="11111111";sec1<="11111111";
  148.                                 IF vmon<10
  149.                                 THEN sec1<="11000000";v1:=vmon;END IF;
  150.                                 IF vmon<20 AND vmon>9
  151.                                 THEN sec1<="11111001";v1:=vmon-10; END IF;
  152.                                 IF vmon<30 AND vmon>19
  153.                                 THEN sec1<="10100100";v1:=vmon-20;END IF;
  154.                                 IF vmon<32 AND vmon>29
  155.                                 THEN sec1<="10100100";v1:=vmon-30;END IF;
  156.                                 CASE v1 is
  157.                                    WHEN"000000"=>sec0<="11000000";
  158.                                    WHEN"000001"=>sec0<="11111001";
  159.                                    WHEN"000010"=>sec0<="10100100";
  160.                                    WHEN"000011"=>sec0<="10110000";
  161.                                    WHEN"000100"=>sec0<="10011001";
  162.                                    WHEN"000101"=>sec0<="10010010";
  163.                                    WHEN"000110"=>sec0<="10000010";
  164.                                    WHEN"000111"=>sec0<="11111000";
  165.                                    WHEN"001000"=>sec0<="10000000";
  166.                                    WHEN"001001"=>sec0<="10010000";
  167.                                    WHEN OTHERS=>NULL;
  168.                                   END  CASE;
  169.                                 ELSE IF adj_bit = 5 THEN sec0<="11111111";sec1<="11111111";END IF;
  170.                         END IF;
  171.                 END PROCESS;
  172. MIN: PROCESS(clk_60s_m,v60m1)
  173.                         BEGIN                       
  174.                         IF clk_60s_m' EVENT AND clk_60s_m='1'THEN
  175.                                 IF stop='0'OR v60m1="000001" THEN
  176.                                         min_rst<='1';
  177.                                         IF v60m=59 THEN v60m<="000000";clk_60m_h<='1';--59
  178.                                                 ELSE v60m<=v60m+1;clk_60m_h<='0';
  179.                                         END IF;
  180.                                 END IF;
  181.                                 IF v60m1="000000" THEN min_rst<='0';END IF;       
  182.                         END IF;
  183.                         IF stop='1' THEN clk_60m_h<=clk;END IF;
  184.                 END PROCESS;
  185. DIS_MIN:PROCESS(v60m,vyear)
  186.                 VARIABLE v,v1:STD_LOGIC_VECTOR(5 DOWNTO 0);
  187.                 BEGIN
  188.                 IF dis_MonAndYear='0'  THEN
  189.                         IF a2s=2  OR adj_bit=0 OR adj_bit=1 OR adj_bit=3 OR adj_bit=4 THEN
  190.                                 if v60m<10
  191.                                 then min1<="11000000";v:=v60m;END IF;
  192.                                 IF v60m>9 AND v60m<20
  193.                                 then min1<="11111001";v:=v60m-10;END IF;
  194.                                 IF v60m>19 AND v60m<30
  195.                                 then min1<="10100100";v:=v60m-20;END IF;
  196.                                 IF v60m>29 AND v60m<40
  197.                                 then min1<="10110000";v:=v60m-30;END IF;
  198.                                 IF v60m>39 AND v60m<50
  199.                                 then min1<="10011001";v:=v60m-40;END IF;
  200.                                 IF v60m>49 AND v60m<60
  201.                                 then min1<="10010010";v:=v60m-50;END IF;
  202.                                   CASE v is
  203.                                    WHEN"000000"=>min0<="11000000";
  204.                                    WHEN"000001"=>min0<="11111001";
  205.                                    WHEN"000010"=>min0<="10100100";
  206.                                    WHEN"000011"=>min0<="10110000";
  207.                                    WHEN"000100"=>min0<="10011001";
  208.                                    WHEN"000101"=>min0<="10010010";
  209.                                    WHEN"000110"=>min0<="10000010";
  210.                                    WHEN"000111"=>min0<="11111000";
  211.                                    WHEN"001000"=>min0<="10000000";
  212.                                    WHEN"001001"=>min0<="10010000";
  213.                                    WHEN OTHERS=>NULL;
  214.                                   END  CASE;
  215.                                 ELSE IF adj_bit = 2 THEN min1<="11111111";min0<="11111111";END IF;
  216.                         END IF;
  217.                 END IF;
  218.                 IF a6s=2  OR  dis_MonAndYear='1'THEN
  219.                                 if vyear<10
  220.                                 then min1<="11000000";v1:=vyear;END IF;
  221.                                 IF vyear>9 AND vyear<20
  222.                                 then min1<="11111001";v1:=vyear-10;END IF;
  223.                                 IF vyear>19 AND vyear<30
  224.                                 then min1<="10100100";v1:=vyear-20;END IF;
  225.                                 IF vyear>29 AND vyear<40
  226.                                 then min1<="10110000";v1:=vyear-30;END IF;
  227.                                 IF vyear>39 AND vyear<50
  228.                                 then min1<="10011001";v1:=vyear-40;END IF;
  229.                                 CASE v1 is
  230.                                    WHEN"000000"=>min0<="11000000";
  231.                                    WHEN"000001"=>min0<="11111001";
  232.                                    WHEN"000010"=>min0<="10100100";
  233.                                    WHEN"000011"=>min0<="10110000";
  234.                                    WHEN"000100"=>min0<="10011001";
  235.                                    WHEN"000101"=>min0<="10010010";
  236.                                    WHEN"000110"=>min0<="10000010";
  237.                                    WHEN"000111"=>min0<="11111000";
  238.                                    WHEN"001000"=>min0<="10000000";
  239.                                    WHEN"001001"=>min0<="10010000";
  240.                                    WHEN OTHERS=>NULL;
  241.                                   END  CASE;
  242.                                 ELSE IF adj_bit = 6 THEN min0<="11111111";min1<="11111111";END IF;
  243.                         END IF;
  244.                 END PROCESS;
  245. HOUR:   PROCESS(clk_60m_h)
  246.                 BEGIN
  247.                 IF clk_60m_h'EVENT AND clk_60m_h='1'THEN
  248.                         IF stop='0'OR v24h1="000001" THEN
  249.                                 hour_rst<='1';
  250.                                 IF v24h=23 THEN v24h<="000000";clk_24h_d<='1';--23
  251.                                         ELSE v24h<=v24h+1;clk_24h_d<='0';
  252.                                 END IF;
  253.                         END IF;
  254.                         IF v24h1="000000" THEN hour_rst<='0';END IF;
  255.                 END IF;
  256.                 IF stop='1' THEN clk_24h_d<=clk;END IF;
  257.                 END PROCESS;
  258. DIS_HOUR:
  259.                 PROCESS(v24h)
  260.                         VARIABLE v:STD_LOGIC_VECTOR(5 DOWNTO 0);BEGIN
  261.                         IF dis_MonAndYear='0'  THEN
  262.                                 IF a3s=2 OR adj_bit=0 OR adj_bit=2 OR adj_bit=1 OR adj_bit=4 THEN
  263.                                         IF v24h<10
  264.                                         THEN hour1<="11000000";v:=v24h;END IF;
  265.                                         IF v24h<20 AND v24h>9
  266.                                         THEN hour1<="11111001";v:=v24h-10; END IF;
  267.                                         IF v24h<24 AND v24h>19
  268.                                         THEN hour1<="10100100";v:=v24h-20;END IF;
  269.                                         CASE v is
  270.                                            WHEN"000000"=>hour0<="11000000";
  271.                                            WHEN"000001"=>hour0<="11111001";
  272.                                            WHEN"000010"=>hour0<="10100100";
  273.                                            WHEN"000011"=>hour0<="10110000";
  274.                                            WHEN"000100"=>hour0<="10011001";
  275.                                            WHEN"000101"=>hour0<="10010010";
  276.                                            WHEN"000110"=>hour0<="10000010";
  277.                                            WHEN"000111"=>hour0<="11111000";
  278.                                            WHEN"001000"=>hour0<="10000000";
  279.                                            WHEN"001001"=>hour0<="10010000";
  280.                                            WHEN OTHERS=>NULL;
  281.                                           END  CASE;
  282.                                         ELSE IF adj_bit = 3 THEN hour1<="11111111";hour0<="11111111";END IF;
  283.                                 END IF;
  284.                         END IF;
  285.                         IF dis_MonAndYear='1' THEN hour1<="11111111";hour0<="11111111";END IF;
  286.                  END PROCESS;
  287. DAY:   PROCESS(clk_24h_d,vmon)
  288.                 BEGIN                       
  289.                 IF clk_24h_d'EVENT AND clk_24h_d='1'        THEN
  290.                 IF vday1="000001" THEN day_rst<='0';END IF;
  291.                         IF stop='0'OR vday1="000011" THEN
  292.                                 day_rst<='1';                                                     --t0
  293.                                 IF vmon=1 OR vmon=3 OR vmon=5 OR vmon=7 OR vmon=8 OR vmon=10 OR vmon=12 THEN
  294.                                         IF vday=31 THEN vday<="000001";clk_day<='1';
  295.                                                 ELSE vday<=vday+1;clk_day<='0';
  296.                                         END IF;       
  297.                                 END IF;
  298.                                 IF vmon=4 OR vmon=6 OR vmon=9 OR vmon=11 THEN
  299.                                         IF vday=30 THEN vday<="000001";clk_day<='1';
  300.                                                 ELSE vday<=vday+1;clk_day<='0';
  301.                                         END IF;
  302.                                 END IF;
  303.                                 IF vmon=2 THEN
  304.                                         IF ((vyear AND "000011")="000000")THEN
  305.                                                 IF vday=28 THEN vday<="000001";clk_day<='1';
  306.                                                         ELSE vday<=vday+1;clk_day<='0';
  307.                                                 END IF;
  308.                                         else
  309.                                                 IF vday=29 THEN vday<="000001";clk_day<='1';
  310.                                                         ELSE vday<=vday+1;clk_day<='0';
  311.                                                 END IF;
  312.                                         END IF;
  313.                                 END IF;                       
  314.                         END IF;                                               
  315.                 END IF;
  316.                 IF stop='1' THEN clk_day<=clk;END IF;
  317.                 END PROCESS;
  318. DIS_DAY:
  319.                 PROCESS(vday)
  320.                         VARIABLE v:STD_LOGIC_VECTOR(5 DOWNTO 0);BEGIN
  321.                         IF dis_MonAndYear='0' THEN
  322.                                 IF a4s=2  OR adj_bit=0 OR adj_bit=2 OR adj_bit=3 OR adj_bit=1 THEN
  323.                                 IF vday<10
  324.                                 THEN day1<="11000000";v:=vday;END IF;
  325.                                 IF vday<20 AND vday>9
  326.                                 THEN day1<="11111001";v:=vday-10; END IF;
  327.                                 IF vday<30 AND vday>19
  328.                                 THEN day1<="10100100";v:=vday-20;END IF;
  329.                                 IF vday<32 AND vday>29
  330.                                 THEN day1<="10110000";v:=vday-30;END IF;
  331.                                 CASE v is
  332.                                    WHEN"000000"=>day0<="11000000";
  333.                                    WHEN"000001"=>day0<="11111001";
  334.                                    WHEN"000010"=>day0<="10100100";
  335.                                    WHEN"000011"=>day0<="10110000";
  336.                                    WHEN"000100"=>day0<="10011001";
  337.                                    WHEN"000101"=>day0<="10010010";
  338.                                    WHEN"000110"=>day0<="10000010";
  339.                                    WHEN"000111"=>day0<="11111000";
  340.                                    WHEN"001000"=>day0<="10000000";
  341.                                    WHEN"001001"=>day0<="10010000";
  342.                                    WHEN OTHERS=>NULL;
  343.                                   END  CASE;
  344.                                 ELSE IF adj_bit = 4 THEN day0<="11111111";day1<="11111111";END IF;
  345.                                 END IF;
  346.                         END IF;
  347.                         IF dis_MonAndYear='1'THEN day0<="11111111";day1<="11111111";END IF;
  348.                  END PROCESS;
  349. MON:   PROCESS(clk_day)
  350.                 BEGIN
  351.                 IF clk_day'EVENT AND clk_day='1'THEN       
  352.                         IF stop='0'OR vmon1="000010" THEN
  353.                                 mon_rst<='1';
  354.                                 IF vmon=12 THEN vmon<="000001";clk_mon<='1';
  355.                                         ELSE vmon<=vmon+1;clk_mon<='0';
  356.                                         END IF;
  357.                         END IF;
  358.                         IF vmon1="000001" THEN mon_rst<='0';END IF;
  359.                 END IF;                        --======test2
  360.                 IF stop='1' THEN clk_mon<=clk;END IF;
  361.                 END PROCESS;
  362. YEAR:   PROCESS(clk_mon)
  363.                         BEGIN
  364.                         IF clk_mon'EVENT AND clk_mon='1'THEN
  365.                                 IF stop='0'OR vyear1="000010" THEN
  366.                                 year_rst<='1';
  367.                                 IF vyear=50 THEN vyear<="000001";--clk_year<='1';
  368.                                         ELSE vyear<=vyear+1;--clk_year<='0';
  369.                                         END IF;
  370.                                 END IF;
  371.                         IF vyear1="000001" THEN year_rst<='0';END IF;
  372.                         END IF;
  373.                 END PROCESS;--黄冈师范

  374. END ARCHITECTURE bhv;
用的是学校的DE-2,显示年月日,时分秒,两个按键,一个是切换位 一个是调时间 按6下就可以回到正常的时间显示,没到一个整点就报时:lol刚刚写出来
 楼主| 胡斯哲 发表于 2014-12-6 21:33 | 显示全部楼层
由于7.2版本的编译器,不会注释
FAQ 发表于 2014-12-24 21:11 | 显示全部楼层
Verilog?
 楼主| 胡斯哲 发表于 2014-12-24 21:37 | 显示全部楼层
FAQ 发表于 2014-12-24 21:11
Verilog?

vhdl
x424211230 发表于 2014-12-26 22:24 | 显示全部楼层
弈涯 发表于 2015-1-2 10:14 | 显示全部楼层
 楼主| 胡斯哲 发表于 2015-1-4 12:09 | 显示全部楼层
弈涯 发表于 2015-1-2 10:14

:L
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:读书喝茶,不争朝夕

141

主题

1431

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部