桂林电子科技大学职业技术学院课题:FPGA实训专业:电子信息工程技术学号:姓名:目录关键词: (1)引言: (1)设计要求: (1)EDA技术介绍: (1)Verilog HDL简介: (1)方案实现: (2)工作原理: (2)总结: (3)结语: (3)程序设计: (4)数字钟关键词:EDA、Verilog HDL、数字钟引言:硬件描述语言HDL(Hardware Des-cription Language)是一种用形式化方法来描述数字电路和系统的语言。
目前,电子系统向集成化、大规模和高速等方向发展,以硬件描述语言和逻辑综合为基础的自顶向下的电路设计发放在业界得到迅猛发展,HDL在硬件设计领域的地位将与C和C++在软件设计领域的地位一样,在大规模数字系统的设计中它将逐步取代传统的逻辑状态表和逻辑电路图等硬件描述方法,而成为主要的硬件描述工具。
Verilog HDL是工业和学术界的硬件设计者所使用的两种主要的HDL之一,另外一种是VHDL。
现在它们都已经成为IEEE标准。
两者各有特点,但Verilog HDL拥有更悠久的历史、更广泛的设计群体,资源也远比VHDL丰富,且非常容易学习掌握。
此次以Verilog HDL语言为手段,设计了多功能数字钟,其代码具有良好的可读性和易理解性。
设计要求:数字钟模块、动态显示模块、调时模块、到点报时模块等;必须有键防抖动功能。
可自行设计8位共阴数码管显示;亦可用FPGA实验平台EDK-3SAISE上的4位数管,但必须有秒指导灯。
EDA技术介绍:20世纪90年代,国际上电子和计算机技术较先进的国家,一直在积极探索新的电子电路设计方法,并在设计方法、工具等方面进行了彻底的变革,取得了巨大成功。
在电子技术设计领域,可编程逻辑器件(如CPLD、FPGA)的应用,已得到广泛的普及,这些器件为数字系统的设计带来了极大的灵活性。
这些器件可以通过软件编程而对其硬件结构和工作方式进行重构,从而使得硬件的设计可以如同软件设计那样方便快捷。
这一切极大地改变了传统的数字系统设计方法、设计过程和设计观念,促进了EDA技术的迅速发展。
EDA是电子设计自动化(Electronic Design Automation)的缩写,在20世纪90年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。
EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。
EDA技术的出现,极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。
这些器件可以通过软件编程而对其硬件结构和工作方式进行重构,从而使得硬件的设计可以如同软件设计那样方便快捷。
这一切极大地改变了传统的数字系统设计方法、设计过程和设计观念,促进了EDA技术的迅速发展。
Verilog HDL简介:硬件描述语言Verilog是Philip R.Moorby于1983年在英格兰阿克顿市的Gateway Design Automation硬件描述语言公司设计出来的,用于从开关级到算法级的多个抽象设元,并提供了丰富的结构,这些结构不仅用于硬件的并发行为建模,而且用于硬件的时序特性和结构的建模。
也可以通过编程语言接口(PLI )对该语言进行拓展。
Verilog 语言从诞生起就与生产紧密结合在一起,具有结构清晰、文法简明、功能强大、高速模拟和多库支持等优点,并获得许多工具的支持,深受用户喜爱。
Verilog 实际上是IC 行业标准,特别是在1995年12月被IEEE 接纳为正式标准后,它成为一种很有竞争力的硬件描述语言。
Verilog 的基本设计单元是模块(block )。
一个模块是由两部分组成的,一部分描述接口,另一部分描述逻辑功能。
Verilog 结构位于在module 和endmodule 声明语句中间,每个Verilog 程序包括4个主要组成部分:端口定义、I/O 说明、内部信号声明和功能定义。
模块主要有三种方式产生逻辑:1) 用”assign”声明语句:assign = a = b & c ; 2) 用实例元件:and #2 ul (q ,a ,b );3) 用”always”块:既可用于描述组合逻辑,也可描述时序逻辑。
在Verilog 模块中,所有过程块,连续赋值语句,实例引用都是并行的。
他们的顺序不会影响实现的功能。
是同时执行的,即并发的。
在always 模块中,逻辑是按照指定的顺序执行的。
模块内部的语句是顺序的方案实现:此次数字钟设计的基本结构框图如下:1)时钟计数:完成时、分、秒的正确计时并且显示所计的数字;对秒、分进行60进制计数,即从0到59循环计数;对小时进行24进制计数,即从0到23循环计数,并且在数码管上显示数值。
2)时间设置:手动调节分钟、小时,可以对所设计的时钟任意调时间,这样使数字钟真正具有使用功能。
因为我们用的时钟信号均是1HZ 的,所以按键按下每来一个脉冲,即计数一次。
3)清零功能:reset 为复位键,低电平时实现清零功能,高电平时正常计数。
可以根据我们自己任意时间的复位。
4)蜂鸣器在整点时有报时信号产生,蜂鸣器报警。
工作原理:Clk:系统基准时钟输入脉冲为40MHz 。
将其20000000分频后可以得到1Hz 的数字钟工作频率及按键扫描频率。
再将其100000分频后作为七段数码管显示的扫描频率。
S1:调节小时自加信号,低电频有效。
每按下一次,小时自加1。
S2:调节分钟自加信号,低电频有效。
每按下一次,分钟自加1。
S3:调节小时自减信号,低电频有效。
每按下一次,小时自减1。
S4:调节分钟自减信号,低电频有效。
每按下一次,分钟自减1。
Spk:扬声器闹钟输出。
Sel:七段数码管扫描驱动。
扫描频率为系统的100000分频,由于人眼的视觉效果呈现在眼前的便是整体的数字显示。
Display:七段数码管显示输出。
总结:①设计小结通过本次课程设计对EDA这门学科有了深如的学习,对电路也有了深入的学习,在多功能数字钟的设计过程中,在软件设计中本系统的软件部分主要是利用Verilog HDL 语言来设计的,并用来实现多功能数字钟的所用功能。
在设计中有很多的困难主要是在程序验证的时候容易出现错误,但是这些困难我们都还是一一的解决了。
②设计收获通过本次课程设计,我们在对EDA这门技术上有了更深刻的认识,也从实践中去感受到了EDA技术给我们设计带来的改变与进步。
我们不仅基本掌握了ISE Foundation软件的使用,还对电子设计的思路有了更多的认识。
通过对EDA设计中的TOP-DOWN设计方式的运用,体会到了对于一个大型系统的设计方案选取应从顶向下的设计思路,这与传统的至底向上的设计方式有很大改进,且设计效率得到大大提高。
结语通过本次实训,我们实现了从单一的理论学习转变为实际解决问题,它使我们的理论知识得到了综合运用,培养了我们综合运用所学理论的能力和解决实际问题的能力。
本次实训的过程,通过写总结报告初步训练了大家的书面表达能力、组织逻辑能力,这些将对我们以后有很大帮助。
程序设计:`timescale 1ns / 1psmodule shizhong(clk,rst,s1,s2,s3,s4,display,seg_bit,spk,led_test);input clk;input rst,s1,s2,s3,s4;output reg spk;reg clk_1hz;//秒脉冲reg clk_1khz;//动态扫描脉冲output reg led_test;output reg[6:0]display;output reg[3:0]seg_bit;//位选通reg[30:0]clk_count1;reg[20:0]counter;reg[7:0]secl,sec;reg[7:0]minl,minh;reg[7:0]disp_temp;reg[3:0]state;initialbegindisplay<=7'bz;state<=0;counter<=0;clk_count1<=0;secl<=6;sec<=3;minl<=9;minh<=5;hourl<=3;hourh<=2;endalways@(posedge clk)beginif(clk_count1>=20_000_000)beginclk_count1<=0;clk_1hz<=~clk_1hz;endelse clk_count1<=clk_count1+1; //分频得到秒脉冲if(counter>=100000)begin counter<=0;clk_1khz<=~clk_1khz;endelse counter<=counter+1;//分频得到动态扫描脉冲case(disp_temp)0:display<=7'b100_0000;1:display<=7'b111_1001;2:display<=7'b010_0100;3:display<=7'b011_0000;4:display<=7'b001_1001;5:display<=7'b001_0010;6:display<=7'b000_0010;7:display<=7'b111_1000;8:display<=7'b000_0000;9:display<=7'b001_0000;default:display<=7'bz;endcaseendalways@(posedge clk_1hz )if(!rst)beginsecl=0;sec=0;minl=0;minh=0;hourl=0;hourh=0;endelsebeginif(!s1)begin if(hourl==9)begin hourl=0;hourh=hourh+1;endelse begin if(hourh==2&&hourl==3)beginhourh=0;hourl=0;endelse hourl=hourl+1;endelseif(!s2)begin if(minl==9)begin minl=0;if(minh==5)minh=0;else minh=minh+1;endelse minl=minl+1;endelseif(!s3)begin if(hourh==0&&hourl==0)begin hourh=2;hourl=3; endelse if(hourl==0)begin hourl=9; hourh=hourh-1;endelse hourl=hourl-1;endelseif(!s4)begin if(minh==0&&minl==0)begin minh=5;minl=9; endelse if(minl==0)begin minl=9; minh=minh-1;endelse minl=minl-1;endelse begin secl=secl+1;if(secl==10)begin secl=0;sec=sec+1;endif(sec==6)begin sec=0;minl=minl+1;endif(minl==10)begin minl=0;minh=minh+1;endif(minh==6)begin minh=0;hourl=hourl+1;endif(hourl==10)begin hourl=0;hourh=hourh+1;endif(hourh==2&&hourl==4)begin hourh=0;hourl=0;endendendalways@(posedge clk)beginif(minh==0&&minl==0&&secl%2==0)spk<=!spk;else spk<=0;endalways@(posedge clk_1khz)begincase(state)0:begin seg_bit<=4'b0111;disp_temp<=minl;state<=1;led_test=1;end1:begin seg_bit<=4'b1011;disp_temp<=minh;state<=2;led_test=1;end2:begin seg_bit<=4'b1101;disp_temp<=hourl;state<=3;led_test=~clk_1hz;end 3:begin seg_bit<=4'b1110;disp_temp<=hourh;state<=0;led_test=1;enddefault:begin display<=7'bz;state<=0;endendcaseend。