您的当前位置:首页正文

基于VerilogHDL设计的数字时钟

2020-06-02 来源:小奈知识网
精品-----

深圳大学考试答题纸

(以论文、报告等形式考核专用)

二○ 18 ~二○ 19 学年度第 一 学期

课程编

1602080001

号 学

号 教师评语: 姓名

李思豪

专业年级

电子科学与技术16级1班

课程名称

硬件描述语言与逻辑综合 主讲教师 刘春平 评分 题目:

基于Verilog HDL设计的数字时钟

摘 要:本文利用Verilog HDL语言自顶向下的设计方法设计多功能数字钟,突出了其作为硬件描述语言的良好的可读性、可移植性和易理解等优点,并通过Altera QuartusⅡ 6.0和cyclnoe II EP2C35F672C6完成综合、仿真。此程序通过下载到FPGA芯片后,可应用于实际的数字钟显示中

关键词:Verilog HDL;硬件描述语言;FPGA

--精品

精品-----

目录

一、实验任务 ........................................................................................ 3

实验目的 ........................................................................................ 3 实验要求 ........................................................................................ 3 二、设计思路 ........................................................................................ 3 三、实验结果 ...................................................................................... 10 四、总结与收获 ................................................................................. 14

--精品

精品-----

一、实验任务

实验目的

1. 深入了解基于quartus ii工具的复杂时序逻辑电路的设计。 2. 理解并熟练利用EDA工具进行综合设计。 3. 熟练掌握芯片烧录的流程及步骤。

4. 掌握Verilog HDL 语言的语法规范及时序电路描述方法。

实验要求

设计一个带秒表功能的24 小时数字钟,它包括以下几个组成部分:

① 显示屏,由6 个七段数码管组成,用于显示当前时间(时:分,秒)或设置的秒表时间;

② 复位键 复位所有显示和计数

③ 设置键,用于确定新的时间设置,三个消抖按键分别用于时分秒的设置 ④ 秒表键,用于切换成秒表功能 基本要求

(1) 计时功能:这是本计时器设计的基本功能,每隔一秒计时一次,并在显示屏上显示当前时间。

(2) 秒表功能:设置时间,进行倒计时功能

(3) 设置新的计时器时间:按下设置键后,用户能通过时分秒三个消抖按键对时间进行设置。

二、设计思路

--精品

精品-----

1、总原理框图:

--精品

精品-----

原理如上图所示,时钟由分频器模块,数码管显示模块,计时器模块三个模块构成,每个模块实现如下的不同功能,最后通过在顶层模块的调用,来实现时钟功能。

2. 顶层模块:

顶层模块调用三个字模块,并且定义输入输出口,代码输入所示:

module

myclock2(daojishi,stop,clk,reset,shi,fen,miao,miaoout1,miaoout2,fenout1,fenout2,shiout1,shiout2); input clk,reset,stop,shi,fen,miao,daojishi;

output[6:0] miaoout1,miaoout2,fenout1,fenout2,shiout1,shiout2; wire[3:0] miao1,miao2,fen1,fen2,shi1,shi2; wire clk_1hz;

divider_1HZ divider1hz(clk_1hz,reset,clk);

count count1(daojishi,shi,fen,miao,stop,miao1,miao2,fen1,fen2,shi1,shi2,reset,clk_1hz); decode4_7 d0(miaoout1,miao1); decode4_7 d1(miaoout2,miao2); decode4_7 d2(fenout1,fen1); decode4_7 d3(fenout2,fen2); decode4_7 d4(shiout1,shi1); decode4_7 d5(shiout2,shi2); endmodule

输入输出端口类型功能表:

引脚名 daojishi stop clk reset shi fen miao miaoout1 miaoout2 fenout1 fenout2 shiout1 shiout2

类型 input input input input input input input output output output output output output 功能 秒表倒计时模式 暂停按键 晶振脉冲 复位按键 小时调节按键 分钟调节按键 秒调节按键 秒个位数码管输出 秒十位数码管输出 分个位数码管输出 分十位数码管输出 时个位数码管输出 时十位数码管输出 三个子模块的原理和代码:

--精品

精品-----

(1)分频模块 :

分频模块的作用主要是要获得各种频率的时钟信号。输入信号27MHZ的信号,要想获得1HZ的信号作为秒脉冲计时,则要对27MHZ信号分频。通过计数的方式,当计数从0开始到13999999时,1HZ信号取反一次,计数又从0开始,如此循环,就可以得到1HZ脉冲信号。对于其他信号也是如此,只是计数值不一样,得到的分频信号不同。

模块代码如下:

