基于VHDL语言的FPGA简易数字钟设计

发布者:Yudie最新更新时间:2012-09-18 来源: 51hei关键字:VHDL  FPGA  简易数字钟 手机看文章 扫描二维码
随时随地手机看文章

作为一个菜鸟我很愿意分享下我做的一些小东西,记得一年前好像少几天吧,看记录是2009年5月19日

我用51单片机做数字钟的情景,那个时候用汇编,焦头烂额,做了三天,还请教了老师。

哎,现在都已经用C了,而且重心已经放在了AVR上,

不过想想,这一年我还是学了很多东西,至少不是虚度了这一年。

FPGA是挺好玩的,不过没有时间搞,忙着比赛。

不过凭借着学期前两个礼拜实习天天晚上去图书馆自学VHDL的基础,加上单片机的基础,一直活到现在。呵呵呵

臭屁一下,今天老师说我可以做他的助教,确实把我兴奋了一把,

其实我一直很心虚,因为都没有时间搞,哪天出个难题答不上来就糗了。

 

今天中午和下午花了6个小时左右的时间做了一个数字钟,

VHDL语言(Very  high  speed  integrated  circuit  Hardware Description Language)即超高速集成电路硬件描述语言。

顾名思义既然是硬件描述,当然是描述硬件,这个语言相当于在FPGA或CPLD芯片里熔出一个数字电路。

 

硬件FPGA 芯片是ALTERA公司Cyclone II 系列的EP2C35F672C6

使用的是ALTERA公司的开发板,型号DE2来张全图,软件为Quartus II 8.0,、ALTERA公司为自己产品打造的开发软件。

点击浏览下一页

据说是5000块钱,因为是学校教学用,批量买,2500块钱(不过我看下,就芯片贵,我看这个板子人家至少赚了1000多),我原来以为老师不会借,不过他似乎不介意,倒是他主动借给我的,额。。。

 

不费话了,贴程序吧

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity fpq is
port(clk : in std_logic;
  k : in std_logic;
  k1 : in std_logic;
  k2 : in std_logic;
  ge : out std_logic_vector(0 to 6);
  shi : out std_logic_vector(0 to 6);
  feng : out std_logic_vector(0 to 6);
  fens : out std_logic_vector(0 to 6);
  shig : out std_logic_vector(0 to 6);
  shis : out std_logic_vector(0 to 6));
end fpq;

architecture first of fpq is
 signal clock : integer range 0 to 24999999;
 signal ge_t : integer range 0 to 9;
 signal shi_t : integer range 0 to 5;
 signal feng_t : integer range 0 to 9;
 signal fens_t : integer range 0 to 5;
 signal shig_t : integer range 0 to 9;
 signal shis_t : integer range 0 to 2;
 signal temp : integer range 0 to 9;
 
