找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17476|回复: 1
打印 上一主题 下一主题
收起左侧

基于FPGA的数字电子时钟设计与实现,含源码,原理图与WORD格式论文

[复制链接]
跳转到指定楼层
楼主
这是我用Altera公司下集成软件Quartus II硬件开发板来实现的,通过Verilog HDL硬件描述性语言建模来分层次分模块设计一个具有时分秒的电子钟并能设置任意时刻闹钟,在ModelSim上仿真测试,最后在Cyclone IV E的FPGA实验平台上实际测试验证。
本科毕业论文(设计)
题目基于FPGA的24小时数字钟的设计
姓名
专业
学院
学号
导师:
职称


基于FPGA的24小时数字钟设计


摘要】介绍利用verilogHDL硬件描述语言结合FPGA(Field Programmable Gate Array)编程器件进行数字钟的设计,并通过数码管动态扫描显示计时结果。本文采用分层次分模块的方法,用verilog语言进行设计。在Quartus II 11.0开发平台上完成设计,编译,管脚分配,在ModelSim上仿真验证,并在FPGA硬件上进行测试。该测试结果表明该设计方案切实可行。
关键词】FPGA;verilog;Quartus II 11.0;ModelSim;数字钟

Design of digital clock 24 hours based on FPGA

Medical imaging college of medical engineering professional level 2012

wangling student number: 1063451392

Instructor: he ling li

abstract】Introducing the design of digital clock combined FPGA with verilogHDL,the time of clock can be displayed with the digital driving circuit.the project adopts the methods of Hierarchical modules to design with verilogHDL.the digital clock is designed,compiled and pin assignment on Quartus II 11.0 ,is simulated on ModelSim and is tested in the experiment box. The simulation waves and test results indicate that the project is feasible.
key words】 FPGA; verilog; Quartus II 11.0; ModelSim; digital clock

目录
基于FPGA的24小时数字钟设计
引言
1.软件与verilogHDL介绍
1.1软件引入
1.2语言介绍
2.数字钟的设计方案及原理
2.1设计方案
2.2设计原理
2.2.1数字钟组成框图
2.2.2数字钟层次结构图
3.核心模块设计
3.1顶层模块
3.2底层模块
4.管脚分配
5.电路测试
6.注意事项
7.心得与体会
【参考文献】
致谢
附录




引言
  随着现代电子技术的发展,数字电子时钟在家庭,车站,医院,办公等各个场所有着广泛的应用,成为人们生活的必需品,由于生产工艺上的进步大大降低了现场可编程门阵列(FPGA)的成本,使其成为目前设计数字电路的首选器件之一[1]。电子时钟的精度远远大于老式钟表,而且在钟表的报时能功能的基础上不断发展,诸如自动定时报警装置,定时广播,闹钟设置,甚至各种大型医疗设备的定时启用,智能仪表,机器人,所有这些都是在数字钟表的基础上实现,为其他电路的设计提供一定借鉴作用[1]。因此对简单数字钟的研究有极大的意义。
1.软件与verilogHDL介绍1.1软件引入
  Altera® Quartus® II设计软件是适合单芯片可编程系统(SOPC)的最全面的设计环境[2]。建立工程项目和verilog HDL文件设计之后,可以使用 Quartus II 软件中的 Settings 对话框、Assignment Editor 和 Floorplan Editor 指定初始设计约束条件,例如,引脚分配、器件选项和时序约束条件[2]。Quartus II还提供Compiler Settings 向导(Assignments 菜单)协助用户指定初始设计的约束条件。
  ModelSim仿真工具是Model公司开发的,它支持Verilog、VHDL以及他们的混合仿真,它可以将整个程序分步执行,使设计者直接看到程序下一步将要执行的语句,而且在程序执行的任何步骤任何时刻都可以查看任意变量的当前值。可以在Dataflow窗口观察某一单元或模块的输入输出连续变化等,比Quartus 自带的仿真功能强大的多,支持Testbench,是目前业界最通用的仿真器之一[2]