module divider_1HZ(clk_1hz,reset,clk); output clk_1hz; input reset,clk; reg clk_1hz; reg[23:0] count; always @(posedge clk) begin

if(reset) begin

count<=0; clk_1hz<=0; end else begin

if(count==13499999)

--精品

精品-----

end end

else

begin end

count<=0;

clk_1hz<=~clk_1hz;

count<=count+1;//计数

endmodule

(2)译码显示模块:

一、数码管显示:通过传入响应的十进制数,运用case语句转换输出相应的7位二进制显示码,送入数码管显示。

代码如下:

module decode4_7(temp,indec); output[6:0] temp; input[3:0] indec; reg[6:0] temp; always @(indec) begin

case(indec) //用case 语句进行译码 4'd0:temp[6:0]=7'b1000000; 4'd1:temp[6:0]=7'b1111001; 4'd2:temp[6:0]=7'b0100100; 4'd3:temp[6:0]=7'b0110000; 4'd4:temp[6:0]=7'b0011001; 4'd5:temp[6:0]=7'b0010010; 4'd6:temp[6:0]=7'b0000010; 4'd7:temp[6:0]=7'b1111000; 4'd8:temp[6:0]=7'b0000000; 4'd9:temp[6:0]=7'b0010000;

--精品

精品-----

default: temp=7'bz; endcase end

endmodule

(3)、计时器模块 :

秒计数:在1HZ脉冲下进行秒计时,当计时达到59秒后,在下一个脉冲来临变0,并发出一个脉冲信号,可供下面分钟计数作为输入脉冲信号计时。

分钟计数:在输入脉冲下,分钟开始计时,当计时达到59后,在下一个脉冲来临变0,并发出一个脉冲,供小时计数的输入脉冲新号。

小时计数:脉冲信号来临时,计数加1,达到23后在下一个脉冲的作用下清零,从新计时。

如果有复位信号,则时分秒全部清零。

计时器模块还包含了设置时间 和秒表切换的功能 部分代码如下:

module count(daojishi,shi,fen,miao,stop,miao1,miao2,fen1,fen2,shi1,shi2,reset,clk_1hz); input reset,clk_1hz,stop,daojishi; input shi,fen,miao;

output miao1,miao2,fen1,fen2,shi1,shi2; reg[3:0] miao1,miao2,fen1,fen2,shi1,shi2; always @(posedge clk_1hz) begin if(reset) begin

miao1<=0;miao2<=0;fen1<=0;fen2<=0;shi1<=0;shi2<=0;

--精品

精品-----

end if(stop==1)

begin //秒调节

if(miao==0) begin

miao1<=miao1+1; if(miao1==9) begin

miao1<=0; miao2<=miao2+1; if(miao2==5) begin miao2<=0; end end end

if(fen==0) //分调节 begin

fen1<=fen1+1; if(fen1==9)

--精品

精品-----

begin

fen1<=0; fen2<=fen2+1; if(fen2==5) begin fen2<=0; end end end

if(shi==0) //时调节 begin

shi1<=shi1+1;

if(shi1==9||((shi1==3)&&(shi2==2))) begin

shi1<=0; shi2<=shi2+1; if(shi2>=2) begin shi2<=0; end end

--精品

精品-----

end end

if((!reset)&&(stop==0)) begin

if(daojishi==0) //时钟程序 begin

miao1<=miao1+1;

if(miao1==9) begin

miao1<=0;

miao2<=miao2+1; if(miao2==5) begin

miao2<=0; fen1<=fen1+1; if(fen1==9) begin fen1<=0; fen2<=fen2+1; if(fen2==5) begin fen2<=0;

--精品

精品-----

shi1<=shi1+1;

if((shi1==9)||((shi1==3)&&(shi2==2))) begin shi1<=0; shi2<=shi2+1; if(shi2==2) begin shi2<=0; end end end end end end end

else //倒计时程序 begin

if(!((shi1==0)&&(shi2==0)&&(fen1==0)&&(fen2==0)&&(miao2==0)&&(miao1==0))) begin

miao1<=miao1-1; if(miao1==0)

--精品

精品-----

begin

miao1<=9;

miao2<=miao2-1; if(miao2==0) begin

miao2<=5; fen1<=fen1-1; if(fen1==0) begin fen1<=9; fen2<=fen2-1; if(fen2==0) begin fen2<=5; shi1<=shi1-1; if(shi1==0) begin shi1<=9; shi2<=shi2-1; if(shi2==0) begin shi2<=0;

--精品

精品-----

end end end end end end end end end end

endmodule

3. 引脚排布:如下所示:

--精品

精品-----

引脚分布图

二、实验结果

(1)波形仿真

