原创 基于VHDL的电子时钟设计(1)

2009-12-1 23:26 3620 7 8 分类: FPGA/CPLD

基于VHDL的电子时钟设计


众所周知在校学生学习单片机或者数电和FPGA时常常要做时钟。其实做时钟是很重要的,很多大学教授或者讲师都说做时钟是上述三门课的入门。记得当初一位单片机的牛人(我所认识的西门子公司的一位工程师)以一种坚硬的口吻对我说:你想学单片机,如果你掌握了时钟的设计就证明你入门了。他这句话深深触动了我。后来我索性就把做电子时钟作为自己一个学期的专攻方向。因此我在学习当中认真的完成了6中方式的电子时钟设计。我相信在校学生如果能完整的做出几种不同方式,不同硬件或平台的电子时钟那也应该说是学习入门了。


为了方便网友们学习电子钟的设计我因此把自己做的几种不同方式的时钟发表在网上以供大家参考。我会陆续发布几种时钟设计方案,大家耐心等待吧。


下面是我在校期间利用VHDL语言完成电子时钟的一部分。


为了防止出现完整性的拷贝,所以我只提供了大部分源程序代码而并非完整实验设计方案。所以就没有把自己的完整设计实验报告发表出来。希望网友们多包涵。


为了方便大家阅读所以每篇博文只是发表一小部分。大家如果有心的话把几篇博文看玩再连接起来就能做出完整的时钟了。


做时钟肯定需要六十进制计数。下面是VHDL写的60进制计数器<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


其实本程序代码也是我自己在朋友帮助下完成的,那是在我刚开始学VHDL的时候。




LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY COUNTC IS
   PORT(CLK,CLK0,R,BCD1WR,BCD10WR:IN STD_LOGIC;
        A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
        Y:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
        SEL:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
   END COUNTC;
ARCHITECTURE ONE OF COUNTC IS
SIGNAL BCD1N:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL BCD10N:STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
P1:PROCESS(CLK,BCD1WR)
   BEGIN
    IF R='1' THEN
     BCD1N<="0000";
    ELSIF BCD1WR='1' THEN
     BCD1N<=A;
    ELSIF CLK'EVENT AND CLK='1' THEN
       IF BCD1N="1001" THEN
          BCD1N<="0000";
       ELSE BCD1N<=BCD1N+1;
       END IF;
END IF;
END PROCESS P1;
P2:PROCESS(CLK,BCD10WR)
BEGIN
    IF R='1' THEN
     BCD10N<="000";
ELSIF BCD10WR='1' THEN
     BCD10N<=A(2 DOWNTO 0);
ELSIF CLK'EVENT AND CLK = '1' THEN
     IF(BCD1N = "1001") THEN
       IF BCD10N="101" THEN
          BCD10N<="000";
       ELSE BCD10N<=BCD10N+1;
       END IF;
     END IF;
   END IF;
END PROCESS P2;
P3:PROCESS(CLK0,BCD1N,BCD10N)
BEGIN
IF CLK0 = '1' THEN
SEL <= "001";
CASE BCD1N IS
WHEN "0000"=>Y<="0111111";
WHEN "0001"=>Y<="0000110";
WHEN "0010"=>Y<="1011011";
WHEN "0011"=>Y<="1001111";
WHEN "0100"=>Y<="1100110";
WHEN "0101"=>Y<="1101101";
WHEN "0110"=>Y<="1111101";
WHEN "0111"=>Y<="0000111";
WHEN "1000"=>Y<="1111111";
WHEN "1001"=>Y<="1101111";
WHEN "1010"=>Y<="1110111";
WHEN "1011"=>Y<="1111100";
WHEN "1100"=>Y<="0111001";
WHEN "1101"=>Y<="1011110";
WHEN "1110"=>Y<="1111001";
WHEN "1111"=>Y<="1110001";
WHEN OTHERS => NULL;
END CASE;
ELSE SEL <="010";
CASE BCD10N IS
WHEN "000"=>Y<="0111111";
WHEN "001"=>Y<="0000110";
WHEN "010"=>Y<="1011011";
WHEN "011"=>Y<="1001111";
WHEN "100"=>Y<="1100110";
WHEN "101"=>Y<="1101101";
WHEN "110"=>Y<="1111101";
WHEN "111"=>Y<="0000111";
WHEN OTHERS => NULL;
END CASE;
END IF;
END PROCESS P3;
END ONE;

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户365683 2011-6-27 09:27

不错
相关推荐阅读
用户191244 2010-05-30 13:36
单片机汇编语言的延时,中断模块设计
单片机的汇编语言设计很重要,其中学习最重要的部分就是延时和中断的设计。这里就把当初自己学习单片机的一个小学习片段,公布出来。若读者有什么建议或者需求可留言与我联系。下面的只是我最初学习单片机的一些知识...
用户191244 2010-04-22 13:08
改变硬盘序列号码的方法
 最近收集的一些以前用过的protel学习资料希望该资料能够对网友们有所用处。资料很大,所以采用分几次上传。下面是改变硬盘序列号的方法。 改变硬盘序列号码的方法<?xml:namespace p...
用户191244 2010-04-15 22:07
c语言的分支结构程序设计
     无论是单片机c语言的学习还是其他计算机语言的学习,分支结构的程序设计都很重要。c语言的分支结构程序设计很好学,很重要。下面是本人学习分支程序设计过程当中感觉较好的资料。内容有些多,但是还算经...
用户191244 2010-04-08 21:59
FPGA的学习资料(MAXPLUS软件的使用及VHDL)
很久没发表日记。再次表示歉意。下面是本人,年前学习FPGA的时候接触过的资料,虽不能说是很好的学习资料但是鄙人愚见认为学习MAXPLUS软件的使用入门还是不错的。大家如看看吧,觉得还行的话就留言。我还...
用户191244 2010-03-28 12:15
流水灯程序集合
由于本人的电脑坏了,硬盘彻底报废,所以很伤心了一阵。在这里也提醒大家,记得硬盘备份或者把一些重要的资料刻录在光盘中保存,这样就不会出现我这种很无助的状况了。几年下来的,资料全没了,连那些照片都没了,现...
用户191244 2010-01-12 19:17
实验室经验谈----什么样的示波器适合你?
实验室,最常用的示波器,大家很熟悉了,但有谁知道示波器也有使用范围和使用方向的问题,比如数电,模电实验用的示波器常是低频的,在通信,高频实验室用的示波器才是频率很大的示波器,下面讲示波器的知识吧。什么...
EE直播间
更多
我要评论
1
7
关闭 站长推荐上一条 /3 下一条