基于verilog的数字时钟设计.docx

上传人:b****6 文档编号:3412495 上传时间:2022-11-22 格式:DOCX 页数:17 大小:533.31KB
下载 相关 举报
基于verilog的数字时钟设计.docx_第1页
第1页 / 共17页
基于verilog的数字时钟设计.docx_第2页
第2页 / 共17页
基于verilog的数字时钟设计.docx_第3页
第3页 / 共17页
基于verilog的数字时钟设计.docx_第4页
第4页 / 共17页
基于verilog的数字时钟设计.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

基于verilog的数字时钟设计.docx

《基于verilog的数字时钟设计.docx》由会员分享,可在线阅读,更多相关《基于verilog的数字时钟设计.docx(17页珍藏版)》请在冰豆网上搜索。

基于verilog的数字时钟设计.docx

基于verilog的数字时钟设计

基于verilog的数字时钟设计

LT

4.4七段显示设置………………………………………………………………………………………………11

4.4.1BCD码显示模块……………………………………………………………………………………11

4.4.2二位七段显示模块………………………………………………………………………………12

4.4.3一位七段显示模块………………………………………………………………………………12

4.5顶层模块实现…………………………………………………………………………………………14

五、模拟与仿真…………………………………………………………………………………………………..15

六、逻辑综合……………………………………………………………………………………………………….16

七、下载到硬件电路……………………………………………………………………………………………16

八、总结……………………………………………………………………………………………………………….18

九、心得体会……………………………………………………………………………………………………….18

十、参考文献……………………………………………………………………………………………………….19

 

一、前言

随着微电子技术的的飞速发展,大规模可编程器件的密度和性能不断提高,数字系统的设计方法、设计过程也发生了重大改变,传统的设计方法已经逐渐被电子设计自动化EDA(ElectronicDesignAutomation)工具所取代。

可编程器件可以通过硬件描述语言(如VerilogHDL)的形式根据实际设计的需要灵活地嵌入规模化的数字单元,大大地缩短了产品的设计周期。

以可编程逻辑器件为核心的设计在数字系统设计领域将占据越来越重要的作用,因此,作为硬件设计者掌握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的控制过程与“时”、“分”类似

代码:

modulemyclock(RSTn,CLK,FLAG,UP,DN,H,M,S,MS);

inputRSTn,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;

assignH=m_H;

assignM=m_M;

assignS=m_S;

assignMS=m_MS;

always@(posedgeCLK)

if(~RSTn)//复位状态

begin

m_H<=8'd23;

m_M<=8'd52;

m_S<=8'b0;

m_MS<=8'b0;

end