在Quartus II中利用仿真波形进行功能或时序仿真的基本步骤如下: (1)创建新的矢量波形文件(*.vwf). (2)添加输入、输出节点。 (3)编译输入节点的波形。

(4)完成矢量波形文件的创建之后,用户即可以对设计进行功能或时序仿真。

--精品

精品-----

(5)仿真启动后,状态窗口会同时自动打开,在状态窗口中显示仿真进度及所用时间。

(6)默认情况下,仿真器报告窗口内在仿真过程中会显示仿真波形部分,其中还包括当前仿真器的设置信息和仿真信息等。

下面我们单独对三个子模块分别进行仿真并分析仿真结果: (1)分频器模块仿真结果:

分频器仿真图

仿真分析:我们取时钟信号的周期是20ns,为了让仿真结果更明显,取每三个时钟周期让秒脉冲clk_1hz翻转一次,而不是1349999翻转一次。并且让reset复位信号在仿真的160ns-300ns有效。结果如图所示,在每三个时钟信号出现时,秒脉冲都会翻转一次,在reset信号有效时,秒脉冲无输出,仿真结果符合预计要求。

--精品

精品-----

(2)显示译码模块仿真结果:

数码管输出数字8仿真图

数码管输出数字8仿真图

仿真结果分析: indec是我们要输出的十进制数,temp是连接7段数码的7位二

--精品

精品-----

进制数,已知数码管为共阴极数码管。我们设定indec为8,从图中可以看见temp[7:0]都是0;所以7个数码管都会被点亮,就是显示8。我们再设定indec为1,可以预见1在数码管中应该是亮两个,如第二图所示只有temp[1]和temp[2]是0,所以就是亮两个灯,显示1。仿真结果符合设计要求。

(3)计时器模块仿真结果:

计数器计数仿真图

--精品

精品-----

计数器复位测试仿真图

仿真结果:miao1,miao2,fen1,fen2,shi1,shi2分别是秒分时的个位和十位,时钟脉冲clk_1hz每一个上升沿,miao1就加1,miao1再依次进位给更高的为。如图所示,当miao1计数到9的时候,miao2加1,当miao2计数到5的时候,fen1加1,时钟计数功能实现,仿真符合设计要求。

图二是复位信号reset的测试,当reset为1有效时,累计的时间清零。如图所以,当reset=1时,miao1,miao2,fen1,fen2,shi1,shi2全部变0,仿真符合技术要求。

此模块还有设置时间和倒计时的功能,但是在波形仿真中不够直观,所以不做波形仿真。

(2)DE2开发板实现

将开发板插入电脑中,烧录进程序,进行各项功能测试,包括计时功能,时间调节功能,秒表功能,复位功能,暂停功能。 实验过程记录:

--精品

精品-----

(1)烧录程序完成,DE2立刻开始从0秒计数,依次向分钟,小时进位,当时间为 23:59:59时,下一秒全部跳0;时钟功能实现。

(2)复位功能测试:switch0为复位信号按键,拨下该按键,时间清零,复位功能实现。 (3)暂停功能测试:switch1为暂停信号按键,拨下该按键,时间暂停,暂停功能实现。 (4)时间设置测试:消抖按钮key0,key1,key2,分别是秒分时设置键。按下暂停键, 计数停止,每按一下key0,秒加一;每按一下key1,分加一;每按一下key2,小时加一。时间设置完成,回拨暂停键,时钟从设置的时间开始计时。时间设置功能实现。 (5)秒表倒计时功能测试:switch2为倒计时信号按键,拨下该键后,时钟开始倒计时,倒计时功能实现。

测试完成,所有测试结果符合设计要求,完成verilong时钟设计。

四、总结与心得体会

在QuartusII开发环境下,采用自顶向下的设计方法有利于在早期发现结构设计中的错误,避免不必要的重复设计。再结合基于FPGA 的可编程实验板,轻轻松松就能实现各种电子产品的设计,现场观察实验测试结果。大大缩短了产品

--精品

精品-----

的设计周期和调试周期,提高了设计的可靠性和成功率,充分体现了可编程逻辑器件在数字电路设计中的优越性。

在经过了四个星期的编写和仿真后,终于完成了设计要求,这次设计,我克服了很多关于设计问题方面的困难,特别是对verilog语法和规则的不熟悉导致很多困难,最后使我对Quartus II软件的使用有了更进一步的了解,同时也积累了一些经验。很多时候我们想要的功能,写出来的代码,并不是正确的,需要不断的调试,要理论联系实际,这样才能更快的完成设计任务。

--精品

因篇幅问题不能全部显示,请点此查看更多更全内容