1.2语言介绍
  Verilog语言形式简单,与C语言相近,容易掌握,在门级开关电路描述方面比VHDL强的多[3]。相比传统电路原理图输入法,verilogHDL设计周期短,无需专门的设计工具即可很轻松的将完成的设计移植到不同厂家的不同芯片中去[3],并在不同规模应用时比较方便的作修改调整。由于verilog HDL的信号位数是很容易改变的,故可对它进行修改来适应不同的规模你应用[4]。且在仿真验证时,仿真测试文件可采用同一种描述语言来对设计电路进行测试。Verilog HDL 程序是由模块构成的,每个模块的内容都是嵌在module和endmodule两个语句之间,每个verilog程序包括四个主要部分:端口定义,I/O说明,内部信号声明,功能定义。每个模块实现特定的功能,模块是可以进行层次嵌套的。正因为如此,才可以将大型的数字电路设计分割成不同的小模块来实现特定的功能,最后通过顶层模块调用子模块来实现整体功能[4]

2.数字钟的设计方案及原理2.1设计方案
  本文以FPGA为实验平台,采用VerilogHDL语言在Quartus II 11.0开发环境下设计数字时钟[5-6],具有计时,校时,整点报时的功能,具体功能为:1)能够对小时、分钟、秒钟进行正常计时,每日按24小时计时制,能用四个七段式数码管清晰显示时和分,八个LED采用二进制形式来显示秒钟。2)具有复位功能,按下reset键可以对当前时间清零。3)校验功能,能够对数字钟进行分时设置,方便在时钟跑错时进行校正。4)整点报时功能,当为12:00时和00:00时,蜂鸣器以1Hz的频率响起12下,报整点功能实现。
数字钟的硬件框图如图1所示。


图1 数字钟的硬件框图
2.2设计原理2.2.1数字钟组成框图
  数字时钟组成框图如图2所示。可见,它由2个60进制计数器、1个24进制计数器和2个2选1数据选择器共5个模块组成。3个计数器共用一个时钟信号CP,CP是50M系统时钟分频后的1Hz信号。在时和分的输出端接上译码电路,用四个共阳极的七段数码管显示出时间[7] ,秒的输出用8个LED的二进制形式来表示。两个选择器分别选择时计数器和分计数器的使能控制信号,对时间进行校正时,在控制端(Adj_hour和Adj_min)的作用下,使能信号接高电平,此时每来一个时钟信号,计数器加1计数,从而实现对小时和分钟的校正[8]。正常计时时,使能信号来自于低位计数器的进位输出,即秒计数达到59s时,产生输出信号(Sco=1)使分计数器加1,分、秒计数器同时计时到最大值(59s 59min)时 ,产生输出信号(Mco=1)使小时计数器加1。

图2 数字钟组成框图(见51hei附件)

2.2.2数字钟层次结构图
  数字时钟的层次结构图如图3所示。可以看出,整个程序分为两个层次4个模块,其结构层次如图2所示。底层由3个模块组成,6进制计数器模块(counter6.v)、10进制计数模(counter10.v)和24进制计数模块(counter24.v),顶层有一个模块(top_clock.v),它调用底层的3个模块完成数字钟的计时功能。

        
图3数字钟程序的层次结构图
3.核心模块设计3.1顶层模块
  建立数字时钟工程new project  clock,设计顶层模块top_clock.v,顶层模块包括1Hz分频电路、整点报时电路、数码管动态扫描(移位、选择)、译码、显示电路。其顶层框图如图4所示。


           
图4 数字钟顶层框图

(1)生成1Hz时钟信号模块
  时分秒计数器的计时时钟cp为1Hz的信号,而系统时钟信号(sys_clk)为50MHz,因此需要对50MHz信号进行分频得到1Hz。具体分频的代码为:
always@(posedge sys_clk or negedge reset) begin
  if(~reset)begin
    cnt<=0;cp<=0;
    end else begin
       if(cnt=25’d24999999)begin
         cp<=~cp;cnt<=0;
        end else begin
          cnt<=cnt+1;
        end
     end
end
(2)整点报时模块
  正常计数时,当分秒计数达到59分59秒,下一个时钟信号cp的上升沿到来时蜂鸣器以1Hz的频率发出蜂鸣实现整点报时,且N整点时,蜂鸣器就发出N声“嘀”响,13时及13时以后的每个整点,蜂鸣器发出(N-12)声“嘀”响。具体整点报时代码为:
