基于FPGA的电子钟设计.docx
《基于FPGA的电子钟设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的电子钟设计.docx(12页珍藏版)》请在冰豆网上搜索。
![基于FPGA的电子钟设计.docx](https://file1.bdocx.com/fileroot1/2023-2/3/f1c67f77-416c-412c-b499-59e412d4f6ee/f1c67f77-416c-412c-b499-59e412d4f6ee1.gif)
基于FPGA的电子钟设计
基于FPGA的电子钟设计
一、需求分析2
1.功能描述2
2.其他要求2
二、总体设计2
1.设计思路2
2.器件选型2
三、硬件设计2
1.硬件框图2
2.硬件模块2
3.硬件电路图2
四、软件设计2
1.软件框图2
2.软件流程图及其程序代码2
五、测试效果2
六、问题分析2
1.实现过程中遇到的问题及解决方法分析。
2
2.收获与体会2
附录:
2
一、需求分析
学习利用VerilogHDL语言完成基于FPGA的数字钟设计,最后完成在EDA实验箱上的下载和调试。
1.功能描述
该电子钟可以实现以数字形式(hh—ff—mm)显示时、分、秒的时间和复位以及调时功能。
(1)“SW0”键时,数字钟复位;
(2)“SW1”键控制“秒”调整;
(3)“SW2”键控制“分”调整;
(4)“SW3”键控制“时”调整;
2.其他要求
掌握用VerilogHDL语言的设计思想以及整个数字系统的设计。
利用编译仿真软件QuartusⅡ实现其基本功能,然后结合EDA试验箱,在试验箱上演示具体功能。
本实验设计采用试验箱上的模式5,时、分、秒的计时结果通过8个数码管动态显示。
二、总体设计
1.设计思路
利用VerilogHDL语言编程实现电子时钟的功能,显示电路利用七段数码管进行显示。
芯片采用CycloneⅢ系列中的EP3C10E144C8。
秒计数器的计数时钟clk1为1Hz的标准信号。
数码管的动态扫描时钟clk2为1kHz的标准信号。
本设计中clk1和clk2分别采用试验箱上的信号F0、F1来实现。
时钟的段选数据和位选数据通过EP3C10E144C8芯片的I/O口送给数码管,从而实现时间显示。
时间的复位和调整通过外加独立按键(SW0,SW1,SW2,SW3)来控制。
2.器件选型
器件名称
EP3C10E144C8
LED数码管
独立按键
数量
1片
8只
4个
三、硬件设计
1.硬件框图
硬件框图如下所示:
2.硬件模块
因该设计非常简单,硬件模块很少,只有显示模块和按键模块。
3.硬件电路图
硬件电路如下图所示:
四、软件设计
1.软件框图
软件总体框图
2.软件流程图及其程序代码
软件总体流程图如下:
2.1分、时、秒(24*60*60)计时模块
程序代码如下:
always@(posedgeclk1)
begin
if(!
reset)
begin
sec=0;
min=0;
hour=0;
end
else
sec=sec+1;
if(sec==60)
begin
sec=0;
min=min+1;
end
if(min==60)
begin
min=0;
hour=hour+1;
end
if(hour==24)
hour=0;
end
2.2译码及数码管显示模块
程序代码如下:
always@(negedgeclk2)//clk2为1kHz的数码管动态扫描时钟
begin
scan=scan+3'b001;
------数码管的位选和段选控制--------
case(scan)
3'h0:
beginwei=8'hFE;seg=d[0];end
依次选中每个数码管,并将它要显示的数据给seg
3'h1:
beginwei=8'hFD;seg=d[1];end
3'h2:
beginwei=8'hFB;seg=d[2];end
3'h3:
beginwei=8'hF7;seg=d[3];end
3'h4:
beginwei=8'hEF;seg=d[4];end
3'h5:
beginwei=8'hDF;seg=d[5];end
3'h6:
beginwei=8'hBF;seg=d[6];end
3'h7:
beginwei=8'h7F;seg=d[7];end
endcase
--------译码部分-----------
case(seg)
4'h0:
duan=8'h3F;//数字“0”的译码
4'h1:
duan=8'h06;//数字“1”的译码
4'h2:
duan=8'h5B;//数字“2”的译码
4'h3:
duan=8'h4F;//数字“3”的译码
4'h4:
duan=8'h66;//数字“4”的译码
4'h5:
duan=8'h6D;//数字“5”的译码
4'h6:
duan=8'h7D;//数字“6”的译码
4'h7:
duan=8'h07;//数字“7”的译码
4'h8:
duan=8'h7F;//数字“8”的译码
4'h9:
duan=8'h6F;//数字“9”的译码
default:
duan=8'h40;//符号“-”的译码
endcase
end
2.3数据处理子模块:
对当前的时钟数据进行处理,实现原理是分别用时、分、秒这3个数据除以10,将得到的十位和个位分别存在2个单独的存储器里。
模块代码为:
always@(posedgeclk0)
begin
d[0]=(sec%10);
d[1]=(sec/10);
d[2]=10;
d[3]=(min%10);
d[4]=(min/10);
d[5]=10;
d[6]=(hour%10);
d[7]=(hour/10);
end
五、测试效果
经过软件仿真,测试效果良好,上述功能基本都能实现。
一下给出基本的仿真效果。
仿真效果如下所示:
1.时、分、秒计时仿真结果:
2.译码显示仿真结果:
3.EDA实验箱上的调试效果:
六、问题分析
1.实现过程中遇到的问题及解决方法分析
刚开始因为不太懂Verilog语言,所以在实验过程中遇到了不小的麻烦。
我所写的程序总是出现很多语法错误,最后通过查阅资料和同学们的帮助才是问题得以解决。
另外,在EDA试验箱上调试时,因为对试验箱的硬件不是很了解,调试一直不成功。
最后,通过查看EDA实验指导书,才知道是时钟信号的跳线帽没有接好。
最后,经过仿真,该设计虽能达到预期的要求,但也存在不足之处。
因为时间仓促,该设计未能实现调时模块。
2.收获与体会
经过本次实验设计的学习,收获颇丰。
首先,对FPGA有了一定的了解,同时锻炼了我的动手能力。
其次,我学习了Verilog语言,会用Verilog语言编写简单的程序。
特别是体会到了Verilog语言与C语言的不同。
Verilog语言虽然语法与C语言很相似,但它与C语言还是有很大的差别的。
C语言是串行的思想,而Verilog语言很多语句是并行的。
附录:
全部代码如下:
moduleclock(clk,clk0,sec,min,hour,wei,duan,reset);
inputclk,clk0,reset;
outputsec,min,hour,wei,duan;
reg[7:
0]sec;
reg[7:
0]min;
reg[7:
0]hour;
reg[2:
0]scan;
reg[7:
0]wei;
reg[7:
0]duan;
reg[3:
0]d[7:
0];
reg[7:
0]seg;
reg[2:
0]set;
always@(posedgeclk)
begin
if(!
reset)
begin
sec=0;
min=0;
hour=0;
end
else
sec=sec+1;
if(sec==60)
begin
sec=0;
min=min+1;
end
if(min==60)
begin
min=0;
hour=hour+1;
end
if(hour==24)
hour=0;
end
always@(posedgeclk0)
begin
d[0]=(sec%10);
d[1]=(sec/10);
d[2]=10;
d[3]=(min%10);
d[4]=(min/10);
d[5]=10;
d[6]=(hour%10);
d[7]=(hour/10);
end
always@(negedgeclk0)
begin
scan=scan+3'b001;
case(scan)
3'h0:
beginwei=8'hFE;seg=d[0];end
3'h1:
beginwei=8'hFD;seg=d[1];end
3'h2:
beginwei=8'hFB;seg=d[2];end
3'h3:
beginwei=8'hF7;seg=d[3];end
3'h4:
beginwei=8'hEF;seg=d[4];end
3'h5:
beginwei=8'hDF;seg=d[5];end
3'h6:
beginwei=8'hBF;seg=d[6];end
3'h7:
beginwei=8'h7F;seg=d[7];end
endcase
case(seg)
4'h0:
duan=8'h3F;
4'h1:
duan=8'h06;
4'h2:
duan=8'h5B;
4'h3:
duan=8'h4F;
4'h4:
duan=8'h66;
4'h5:
duan=8'h6D;
4'h6:
duan=8'h7D;
4'h7:
duan=8'h07;
4'h8:
duan=8'h7F;
4'h9:
duan=8'h6F;
default:
duan=8'h40;
endcase
end
endmodule