基于verilog的数字时钟设计_数字时钟设计verilog
基于verilog的数字时钟设计由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“数字时钟设计verilog”。
课程设计
基于Verilog HDL的数字秒表设计
系别:物理与电气工程学院 专业:微电子学 班级:班 成员:
目录
一、前言…………………………………………………………………………………………………………………3
二、实验目的………………………………………………………………………………………………………….3
三、功能设计…………………………………………………………………………………………………………3
四、用Verilog描述电路……………………………………………………………………………………….4
4.1时钟调校及计时模块……………………………………………………………………………………4.2整数分频模块………………………………………………………………………………………………..8
4.3时钟信号选择模块………………………………………………………………………………………8
4.4七段显示设置………………………………………………………………………………………………14.4.1 BCD码显示模块……………………………………………………………………………………11
4.4.2 二位七段显示模块………………………………………………………………………………14.4.3一位七段显示模块………………………………………………………………………………12
4.5顶层模块实现…………………………………………………………………………………………14
五、模拟与仿真…………………………………………………………………………………………………..15
六、逻辑综合……………………………………………………………………………………………………….16
七、下载到硬件电路……………………………………………………………………………………………16
八、总结……………………………………………………………………………………………………………….18
九、心得体会……………………………………………………………………………………………………….18
十、参考文献……………………………………………………………………………………………………….19
一、前言
随着微电子技术的的飞速发展,大规模可编程器件的密度和性能不断提高,数字系统的设计方法、设计过程也发生了重大改变,传统的设计方法已经逐渐被电子设计自动化EDA(Electronic Design Automation)工具所取代。可编程器件可以通过硬件描述语言(如Verilog HDL)的形式根据实际设计的需要灵活地嵌入规模化的数字单元,大大地缩短了产品的设计周期。以可编程逻辑器件为核心的设计在数字系统设计领域将占据越来越重要的作用,因此,作为硬件设计者掌握EDA设计方法和工具是必须的。
二、实验目的(1)通过本次课程设计加深对Verilog语言课程的全面认识、复习和掌握。(2)掌握定时器、外部中断的设置和编程原理。
(3)通过此次课程设计能够将软硬件结合起来,对程序进行编辑、调试。使其能够通过电脑下载到芯片,正常工作。
(4)实际操作Quartus II软件,复习巩固以前所学知识。
三、功能设计
数字钟是一个常用的数字系统,其主要功能是计时和显示时间。这里通过一个数字钟表的模块化设计方法,说明自顶向下的模块化设计方法和实现一个项目的设计步骤。这里实现的电子表具有显示和调时的基本功能,可以显示时、分 秒和毫秒,并通过按键进行工作模式选择,工作模式有4种,分别是正常计时模式、调时模式、调分模式、调秒模式。
构成电子表的基本基本模块有四个,分别是时钟调校及计时模块myclock、整数分频模块int_div、时钟信号选择模块clkgen和七段显示模块disp_dec。
四、用Verilog实现电路
4.1时钟调校及计时模块
时钟调校及计时模块myclock实现的功能是根据当前的工作状态进行时、分、秒的调整或正常的计时。代码端口说明如下:
输入信号:
RSTn——复位信号
CLK——100Hz时钟信号
FLAG[1:0]——工作模式控制信号,模式定义为:00表示正常显示,01表示调时,10表示调分,11表示调秒;
UP——调校模式时以加1方式调节信号;
DN——调校模式时以减1方式调节信号。
输出信号:
H[7:0]——“时”数据(十六进制);
M[7:0]——“分”数据(十六进制);
S[7:0]——“秒”数据(十六进制);
MS[7:0]———“百分秒”数据(十六进制)。
该模块的设计思路是,当复位信号RSTn有效时,时、分、秒信号清零,否则工作模式控制信号FLAG的值决定当前的工作状态。当FLAG=2’b00时,电子表工作在正常计时状态,对输入的100Hz的时钟信号clk进行计数,修改当前的百分秒(MS)、秒(S)、分(M)和时(H)的计数值;当FLAG信号=2’b01时,电子表工作在“时”校正状态,若此时UP信号有效则H加1,若此时DN信号有效则H减1,;当FLAG信号=1’b10时,电子表工作在“分” 校正状态,若此时UP信号有效则M加1,若此时DN信号有效则M减1;当FLAG=2’b11时,电子表工作在“秒”校正状态,其UP和DN的控制过程与“时”、“分”类似
代码:
module myclock(RSTn,CLK,FLAG,UP,DN,H,M,S,MS);
input RSTn,CLK,UP,DN;
output [7:0] H,M,S;
output [7:0] MS;
input[1:0] FLAG;
reg [5:0] m_H,m_M,m_S;
reg [6:0] m_MS;
aign H=m_H;
aign M=m_M;
aign S=m_S;
aign MS=m_MS;
always @(posedge CLK)
if(~RSTn)
begin
m_H
m_M
m_S
m_MS
end
else if(FLAG==2'b01)
begin
if(UP)
begin
if(m_H==8'd23)
m_H
else
m_H=m_H+1'b1;
end
else if(DN)
//复位状态
//调时状态 5
begin
if(m_H==8'h00)
m_H
else
m_H
end
end
else if(FLAG==2'b10)
begin
if(UP)
if(m_M==8'd59)
m_M
else
m_M
else if(DN)
if(m_M==8'h00)
m_M
else
m_M
end
else if(FLAG==2'b11)
begin
if(UP)
if(m_S==8'd59)
m_S
else
m_S
else if(DN)
if(m_S==8'h00)
//调分状态
//调秒状态6
m_S
else
m_S
end
else
begin
//正常计时状态
if(m_MS==8'd99)
begin
m_MS
if(m_S==8'd59)
begin
m_S
if(m_M==8'd59)
begin
m_M
if(m_H==8'd23)
m_H
else
m_H
end
else
m_M
end
else
m_S
end
else
m_MS
end
endmodule
4.2整数分频模块
由于数字系统提供的基准时钟信号频率往往较高,因此需要分频模块产生所需频率的失踪信号,例如上面时钟校正及计时模块所需的100Hz的时钟信号。整数分频模块int_div可以实现对输入时钟clock进行F_DIV分频后输出clk_out。F_DIV分频系数范围为1~2^n(n=F_DIV_WIDTH),若要改变分频系数,改变参数F_DIV或F_DIV_WIDTH到相应范围即可。若分频系数为偶数,则输出时钟占空比为50%;若分频系数为奇数,则输出的时钟占空比取决于输入的时钟占空比和分频系数(当输入为50%时,输出也是50%)。
代码:
module int_div(clock,clk_out);
parameter F_DIV=48000000;
//分频系数
parameter F_DIV_WIDTH=32;
//分频计数器宽度
input clock;
//输入时钟
output clk_out;
//输出时钟
reg clk_p_r;
reg clk_n_r;
reg[F_DIV_WIDTH-1:0] count_p;
reg[F_DIV_WIDTH-1:0] count_n;
wire full_div_p;
//上升沿计数满标志
wire half_div_p;
//上升沿计数半满标志
wire full_div_n;
//下降沿计数满标志
wire half_div_n;
//下降沿计数半满标志
//判断计数标志位置位与否
aign full_div_p=(count_p
aign half_div_p=(count_p>1)-1);
aign full_div_n=(count_n
aign half_div_n=(count_n>1)-1);
//时钟输出
aign clk_out=(F_DIV==1)?clock:(F_DIV[0]?(clk_p_r&clk_n_r):clk_p_r);
always @(posedge clock)
//上升沿脉冲计数
begin
if(full_div_p)
begin
count_p
if(half_div_p)
clk_p_r
else
clk_p_r
end
else
begin
count_p
clk_p_r
end
end
always @(negedge clock)
//下降沿脉冲计数
begin
if(full_div_n)
begin
count_n
if(half_div_n)
clk_n_r
else
clk_n_r=1'b1;
end
else
begin
count_n
clk_n_r
end
end endmodule
4.3时钟信号选择模块
时钟信号选择模块clkgen实际上时一个二选一电路,用于提供时钟调校及计时时模块所需的时钟脉冲。当电子表工作在正常计时状态时选择100Hz时钟信号;当电子表工作在调时、调分、调秒是那种设置模式时,如果采用100Hz时钟信号,那么手动一次按键可能引起设置数据的一串跳变,因此为了方便按键时动作对时间的设置,这里采用2Hz的时钟信号。其端口说明如下:
flag——时钟选择输入信号;
clk_100Hz———输入100Hz的时钟信号;
clk_2Hz——输入2Hz的时钟信号;
Clkout——输出时钟信号。
代码:
module clkgen(flag,clk_100hz,clk_2hz,clkout);
input[1:0] flag;
//若flag=0则clkout=100Hz,否则clkout=2Hz
input clk_100hz,clk_2hz;
output clkout;
aign clkout=(flag==2'b00)?clk_100hz:clk_2hz;endmodule
4.4七段显示设置
为了对时钟时、分、秒和毫秒数据输出显示,需要将时、分、秒和毫秒的二进制转换为十进制数。由于时、分、秒最大到60,毫秒最大到99,所以十进制数选择2位就能满足要求。为了在七段数码管输出时间数据,还需要将显示的十进制数转化为七段段码。以上功能分别由BCD码显示模块和七段译码管模块来实现。
4.4.1 BCD码显示模块
BCD码显示模块的功能是将8位二进制数转化为2位十进制数后,进行七段段译码显示。为了实现显示功能,在其内部调用了dual_hex 2位七段显示模块。其端口说明如下:
输入信号:
hex——2位8421BCD码输入。输出信号:
dispout——2位8421码对应的七段数码管段码。
代码:
module disp_dec(hex,dispout);
input[7:0] hex;
//八位二进制输入数据
output[15:0] dispout;
//2位十进制的七段段码显示数据
reg[7:0] dec;
always @(hex)
begin
//8位二进制数转化为2位BCD码
dec[7:4]=hex/4'd10;
dec[3:0]=hex%4'd10;
end
dual_hex u1(1'b0,dec,dispout);
//调用2位共阳极七段显示模块 endmodule
4.4.2 二位七段显示模块
二位七段显示模块的功能是将2进制或十六进制数转化为对应的七段段码,内部调用了一位七段译码模块seg_decoder。
代码:
module dual_hex(iflag,datain,dispout);
input iflag;
//共阴或共阳输出选择
input[7:0] datain;
//2位的十进制或十六进制数据
output[15:0] dispout;
//2个七段段码数据
seg_decoder u1(iflag,datain[7:4],dispout[15:8]);
seg_decoder u2(iflag,datain[3:0],dispout[7:0]);endmodule
4.4.3 一位七段译码模块
一位七段译码模块的功能是将4位二进制数转化为对应的共阴或共阳七段段码。
代码:
module seg_decoder(iflag,iA,oY);
input iflag;
//共阴或共阳输出选择
input[3:0] iA;
//4位二进制数据
output reg[7:0] oY;
//七段段码显示数据
always @(iflag,iA)
begin
case(iA)
//共阴级七段输出
4'b0000:oY=8'h3f;
4'b0001:oY=8'h06;
4'b0010:oY=8'h5b;
4'b0011:oY=8'h4f;
4'b0100:oY=8'h66;
4'b0101:oY=8'h6d;
4'b0110:oY=8'h7d;
4'b0111:oY=8'h27;
4'b1000:oY=8'h7f;
4'b1001:oY=8'h6f;
4'b1010:oY=8'h77;
4'b1011:oY=8'h7c;
4'b1100:oY=8'h58;
4'b1101:oY=8'h5e;
4'b1110:oY=8'h79;
4'b1111:oY=8'h71;
endcase
if(!iflag)
oY=~oY;
end endmodule
//共阳极七段输出 13
4.5、顶层模块的实现
顶层模块是将各功能模块连接起来,实现电子表的完整功能。其端口信号说明如下:
输入信号:
iCLK——50——50MHz时钟信号;
RSTn——复位信号;
FLAG——工作模式控制信号,模式定义为:00表示正常显示,01表示调时,10表示调分,11表示调秒;
UP——调校模式时以加1方式调节信号;
DN——调校模式时以减1方式调节信号。
输出信号:
H_dis——“小时”数据的七段数码管数据;
M_dis——“分钟”数据的七段数码管数据;
S_dis——“秒”数据的七段译码管数据;
MS_dis——“百分秒”数据的七段译码管数据; Mode——工作模式输出; H——“时”数据(十六进制);
M——“分”数据(十六进制);
S——“秒”数据(十六进制);
MS———“百分秒”数据(十六进制)。
代码:
module clock(iCLK_50,RSTn,FLAG,UP,DN,H_dis,M_dis,S_dis,MS_dis,Mode,H,M,S);
input iCLK_50;
input RSTn,UP,DN;
input [1:0] FLAG;
output [1:0] Mode;
output [15:0] H_dis,M_dis,S_dis,MS_dis;
output [7:0] H,M,S;
wire [7:0] MS;
wire clk_100hz,clk_2hz;
wire clk;
aign Mode=FLAG;
int_div #(500000,32)nclk100(iCLK_50,clk_100hz);
int_div #(50000000,32)nclk2(iCLK_50,clk_2hz);
clkgen u0(FLAG,clk_100ha,clk_2hz,clk);
myclock u1(RSTn,clk,FLAG,UP,DN,H,M,S,MS);
disp_dec Hour(H,H_dis);
disp_dec Minute(M,M_dis);
disp_dec Second(S,S_dis);
disp_dec hour(MS,MS_dis);endmodule
五、模拟与仿真
在Quartus II中利用仿真波形进行功能或时序仿真的基本步骤如下:(1)创建新的矢量波形文件(*.vwf).(2)添加输入、输出节点。(3)编译输入节点的波形。
(4)完成矢量波形文件的创建之后,用户即可以对设计进行功能或时序仿真。(5)仿真启动后,状态窗口会同时自动打开,在状态窗口中显示仿真进度及所用时间。
(6)默认情况下,仿真器报告窗口内在仿真过程中会显示仿真波形部分,其中还包括当前仿真器的设置信息和仿真信息等。
计时状态仿真波形
六、逻辑综合完成项目创建和设计输入后,用Quartus II的编译器(compiler)对设计进行检查和逻辑综合,并生成用于配置可编程逻辑器件的下载文件。Quartus II编译器中的Analysis & Synthesis模块将分析设计文件并建立工程数据库。该模块使用Quartus II内置综合器,综合Verilog HDL设计文件(.v)。(1)编译器件选项设置。(2)引脚分配。(3)编译设计。(4)查看适配结果。
七、下载到硬件电路
在设计(工程)编译成功后,便可以对所选的(Altera)目标器件进行编程和配置。Quartus II编译器的Aembler 模块将会对工程的各个组件转换成编程文件,包括编译器对象文件(*.pof)和SRAM对象文件(.sof)。Quartus II编译器(Progrsmmer)可以使用这些编程文件与Altera编程硬件配合,对Quartus II软件所支持的Altera器件进行编程和配置。
秒显示
分显示
八、总结
在QuartusII开发环境下,采用自顶向下的设计方法有利于在早期发现结构设计中的错误,避免不必要的重复设计。再结合基于FPGA 的“在系统”可编程实验板,轻轻松松就能实现各种电子产品的设计,现场观察实验测试结果。大大缩短了产品的设计周期和调试周期,提高了设计的可靠性和成功率,充分体现了可编程逻辑器件在数字电路设计中的优越性。
九、心得体会
两周时间的课程设计,终于达到了数字秒表系统的要求,尽管还不是十分完美,但从心底里说,还是很高兴的。
通过以上步骤就可以完成对数字秒表的过程设计。这次设计,我克服了很多关于设计问题方面的困难,使我对Quartus II软件的使用有了更进一步的了解,同时也积累了一些经验。在这次的课程设计中,我体会最深的就是,理论与实际的差别,往往理论上十分成熟的技术,在真正实现的过程中还是会出现很多问题,要考虑到诸多因素。通过此次设计,我真正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,只有通过实践,才能不断提高,不断进步。
参考文献
[1]王金明.Verilog HDL程序实际教程.北京:人民邮电出版社,2004.[2]杜建国.Verilog HDL硬件描述语言.北京:国防工业出版社,2004.[3]王诚, 吴继华,等.Altera FPGA/CPLD设计(基础篇).北京:人民邮电出版社,2005.[4]夏宇闻.Verilog数字系统设计教程.北京:航空航天大学出版社,2003.[5]Stephen Brown,Zvonko Vranesic.数字逻辑基础与Verilog设计.北京:机械工业出版社,2008.[6]杜慧敏,等.基于Verilog的FPGA设计基础.西安:电子科技大学出版社,2006.[7]杜勇.FPGA/VHDL设计入门与进阶.北京:机械工业出版社,2011.[8]杨晓惠,等.FPGA系统设计与实例.北京:人民邮电出版社.[9]周瑞景,等.基于Quartus II的数字系统Verilog HDL设计实例讲解.北京:电子工业出版社,2010.[10]王金明.数字系统设计与Verilog HDL设计实例.北京:电子工业出版社,2009.
(电子技术课程)设计说明书数字电子时钟起止日期:2016 年11月23日 至2016年 11月 27 日学生姓名班级 学号成绩 指导教师(签字)交通工程学院(部) 2016年11月29日数字电子钟设计一......
实验报告数字时钟的设计一、实验目的1、掌握数字钟的设计方法。2、掌握计数器相互级联的方法。 学号:14040120049 姓名:陶泽二、实验设备和器件1、数字逻辑电路实验板2、74HC(......
数字系统设计与Verilog HDL学习报告在现代数字系统设计中,EDA技术已经成为一种普遍的工具。EDA技术,即电子设计自动化技术,对于EDA技术并没有一个精准的定义,我们可以认为,所谓的......
Hefei UniversityEDA课程综述论文题目: EDA课程综述专 业: 09通信(2)班姓 名: 唐吉祥学 号: 0905072035 指导老师: 查长军前言随着基于PLD的EDA技术的发展和应用领域的扩大和深......
目录1.序论„„„„„„„„„„„„„„„„„„„„„„„„„3 2.本论„„„„„„„„„„„„„„„„„„„„„„„„„4 ——设计说明„„„„„„„„„„„„„„......
