基于FPGA的数字钟设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

摘要

本设计为一个可调数字钟,具有时、分、秒计数功能,以24小时循环计数。本设计采用FPGA技术,以硬件描述语言VreilogHDL为系统逻辑描述手段设计文件,在QUARTUS2工具软件环境下,采用自顶向下的设计方法,由各个模块共同构建一个基于CPLD的数字钟。系统芯片采用6块74160实现了60进制(分、秒)、24进制(小时)的编译,由时钟模块、控制模块、计时模块、数据译码模块、显示模块组成。最终经过编译和仿真所涉及的程序,在可编程逻辑器件上下载验证,本系统能够完成时、分、秒的分别显示,可以在程序中直接改变初始值。

关键词:数字钟硬件描述语言VerilogHDL FPGA

1.实验目的

本实验主要内容涉及数字逻辑电路的设计、数字电路仿真软件Quartus Ⅱ以及VHDL 设计语言的学习与应用。实验目的在于让实验者掌握数字逻辑电路的设计方法和过程,并且能够熟练准确地设计出具有特定功能的较复杂数字逻辑电路,此外,实验者还应熟练掌握Quartus Ⅱ软件的设计、仿真以及编译下载的使用方法。 2 .课程要求

用Verilog 硬件描述语言设计数字钟,实现:

1.具有时、分、秒计数显示功能,以二十四小时循环计时。

2.具有调节小时、分钟功能。

3.具有整点报时功能。

3.系统设计总体方案

秒模块 时模块

4.各模块电路具体实现

4.1 时钟分频模块

module div_clk(clk_50MHz,clk_1Hz,clk_1KHz,clk_500Hz);

input clk_50MHz;

output clk_1Hz,clk_500Hz,clk_1KHz;

reg clk_1Hz,clk_500Hz,clk_1KHz;

reg [24:0] cnt1;

reg [24:0] cnt2;

reg [24:0] cnt3;

always @(posedge clk_50MHz)

begin if(cnt1 == 24999999)

begin cnt1<=0;

clk_1Hz=~clk_1Hz;

end

else cnt1<=cnt1+1'b1;

end

always @(posedge clk_50MHz)

begin if(cnt2 == 24999)

begin cnt2<=0;

clk_1KHz=~clk_1KHz;

end

else cnt2<=cnt2+1'b1;

end

always @(posedge clk_50MHz)

begin if(cnt3 == 49999)

begin cnt3<=0;

clk_500Hz=~clk_500Hz;

end

else cnt3<=cnt3+1'b1;

end

endmodule

4.2计数器模块的设计与实现

4.2.1秒显示模块的实现

图4.2.1 秒钟显示模块4.2.2分钟显示模块的实现

图4.2.2 分钟显示模块4.2.3小时显示模块的实现

图4.2.3 时钟显示模块

4.3 数码管显示及译码模块

module decode(clk_1KHz,hour_ten,hour_one,min_ten,min_one,sec_ten,sec _one,dig,seg);

input clk_1KHz;

input [3:0] hour_ten,hour_one,min_ten,min_one,sec_ten,sec_one; output [7:0] dig;

output [7:0] seg;

reg[7:0] seg_reg;

reg[7:0] dig_reg;

reg[3:0] dat_reg;

reg[2:0] count;

always @(posedge clk_1KHz)

begin

if(count ==5)count<=0;

else count<=count+1'b1;

end

always @(posedge clk_1KHz)

begin

case(count)

3'd0 : begin dat_reg<=hour_ten[3:0];dig_reg<=8'b01111111;end 3'd1 : begin dat_reg<=hour_one[3:0];dig_reg<=8'b10111111;end 3'd2 : begin dat_reg<=min_ten[3:0]; dig_reg<=8'b11011111;end 3'd3 : begin dat_reg<=min_one[3:0]; dig_reg<=8'b11101111;end 3'd4 : begin dat_reg<=sec_ten[3:0]; dig_reg<=8'b11110111;end 3'd5 : begin dat_reg<=sec_one[3:0]; dig_reg<=8'b11111011;end default : begin dat_reg<=0;dig_reg<=6'b000000;end

endcase

end

always @(dat_reg)

begin

case(dat_reg)

4'h0 : seg_reg<=8'hc0;

4'h1 : seg_reg<=8'hf9;

4'h2 : seg_reg<=8'ha4;

4'h3 : seg_reg<=8'hb0;

4'h4 : seg_reg<=8'h99;

4'h5 : seg_reg<=8'h92;

4'h6 : seg_reg<=8'h82;

4'h7 : seg_reg<=8'hf8;

4'h8 : seg_reg<=8'h80;

4'h9 : seg_reg<=8'h90;

default : seg_reg<=8'hff;

endcase

相关文档
最新文档