begin
t0: process(clk)
 begin
  if (clk'event and clk='1') then
   clock <= clock + 1;    
   if clock = 24999999 then
---------------------------------------------
   if k='0' then
---------------------------------------------
   
       if ge_t = 9 then
     ge_t <= 0;
     if shi_t = 5 and ge_t = 9 then
      shi_t <= 0;
      if feng_t = 9 and shi_t = 5 then
       feng_t <= 0;
       if fens_t = 5 and feng_t = 9 then
        fens_t <= 0;
        if shis_t = 2 and shig_t = 3 and fens_t = 5 then
         shig_t <= 0;
         if shis_t = 2 and shig_t = 3 then
          shis_t <= 0;
         else
          shis_t <= shis_t + 1;
         end if;
        else 
         if shig_t = 9 and fens_t = 5 then
          shig_t <= 0;
         else
          shig_t <= shig_t +1;
         end if;
        end if;
       else
        fens_t <= fens_t + 1;
       end if;
      else 
       feng_t <= feng_t + 1;
      end if;
     else
      shi_t <= shi_t + 1;
     end if;
    else
     ge_t <= ge_t + 1;
    end if;   
  else
   if k1='0' then
    if feng_t = 9 then
     feng_t <= 0;
     if fens_t = 5 then
      fens_t <= 0;
     else
      fens_t <= fens_t + 1;
      end if; 
    else
     feng_t <= feng_t + 1;
    end if;        
   end if;
   if k2='0' then
    if shig_t = 3 and shis_t = 2 then
     shig_t <= 0;
     shis_t <= 0;
    else     
     if shig_t = 9 then
      shig_t <= 0;
      if shis_t = 2 then
       shis_t <= 0;
      else
       shis_t <= shis_t + 1;
      end if;
     else
      shig_t <= shig_t + 1;
     end if;
    end if;        
   end if;
  end if; 
------------------------------------------------   
  end if;
 end if; 
------------------------------------------------  
 end process t0;
 
c:  process(clk,ge_t,shi_t,feng_t,fens_t,shig_t,shis_t) 
 begin
  case ge_t is
  when 9 => ge <= "0000100";
  when 8 => ge <= "0000000";
  when 7 => ge <= "0001111";
  when 6 => ge <= "0100000";
  when 5 => ge <= "0100100";
  when 4 => ge <= "1001100";
  when 3 => ge <= "0000110";
  when 2 => ge <= "0010010";
  when 1 => ge <= "1001111";
  when 0 => ge <= "0000001";
  end case;
  
  case shi_t is
  when 5 => shi <= "0100100";
  when 4 => shi <= "1001100";
  when 3 => shi <= "0000110";
  when 2 => shi <= "0010010";
  when 1 => shi <= "1001111";
  when 0 => shi <= "0000001";
  end case;
  
  case feng_t is
  when 9 => feng <= "0000100";
  when 8 => feng <= "0000000";
  when 7 => feng <= "0001111";
  when 6 => feng <= "0100000";
  when 5 => feng <= "0100100";
  when 4 => feng <= "1001100";
  when 3 => feng <= "0000110";
  when 2 => feng <= "0010010";
  when 1 => feng <= "1001111";
  when 0 => feng <= "0000001";
  end case;
  
  case fens_t is
  when 5 => fens <= "0100100";
  when 4 => fens <= "1001100";
  when 3 => fens <= "0000110";
  when 2 => fens <= "0010010";
  when 1 => fens <= "1001111";
  when 0 => fens <= "0000001";
  end case;
  
  case shig_t is
  when 9 => shig <= "0000100";
  when 8 => shig <= "0000000";
  when 7 => shig <= "0001111";
  when 6 => shig <= "0100000";
  when 5 => shig <= "0100100";
  when 4 => shig <= "1001100";
  when 3 => shig <= "0000110";
  when 2 => shig <= "0010010";
  when 1 => shig <= "1001111";
  when 0 => shig <= "0000001";
  end case;
  
  case shis_t is
  when 2 => shis <= "0010010";
  when 1 => shis <= "1001111";
  when 0 => shis <= "0000001";
  end case;
 end process c;
end first;

和汇编有的一拼啊,呵呵,由于是新手,所以很多程序都带有单片机的想法,其实VHDL和C、FPGA和单片机是两种不同的语言、芯片,主要是要有并行思想和状态机的概念,很遗憾我现在好像都没有。

设置模式开关是sw01.、分钟设置按钮key01、key02 。

视频地址:http://v.youku.com/v_show/id_XMTcxMTMzODYw.html 不过很糊啊。。悲剧。

关键字:VHDL  FPGA  简易数字钟 引用地址:基于VHDL语言的FPGA简易数字钟设计

上一篇:略谈两个月单片机设计与开发的感慨
下一篇:关于1602液晶显示器的一些经验

推荐阅读最新更新时间:2024-03-16 13:08

基于FPGA的生物芯片扫描仪的位置检测
引言 --- 生物芯片是20世纪末随 人类基因组计划 的研究和发展而产生的一项高新技术,是人们高效地大规模获取生物信息的有效手段。目前大部分生物芯片采用荧光染料标记待测样品分子。生物芯片扫描仪用激光激发荧光染料,通过对激发点的成像,检测一个点;结合生物芯片X-Y二维精密扫描台上移动,实现对整片的扫描。 X-Y二维扫描台的位置检测精度直接影响着扫描分辨率 生物芯片扫描仪性能的关键参数。基于传统的数字电路的生物芯片扫描仪中X-Y二维扫描台的位置检测电路存在计数误差和误清零问题,本文以基于FPGA设计的位置检测电路来解决。以FPGA芯片代替传统的数字电路,不仅可提高系统的集成度和可靠性,而且FPGA最高工作频率已超过200MHz,通
[测试测量]
基于<font color='red'>FPGA</font>的生物芯片扫描仪的位置检测
赛灵思与微软汽车业务部推出的智能车载信息系统
        根据美国交通部的一项研究,全世界人们每周在汽车上度过的交通时间超过 5 亿小时。 既然花在汽车上的时间如此之多,人们希望能够利用这些时间来享受娱乐,同心爱的人说说话,甚至完成一些通常需要在工作场所才能完成的任务。           在汽车中保持联系是人们最想实现的,这只要看一看手机的使用就可以知道。 另外,路上遭遇严重的交通堵塞,走错了路,或者遇到像汽油用完了之类的常事,都可能影响您准时到达目的地。          如何才能让驾驶者在安全驾驶的同时保持联系,并按时到达目的地呢? 巧妙的方法是通过语音命令结合互联网连接进行通信和控制。 Microsoft Telematics Platform(微软车载信息处理平台
[嵌入式]
基于FPGA的X射线安检设备控制器设计
   摘 要 :依据X射线安检设备各部分工作原理及控制要求,本文采用FPGA和以太网技术设计了基于FPGA的X射线安检设备控制器。本文以Xilinx公司的ISE为开发平台,在ModelSim中仿真了控制器各个模块的功能,得到了符合控制器要求的波形。    引言   X射线安检设备广泛应用于机场、车站、海关、港口、仓库等地。近年来由于犯罪分子大量使用先进的伪装技术,使传统的安检设备显得力不从心。针对上述情况,本文设计了基于FPGA的X射线安检设备控制器,该控制器通过加载Thin TCP/IP接入以太网,使得多台PC共同对可疑物品的图像数据进行分析,进而提高鉴别精度。    工作原理及控制要求   X射线安检设备主要由X射
[工业控制]
FPGA:高性能低成本双管齐下拓展应用
FPGA(现场可编程门阵列)正以其性能和成本的平衡性、设计的灵活性在众多应用市场成就“自有”天地。随着市场需求的不断变化,FPGA主导厂商将“随需而变”的策略发挥到了极致,为FPGA在市场中的表现添上了浓墨重彩。日前Altera发布了其高性能65纳米FPGA产品Stratix III系列,Xilinx宣布推出第二个系列的65纳米VIRTEX-5 LXT FPGA,并在之后不久又推出低成本的I/O优化FPGA Spartan—3A平台,进一步向大规模应用市场渗透。折射出FPGA以高性能、低成本为“利器”,正加快向应用市场渗透。    高性能FPGA将成系统核心芯片 两大巨头对65纳米FPGA的“热衷”无疑是看好市场对高性能FPGA
[焦点新闻]
基于DSP Builder的DDS设计及其FPGA实现
  直接数字合成器,是采用数字技术的一种新型频率合成技术,他通过控制频率、相位增量的步长,产生各种不同频率的信号。他具有一系列的优点;较高的频率分辨率;可以实现快速的频率切换;在频率改变时能够保持相位的连续;很容易实现频率、相位和幅度的数控调制等。目前可采用专用芯片或可编程逻辑芯片实现DDS ,专用的DDS芯片产生的信号波形、功能和控制方式固定,常不能满足具体需要 。可编程逻辑器件具有器件规模大、工作速度快及可编程的硬件特点,并且开发周期短,易于升级,因为非常适合用于实现DDS。   1 DDS的工作原理   DDS的结构原理图如图1所示,DDS以数控振荡器的方式,产生频率、相位和幅度可控的正弦波 。电路包括了相位
[嵌入式]
光电靶的基本原理
1 基于FPGA的嵌入式系统开发流程  设计一个嵌入式系统,主要包括硬件平台搭建和应用软件编写。基于FPGA技术,硬件平台搭建和软件编写都可在相应的软件平台上完成。EDK(Embedded Development Kit)是Xilinx公司开发嵌入式系统的套件工具。EDK套件工具主要包括硬件平台产生器、软件平台产生器、仿真模型生成器和软件编译调试等工具,利用其集成开发环境XPS(platform studio)可以方便地完成嵌入式系统的开发设计 ,设计流程如图1所示。 2 硬件平台搭建过程  分析系统需求中,铁轨检测主要是进行图像的分析处理,包括三个主要部分:图像输入、图像处理和结果显示。本项目使用依元素公司生产的Xilin
[嵌入式]
光电靶的基本原理
基于ARM的可定制MCU可替代FPGA
  如今的产品生命周期可能短至六个月,因此在这种情况下要想取得定制ASIC的低成本、低功耗和高性能优势几乎是不可能的。定制ASIC的设计周期通常要一年左右,这通常要比终端产品的生命周期还要长。另外,标准单元ASIC还具有NRE费用(非重复工程成本),对于基本的0.13微米设计,该成本约为30万美元,而对于具有复杂IP内容的90nm设计将超过100万美元。因而当每年的批量小于10万片时,从经济角度看就不具有可行性。   为此人们研发出了平台化或结构化ASIC,它们具有预设计的IP块和可编程的ASIC门,可显著降低成本并缩短设计周期。这种方案将设计周期从一年甚至更长的时间缩短到几个月,还将NRE成本降低到大约15万美元,不过与门阵列
[单片机]
直扩系统PN码捕获和跟踪的FPGA实现
摘要:在数字匹配滤波器和超前滞后鉴相环路的理论基础上,采用VHDL编程,在FPGA芯片上实现PN码捕获和跟踪的电路。详细讨论了各电路模块的设计实现方法。完成电路的仿真验证,给出了仿真波形。结果表明电路工作正常可靠,系统扩展方便灵活,满足设计要求。 关键词:FPGA;PN码捕获;PN码跟踪;数字匹配滤波器;超前滞后环路 在接收机端,为了接收到正确的信号,必须使得本地PN码与接收信号PN码严格同步。PN码同步的过程分为两个阶段:捕获和跟踪。典型的捕获方法是匹配滤波器法,而跟踪则常用超前滞后鉴相跟踪环路。随着可编程逻辑器件FPGA的大规模使用,数字电路系统的设计变得更加灵活和方便,并且易于系统维护和更新。本设计采用VHDL编程,用
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved