2:LED1[7:0]='b01011011; 3:LED1[7:0]='b01001111; 4:LED1[7:0]='b01100110; 5:LED1[7:0]='b01101101; 6:LED1[7:0]='b01111101; 7:LED1[7:0]='b00000111; 8:LED1[7:0]='b01111111; 9:LED1[7:0]='b01101111; default: LED1[7:0]=8'b11111111; endcase end
endmodule
(五) 时序仿真 总体图
在主道开始60秒的计数过程中即使S为1也不会转入乡道运行
在主道60秒计数结束后可以转入乡道的20秒,在乡道的20秒过程中如果S为0则又返回主道计数
(六) 实验总结
这次实验是从EDA实验以来遇到的最复杂的代码,其中的if语句众多,而且嵌套也多,开始的时候摸不到头脑,编译的时候在这些语句上也是出错最多了。还好有一定的代码基础,我就在此基础上进行了一些修改和改进,仿真也非常的成功,去实验室进行烧程序进板子的时候,也很快。所以,这次实验的验收也很快。这也大大的促使我学习的动力,就想在下一次的实验中,学到更多。
五、 多功能数字钟设计
(一) 实验目的
1、 学习综合且较复杂数字系统设计; 2、
学习多层次、多模块数字系统设计;
3、 学习数码管扫描显示电路设计; (二) 设计要求
完成设计、仿真、调试、下载、硬件测试等环节,在型EDA实验装置上由简单到复杂实现多功能数字钟功能,具体要求如下: 1、 2、 3、 4、 5、 6、 7、
数码管扫描显示时、分、秒;
具有正常计时和调时、调分、调秒等校时功能; 经设置应具有整点报时功能; 经设置应具有跑表功能; 经设置应具有闹钟功能; 音乐闹钟功能;
液晶显示:年、月、日、时、分、秒、星期;
以下部分为扩展要求:
8、 自动闰年、闰月的万年历功能; (三) 主要仪器设备 1、微机 1台 2、QuartusII集成开发软件 1套 3、EDA实验装置 1套 (四) 实验思路
整个程序采用模块化的设计方法。 基本计数模块
整个程序采用BCD码计数,即每一位要显示的数据都用3位二进制数来表示。根据设计要求,技术模块应有模60,模24和模100的计数,可以用模10的模6的和模24的三个模块通过例化元件一步步实现,而且计数模块应具有计数清零和锁存的功能。
模10通过使能端en完成计数和锁存ncr清零,cp为计数脉冲,Q为数据输出。 module counter10(Q,nCR,EN,CP); input nCR,EN,CP; output [3:0] Q; reg [3:0] Q;
always @(posedge CP or negedge nCR) begin
if (~nCR) Q<=4'b0000; else if (~EN) Q<=Q;
else if ( Q==4'b1001) Q<=4'b0000; else Q<=Q+1'b1; end endmodule
模6原理与模10相同
module counter6(Q,nCR,EN,CP); input nCR,EN,CP; output [3:0] Q; reg [3:0] Q;
always @(posedge CP or negedge nCR) begin
if (~nCR) Q<=4'b0000; else if (~EN) Q<=Q;
else if ( Q==4'b0101) Q<=4'b0000; else Q<=Q+1'b1; end endmodule
模60通过例化模10和模6的元件,二者计数脉冲相同,进位通过模6的使能段en在模10的为9的下一个脉冲时进行使能选通从而进位,否则锁存数据。 module counter6(Q,nCR,EN,CP); input nCR,EN,CP; output [3:0] Q; reg [3:0] Q;
always @(posedge CP or negedge nCR) begin
if (~nCR) Q<=4'b0000; else if (~EN) Q<=Q;
else if ( Q==4'b0101) Q<=4'b0000; else Q<=Q+1'b1; end endmodule
模100与模60原理相同
module counter100(Cnt,nCR,EN,CP); input nCR,EN,CP; output [7:0] Cnt; wire [7:0] Cnt; wire ENP;
counter10 UC0(Cnt[3:0],nCR,EN,CP); counter10 UC1(Cnt[7:4],nCR,ENP,CP); assign ENP=(Cnt[3:0]==4'b1001); endmodule
模24计数也分为高位和低位,低位为9时下一个脉冲向高位进1同时低位清零,ncr为清零信号,en为使能信号完成计数和锁存,CP为计数脉冲,当满足高位大于2或者低位大于9(实际不可能实现,只是让程序更严密)或者计数到23时,下一个脉冲清零,否则正常计数加1,从而完成模24的计数。 module counter24(CntH,CntL,nCR,EN,CP); input nCR,EN,CP;
output [3:0] CntH,CntL;
reg [3:0] CntH,CntL;
always @(posedge CP or negedge nCR) begin
if (~nCR) {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 分频模块
输入为1KHz的信号,调用了三个模10的计数模块,一个为10时作为下一个的使能端信号从而让下一个模10模块进行计数,这样就可以通过二进制数计数时个个位的变化规律进行分频获得想要的频率的脉冲信号,程序中获得了100HZ,500HZ,和1HZ的信号。
module Divided_Frequency(_1HZOut,_500HZOut,nCR,_1KHZIn,_100HZ); input nCR,_1KHZIn;
output _1HZOut,_500HZOut,_100HZ; supply1 Vdd; wire [11:0] Q; wire EN1,EN2;
counter10 DUO(Q[3:0],nCR,Vdd,_1KHZIn); counter10 DU1(Q[7:4],nCR,EN1,_1KHZIn); counter10 DU2(Q[11:8],nCR,EN2,_1KHZIn); assign EN1=(Q[3:0]==4'h9);
assign EN2=(Q[3:0]==4'h9&Q[7:4]==4'h9); assign _1HZOut=Q[11]; assign _500HZOut=Q[0]; assign _100HZ=Q[3]; endmodule 主时钟模块
主时钟模块调用了两个模60和一个模24的基本计数模块,以完成正常的时钟计数,当检测到有调时调分信号时便让分或时进位,否则秒为59的下一个脉冲作为分的计数信号使分进1,分为59同时秒为59时的下一个脉冲时作为时的计数信号使时进1,用if语句实现。使能端则一直为1,计数脉冲接分频后的一秒。用1KHZ的频率对计数进行扫描获得进位信号。
module top_clock(Hour,Minute,Second,nCR,_1HZ,AdjMinKey,AdjHrKey,HZ); input nCR,_1HZ,AdjMinKey,AdjHrKey,HZ; output [7:0] Hour,Minute,Second; wire [7:0] Hour,Minute,Second; supply1 Vdd;