assign hour_num=hour[7:4]*10+hour[3:0]+1;
always@(posedge cp or negedge reset)begin
if(~reset)        bp_cnt_end<={5{1'b1}};
else if(hour_en)
bp_cnt_end<=((hour_num==24)?12:(hour_num>=13)?(hour_num-12):hour_num)-1;
end
always@(posedge cp or negedge reset)begin
if(~reset)                 bp_cnt<={5{1'b1}};
else if(hour_en)           bp_cnt<=5'b0;
else if(bp_cnt<bp_cnt_end)   bp_cnt<=bp_cnt+1'b1;
end
always@(posedge cp or negedge reset)begin
if(~reset)                  bp_enable<=1'b0;
else if(hour_en)            bp_enable<=1'b1;
else bp_enable<=(bp_cnt<bp_cnt_end);
end
assign cp_out=scan_cnt[19] & bp_enable&cp;

(3)扫描信号模块
  数字钟工作于正常时,每来一个时钟信号sys_clk,reg [SCAN_CNT_WIDTH-1:0]scan_cnt进行动态扫描移位状态(00,01,10,11)来选择一个数码管,只要扫描速度足够快,利用发光二极管的余晖和人眼视觉的暂留作用,使人感觉每个数码管都在显示。具体扫描代码为:
always@(posedge sys_clk or negedge reset)
  begin
    if(~reset)
      scan_cnt<=0;
    else begin
      scan_cnt<=scan_cnt+1;
     end
              end
always@(*)  
  begin
    case(scan_cnt[SCAN_CNT_WIDTH-1:SCAN_CNT_WIDTH-2])
                 2'b00:begin DIG_r<=4'b0001; scan_out<=minute[3:0];end
                 2'b01:begin DIG_r<=4'b0010; scan_out<=minute[7:4];end
                 2'b10:begin DIG_r<=4'b0100; scan_out<=hour[3:0];end
                 2'b11:begin DIG_r<=4'b1000; scan_out<=hour[7:4];end
      default:begin DIG_r<=4'b0000;scan_out<=4'b0;end
    endcase
   end

(4)选择显示数据及译码模块
  扫描信号决定某一时刻哪一个数码管被点亮,扫描信号也是显示时间数据的选择信号。由于时间数据为BCD码形式,需译成七段显示码。具体代码为:
always@(*)
  begin
     case (scan_out)
         0: seg7_out_r = 7'b0111111; // 0
         1: seg7_out_r = 7'b0000110; // 1
         2: seg7_out_r = 7'b1011011; // 2
         3: seg7_out_r = 7'b1001111; // 3
         4: seg7_out_r = 7'b1100110; // 4
         5: seg7_out_r = 7'b1101101; // 5
         6: seg7_out_r = 7'b1111101; // 6
         7: seg7_out_r = 7'b0100111; // 7
         8: seg7_out_r = 7'b1111111; // 8
         9: seg7_out_r = 7'b1100111; // 9
         10: seg7_out_r = 7'b1110111; // A
         11: seg7_out_r = 7'b1111100; // b
         12: seg7_out_r = 7'b0111001; // c
         13: seg7_out_r = 7'b1011110; // d
         14: seg7_out_r = 7'b1111001; // E
         15: seg7_out_r = 7'b1110001; // F
         default: seg7_out_r = 7'b0000000;
     endcase
     end

(4)结果显示模块

   assign seg7_out={1'b0,(~seg7_out_r[6:0])};   
   assign DIG=~DIG_r[3:0];
   assign second_out=second[3:0]+second[7:4]*10;

(5)分时校验模块
  使能端(en),复位(reset)为高电平时有效且计数器正常计时,分时校验adj_min,adj_hour 为高电平时(本实验开发板将拨码开关拨到off状态)停止计时此时数码管处于调表状态(每隔一秒数码管分和时的数字显示增加1且互不影响),分时校验为低电平时计数器正常计时。具体分时校验代码为:
assign minL_en=adj_min?vdd:(second==8'h59);
assign minH_en=(adj_min&&(minute[3:0]==4'h9))||(minute[3:0]==4'h9)&&(second==8'h59);
assign hour_en=adj_hour?vdd:((minute==8'h59)&&(second==8'h59));
3.2底层模块
  设计6进制计数器模块(counter6.v)、10进制计数器模块(counter10.v)和24进制计数器模块(counter24.v)。计数结果为BCD码形式,通过调用这三个元件可以实现计时(当使能端en和ncr为高电平时,每来一个脉冲,计数器q加1直到计满回零)。其各模块框图如图5如下:
图5  6、10、24进制模块框图


(1)6进制计数器模块仿真波形及代码实现

图6  6进制计数波形

module counter6 (q,reset,en,cp);
input cp,reset,en;
output[3:0]q;
reg[3:0]q;
always@(posedge cp or negedge reset)
begin
  if(~reset)q<=4'b0000;           
  else if (~en)q<=q;
  else if(q==4'b0101)q<=4'b0000;
  else q<=q+1'b1;     
  end
  endmodule

(2)10进制计数器模块仿真波形及代码实现
图7  10进制计数波形
module counter10 (q,reset,en,cp);
input cp,reset,en;
output[3:0]q;
reg[3:0]q;
always@(posedge cp or negedge reset)
begin
  if(~reset)q<=4'b0000;
  else if(~en)q<=q;
  else if(q==4'b1001)q<=4'b0000;
  else q<=q+1'b1;
  end
  endmodule
(3)24进制计数器模块仿真波形及代码实现

图8  24进制计数波形

module counter24(cntH,cntL,reset,en,cp);
input cp,reset,en;
output [3:0] cntH,cntL;
reg[3:0]cntH,cntL;
always@(posedge cp or negedge reset)
begin
if(~reset){cntH,cntL}<=8'h00;
   else if(~en)
    {cntH,cntL}<={cntH,cntL};
   else if ((cntH>2)||(cntL>9)||((cntH==2)&&(cntL>=3)))
    {cntH,cntL}<=8'h00;
              else if ((cntH==2)&&(cntL<3))
                 begin
                              cntH<=cntH;
                              cntL<=cntL+1'b1;
                            end
   else if(cntL==9)
                 begin
                   cntH<=cntH+1'b1;
                              cntL<=4'b0000;
                            end
else
   begin
     cntH<=cntH;
                cntL<=cntL+1'b1;
              end
end
endmodule                             
4.管脚分配
  选择目标器件并对相应地引脚进行锁定。在这里所选择的器件为Altera公司Cyclone E系列的EP4C6E22C8芯片,引脚分配方法如表1。
注:在管脚分配时,FPGA的101引脚会出现出现Error: Can't place multiple pins assigned to pin location Pin_XX (IOC_X28_Y2_N0)
解决方法:
  Assignments->Device->Device and pin options->(卡)Dual purpose pin将nCE0以及Other Active Parallel Pins(其他复用的管脚)全部设置改为: “use as regular IO”默认只给FPGA下载使用选择复用了就是下载完还可以给普通IO使用。

表1  引脚分配方法

信号

引脚

信号

引脚

sys_clk

PIN_91

DIG[3]

SEG_C4_87

reset

PIN_90

DIG[2]

SEG_C3_86

adj_min

SW_KEY1_34

DIG[1]

SEG-C2_99

adj_hour

SW_KEY2_33

DIG[0]

SEG_C1_98

seg7_out[7]

LED8_105

second[7]

PIN_144

seg7_out[6]

LED7_103

second[6]

PIN_143

seg7_out[5]

LED6_101

second[5]

PIN_142

seg7_out[4]

LED5_106

second[4]

PIN_1

seg7_out[3]

LED4_110

second[3]

PIN_2

seg7_out[2]

LED3_104

second[2]

PIN_3

seg7_out[1]

LED2_111

second[1]

PIN_31

seg7_out[0]

LED1_100

second[0]

PIN_39

5.电路测试
  为验证设计电路,最后将程序下载到FPGA开发板上进行硬件测试。下载目标器件选用Alter公司的Cyclone IV E系列的EP4C6E22C8芯片,用Quartus II 11.0 软件进行电路综合及程序下载。器件管脚设定后,将程序再编译一次,最终生成可以下载的目标文件。将器件设定的相应管脚和数码管驱动电路进行连接,最后将目标文件下载到器件当中,则数码管显示计时结果且能实现分时校验。通过测试计时结果与分时校验正确。

6.注意事项
(1)实验过程中发现数码管部分管子的时不亮时微亮导致数字的显示不清晰。分析数码管的扫描频率为系统脉冲50MHz,而FPGA数码管的扫描频率不支持太高频率或者是数码管的管脚不支持太高频,而把扫描频率降下来即可(本实验采用增大扫描频率的位宽,由于位宽定义的越大,扫描频率越低)。程序改动如下:
reg[7:0]scan_out改为reg[19:0]scan_out
case(scan_cntt[7:6])改为case(scan_cnt[19:18])
这样即可解决数码管显示不清的问题。
  • 在观察实验的过程中将ifcnt==24999999)改成if(cnt==25000000/k-1)即可将时间走快k倍方便观察实验结果。

7.心得与体会
  本次论文从查阅文献,结合实际选题,软件安装到可实施方案的设计,VerilogHDL的编写,由于是第一次做电子硬件功能设计:
  首先:在设计思路上存在严重模糊,逻辑混乱,尤其在顶层模块的设计时不能理清模块之间的相互关系,对一些基本概念缺乏准确的认识;
  其次:对软件的安装及操作环境的不熟悉导致实验进行的缓慢;
  第三:第一次仓促自学VerilogHDL语言常常犯一些低级的语法错误,即使是一个标点、匹配问题、数据类型定义错了都会导致一连串的错误,故在编程时一定要倍加仔细;
  第四:在仿真波形的观察与分析上明显感到专业知识的不够,尤其在对分频,扫描,译码,显示电路这块由于扫描频率、延时单位、时间精度及运行时间没有设计好导致无法观察实验意达到的波形及显示结果;
  第五:此次论文设计时间仓促且基础不够没有进一步做数字时钟的功能扩展;
  第六:实验是检验原理方案的唯一方法,只有通过不断的尝试、观察、分析才能得到正确的实验结果。
  最后:此次论文也收获很多,学习了数字系统自上而下的设计方法,进一步熟悉层次电路的设计方法。自顶而下的电子设计方法能使程序之间条理理清晰,分工明确,便于设计。同时也培养了自己动手设计实验的能力及对计算机软件编程应用方面的兴趣也为今后的学习打好基础。
【参考文献】
[1]康华光,邹寿彬.《电子技术基础数字部分(第五版)》[M].北京:高等教育出版社,2005144-146,162-163,121-133.
[2]陈欣波.Alter FPGA 工程师成长手册[M].北京:清华大学出版社,2012.
[3]夏宇闻.verilog基本知识(下)[J].电子产品世界,2002,(20):87-90.
[4]夏宇闻.《verilog数字系统设计教程》[M].北京:北京航空航天大学,2004年版.
[5]纪欣然,丁一,梁致源.基于FPGA的多功能数字钟设计[J].
电子设计工程,2012,20(16):177-179.
JI Xin-ran,DING Yi,LIANG Zhi-yuan.Design of
multifunction digital clock based on FPGA [J].Electronic
Design Engineering,2012,20(16):177-179.
[6]徐大诏.基于FPGA实现的数字钟设计[J].信息技术.
[7]杨军.基于FPGA的SOPC实践教程[M].北京:科学出版社,2010.
[8]王琥,任峻.基于FPGA的数字电子钟设计[J].电子设计工程,2014,22(4):127-129

致谢
  本次论文得以完成首先要感谢我的指导老师--何伶俐老师,从选题到写作方向与思路再到整个论文的完成,在此期间不管大大小小的问题,只要我问到,何老师都会第一时间不厌其烦的为我解答。何老师认真负责的教学精神与朴实的品质深深的影响了我,告诫我科研来不得半点虚假,一定要脚踏实地是什么就是什么。其次,感谢参考文献作者所提到的方法与观点,正是因为阅读了作者的相关著作让我对层次电路的设计有了进一步的认识并逐渐熟悉了verilog语言的编程风格。然后我要感谢亲爱的同学们,正是因为你们的陪伴与鼓励使我变得坚强与勇毅,另外也非常感谢网上热心论坛好友提供的帮助和解答。最后由于专业知识所限,论文中还存在很多瑕疵和需要研究改进的地方,望老师和同学予以指正。再次感谢四年来老师的谆谆教导,感谢同学的帮助与关心,祝福我的老师工作愉悦,阖家幸福,我的同学工作顺利,勇攀高峰。

附录
(图片)
            



(代码)


…………
…………

完整的Word格式文档51黑下载地址(内含清晰图片与源代码):
基于FPGA的数字电子时钟设计与实现.doc (6.21 MB, 下载次数: 204)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:780207 发表于 2020-6-17 17:29 | 只看该作者
不错,值得下载学习。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表