elseif(FLAG==2'b01)//调时状态

begin

if(UP)

begin

if(m_H==8'd23)

m_H<=8'd0;

else

m_H=m_H+1'b1;

end

elseif(DN)

begin

if(m_H==8'h00)

m_H<=8'd23;

else

m_H<=m_H-1'b1;

end

end

elseif(FLAG==2'b10)//调分状态

begin

if(UP)

if(m_M==8'd59)

m_M<=8'd0;

else

m_M<=m_M+1'b1;

elseif(DN)

if(m_M==8'h00)

m_M<=8'd59;

else

m_M<=m_M-1'b1;

end

elseif(FLAG==2'b11)//调秒状态

begin

if(UP)

if(m_S==8'd59)

m_S<=8'b0;

else

m_S<=m_S+1'b1;

elseif(DN)

if(m_S==8'h00)

m_S<=8'd59;

else

m_S<=m_S<=m_S-1'b1;

end

else

begin//正常计时状态

if(m_MS==8'd99)

begin

m_MS<=8'd0;

if(m_S==8'd59)

begin

m_S<=8'd0;

if(m_M==8'd59)

begin

m_M<=8'd0;

if(m_H==8'd23)

m_H<=0;

else

m_H<=m_H+1'b1;

end

else

m_M<=m_M+8'd1;

end

else

m_S<=m_S+1'b1;

end

else

m_MS<=m_MS+1'b1;

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%)。

代码:

moduleint_div(clock,clk_out);

parameterF_DIV=48000000;//分频系数

parameterF_DIV_WIDTH=32;//分频计数器宽度

inputclock;//输入时钟

outputclk_out;//输出时钟

regclk_p_r;

regclk_n_r;

reg[F_DIV_WIDTH-1:

0]count_p;

reg[F_DIV_WIDTH-1:

0]count_n;

wirefull_div_p;//上升沿计数满标志

wirehalf_div_p;//上升沿计数半满标志

wirefull_div_n;//下降沿计数满标志

wirehalf_div_n;//下降沿计数半满标志

//判断计数标志位置位与否

assignfull_div_p=(count_p

assignhalf_div_p=(count_p<(F_DIV>>1)-1);

assignfull_div_n=(count_n

assignhalf_div_n=(count_n<(F_DIV>>1)-1);

//时钟输出

assignclk_out=(F_DIV==1)?

clock:

(F_DIV[0]?

(clk_p_r&clk_n_r):

clk_p_r);

always@(posedgeclock)//上升沿脉冲计数

begin

if(full_div_p)

begin

count_p<=count_p+1'b1;

if(half_div_p)

clk_p_r<=1'b0;

else

clk_p_r<=1'b1;

end

else

begin

count_p<=0;

clk_p_r<=1'b0;

end

end

always@(negedgeclock)//下降沿脉冲计数

begin

if(full_div_n)

begin

count_n<=count_n+1'b1;

if(half_div_n)

clk_n_r<=1'b0;

else

clk_n_r=1'b1;

end

else

begin

count_n<=0;

clk_n_r<=1'b0;

end

end

endmodule

 

4.3时钟信号选择模块

时钟信号选择模块clkgen实际上时一个二选一电路,用于提供时钟调校及计时时模块所需的时钟脉冲。

当电子表工作在正常计时状态时选择100Hz时钟信号;当电子表工作在调时、调分、调秒是那种设置模式时,如果采用100Hz时钟信号,那么手动一次按键可能引起设置数据的一串跳变,因此为了方便按键时动作对时间的设置,这里采用2Hz的时钟信号。

其端口说明如下:

flag——时钟选择输入信号;

clk_100Hz———输入100Hz的时钟信号;

clk_2Hz——输入2Hz的时钟信号;

Clkout——输出时钟信号。

代码:

moduleclkgen(flag,clk_100hz,clk_2hz,clkout);

input[1:

0]flag;//若flag=0则clkout=100Hz,否则clkout=2Hz

inputclk_100hz,clk_2hz;

outputclkout;

assignclkout=(flag==2'b00)?

clk_100hz:

clk_2hz;

endmodule

 

4.4七段显示设置

为了对时钟时、分、秒和毫秒数据输出显示,需要将时、分、秒和毫秒的二进制转换为十进制数。

由于时、分、秒最大到60,毫秒最大到99,所以十进制数选择2位就能满足要求。

为了在七段数码管输出时间数据,还需要将显示的十进制数转化为七段段码。

以上功能分别由BCD码显示模块和七段译码管模块来实现。

4.4.1BCD码显示模块

BCD码显示模块的功能是将8位二进制数转化为2位十进制数后,进行七段段译码显示。

为了实现显示功能,在其内部调用了dual_hex2位七段显示模块。

其端口说明如下:

输入信号:

hex——2位8421BCD码输入。

输出信号:

dispout——2位8421码对应的七段数码管段码。

代码:

moduledisp_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_hexu1(1'b0,dec,dispout);//调用2位共阳极七段显示模块

endmodule

4.4.2二位七段显示模块

二位七段显示模块的功能是将2进制或十六进制数转化为对应的七段段码,内部调用了一位七段译码模块seg_decoder。

代码:

moduledual_hex(iflag,datain,dispout);

inputiflag;//共阴或共阳输出选择

input[7:

0]datain;//2位的十进制或十六进制数据

output[15:

0]dispout;//2个七段段码数据

seg_decoderu1(iflag,datain[7:

4],dispout[15:

8]);

seg_decoderu2(iflag,datain[3:

0],dispout[7:

0]);

endmodule

 

4.4.3一位七段译码模块

一位七段译码模块的功能是将4位二进制数转化为对应的共阴或共阳七段段码。

代码:

moduleseg_decoder(iflag,iA,oY);

inputiflag;//共阴或共阳输出选择

input[3:

0]iA;//4位二进制数据

outputreg[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

 

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———“百分秒”数据(十六进制)。

代码:

moduleclock(iCLK_50,RSTn,FLAG,UP,DN,H_dis,M_dis,S_dis,MS_dis,Mode,H,M,S);

inputiCLK_50;

inputRSTn,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;

wireclk_100hz,clk_2hz;

wireclk;

assignMode=FLAG;

int_div#(500000,32)nclk100(iCLK_50,clk_100hz);

int_div#(50000000,32)nclk2(iCLK_50,clk_2hz);

clkgenu0(FLAG,clk_100ha,clk_2hz,clk);

myclocku1(RSTn,clk,FLAG,UP,DN,H,M,S,MS);

disp_decHour(H,H_dis);

disp_decMinute(M,M_dis);

disp_decSecond(S,S_dis);

disp_dechour(MS,MS_dis);

endmodule

 

五、模拟与仿真

在QuartusII中利用仿真波形进行功能或时序仿真的基本步骤如下:

(1)创建新的矢量波形文件(*.vwf).

(2)添加输入、输出节点。

(3)编译输入节点的波形。

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

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

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

计时状态仿真波形

 

六、逻辑综合

完成项目创建和设计输入后,用QuartusII的编译器(compiler)对设计进行检查和逻辑综合,并生成用于配置可编程逻辑器件的下载文件。

QuartusII编译器中的Analysis&Synthesis模块将分析设计文件并建立工程数据库。

该模块使用QuartusII内置综合器,综合VerilogHDL设计文件(.v)。

(1)编译器件选项设置。

(2)引脚分配。

(3)编译设计。

(4)查看适配结果。

 

七、下载到硬件电路

在设计(工程)编译成功后,便可以对所选的(Altera)目标器件进行编程和配置。

QuartusII编译器的Assembler模块将会对工程的各个组件转换成编程文件,包括编译器对象文件(*.pof)和SRAM对象文件(.sof)。

QuartusII编译器(Progrsmmer)可以使用这些编程文件与Altera编程硬件配合,对QuartusII软件所支持的Altera器件进行编程和配置。

秒显示

 

分显示

八、总结

在QuartusII开发环境下,采用自顶向下的设计方法有利于在早期发现结构设计中的错误,避免不必要的重复设计。

再结合基于FPGA 的“在系统”可编程实验板,轻轻松松就能实现各种电子产品的设计,现场观察实验测试结果。

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

 

九、心得体会

两周时间的课程设计,终于达到了数字秒表系统的要求,尽管还不是十分完美,但从心底里说,还是很高兴的。

 

     通过以上步骤就可以完成对数字秒表的过程设计。

这次设计,我克服了很多关于设计问题方面的困难,使我对QuartusII软件的使用有了更进一步的了解,同时也积累了一些经验。

在这次的课程设计中,我体会最深的就是,理论与实际的差别,往往理论上十分成熟的技术,在真正实现的过程中还是会出现很多问题,要考虑到诸多因素。

通过此次设计,我真正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,只有通过实践,才能不断提高,不断进步。

 

参考文献

[1]王金明.VerilogHDL程序实际教程.北京:

人民邮电出版社,2004.

[2]杜建国.VerilogHDL硬件描述语言.北京:

国防工业出版社,2004.

[3]王诚,吴继华,等.AlteraFPGA/CPLD设计(基础篇).北京:

人民邮电出版社,2005.

[4]夏宇闻.Verilog数字系统设计教程.北京:

航空航天大学出版社,2003.

[5]StephenBrown,ZvonkoVranesic.数字逻辑基础与Verilog设计.北京:

机械工业出版社,2008.

[6]杜慧敏,等.基于Verilog的FPGA设计基础.西安:

电子科技大学出版社,2006.

[7]杜勇.FPGA/VHDL设计入门与进阶.北京:

机械工业出版社,2011.

[8]杨晓惠,等.FPGA系统设计与实例.北京:

人民邮电出版社.

[9]周瑞景,等.基于QuartusII的数字系统VerilogHDL设计实例讲解.北京:

电子工业出版社,2010.

[10]王金明.数字系统设计与VerilogHDL设计实例.北京:

电子工业出版社,2009.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1