当前位置:文档之家› 数字电子时钟1

数字电子时钟1

数字电子时钟表一题目分析及系统结构划分本实验要求用MAX+PLUS 11设计一数字电子时钟表,具体要求如下:(1)有完整和准确的记数功能,即能显示从00-00-00到23-59-59。

(2)可对时,分,秒进行调整,有整点报时功能。

为使设计出来的电子表满足MAX+PLUS的要求,需要所设计思路尽可能的清楚,使设计尽可能的简洁,故将系统划分为如下五个模块:状态选择模块---StateSelec;时,分,秒调整和记时模块---Hcount ,Scount,Mcount;Bcd—Led 转换即显示模块---Bcdled;分频模块---Divide;记数与调整模块---Enaselect 这五个模块的连接由下图实现:二各模块功能描述(一)Stateselect设计思想为:由Set信号的上升沿来选择四种工作状态:电子时钟正常工作状态,时调整状态,分调整状态,秒调整状态。

当然只有Sel信号的上升沿且Up信号有上升沿到来时,才由Stateselect将选择的状态送下一级模块。

即Stateselect 模块可控时钟在上述四种状态的切换,实现为:当Set未被按下时,Setmodel 输出为0,此时时钟工作于正常记时状态;当Set第一次被按下时,Setmodel 输出变为1,且一直维持到Set第四次按下。

此时为秒调整状态,当Up信号有上升沿来临时,秒值递加;当Set第二次被按下时,变为分调整状态,当Up信号有上升沿来临时,分值递加;当Set第三次被按下时,变为时调整状态,当Up信号有上升沿来临时,时值递加;当Set第四次按下时,Setmodel输出又变为0,时钟完成调整工作进入正常工作状态。

次后当Set再次按下时将重复上述工作状态的转换。

Verilog代码为:module stateselect(set,up,sup,mup,hup,setmode,clk);input set,up,clk;output sup,mup,hup,setmode;reg sup,mup,setmode,hup;reg [1:0]selc;always@(posedge set)beginselc=selc+1;endalways @(posedge clk)begincase(selc)0: setmode=0;1: beginsetmode=1;sup=up;end2:mup=up;3: hup=up;endcaseendendmodule用MAX+PLUS仿真的波形:(二)Enaselect:设计思想:由Stateselect模块的Setmodel作为Enaselect的Sel输入信号的上一级来源,当Sel为0时Enaout选择Ena0,为正常记时状态;当Sel为1时,Enaout选择Ena1,时,分,秒调整状态。

Verilog代码为:module enaselect(ena0,ena1,sel,enaout);input ena0,ena1,sel;output enaout;assign enaout=(sel==0)?ena0:ena1;endmodule用MAX+PLUS仿真的波形:(三)Scount:设计思想:本模块实现秒调整和记时功能。

有00到59的记数功能。

当Clk 上升沿来临时,此时若Ena有效时,判断如果为秒值为58时,则秒的低位Lbcd 变成9,且使进位信号Cin为1;如果为秒值为59时,则使秒值为00,且使进位信号Cin变为0,其他情况下,秒值低位逢十进一,即当秒值为9时,秒值高位进一位,当秒值不为9时,秒值加一。

Verilog代码为:module scount(ena,lbcd,hbcd,cin,clk);input ena,clk;output [3:0] lbcd,hbcd;output cin;reg cin;reg [3:0] lbcd,hbcd;always @(posedge clk)beginif(ena)beginif(lbcd==8&&hbcd==5)beginlbcd=9; cin=1;endelse if (lbcd==9&&hbcd==5)beginlbcd=0;hbcd=0;cin=0;endelse if (lbcd==9)beginlbcd=0;hbcd=hbcd+1;endelselbcd=lbcd+1;endendendmodule用MAX+PLUS仿真的波形:(四)Mcount设计思路:Mcount模块与Scount模块大致上是一致的唯一的差别就是比Scount模块多了Sound也就是整点报时信号的输出。

当分值为00时Sound有上升沿持续到分值变成01,也就是有一分的报时时间。

