第一篇:基于FPGA的数字钟课程设计
计算机与信息工程系
《脉冲与数字电路》 课程设计报告
专业
通信工程
班级
B090507
学号
B09050722
姓名
张亚威
报告完成日期
2011/06/24
指导教师
秦玉洁
评语:
成绩:
批阅教师签名:
批阅时间:
1.任务和设计要求
设计具有时、分、秒计数显示,以24小时循环计时的时钟电路,带有清零和校准功能;
2.设计原理
采用硬件描述语言Verilog 进行编程,实现20MHZ晶振到1HZ的分频;采用verilog语言实现数字表功能实现的各个模块;通过各个模块的代码生成相应的模块原理图;再将各个模块生成的原理图进行叠加组成一个数字表系统;
3.系统设计
设计的数字表有6个输入,16个输出;
6个输入中,有一个是时钟信号,开发板上的28号引脚输入的50MHZ的时钟信号;一个清零端,当数字表正常显示时,按下清零端可以实现
数字钟整体电路图:
4.各个模块设计
基于EP1C6Q240C8的数字钟设计,有6个模块组成: Fdiv 分频模块
Control 模式选择模块 Tune 校正模块 Zoushi 时间正常运行模块 Saomiao 数码管动态扫描模块; Decoder BCD译码模块;
Fdiv 模块:
功能:实现20MHZ的时钟信号分成10KHZ的信号和1HZ的信号;
输入:clk 为20MHZ的时钟信号; 输出:f10000HZ 为10KH的时钟信号;
F1HZ 为1HZ的时钟信号; Fdiv 模块代码:
module fdiv(clk,f10000Hz,f1Hz);output f10000Hz,f1Hz;input clk;reg f10000Hz,f1Hz;integer CNT1=0,CNT2=0;always@(posedge clk)
begin
if(CNT1<1999)
begin
CNT1=CNT1+1;
f10000Hz<=1'b0;
end
else
begin
CNT1=0;
f10000Hz<=1'b1;
end
end
always@(posedge f10000Hz)
begin
if(CNT2<9999)
begin
CNT2=CNT2+1;
f1Hz<=1'b0;
end
else
begin
CNT2=0;
f1Hz<=1'b1;
end
end endmodule fdiv 模块波形仿真:
由于实际的分频波形仿真中,由于要将20MHZ的分成1HZ的,需要将信号缩小20 000 000倍,因此,此处采用将20HZ的先分成10HZ,然后再将10HZ的分成1HZ的时钟信号;在仿真中这样整,在实际演示中再改下代码,实现真正的20MHZ到1HZ的分频;它们只是一个倍数关系而已;
Control 模块:
功能:实现电子表的正常显示及时间校正模式的转换;
输入:key 模式修改键,每来一个高电平,mode加一次。如果mode 的值为2,则mode被赋值为 1;
Reset 复位键,如果reset 为 1,则mode 被赋值为0; 输出:mode 用于输出到下一级模块,进行模式判断; Control 模块源代码:
module control(mode,key,reset);input key,reset;output[1:0] mode;reg[1:0] mode;always@(posedge key)begin
if(reset)
begin
mode<=2'b00;
end
else
begin
mode<=mode+2'b01;
if(mode==2)
begin
mode<=2'b00;
end
end end endmodule Control 模块波形仿真
Tune 模块
功能:实现秒分时的校正;
输入:Mode 为模式选择,mode为0时是正常显示时间模式;mode 为1时,是秒、分、时加一模式。Mode为2时,是时分秒减一模式;
Ht 为时调节输入;
mt 为分调节输入;
St 为秒调节输入;
输出:Aa 为秒的个位;
Ba 为秒的十位;
Da 为分钟的个位;
Ea 为分钟的十位;
Ga 为小时的个位;
Ha 为小时的十位; Tune 调时模块源代码:
module tune(mode,ht,mt,st,aa,ba,da,ea,ga,ha);input[1:0] mode;input ht;input mt;input st;output[3:0] aa;output[2:0] ba;output[3:0] da;output[2:0] ea;output[3:0] ga;output[1:0] ha;reg[3:0] aa,da,ga;reg[2:0] ba,ea;reg[1:0] ha;
always@(posedge st)begin
if(mode==1)
begin
aa<=aa+1;
if(aa==9)
begin
ba<=ba+1;
aa<=0;
end
if(ba==5&&aa==9)
ba<=0;
end
else if(mode==2)
begin
aa<=aa-1;
if(aa==0)
begin
ba<=ba-1;
aa<=9;
end
if(ba==0&&aa==0)
ba<=5;
end end always@(posedge mt)begin
if(mode==1)
begin
da<=da+1;
if(da==9)
begin
ea<=ea+1;
da<=0;
end
if(ea==5&&da==9)
ea<=0;
end
else if(mode==2)
begin
da<=da-1;
if(da==0)
begin
ea<=ea-1;
da<=9;
end
if(ea==0&&da==0)
ea<=5;
end end always@(posedge ht)begin
if(mode==1)
begin
ga<=ga+1;
if(ga==9)
begin
ha<=ha+1;
ga<=0;
end
if(ha==2&&ga==3)
begin
ha<=0;
ga<=0;
end
end
else if(mode==2)
begin
ga<=ga-1;
if(ga==0)
begin
ha<=ha-1;
ga<=9;
end
if(ga==0&&ha==0)
begin
ga<=3;
ha<=2;
end
end end
endmodule Tune
调时模块仿真波形:
Mode 为0 时,ht,mt,st均不起作用;
Mode 为1时,小时加到23,ht再来一个上升沿,小时变为0;
Mode 为1时,秒、分加到59,st、mt再来一个上升沿,秒、分变成0;
Mode 为2时,小时减到0,ht再来一个上升沿,小时变为23;
Mode 为2时,秒、分减到0,st、mt再来一个上升沿,秒、分变成59;
Zou shi模块:
功能:实现时间的正常显示及校正显示;
正常显示,当秒加到59时,1HZ的脉冲信号CLK1再来一个上升沿,秒变为0,同时分加一;
当正常显示时,复位端来一个上升沿的脉冲,显示变成输入端输入的数据;
Mode 变成模式1时,显示变成输入端输入的数据;
Mode 变成模式2时,显示变成输入端输入的数据;
Sao miao模块:
功能:实现数码管的动态扫描;
输入:clk10K 输入10KHZ的时钟信号作为数码管的动态扫描时钟信号;
a[3..0] 上一级输出的秒的个位;
b[2..0] 上一级输出的秒的十位;
c[3..0] 上一级输出的分秒之间的标志位;
d[3..0] 上一级输出的分的个位;
e[2..0] 上一级输出的分的十位;
f[2..0] 上一级输出的秒的时分之间的标志位; g[3..0] 上一级输出的时的个位;
h[2..0] 上一级输出的时的个位;
输出:zx[3..0]数码管将要显示的4位BCD码;
Zw[7..0]八位数码管动态扫描输出; Sao miao 数码管扫描模块源代码:
module saomiao(a,b,c,d,e,f,g,h,f10000HZ,zx,zw);input f10000HZ;input[3:0] a,d,g,c,f;input[2:0] b,e;input[1:0] h;output[3:0] zx;output[7:0] zw;reg[3:0] zx;
reg[7:0] zw;reg[2:0] slip;always@(posedge f10000HZ)begin
if(slip==100)
slip<=4'b000;
else
slip<=slip+1'b1;end always@(slip)begin
case(slip)
4'd0:begin zw=8'b11111110;zx=a;end
4'd1:begin zw=8'b11111101;zx=b;end
4'd2:begin zw=8'b11111011;zx=c;end
4'd3:begin zw=8'b11110111;zx=d;end
4'd4:begin zw=8'b11101111;zx=e;end
4'd5:begin zw=8'b11011111;zx=f;end
4'd6:begin zw=8'b10111111;zx=g;end
4'd7:begin zw=8'b01111111;zx=h;end
default:zw=8'bx;
endcase end endmodule Sao miao 数码管扫描模块仿真波形:
Zx显示的是上一级输出的4位BCD码,此处是以十进制的形式显示的;
Decoder 模块:
功能:将上一级输出的4为BCD码转换成数码管能正常显示的数据;
输入:zx[3..0]上一级输出的4位BCD码; 输出:seg[6..0]数码管能正常显示的数据;
Decoder 译码模块源代码: module decoder(zx,seg);input[3:0] zx;output[6:0] seg;reg[6:0] seg;always@(zx)begin case(zx)4'b0000: seg<=7'b0111111;4'b0001: seg<=7'b0000110;4'b0010: seg<=7'b1011011;4'b0011: seg<=7'b1001111;4'b0100: seg<=7'b1100110;4'b0101: seg<=7'b1101101;4'b0110: seg<=7'b1111101;4'b0111: seg<=7'b0000111;4'b1000: seg<=7'b1111111;4'b1001: seg<=7'b1101111;4'b1010: seg<=7'b1000000;
default:seg<=7'bx;
endcase end endmodule Decoder 译码模块仿真波形:
输入的4位BCD码从0~10,则数码管显示0~9和一横标志位;
5.系统调试与性能分析
在第一次做好之后,下载到开发板里面,出现了问题,不能下载成功;最初认为是下载器的驱动没有安装好,后来经过认真的分析是因为在选择芯片的时候,选错了芯片;在进行了芯片的正确选择,以及引脚的正确配置后,成功的加生成的.sof文件下载到了开发板中;
6.设计过程中遇到的问题及解决方法。
程序完全调时成功后,下载到开发板中,显示全部为0,可能是时钟分频的问题;解决方法是修改源代码,进行正确的时钟信号分频;
第二篇:FPGA课程设计多功能数字钟讲解
多功能数字钟
开课学期:2014—2015 学年第二学期 课程名称: FPGA课程设计
学 院: 信息科学与工程学院
专 业: 集成电路设计与集成系统
班 级: 学 号: 姓 名:
任课教师:
2015 年 7 月 21 日
说 明
一、论文书写要求与说明
1.严格按照模板进行书写。自己可以自行修改标题的题目 2.关于字体:
a)题目:三号黑体加粗。
b)正文:小四号宋体,行距为1.25倍。
3.严禁抄袭和雷同,一经发现,成绩即判定为不及格!!
二、设计提交说明
1.设计需要提交“电子稿”和“打印稿”;
2.“打印稿”包括封面、说明(即本页内容)、设计内容三部分;订书机左边装订。
3.“电子稿”上交:文件名为 “FPGA课程设计报告-班级-学号-姓名.doc”,所有报告发送给班长,由班长统一打包后统一发送到付小倩老师。
4.“打印稿”由班长收齐后交到:12教305办公室; 5.上交截止日期:2015年7月31日17:00之前。
第一章
绪论....................................................................................................................3 关键词:FPGA,数字钟....................................................................................................3 第二章 FPGA的相关介绍...............................................................................................4 2.1 FPGA概述........................................................................................................4 2.2 FPGA特点...........................................................................................................4 2.3 FPGA设计注意...................................................................................................5 第三章 Quartus II与Verilog HDL相关介绍..................................................................7 3.1 Quartus II..............................................................................................................7 3.2 Verilog HDL......................................................................................................7 第四章 设计方案..............................................................................................................8 4.1数字钟的工作原理..............................................................................................8 4.2 按键消抖.............................................................................................................8 4.3时钟复位..............................................................................................................8 4.4时钟校时..............................................................................................................8 4.5数码管显示模块。..............................................................................................8 第五章 方案实现与验证..................................................................................................9 5.1产生秒脉冲..........................................................................................................9 5.2秒个位进位..........................................................................................................9 5.3按键消抖..............................................................................................................9 5.4复位按键设置....................................................................................................10 5.5 数码管显示。...................................................................................................10 5.6 RTL结构总图....................................................................................................11 第六章 实验总结............................................................................................................14 第七章 Verilog HDL源代码附录..................................................................................15
第一章
绪论
现代社会的标志之一就是信息产品的广泛使用,而且是产品的性能越来越强,复杂程度越来越高,更新步伐越来越快。支撑信息电子产品高速发展的基础就是微电子制造工艺水平的提高和电子产品设计开发技术的发展。前者以微细加工技术为代表,而后者的代表就是电子设计自动化(electronic design automatic, EDA)技术。
本设计采用的VHDL是一种全方位的硬件描述语言,具有极强的描述能力,能支持系统行为级、寄存器传输级和逻辑门级这三个不同层次的设计;支持结构、数据流、行为三种描述形式的混合描述,覆盖面广,抽象能力强,因此在实际应用中越来越广泛。ASIC是专用的系统集成电路,是一种带有逻辑处理的加速处理器;而FPGA是特殊的ASIC芯片,与其它的ASIC芯片相比,它具有设计开发周期短、设计制造成本低、开发工具先进、标准产品无需测试、质量稳定以及可实时在线检测等优点。
在控制系统中,键盘是常用的人机交换接口,当所设置的功能键或数字键按下的时候,系统应该完成该键所对应的功能。因此,按键信息输入是与软件结构密切相关的过程。根据键盘结构的不同,采用不同的编码方法,但无论有无编码以及采用什么样的编码,最后都要转换成为相应的键值,以实现按键功能程序的转移。[1] 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些都是以钟表数字化为基础的。因此研究数字钟以及扩大其应用有着非常现实的意义。
关键词:FPGA,数字钟
第二章 FPGA的相关介绍
FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
2.1 FPGA概述
系统设计师可以根据需要通过可编辑的连接把FPGA内部的逻辑块连接起来,就好像一个电路试验板被放在了一个芯片里。一个出厂后的成品FPGA的逻辑块和连接可以按照设计者而改变,所以FPGA可以完成所需要的逻辑功能。
FPGA一般由3种可编程电路和一个用于存放编程数据的静态存储器SRAM组成。这3种可编程电路是:可编程逻辑模块(CLB--Configurable Logic Block)、输入/输出模块(IOB--I/O Block)和互连资源(IR—Interconnect Resource)。可编程逻辑模块CLB是实现逻辑功能的基本单元,它们通常规则的排列成一个阵列,散布于整个芯片;可编程输入/输出模块(IOB)主要完成芯片上的逻辑与外部封装脚的接口,它通常排列在芯片的四周;可编程互连资源包括各种长度的连接线段和一些可编程连接开关,它们将各个CLB之间或CLB、IOB之间以及IOB之间连接起来,构成特定功能的电路。
FPGA一般来说比ASIC(专用集成芯片)的速度要慢,无法完成复杂的设计,而且消耗更多的电能。但是他们也有很多的优点比如可以快速成品,可以被修改来改正程序中的错误和更便宜的造价。厂商也可能会提供便宜的但是编辑能力差的FPGA。因为这些芯片有比较差的可编辑能力,所以这些设计的开发是在普通的FPGA上完成的,然后将设计转移到一个类似于ASIC的芯片上。另外一种方法是用CPLD(复杂可编程逻辑器件备)。
2.2 FPGA特点
FPGA的基本特点主要有:
1)采用FPGA设计ASIC电路,用户不需要投片生产,就能得到合用的芯片。
2)FPGA可做其它全定制或半定制ASIC电路的中试样片。3)FPGA内部有丰富的触发器和I/O引脚。
4)FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。5)FPGA采用高速CHMOS工艺,功耗低,可以与CMOS、TTL电平兼容。可以说,FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。编程互连资源IR可以将FPGA内部的CLB和CLB之间、CLB和IOB之间连接起来,构成各种具有复杂功能的系统。
FPGA是由存放在片内RAM中的程序来设置其工作状态的,因此,工作时需要对片内的RAM进行编程。用户可以根据不同的配置模式,采用不同的编程方式。
加电时,FPGA芯片将EPROM中数据读入片内编程RAM中,配置完成后,FPGA进入工作状态。掉电后,FPGA恢复成白片,内部逻辑关系消失,因此,FPGA能够反复使用。FPGA的编程无须专用的FPGA编程器,只须用通用的EPROM、PROM编程器即可。当需要修改FPGA功能时,只需换一片EPROM即可。这样,同一片FPGA,不同的编程数据,可以产生不同的电路功能。因此,FPGA的使用非常灵活。
FPGA有多种配置模式:并行主模式为一片FPGA加一片EPROM的方式;主从模式可以支持一片PROM编程多片FPGA;串行模式可以采用串行PROM编程FPGA;外设模式可以将FPGA作为微处理器的外设,由微处理器对其编程。
2.3 FPGA设计注意
不管你是一名逻辑设计师、硬件工程师或系统工程师,甚或拥有所有这些头衔,只要你在任何一种高速和多协议的复杂系统中使用了FPGA,你就很可能需要努力解决好器件配置、电源管理、IP集成、信号完整性和其他的一些关键设计问题。不过,你不必独自面对这些挑战,因为在当前业内领先的FPGA公司里工作的应用工程师每天都会面对这些问题,而且他们已经提出了一些将令你的设计工作变得更轻松的设计指导原则和解决方案。
本次实验所采用的FPGA器件是Altera Cyclone V 5CSEMA5F31C6N
FPGA实物图
FPGA数码管介绍,每节数码管低电平点亮高电平熄灭。LED序号如下图所示:
根据上图所示的顺序,可以得出显示的数组代码。
4'd0: HEX0=7'b1000000;4'd1: HEX0=7'b1111001;4'd2: HEX0=7'b0100100;4'd3: HEX0=7'b0110000;4'd4: HEX0=7'b0011001;4'd5: HEX0=7'b0010010;4'd6: HEX0=7'b0000010;4'd7: HEX0=7'b1111000;4'd8: HEX0=7'b0000000;4'd9: HEX0=7'b0010000;
//0 低电平点亮高电平熄灭 //1 //2 //3 //4 //5 //6 //7 //8 //9 default: HEX0=7'b1111111;//不符合条件的显示零
第三章 Quartus II与Verilog HDL相关介绍
3.1 Quartus II Quartus II 是Altera公司的综合性PLD/FPGA开发软件,原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware 支持Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。
Quartus II 软件拥有友好的界面,使用便捷,功能强大,当中可编程逻辑设计环境采用完成集成化,是先进的EDA工具软件。该软件具备诸多特点(例如:开放性,与结构无联系,多平台设计,完全集成化,设计库丰富、工具模块化等),支持原理图、VHDL、VerilogHDL以及AHDL等多种设计输入形式。Quartus II能够在多系统上使用,为用户的设计方式提供了完善的图形界面。具有运行速度快,界面统一,功能集中,学用简单等特点。
图形或HDL编辑Analysis & Synthesis(分析与综合)Filter(适配器)Assembler(编程文件汇编)编辑器Timing Analyzer(时序分析器)设计输入综合或编译适配器件下载仿真
3.2 Verilog HDL
Verilog HDL是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。Verilog HDL和VHDL是世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。前者由Gateway Design Automation公司(该公司于1989年被Cadence公司收购)开发。两种HDL均为IEEE标准。
第四章 设计方案
4.1数字钟的工作原理
振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。秒计数器满60后向分计数器进位,分计数器满60后向小时计数器进位,小时计数器按照“24翻0”规律计数。计数满后各计数器清零,重新计数。计数器的输出分别经译码器送数码管显示。计时出现误差时,可以用校时电路校时、校分。控制信号由三个独立按键输入。输入信号选择FPGA器件上的50MHZ时钟信号。
4.2 按键消抖
因为按键的物理结构并非理想式开关,在按键按下后会在一个很短的时间内出现电平抖动的情况,因此需要对按键进行消抖处理。这里的按键消抖与单片机中的按键消抖问题有所不同,不能采用延时的方法进行按键消抖,这里我选用对时钟脉冲计数的方式来判断按键是否按下。采用50MHZ时钟信号,实测160ms的消抖时长较为合适,即8000000个时钟上升沿。
4.3时钟复位
按下复位按键后,所有位清零。
4.4时钟校时
时钟计时过程中,可对时钟进行校时。本次设计不考虑对秒位进行校时,分钟的个位和小时的个位加到10时会自动进位,因此只对分钟的个位和小时的个位设置可以加1的校时按钮,即可实现校时功能。整体比较容易实现。
4.5数码管显示模块。
选择需要显示的时钟位数作为敏感词,用上述给出的显示代码对时钟的每一位分别进行显示处理。
第五章 方案实现与验证
5.1产生秒脉冲
always@(posedge clk)。。。
如代码展现,当计数器count记到50000000个时钟上升沿的时候,向秒个位进1.count=count+1;
begin
end count=0;count_s0=count_s0+1;
//秒个位计数
if(count==32'd50000000)
//产生一个一秒的脉冲,//敏感词为50MHZ时钟上升沿
5.2秒个位进位
当秒的个位计数到10的时候,向秒的十位进位。
if(count_s0==4'd10)
begin
end count_s0=0;count_s1=count_s1+1;
//产生秒十位进位
5.3按键消抖
if(!inrst_m0)
count0=count0+1;if(count0==32'd8000000 &&!inrst_m0)
begin count0=0;count_m0=count_m0+1;end
对时钟秒冲进行计数,计数达到8000000时,判断此时的电平是否为0,若还是为0,则判断按键按下,执行分钟个位加1操作。
5.4复位按键设置
begin
if(!reset)
begin
count=0;
count_s0=0;count_s1=0;
count_m0=0;count_m1=0;
count_h0=0;count_h1=0;
end else
复位按键按下后所有位置零。
5.5 数码管显示。
always@(count_s0)
begin
case(count_s0)
4'd0: HEX0=7'b1000000;
4'd1: HEX0=7'b1111001;
4'd2: HEX0=7'b0100100;
4'd3: HEX0=7'b0110000;
4'd4: HEX0=7'b0011001;
4'd5: HEX0=7'b0010010;
4'd6: HEX0=7'b0000010;
4'd7: HEX0=7'b1111000;
4'd8: HEX0=7'b0000000;
4'd9: HEX0=7'b0010000;
default: HEX0=7'b1111111;
endcase end
//按键按下为逻辑0
//复位置零
//秒个位显示
//0 低电平点亮高电平熄灭 //1 //2 //3 //4 //5 //6 //7 //8 //9
//不符合条件的显示零
5.6 RTL结构总图
显示部分如下图:
判断主体如下图:
部分引脚图展现
最终实验现象:
第六章 实验总结
其实本次的多功能数字钟设计其实应该还有很多其他的方法,比如用到外部中断功能进行时钟的校时,采用按键输入加数码管闪烁的方式进行校时位的选择,但限于时间较短,这部分知识空白,所以本次设计实有所缺陷。
经历了本次FPGA的设计,有很多感受,首先就是看了一点数字钟设计方面的资料,遇到很多不理解的地方,于是就需要再和同学进行研究讨论,在讨论的过程中,能听到其他人的思路,感觉特别有意思,同样的功能,实现的方法有许许多多,努力把自己的想法实现,或是选择一种你喜欢的设计借鉴一下,两者都是很好的选择。
通过这次设计实验,着实培养了我们独立思考、解决问题的能力,从最一开始的一筹莫展,没有一点思路,感觉像平底拔楼一样,从两手空空到产生一个控制电路,从无到有,这是创造的力量。同时,和其他同学讨论的过程也很重要,要说的还有就是最后实验成功的喜悦是无可替代的,就好像你亲手种的果树长出了果实,养的鸡下了鸡蛋,是一种创造的喜悦,整个心就像是一个大箱子里面放着一块糖,隐隐约约总能感觉到一丝甜蜜。
数码管显示的数字钟是常见的技术,这次基于FPGA的多功能数字钟设计具有很高的工程价值和现实意义。让我们将知识服务于生活,将知识用于实践,锻炼了我们发现问题解决问题的能力。
这次FPGA的多功能数字钟设计,加深了我们对FPGA设计的理解,培养了我们的逻辑思维和动手操作能力,使我们将知识与技能链接起来,使我们每个人的都在不断进步,提高了专业技能,提高了动手实践的综合能力。
第七章 Verilog HDL源代码附录
module clock(reset,inrst_m0,inrst_h0,clk,HEX0,HEX1,HEX2,HEX3,HEX4,HEX5);input clk,reset,inrst_m0,inrst_h0;output reg [6:0] HEX0,HEX1,HEX2,HEX3,HEX4,HEX5;reg [31:0] count=0,count0=0,count1=0;reg [3:0] count_s0=0,count_s1=0,count_m0=0,count_m1=0, count_h0=0,count_h1=0;
//实际宽度为25 always@(posedge clk)begin
if(!inrst_m0)
count0=count0+1;if(count0==32'd8000000 &&!inrst_m0)//按键消抖
begin count0=0;count_m0=count_m0+1;end if(!inrst_h0)count1=count1+1;if(count1==32'd8000000 &&!inrst_h0)
begin count1=0;count_h0=count_h0+1;end
//按键按下为逻辑0
//复位置零 if(!reset)begin count=0;count_s0=0;count_s1=0;count_m0=0;count_m1=0;count_h0=0;count_h1=0;end count=count+1;begin else
if(count==32'd50000000)
//产生一个一秒的脉冲,end count=0;count_s0=count_s0+1;
//秒个位计数
else if(count_s0==4'd10)
begin
end count_s0=0;count_s1=count_s1+1;
//产生秒十位进位
else if(count_s1==4'd6)
begin
end
//分个位计数 count_s1=0;count_m0=count_m0+1;else if(count_m0==4'd10)
begin
end
//分十位计数 count_m0=0;count_m1=count_m1+1;else if(count_m1==4'd6)
begin
end
//时个位计数 count_m1=0;count_h0=count_h0+1;else if(count_h0==4'd10)
begin
end
//满24判断 count_h0=0;count_h1=count_h1+1;else if(count_h0==4 && count_h1==2)
begin
count_h0=0;
count_h1=0;end
end
always@(count_s0)
begin
case(count_s0)
4'd0: HEX0=7'b1000000;
4'd1: HEX0=7'b1111001;
4'd2: HEX0=7'b0100100;
4'd3: HEX0=7'b0110000;
4'd4: HEX0=7'b0011001;
4'd5: HEX0=7'b0010010;
4'd6: HEX0=7'b0000010;
4'd7: HEX0=7'b1111000;
4'd8: HEX0=7'b0000000;
4'd9: HEX0=7'b0010000;
default: HEX0=7'b1111111;
endcase end
always@(count_s1)
begin
case(count_s1)
4'd0: HEX1=7'b1000000;
4'd1: HEX1=7'b1111001;
4'd2: HEX1=7'b0100100;
4'd3: HEX1=7'b0110000;
4'd4: HEX1=7'b0011001;
4'd5: HEX1=7'b0010010;
default: HEX1=7'b1111111;endcase
//秒个位显示
//0 低电平点亮高电平熄灭//1 //2 //3 //4 //5 //6 //7 //8 //9
//不符合条件的显示零
//秒十位显示
//0 低电平点亮高电平熄灭//1 //2 //3 //4 //5
//不符合条件的显示零
end
always@(count_m0)
begin
case(count_m0)
4'd0: HEX2=7'b1000000;
4'd1: HEX2=7'b1111001;
4'd2: HEX2=7'b0100100;
4'd3: HEX2=7'b0110000;
4'd4: HEX2=7'b0011001;
4'd5: HEX2=7'b0010010;
4'd6: HEX2=7'b0000010;
4'd7: HEX2=7'b1111000;
4'd8: HEX2=7'b0000000;
4'd9: HEX2=7'b0010000;
default: HEX2=7'b1111111;
endcase end always@(count_m1)
begin
case(count_m1)
4'd0: HEX3=7'b1000000;
4'd1: HEX3=7'b1111001;
4'd2: HEX3=7'b0100100;
4'd3: HEX3=7'b0110000;
4'd4: HEX3=7'b0011001;
4'd5: HEX3=7'b0010010;
default: HEX3=7'b1111111;
endcase end always@(count_h0)
begin
case(count_h0)
4'd0: HEX4=7'b1000000;4'd1: HEX4=7'b1111001;
//分个位显示
//0 低电平点亮高电平熄灭 //1 //2 //3 //4 //5 //6 //7 //8 //9
//不符合条件的显示零
//分十位显示
//0 低电平点亮高电平熄灭 //1 //2 //3 //4 //5
//不符合条件的显示零
//时个位显示
//0 低电平点亮高电平熄灭 //1
4'd2: HEX4=7'b0100100;
4'd3: HEX4=7'b0110000;
4'd4: HEX4=7'b0011001;
4'd5: HEX4=7'b0010010;
4'd6: HEX4=7'b0000010;
4'd7: HEX4=7'b1111000;
4'd8: HEX4=7'b0000000;
4'd9: HEX4=7'b0010000;
default: HEX4=7'b1111111;endcase End
always@(count_h1)
begin
case(count_h1)
4'd0: HEX5=7'b1000000;
4'd1: HEX5=7'b1111001;
4'd2: HEX5=7'b0100100;
default: HEX5=7'b1111111;
endcase end
endmodule
//2 //3 //4 //5 //6 //7 //8 //9
//不符合条件的显示零
//时十位显示
//0 低电平点亮高电平熄灭//1 //2
//不符合条件的显示零
第三篇:fpga数字钟课程设计报告
课程设计报告
设计题目:基于FPGA的数字钟设计
班级:电子信息工程1301 学号:20133638 姓名:王一丁
指导教师:李世平
设计时间:2016年1月
摘要
EDA(Electronic Design Automation)电子设计自动化,是以大规模可编程器件为设计载体,以硬件描述语言为系统逻辑描述的主要表达方式,通过相关的软件,自动完成软件方式设计得电子系统到硬件系统,最终形成集成电子系统或专用集成芯片。本次课程设计利用Quartus II 为设计软件,VHDL为硬件描述语言,结合所学知识设计一个多功能时钟,具有显示年、月、日、时、分、秒显示,计时,整点报时,设定时间等功能。利用硬件描述语言VHDL 对设计系统的各个子模块进行逻辑描述,采用模块化的思想完成顶层模块的设计,通过软件编译、逻辑化简、逻辑综合优化、逻辑仿真、最终完成本次课程设计的任务。
关键词:EDA VHDL语言 数字钟
目 录
摘要 课程设计目的 课程设计内容及要求 2.1 设计任务
2.2 设计要求 VHDL程序设计
3.1方案论证 3.2 系统结构框图 3.3设计思路与方法 3.3.1 状态控制模块 3.3.2 时分秒模块 3.3.3 年月日模块 3.3.4 显示模块 3.3.5脉冲产生模块 3.3.6 扬声器与闹钟模块
3.4 RTL整体电路 4 系统仿真与分析
课程设计总结,包括.收获、体会和建议 6 参考文献 1 课程设计目的
(1)通过设计数字钟熟练掌握EDA软件(QUARTUS II)的使用方法,熟练进行设计、编译,为以后实际工程问题打下设计基础。
(2)熟悉VHDL 硬件描述语言,提升分析、寻找和排除电子设计中常见故障的能力。
(3)通过课程设计,锻炼书写有理论根据的、实事求是的、文理通顺的课程设计报告。课程设计内容及要求
2.1 设计任务
(1)6个数字显示器显示时分秒,setpin按键产生一个脉冲,显示切换为年月日。
(2)第二个脉冲可预置年份,第三个脉冲可以预置月份,依次第四、五、六、七个脉冲到来时分别可以预置时期、时、分、秒,第八个脉冲到来后预置结束正常从左显示时分秒。
(3)up为高时,upclk有脉冲到达时,预置位加一,否则减一。2.2 设计要求
(1)在基本功能的基础上,闹钟在整点进行报时,产生一定时长的高电平。
(2)实现闹钟功能,可对闹钟时间进行预置,当达到预置时间时进行报时。
VHDL程序设计 3.1方案论证
该数字钟可以实现:计时功能、整点报时、闹钟和预置时间功能,因此时钟系统可分为5个模块:功能选择模块、时分秒计数模块、年月日计数模块、显示模块、扬声器模块、脉冲产生模块。
(1)功能选择模块是有状态机构成的,功能为依次进行、设置时间、设置闹钟时间。
调整工作状态:数字钟的初始状态显示时分秒,在setpin按键产生一个脉冲,显示切换为年月日。
设置时间:第二个脉冲可预置年份,第三个脉冲可以预置月份,依次第四、五、六、七个脉冲到来时分别可以预置时期、时、分、秒。第八个脉冲到来后,预置结束恢复初始状态,正常显示时分秒。
设置闹钟时间:闹钟在setpin1按键产生第一个脉冲时设定闹钟的时,第二个脉冲设定分,第三个脉冲设定秒,第四个脉冲恢复显示时分秒。
(2)时分秒计数模块包括正常计时、闹钟、整点报时三个功能。
正常计时功能通过软件编写,60进制的秒计数器,60进制的分计数器,24进制的时计数器。时分秒的计数器具有清0、置数、进位和计数功能。其中reset为清0信号,当reset为0时,时分秒的计数器清0。当set产生第四个脉冲后,连续产生的set信号使分秒计数器依次进行置数。以upclk为时钟,通过up对预置位进行控制,当up为高时且upclk有脉冲到来时,预置位加一,否则减一。当set产生第八个脉冲时,数字钟恢复时分秒的显示。
闹钟功能是在正常计数功能上拓展,分为闹钟时间预置和闹钟响应两个部分。闹钟时间预置功能:当set1连续产生脉冲时,依次对闹钟的时分秒位进行预置。以upclk为时钟,通过up对预置位进行控制,当up为高时且upclk有脉冲到来时,预置位加一,否则减一。当set1产生第四个脉冲时,数字钟恢复时分秒的显示。与此同时在程序中增添变量时计时功能可以持续运行。闹钟响应功能:通过预置后,储存的变量与计时器模块的时、分、秒进行比对,当时、分、秒相同时,模块产生一个一段时间的高电平,传输给闹钟响应模块。
整点报时功能:当计数器中的分位等于59,秒位等于59时,模块产生一段高电平,输出给扬声器模块进行报时。
(3)年月日计数模块分为年月日计数功能,年月日预置数功能。
年月日计数功能:以时位的进位脉冲为计时脉冲,闰年二月份为29天,普通年二月份为28天。一月、三月、五月、七月、八月、十月、十二月为31天,四月、六月、九月、十一月为30天。
年月日预置数功能:当set产生第一个脉冲后,依次进行年月日数器置数。以upclk为时钟,通过up对预置位进行控制,当up为高时且upclk有脉冲到来时,预置位加一,否则减一。
(4)显示模块:以时分秒,年月日模块的输出、状态标志为输入信号,通过状态控制模块产生的状态标志对显示模块进行控制,显示计时、预置时的不同状态。
(5)扬声器模块:输入信号为分位、秒位和状态信号,当计时时钟到达整点是输出高电平,其他时刻输出低电平。
(6)脉冲产生模块:对输入的信号进行1000分频,产生周期为一秒的时钟信号,用于数字钟的时钟输入。
3.2系统结构框图
3.3设计思路与方法 3.3.1 状态控制模块
状态控制模块实现对各个功能模块的整体设计,包括对时间与日期的显示与调整,闹钟的显示与调整等控制操作。状态机的输入为setpin,setpin1,upclk。状态机的状态有11种状态。g0:闹钟设置时位; g1:闹钟设置分位; g2:闹钟设置秒位;
s0:时钟显示时分秒;s1:时钟显示年月日; s2:钟设置年; s3:时钟设置月; s4:时钟设置日; s5:时钟设置时; s6:时钟设置分; s7:设置秒
在产生如上状态的同时产生Tlock,flag状态标志,此标志用来进行时钟设置、闹钟设置与显示控制。RTL 电路图
实现代码如下: process(upclk)begin if(upclk='1' and upclk'LAST_VALUE='0')then state<=next_state;--实现状态变换
end if;end process;process(state,setpin,setpin1)begin next_state<=state;case(state)is when s0 => Tlock<=“0000”;flag<='1';if(setpin1='1'
and
setpin1'LAST_VALUE='0')then next_state<=g0;end if;if(setpin='1'
and
setpin'LAST_VALUE='0')
then next_state<=s1;end if;when s1=> Tlock<=“0001”;flag<='1';if(setpin1='1' and next_state<=g0;end if;if(setpin='1'
and next_state<=s2;end if;when s2=> Tlock<=“0010”;flag<='1';if(setpin1='1' and next_state<=g0;end if;if(setpin='1'
and next_state<=s3;end if;
when s3=> Tlock<=“0011”;flag<='1';if(setpin1='1' and next_state<=g0;end if;
setpin1'LAST_VALUE='0')then
then
setpin1'LAST_VALUE='0')then
setpin'LAST_VALUE='0')
then
setpin1'LAST_VALUE='0')then
setpin'LAST_VALUE='0')if(setpin='1' and next_state<=s4;end if;
when s4=> Tlock<=“0100”;flag<='1';if(setpin1='1' and next_state<=g0;end if;if(setpin='1'
and next_state<=s5;end if;when s5=> Tlock<=“0101”;flag<='1';if(setpin1='1' and next_state<=g0;end if;if(setpin='1'
and next_state<=s6;end if;when s6=> Tlock<=“0110”;flag<='1';if(setpin1='1' and next_state<=g0;end if;if(setpin='1'
and
setpin'LAST_VALUE='0')then
setpin1'LAST_VALUE='0')then
then
setpin1'LAST_VALUE='0')then
then
setpin1'LAST_VALUE='0')then
then
setpin'LAST_VALUE='0')
setpin'LAST_VALUE='0')
setpin'LAST_VALUE='0')next_state<=s7;end if;
when s7=>
Tlock<=“0111”;
flag<='1';if(setpin1='1' and
setpin1'LAST_VALUE='0')then next_state<=g0;end if;if(setpin='1'
and next_state<=s0;end if;when g0=> Tlock<=“1000”;flag<='0';if(setpin1='1' and next_state<=g1;end if;if(setpin='1'
and next_state<=s0;end if;
when g1=> Tlock<=“1001”;flag<='0';if(setpin1='1' and next_state<=g2;end if;if(setpin='1'
and next_state<=s0;end if;then
setpin1'LAST_VALUE='0')then
setpin'LAST_VALUE='0')
then
setpin1'LAST_VALUE='0')then
setpin'LAST_VALUE='0')
then
setpin'LAST_VALUE='0')
when g2=> Tlock<=“1010”;flag<='0';if(setpin1='1' next_state<=s0;end if;if(setpin='1'
and
setpin'LAST_VALUE='0')
then
and
setpin1'LAST_VALUE='0')then next_state<=s0;end if;
when others=> next_state<=s0;end case;end process;3.3.2 时分秒模块
时分秒模块的输入为ce(使能端),clk0(系统输入时钟),clk1(upclk时钟),flag(标志位),lock(状态位),up(预置位增减控制),ov(进位位),op(闹钟与扬声器响应)。
时分秒模块的RTL电路图 时钟选择方式:在初始状态和显示年月日的状态下,时分秒模块的时钟输入为系统时钟输入(clk0),在其他状态下,时分秒模块的时钟输入为(upclk时钟)用来进行置位。
实现代码入下:
process(lock,clk0,clk1)begin if(lock=“0000” or lock=“0001”)then clk<=clk0;--正常计数时选择clk0 else clk<=clk1;--预置的时候clk1 end if;end process;时钟计时功能,在显示年月日,时分秒的状态时,时钟正常计数。当数字钟处于置数状态时,年、月、日、时、分、秒时钟停止计时,各个位显示预置数。在闹钟的预置功能实现的同时,通过增添变量,在设置闹钟的同时保证时钟的正常计数,在闹钟预置结束后,恢复到初始的时钟显示。3.2.3 年月日模块
年月日模块分为日期增加和日期减小两个部分,日期增加:在显示时分秒,显示年月日和设置完秒位的状态下,如果是二月,通过函数判断是否为闰年,其他月份对大小月进行判断,大月为31天,小月为30天,代码如下:
if(clk'event and clk='1')then if(ce='1')then if(lock=“0000”)or(lock=“0001”)or(lock=“0100”and up='1')then
if(mon0=“0010”and mon1=“0000”)then
Feb_add_day(Td0,Td1,tempy0,tempy1,date0,date1);
elsif((mon0=“0001”and mon0=“0000”)or(mon0=“0011”)or(mon0=“0101”)
or(mon0=“0111”)or(mon0=“1000”)or(mon0=“0000”and mon1=“0001”)or(mon0=“0010”and mon1=“0001”))then
oddmonth_add_day(Td0,Td1,date0,date1);
else evenmonth_add_day(Td0,Td1,date0,date1);
end if;
end if;日期减少同理,代码如下: if(lock=“0100”and up='0')then if(mon0=“0010”and mon1=“0000”)then Feb_add_day(Td0,Td1,tempy0,tempy1,date0,date1);elsif((mon0=“0001”and mon1=“0000”)or(mon0=“0011”)or(mon0=“0101”)or(mon0=“0111”)or(mon0=“1000”)or(mon0=“0000”and mon1=“0001”)
or(mon0=“0010”and mon1=“0001”))then
oddmonth_sub_day(Td0,Td1,date0,date1);
else evenmonth_sub_day(Td0,Td1,date0,date1);
END IF;
end if;
end if;
end if;当以日位的进位为输入,当存在输入脉冲时,通过函数对月份进行加减,代码如下: begin
if(clk'event and clk='1')then
if(ce='1')then
if(lock=“0000”)or(lock=“0001”)or(lock=“0011”and up='1')then
add_month(Tm0,Tm1,mon0,mon1);
end if;
if(lock=“0011”and up='0')then
sub_month(Tm0,Tm1,mon0,mon1);
end if;
if(lock=“0000”)or(lock=“0001”)then
if(mon0=“0010”and mon1=“0001”)then
sub_year(Ty0,Ty1,year0,year1);
end if;
end if;
if(lock=“0010”and up='1')then
add_year(Ty0,Ty1,year0,year1);
end if;
if(lock=“0010”and up='0')then
sub_year(Ty0,Ty1,year0,year1);
end if;
end if;
end if;3.2.4 显示模块
显示模块的输入为年、月、日、时、分、秒、lock(状态标志),通过if语句,状态机一共提供11钟状态。在不同状态下,给显示模块的年月日时分秒不同的输入,从而得到要求的显示。
显示电路的RTL电路 代码如下:
process(lock,sec0,sec1,min1,min0,hour1,hour0,date0,date1,mon0,mon1,year0,year1)begin if(lock=“0000”)then a0<=sec0;a1<=sec1;b0<=min0;b1<=min1;c0<=hour0;c1<=hour1;end if;if(lock=“0001”)then a0<=date0;a1<=date1;b0<=mon0;b1<=mon1;c0<=year0;c1<=year1;end if;if(lock=“0101”)or(lock=“1000”)then a0<=“1111”;a1<=“1111”;b0<=“1111”;b1<=“1111”;c0<=hour0;c1<=hour1;end if;if(lock=“0110”)or(lock=“1001”)then a0<=“1111”;a1<=“1111”;b0<=min0;b1<=min1;c0<=“1111”;c1<=“1111”;end if;if(lock=“0111”)or(lock=“1010”)then a0<=sec0;a1<=sec1;b0<=“1111”;b1<=“1111”;c0<=“1111”;c1<=“1111”;end if;if(lock=“0010”)then a0<=“1111”;a1<=“1111”;b0<=“1111”;b1<=“1111”;c0<=year0;c1<=year1;end if;if(lock=“0011”)then a0<=“1111”;a1<=“1111”;b0<=mon0;b1<=mon1;c0<=“1111”;c1<=“1111”;end if;if(lock=“0100”)then a0<=date0;a1<=date1;b0<=“1111”;b1<=“1111”;c0<=“1111”;c1<=“1111”;end if;end process;end led_disp_arc;3.2.5脉冲发生模块(分频电路)
脉冲发生电路将提供的1000hz频率分频成1hz(供系统时钟)。f1000为1000hz输入,second_wave为分频输出。
分频器的RTL电路 代码如下: process(f1000,cnt)begin if(f1000'event and f1000='1')then if(cnt=“00000011”)then cnt<=“000000000”;second_wave<=not second_wave;else cnt<=cnt+'1';end if;end if;end process;end second_wave_arc;3.2.6 扬声器模块
模块的输入为clk(系统时钟),op(响应信号),vcc(闹钟使能端),ala(高电平输出)。当vcc为高时,且当op有响应信号输入(高),闹钟产生一定时长的高电平。
闹钟的RTL电路 代码如下:
signal temp1:std_logic_vector(3 downto 0);begin process(op,vcc,clk)begin if clk'event and clk='1' then if(vcc='1')then if(temp1=“1111”)then ala<=not ala;
else
temp1<=temp1+'1';
ala<='1';
end if;
end if;
end if;end process;end alarm_arc;
3.3整体RTL电路
系统仿真与分析 4.1对基本要求的仿真
初态设置:setpin1=0;up=0;setpin置连续8个脉冲,f1000为频率为1000hz的方波。
分析:在setpin第一次脉冲到来时,显示年月日,因为数字钟是初始状态所以年月日均为0。Setpin。第二次脉冲到来时对时进行预置数,因为up=0,所以设置时位,时位在不断地减小,在后面各位预置的过程中,每一位的预置过程都是减小。第三次脉冲来到是对分位进行预置,第四次脉冲到来时对秒位进行预置。第四次脉冲到来时对年进行预置,第五次脉冲到来时对月进行预置,第六次脉冲到来时对日进行预置。第七次脉冲到来时,数字钟显示时分秒,从仿真结果可以看出来,此时时钟是从预置的时间开始计时的,第八次脉冲到来时,此时时钟显示的是年月日,此时显示的年月日为预置的年月日。
从上述分析可以看出,经过仿真的程序基本达到数字钟的基本要求,系统可靠。
4.2对闹钟状态转换的仿真
初始设置:初态设置:setpin1设计一个脉冲;up=0;setpin置连续2个脉冲,f1000为频率为1000hz的方波。
当第一个setpin脉冲到来时,显示年月日,第二个setpin脉冲来临时时钟对年进行预置,此后setpin1的第一个脉冲到来,时钟的状态转为对闹钟时间的设置,达到实验要求。
4.3对闹钟功能的仿真
初始设置:初态设置:setpin1设计三个脉冲;up=0;f1000为频率为1000hz的方波。
数字钟的原状态显示时分秒,由于未进行初始化,所以时分秒从0开始计时,当setpin1第一个脉冲到来时,数字钟对闹钟的时刻的时位进行预置,当setpin1第二个脉冲到来时,数字钟对闹钟的时刻的分位进行预置,当setpin1第三个脉冲到来时,数字钟对闹钟的时刻的秒位进行预置,当第四个脉冲到来是恢复显示时分秒,此时的时分秒已经计数到51秒,符合预期,在设置闹钟的同时,时钟依旧计数,达到要求。
同时从初始时刻,闹钟的扬声器产生一定时长高电平可以看出整点报时功能良好,达到设计要求。课程设计总结(收获、体会和建议)本次VHDL设计的数字钟定义了三种类型的端口,分别是in、out、buffer。In和out端口使用简单,buffer端口具有回读功能,因为buffer类型的端口不能连接到其他类型的端口上,因此不利于子模块原件例化,不利于大型设计。
进程(Process)是VHDL中最为重要的部分,在本次设计中。我出现了对于时钟引入,输出多驱动,一个进程中不允许出现两个时钟沿触发的错误,这些错误在未来的设计中都是应该避免的。顺序语句如IF语句、CASE语句、LOOP语句、变量赋值语句等必须出现在进程、函数或子程序内部,而不能单独出现在进程之外。
本次实验让我对VHDL 语言有了更深的认识,对语言的运用更加熟悉,为未来的实际应用打下了良好的基础。因为实验室的条件限制,并没有将程序下载到实际器件中观察现象,只是通过软件对系统进行仿真,希望以后可以机会接触并使用实际器件。6 参考文献
1.吴廷鑫.基于FPGA的多功能数字钟设计[J].科技经济市场, 2015,(5): 1-5 2.徐大诏.基于FPGA实现的数字钟设计[J].信息技术, 2009,(12): 101-104 3.张子刚, 卢戈, 田鹏.基于VHDL的数字时钟的设计[J].气象水文海洋仪器, 2008,(2): 10-14 4.樊永宁, 张晓丽.基于VHDL的多功能数字钟的设计[J].工矿自动化, 2006,(3): 92-94 5.江翠云 基于CPLD和VHDL的数字钟的设计[期刊论文]-硅谷2010(2)
第四篇:数字钟课程设计
晶体振荡器电路
晶体振荡器电路给数字钟提供一个频率稳定准确的32768Hz的脉冲,可保证数字钟的走时准确及稳定。不管是指针式的电子钟还是数字显示的电子钟都使用了晶体振荡器电路。分频器电路
分频器电路将32768Hz的高频方波信号经74LS4060和74LS250的二分频的分频后得到1Hz的方波信号,可以供秒计数器进行计数。分频器实际上也就是计数器。时间计数器电路
时间计数电路由秒个位和秒十位计数器、分个位和分十位计数器及时个位和时十位计数器电路构成,其中秒个位和秒十位计数器、分个位和分十位计数器为60进制计数器,时个位和时十位计数器可以设计为12进制计数器或者24进制计数器,我们这里根据自己的意愿设计成24进制计数器。译码驱动电路
译码驱动电路将计数器输出的8421BCD码转换为数码管需要的逻辑状态,并且为保证数码管正常工作提供足够的工作电流。数码管
数码管通常有发光二极管(LED)数码管和液晶(LCD)数码管,本设计采用的为LED数码管。
各单元模块设计和分析 晶体振荡器电路
晶体振荡器是构成数字式时钟的核心,它保证了时钟的走时准确及稳定。
图2 晶体振荡器电路图
分频器电路
通常,数字钟的晶体振荡器输出频率较高,为了得到1Hz的秒信号输入,需要对振荡器的输出信号进行分频。
通常实现分频器的电路是计数器电路,一般采用多级2进制计数器来实现。例如,将32767Hz的振荡信号分频为1HZ的分频倍数为32767(2于15极2进制计数器。时间计数单元
时间计数单元有时计数、分计数和秒计数等几个部分。
时计数单元一般为24进制计数器计数器,其输出为两位8421BCD码形式;分计数和秒计数单元为60进制计数器,其输出也为8421BCD码。
本实验采取了74LS90 用两块芯片进行级联来产生60进制和24进制
秒个位计数单元为10进制计数器,无需进制转换,只需将Q0与CP1(下降沿有效)相连即可。CP0(下降没效)与1HZ秒输入信号相连,Q3可作为向上的进位信号与十位计数单元的CP1相连。
秒十位计数单元为6进制计数器,需要进制转换。将10进制计数器转换为6进制计数器的15),即实现该分频功能的计数器相当电路连接,其中Q2可作为向上的进位信号与分个位的计数单元的CP0相连。
分个位和分十位计数单元电路结构分别与秒个位和秒十位计数单元完全相同,也是分个位计数单元的Q3作为向上的进位信号应与分十位计数单元的CP0相连,分十位计数单元的Q2作为向上的进位信号应与时个位计数单元的CP0相连。60进制的连接如图4所示。时个位计数单元电路结构仍与秒或个位计数单元相同,但是要求,整个时计数单元应为24进制计数器,所以在两块74LS90构成的100进制中截取24,就得在24的时候进行异步清零。24进制计数功能的电路如图5所示。
图5 24进制计数器电路
主要参考文献
《电子技术基础》
康华光
高教出版社 《电子线路设计、实验与测试》
谢自美
华中科技大学出版社 《电子技术实验》
汪学典
华中科技大学出版社 课程设计摘要 中文摘要
此次课程设计以数字钟为例,全面的利用了所学的知识,设计出了生活中常见的东西。数字钟主要有多谐振荡器、分频器、计数器、译码器组成。主要芯片有74LS90、CC4511。有多谐振荡器产生约1Mz信号脉冲。满24计数器自动复位,从而实现24 小时计时。
关键词:多谐振荡器、分频器、计数器、74LS90 英文摘要 This design report in detail the digital clock.Making using of our comment study.The digital clock is made of multivibrator type oscillator、divider、counter.Following chips 74LS90 CC4511.When the hour counter reaches the summit of 24,it will return to the beginning point.So ,the whole day is counted.Key word: multivibrator、divider、74LS90
第五篇:数字钟课程设计
数字电子钟逻辑电路设计
一、实验目的:
1、掌握数字钟的设计方法;
2、熟悉集成电路的使用方法。
二、设计任务和要求:
1、设计一个有“时”,“分”,“秒”(23小时59分59秒)显示且有校时功能的电子钟;
2、用中小规模集成电路组成电子钟;
3、画出框图和逻辑电路图,写出设计报告;
4、选做:①闹钟系统。②整点报时。③日历系统。
三、方案选择和论证:
1.分秒功能的实现:用两片74290组成60进制递增计数器 2.时功能的实现:用两片74290组成24进制递增计数器 3.定点报时:当分秒同时出现为0时,灯亮。
4.日历系统:月跟日分别用2片74192实现,月份就接成12进制,日则接成31进制,星期由1片74192组成7进制,从星期一至星期天。
四、方案的设计:
1、可调时钟模块:
秒、分、时分别为60、60和24进制计数器。用两片74LS290做一个二十四进制, 输入计数脉冲CP加在CLKA’端,把QA与与CPLB’从外部连接起来,电路将对CP按照8421BCD码进行异步加法计数。通过反馈端,控制清零端清零,其中个位接成二进制形式,十位接成四进制形式。其电路图如下:
同理利用两片74290组成的六十进制计数器,如下图所示
将两个六十进制的加法计数器和一个二十四进制的加法计数器进行级联:将秒的十位进位脉冲接到分的个位输入脉冲,将分的十位进位脉冲接到时的个位输入脉冲,这样就可以组成最基本的电路。2.校时电路: 例如说时的校准,开关1上端接1HZ脉冲,下端接分的进位。当开关打到上端时电路进入校准功能,当开关打到下端时电路进入正常计时功能。其电路如总电路图所示
3.整点报时:
分别用2个或非门接到分和秒的各输出个节点处,再用一个与非门与报时灯链接,当输出同时为零时,即整点时,报时灯就亮了,起到报时功能。本实验使用LED发光(1s),其电路图如下:
4日历系统:
月和日都用2片74192实现。月份功能则接成13进制,因为月份分日都是从1开始计起,所以要求从0001开始,到1101时,立刻清零,清零时应该切换到置数状态,即将ABCD置1000,通过一个与非门链接到LOAD端置零,同时也将计数器置为0001的状态。其电路图如下所示
日功能74192三十一进制电路图:
总电路图:
四、电路调试:
调试这部分工作在EWB仿真软件上进行。对于电路的调试应该分为几个部分,分别对电路各个部分的功能都进行调试,之后,每连接一部分都要调试一次。在实现日历系统时,如月份需要显示灯显示1~31。一开始以为只把计数器链接成三十一进制即可,结果显示灯只显示0~30,没有自己预期的结果。经过仔细思考,要把0去掉不显示,从1开始显示,而还要显示31。经过查书,最后,知道开始需置数成0001状态,到1000才清零,清零的同时回到置数0001状态,通过多次链接、测试,终于实现了。
在实现校时功能过程中,由于之前想得太过复杂了,浪费了大量时间,最后,经过上网搜索,到图书馆查书,简单的用了个开关连接到脉冲实现了。
五、收获心得体会:
整个过程花了我不少时间,可当做完时才发现做这个数字钟是多么简单的一件事,主要是在调试时花了不少时间,其间换了不少器件,有的器件在理论上可行,但在实际运行中就无法看到效果,所以调试花了我不少时间,有时无法找出错误便更换器件重新接线以使电路正常运行。
在实际的操作过程中,能把理论中所学的知识灵活地运用起来,并在调试中会遇到各种各样的问题,电路的调试提高了我们解决问题的能力,学会了在设计中独立解决问题,也包括怎样去查找问题。似乎所有的事都得自己新手去操作才会在脑海中留下深刻的印象,这个小小的课程设计让我可以熟练的操作EWB软件,也了解了不少器件的功能的应用,也加深了对数字电路认识和理解。
本次课程设计主要是用软件仿真,如果是实际加工电路板就更加锻炼我们的动手能力了,因此,能力还有待提高。