当前位置:文档之家› 数字电路时钟设计verilog语言编写--

数字电路时钟设计verilog语言编写--

电子线路设计与测试实验报告一、实验名称多功能数字钟设计二、实验目的1.掌握可编程逻辑器件的应用开发技术——设计输入、编译、仿真和器件编程;2.熟悉一种EDA软件使用;3.掌握Verilog设计方法;4.掌握分模块分层次的设计方法;5.用Verilog完成一个多功能数字钟设计。

三、设计内容及要求1.基本功能具有“秒”、“分”、“时”计时功能,小时按24小时制计时。

具有校时功能,能对“分”和“小时”进行调整。

2.扩展功能仿广播电台正点报时。

在59分51秒、53秒、55秒、57秒发出低音512Hz 信号,在59分59秒时发出一次高音1024Hz信号,音响持续1秒钟,在1024Hz音响结束时刻为整点。

定时控制,其时间为23时58分。

3.选做内容任意时刻闹钟(闹钟时间可设置)。

自动报整点时数。

四.系统框图与说明数字钟框图1.数字钟电路系统由主体电路和扩展电路两大部分所组成。

2.秒计数器计满60后向分计数器进位,分计数器计满60后向小时计数器进位,小时计数器按照“24进制”规律计数。

3.计数器的输出经译码器送显示器。

五.设计步骤1.列写多功能数字钟设计--层次结构图2.拟定数字钟的组成框图,在Max+Plus II软件中,使用Verilog语言输入,采用分层次分模块的方法设计电路;3.设计各单元电路并进行仿真;4.对数字钟的整体逻辑电路图,选择器件,分配引脚,进行逻辑综合;5.下载到Cyclone II FPGA实验平台上,实际测试数字钟的逻辑功能。