Verilog代码为:module mcount(ena,lbcd,hbcd,cin,clk,sound);input ena,clk;output [3:0] lbcd,hbcd;output cin,sound;reg cin,sound;reg [3:0] lbcd,hbcd;always @(posedge clk)beginif(ena)beginif(lbcd==8&&hbcd==5)beginlbcd=9; cin=1;endelse if (lbcd==9&&hbcd==5)beginlbcd=0;hbcd=0;cin=0;sound=1;endelse if (lbcd==9)beginlbcd=0;hbcd=hbcd+1;endelsebeginlbcd=lbcd+1;sound=0;endendendendmodule用MAX+PLUS仿真的波形:(五)Hcount:设计思路:Hcount模块与Scount模块的工作原理大致相同。

Hcount模块是记数从00到23,没有Cin信号功能。

Verilog代码为:module hcount(ena,lbcd,hbcd,clk);input ena,clk;output [3:0] lbcd,hbcd;reg [3:0] lbcd,hbcd;always @(posedge clk)beginif(ena)beginif(lbcd==3&&hbcd==2)beginlbcd=0;hbcd=0;endelse if (lbcd==9)beginlbcd=0;hbcd=hbcd+1;endelselbcd=lbcd+1;endendendmodule用MAX+PLUS仿真的波形:(六)Bcdled:设计思路:本模块我们在前几次实验中都曾遇到过,所以这里也就不费笔墨重复了。

Verilog代码为:modulebcdled(clk,slbcd,shbcd,mlbcd,mhbcd,hlbcd,hhbcd,ledseg,ledscan);input clk;input[3:0] slbcd,shbcd,mlbcd,mhbcd,hlbcd,hhbcd;output [6:0] ledseg;output [2:0] ledscan;reg [6:0] ledseg;reg [3:0] bcdmid;reg [2:0] ledscan;parameter led0=7'h3f;parameter led1=7'h06;parameter led2=7'h5b;parameter led3=7'h4f;parameter led4=7'h66;parameter led5=7'h6d;parameter led6=7'h7d;parameter led7=7'h07;parameter led8=7'h7f;parameter led9=7'h6f;parameter led10=7'h40;always @(posedge clk)beginledscan=ledscan+1;case(ledscan)0:bcdmid=slbcd;1:bcdmid=shbcd;2:bcdmid=10;3:bcdmid=mlbcd;4:bcdmid=mhbcd;5:bcdmid=10;6:bcdmid=hlbcd;7:bcdmid=hhbcd;endcasecase(bcdmid)0:ledseg=led0;1:ledseg=led1;2:ledseg=led2;3:ledseg=led3;4:ledseg=led4;5:ledseg=led5;6:ledseg=led6;7:ledseg=led7;8:ledseg=led8;9:ledseg=led9;10:ledseg=led10;endcaseendendmodule用MAX+PLUS仿真的波形:(七)Divide:设计思路:将Clk八分频。

Verilog代码为:module divide(clkin,clkout);input clkin;output clkout;reg[2:0] count;reg clkout;always @(posedge clkin)begincount=count+1;if(count==7)clkout=1;elseclkout=0;endendmodule用MAX+PLUS仿真的波形:(八)与门:二输入与门的作用是把Divide模块的Clkout与Scount模块的Cin作为与门的两输入。

即当Clkout与Cin都有效时的输出作为Mcount模块的Ena0。

三输入与门的作用是把Divide模块的Clkout与Scount模块的Cin和Mcount的Cin 作为与门的三输入。

即当Clkout与两Cin都有效时的输出作为Hcount模块的Ena0。

三实验中问题及解决本时钟电路的总体波形如下:本实验中遇到的主要难题是调时功能的实现及整点报时输出信号的选择。

调时要考虑到对时,分,秒的选择,在实验中我通过两输入端set和up来实现该功能。

当第一次被按下时用来调秒,第二,三次再被按下时用来调分和时,其具体由程序来实现。

由于电路要在整点进行报时,其持续时间为一分钟,故输出信号不能有mcount模块的cin引出,因为它在离整点一分时就输出一上升沿信号,不满足题目要求。

所以我在mcount模块中增加一输出端sound来解决该问题。

四实验下载运行情况本实验代码程序模拟运行成功后将其装入可编程逻辑器件EPM7128SLC84-15 中并对其分配引脚,然后将其下载到数字电路实验箱中,按引脚排列进行连线,实际运行成功。

五实验总结用Verilog编写数字电路是很方便的这一点可以从本实验看出,但MAX+PLUS11 要求设计者尽可能地简洁,而且这个要求是很严格的,它要求设计者没有一句多余的。

相关主题