六.Verilog代码//24进制时钟, 具有计时、校时、仿广播电台正点报时、固定时刻定时,任意时刻闹钟等功能moduleclock_main(LED_Hour,LED_Minute,LED_Second,Alarm,CP_1KHz,Jsh_Min_key,Jsh_Hour_ke y,Set_Hour_key,Set_Min_key,Show,Ctrl_Bell);input CP_1KHz;//定义输入时钟input Jsh_Min_key,Jsh_Hour_key;//定义校时按键input Set_Hour_key,Set_Min_key;//定义闹钟定时按键input Show; //定义显示模式按键input Ctrl_Bell;//定义闹钟铃声控制output [7:0]LED_Hour,LED_Minute,LED_Second;//定义输出变量wire [7:0]LED_Hour,LED_Minute,LED_Second;//定义输出变量类型wire [7:0]Hour,Minute,Second;wire [7:0]Set_Hour_Out,Set_Min_Out;wire Out_1Hz,Out_500Hz;//定义分频模块输出变量类型reg Alarm_Ring,Alarm_Clock_1KHz;//定义仿广播电台报时和固定时刻定时铃声output Alarm;//蜂鸣器输入supply1Vdd;wire Alarm_Clock;//任意时刻闹钟闹铃wire MinL_EN,MinH_EN,Hour_EN;//定义中间变量类型//分频fre_dividerFD0(Out_1Hz,Out_500Hz,Vdd,Vdd,CP_1KHz);//正常计时counter10 U1(.Q(Second[3:0]),.nCR(Vdd),.EN(Vdd),.CP(Out_1Hz));counter6U2(.Q(Second[7:4]),.nCR(Vdd),.EN(Second[3:0]==4'h9),.CP(Out_1Hz));assignMinL_EN=Jsh_Min_key?Vdd:(Second==8'h59);assignMinH_EN=(Jsh_Min_key&&(Minute[3:0]==4'h9))||(Minute[3:0]==4'h9)&&(Second==8'h59 );counter10 U3(.Q(Minute[3:0]),.nCR(Vdd),.EN(MinL_EN),.CP(Out_1Hz));counter6 U4(.Q(Minute[7:4]),.nCR(Vdd),.EN(MinH_EN),.CP(Out_1Hz));assign Hour_EN=Jsh_Hour_key?Vdd:((Minute==8'h59)&&(Second==8'h59));counter24 U5(Hour[7:4],Hour[3:0],Vdd,Hour_EN,Out_1Hz);//仿广播电台正点报时baoshi BS1(Alarm_Ring,Minute,Second,Out_500Hz,CP_1KHz);//在59分51秒、53秒、55秒、57秒发出低音512Hz信号,在59分59秒时发出一次高音1024Hz信号,音响持续1秒钟,在1024Hz音响结束时刻为整点//固定时刻定时always @(Hour or Minute or Second)//所定时刻为23时58分,蜂鸣器发出低音1KHz 信号,持续5秒钟if (Hour==8'h23&Minute==8'h58)case (Second)8'h00,8'h01,8'h02,8'h03,8'h04:Alarm_Clock_1KHz=CP_1KHz;default Alarm_Clock_1KHz=1'b0;endcaseelse Alarm_Clock_1KHz=1'b0;//任意时刻闹钟setclockSC1(Alarm_Clock,Set_Hour_Out,Set_Min_Out,Hour,Minute,Second,Set_Hour_key,Set_Mi n_key,CP_1KHz,Out_500Hz,Out_1Hz,Ctrl_Bell);//响铃assign Alarm=Alarm_Ring||Alarm_Clock_1KHz||Alarm_Clock;//数码管显示选择Choice_2to1 CU1(LED_Hour,Show,Set_Hour_Out,Hour);//Show为高电平时,显示闹钟所定时刻;为低电平时,显示正常计时Choice_2to1 CU2(LED_Minute,Show,Set_Min_Out,Minute);Choice_2to1 CU3(LED_Second,Show,8'h00,Second);Endmodule//**********分频模块,获得500Hz低频1Hz时钟源**********modulefre_divider(Out_1Hz,Out_500Hz,nCR,EN,In_1KHz);input nCR,EN,In_1KHz;output Out_1Hz,Out_500Hz;supply1Vdd;wire Out_1Hz,Out_500Hz;wire [11:0]Qn;//定义中间变量类型wire EN1,EN2;counter10 DU1(.Q(Qn[3:0]),.nCR(nCR),.EN(EN),.CP(In_1KHz));counter10 DU2(.Q(Qn[7:4]),.nCR(nCR),.EN(EN1),.CP(In_1KHz));counter10 DU3(.Q(Qn[11:8]),.nCR(nCR),.EN(EN2),.CP(In_1KHz));assign EN1= (Qn[3:0]==4'd9);assign EN2= (Qn[7:4]==4'd9)&(Qn[3:0]==4'd9);assign Out_500Hz=Qn[0];assign Out_1Hz=Qn[11];endmodule//****************模10计数器******************module counter10(Q,nCO,nCR,EN,CP);inputCP,nCR,EN;output[3:0]Q;outputnCO;reg[3:0]Q;always@(posedge CP or negedgenCR)beginif(~nCR)Q<=4'd0;else if(EN)beginif(Q>=4'd9)Q<= 4'd0;else Q<=Q+1'd1;endelse Q<=Q;endassignnCO=~(Q[3]&&Q[0]);endmodule//****************模6计数器****************** module counter6(Q,nCO,nCR,EN,CP);inputCP,nCR,EN;output[3:0]Q;outputnCO;reg[3:0]Q;always@(posedge CP or negedgenCR)beginif(~nCR)Q<=4'd0;else if(EN)beginif(Q==4'd5)Q<= 4'd0;else Q<=Q+1'd1;endelse Q<=Q;endassignnCO=~(Q[2]&&Q[0]);endmodule//**********模60计数,用来构成分、秒计数********** module counter60(Qnt,CO,nCR,EN,CP);inputCP,nCR,EN;output [7:0]Qnt;output CO;wire [7:0]Qnt;counter10 U0(Qnt[3:0],nCO_10,nCR,EN,CP);counter6 U1(Qnt[7:4],nCO_6,nCR,Qnt[3:0]==4'd9,CP);assign CO=~((Qnt[7:4]==4'd5)&&(Qnt[3:0]==4'd9));endmodule//********************模24计数器********************module counter24(CntH,CntL,nCR,EN,CP);inputCP,nCR,EN;output[3:0]CntH,CntL;reg [3:0]CntH,CntL;always @(posedge CP or negedgenCR)beginif(~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))beginCntH<= CntH;CntL<= CntL+1'b1;endelse if(CntL==9)beginCntH<= CntH+1'b1;CntL <= 4'b0000;endelsebeginCntH<= CntH;CntL<= CntL+1'b1;endendendmodule//**********仿广播电台正点报时**********modulebaoshi(Alarm_Ring,Minute,Second,_500Hz,_1KHz);input [7:0] Minute,Second;//定义输入变量input _500Hz,_1KHz;output Alarm_Ring;//定义输出变量regAlarm_Ring;//定义输出变量类型always@(Minute or Second)if(Minute==8'h59)case (Second)8'h51,8'h53,8'h55,8'h57:Alarm_Ring=_500Hz; //在59分51秒、53秒、55秒、57秒发出低音512Hz 信号8'h59:Alarm_Ring=_1KHz; //在59分59秒时发出一次高音1024Hz信号default:Alarm_Ring=1'b0;endcaseelseAlarm_Ring=1'b0;Endmodule//******************任意时刻闹钟******************modulesetclock(Alarm_Clock,Set_Hour_Out,Set_Min_Out,Hour,Minute,Second,Set_Hour_key,S et_Min_key,_1KHz,_500Hz,_1Hz,Ctrl_Bell);inputSet_Hour_key,Set_Min_key;inputCtrl_Bell;input [7:0]Hour,Minute,Second;outputAlarm_Clock;output [7:0]Set_Hour_Out,Set_Min_Out;wire [7:0]Set_Hour_Out,Set_Min_Out;wireAlarm_Clock;input _1KHz,_500Hz,_1Hz;supply1Vdd;wireHourH_EQU,HourL_EQU,MinH_EQU,MinL_EQU;wireTime_EQU;counter60 SU1(.Qnt(Set_Min_Out),.nCR(Vdd),.EN(Set_Min_key),.CP(_1Hz)); //实现闹钟分钟的设定counter24 SU2(Set_Hour_Out[7:4],Set_Hour_Out[3:0],Vdd,Set_Hour_key,_1Hz); //实现闹钟小时的设定comparator SU4(HourH_EQU,Set_Hour_Out[7:4],Hour[7:4]);comparator SU5(HourL_EQU,Set_Hour_Out[3:0],Hour[3:0]);comparator SU6(MinH_EQU,Set_Min_Out[7:4],Minute[7:4]);comparator SU7(MinL_EQU,Set_Min_Out[3:0],Minute[3:0]);assignTime_EQU=(HourH_EQU&&HourL_EQU&&MinH_EQU&&MinL_EQU);assign Alarm_Clock=Ctrl_Bell?(Time_EQU&&(((Second[0]==1'b1)&&_500Hz)||((Second[0]==1'b0)&&_1KHz))):1'b0;endmodule//****************比较器******************module comparator(EQU,A,B); //比较器,如果A和B相等时,则输出为1input [3:0] A,B;output EQU;assign EQU=(A==B);endmodule//****************二选一选择器****************module Choice_2to1(Qnt,SEL,X,Y);input [7:0] X,Y;input SEL;output [7:0] Qnt;assignQnt=SEL?X:Y;endmodule七.各工作模块仿真波形1.基本功能—正常计时和校时2.仿广播电台正点报时3.固定时刻定时4.任意时刻定时及闹钟设定八.实验总结:1.对于本次能够成功地使用Verilog设计并仿真出多功能数字钟,感到非常满意。

相关主题