数字电路时钟设计verilog语言编写.docx
- 文档编号:3420806
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:13
- 大小:93.02KB
数字电路时钟设计verilog语言编写.docx
《数字电路时钟设计verilog语言编写.docx》由会员分享,可在线阅读,更多相关《数字电路时钟设计verilog语言编写.docx(13页珍藏版)》请在冰点文库上搜索。
数字电路时钟设计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+PlusII软件中,使用Verilog语言输入,采用分层次分模块的方法设计电路;
3.设计各单元电路并进行仿真;
4.对数字钟的整体逻辑电路图,选择器件,分配引脚,进行逻辑综合;
5.下载到Cyclone
FPGA实验平台上,实际测试数字钟的逻辑功能。
六.Verilog代码
//24进制时钟,具有计时、校时、仿广播电台正点报时、固定时刻定时,任意时刻闹钟等功能
moduleclock_main(LED_Hour,LED_Minute,LED_Second,Alarm,CP_1KHz,Jsh_Min_key,Jsh_Hour_key,Set_Hour_key,Set_Min_key,Show,Ctrl_Bell);
inputCP_1KHz;//定义输入时钟
inputJsh_Min_key,Jsh_Hour_key;//定义校时按键
inputSet_Hour_key,Set_Min_key;//定义闹钟定时按键
inputShow;//定义显示模式按键
inputCtrl_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;
wireOut_1Hz,Out_500Hz;//定义分频模块输出变量类型
regAlarm_Ring,Alarm_Clock_1KHz;//定义仿广播电台报时和固定时刻定时铃声
outputAlarm;//蜂鸣器输入
supply1Vdd;
wireAlarm_Clock;//任意时刻闹钟闹铃
wireMinL_EN,MinH_EN,Hour_EN;//定义中间变量类型
//分频
fre_dividerFD0(Out_1Hz,Out_500Hz,Vdd,Vdd,CP_1KHz);
//正常计时
counter10U1(.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);
counter10U3(.Q(Minute[3:
0]),.nCR(Vdd),.EN(MinL_EN),.CP(Out_1Hz));
counter6U4(.Q(Minute[7:
4]),.nCR(Vdd),.EN(MinH_EN),.CP(Out_1Hz));
assignHour_EN=Jsh_Hour_key?
Vdd:
((Minute==8'h59)&&(Second==8'h59));
counter24U5(Hour[7:
4],Hour[3:
0],Vdd,Hour_EN,Out_1Hz);
//仿广播电台正点报时
baoshiBS1(Alarm_Ring,Minute,Second,Out_500Hz,CP_1KHz);//在59分51秒、53秒、55秒、57秒发出低音512Hz信号,在59分59秒时发出一次高音1024Hz信号,音响持续1秒钟,在1024Hz音响结束时刻为整点
//固定时刻定时
always@(HourorMinuteorSecond)//所定时刻为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;
defaultAlarm_Clock_1KHz=1'b0;
endcase
elseAlarm_Clock_1KHz=1'b0;
//任意时刻闹钟
setclockSC1(Alarm_Clock,Set_Hour_Out,Set_Min_Out,Hour,Minute,Second,Set_Hour_key,Set_Min_key,CP_1KHz,Out_500Hz,Out_1Hz,Ctrl_Bell);
//响铃
assignAlarm=Alarm_Ring||Alarm_Clock_1KHz||Alarm_Clock;
//数码管显示选择
Choice_2to1CU1(LED_Hour,Show,Set_Hour_Out,Hour);//Show为高电平时,显示闹钟所定时刻;为低电平时,显示正常计时
Choice_2to1CU2(LED_Minute,Show,Set_Min_Out,Minute);
Choice_2to1CU3(LED_Second,Show,8'h00,Second);
Endmodule
//**********分频模块,获得500Hz低频1Hz时钟源**********
modulefre_divider(Out_1Hz,Out_500Hz,nCR,EN,In_1KHz);
inputnCR,EN,In_1KHz;
outputOut_1Hz,Out_500Hz;
supply1Vdd;
wireOut_1Hz,Out_500Hz;
wire[11:
0]Qn;//定义中间变量类型
wireEN1,EN2;
counter10DU1(.Q(Qn[3:
0]),.nCR(nCR),.EN(EN),.CP(In_1KHz));
counter10DU2(.Q(Qn[7:
4]),.nCR(nCR),.EN(EN1),.CP(In_1KHz));
counter10DU3(.Q(Qn[11:
8]),.nCR(nCR),.EN(EN2),.CP(In_1KHz));
assignEN1=(Qn[3:
0]==4'd9);
assignEN2=(Qn[7:
4]==4'd9)&(Qn[3:
0]==4'd9);
assignOut_500Hz=Qn[0];
assignOut_1Hz=Qn[11];
endmodule
//****************模10计数器******************
modulecounter10(Q,nCO,nCR,EN,CP);
inputCP,nCR,EN;
output[3:
0]Q;
outputnCO;
reg[3:
0]Q;
always@(posedgeCPornegedgenCR)
begin
if(~nCR)Q<=4'd0;
elseif(EN)
begin
if(Q>=4'd9)
Q<=4'd0;
elseQ<=Q+1'd1;
end
elseQ<=Q;
end
assignnCO=~(Q[3]&&Q[0]);
endmodule
//****************模6计数器******************
modulecounter6(Q,nCO,nCR,EN,CP);
inputCP,nCR,EN;
output[3:
0]Q;
outputnCO;
reg[3:
0]Q;
always@(posedgeCPornegedgenCR)
begin
if(~nCR)Q<=4'd0;
elseif(EN)
begin
if(Q==4'd5)
Q<=4'd0;
elseQ<=Q+1'd1;
end
elseQ<=Q;
end
assignnCO=~(Q[2]&&Q[0]);
endmodule
//**********模60计数,用来构成分、秒计数**********
modulecounter60(Qnt,CO,nCR,EN,CP);
inputCP,nCR,EN;
output[7:
0]Qnt;
outputCO;
wire[7:
0]Qnt;
counter10U0(Qnt[3:
0],nCO_10,nCR,EN,CP);
counter6U1(Qnt[7:
4],nCO_6,nCR,Qnt[3:
0]==4'd9,CP);
assignCO=~((Qnt[7:
4]==4'd5)&&(Qnt[3:
0]==4'd9));
endmodule
//********************模24计数器********************
modulecounter24(CntH,CntL,nCR,EN,CP);
inputCP,nCR,EN;
output[3:
0]CntH,CntL;
reg[3:
0]CntH,CntL;
always@(posedgeCPornegedgenCR)
begin
if(~nCR){CntH,CntL}<=8'h00;
elseif(~EN){CntH,CntL}<={CntH,CntL};
elseif((CntH>2)||(CntL>9)||((CntH==2)&&(CntL>=3)))
{CntH,CntL}<=8'h00;
elseif((CntH==2)&&(CntL<3))
beginCntH<=CntH;CntL<=CntL+1'b1;end
elseif(CntL==9)
beginCntH<=CntH+1'b1;CntL<=4'b0000;end
else
beginCntH<=CntH;CntL<=CntL+1'b1;end
end
endmodule
//**********仿广播电台正点报时**********
modulebaoshi(Alarm_Ring,Minute,Second,_500Hz,_1KHz);
input[7:
0]Minute,Second;//定义输入变量
input_500Hz,_1KHz;
outputAlarm_Ring;//定义输出变量
regAlarm_Ring;//定义输出变量类型
always@(MinuteorSecond)
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;
endcase
else
Alarm_Ring=1'b0;
Endmodule
//******************任意时刻闹钟******************
modulesetclock(Alarm_Clock,Set_Hour_Out,Set_Min_Out,Hour,Minute,Second,Set_Hour_key,Set_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;
counter60SU1(.Qnt(Set_Min_Out),.nCR(Vdd),.EN(Set_Min_key),.CP(_1Hz));//实现闹钟分钟的设定
counter24SU2(Set_Hour_Out[7:
4],Set_Hour_Out[3:
0],Vdd,Set_Hour_key,_1Hz);//实现闹钟小时的设定
comparatorSU4(HourH_EQU,Set_Hour_Out[7:
4],Hour[7:
4]);
comparatorSU5(HourL_EQU,Set_Hour_Out[3:
0],Hour[3:
0]);
comparatorSU6(MinH_EQU,Set_Min_Out[7:
4],Minute[7:
4]);
comparatorSU7(MinL_EQU,Set_Min_Out[3:
0],Minute[3:
0]);
assignTime_EQU=(HourH_EQU&&HourL_EQU&&MinH_EQU&&MinL_EQU);
assignAlarm_Clock=Ctrl_Bell?
(Time_EQU&&(((Second[0]==1'b1)&&_500Hz)||((Second[0]==1'b0)&&_1KHz))):
1'b0;
endmodule
//****************比较器******************
modulecomparator(EQU,A,B);//比较器,如果A和B相等时,则输出为1
input[3:
0]A,B;
outputEQU;
assignEQU=(A==B);
endmodule
//****************二选一选择器****************
moduleChoice_2to1(Qnt,SEL,X,Y);
input[7:
0]X,Y;
inputSEL;
output[7:
0]Qnt;
assignQnt=SEL?
X:
Y;
endmodule
七.各工作模块仿真波形
1.基本功能—正常计时和校时
2.仿广播电台正点报时
3.固定时刻定时
4.任意时刻定时及闹钟设定
八.实验总结:
1.对于本次能够成功地使用Verilog设计并仿真出多功能数字钟,感到非常满意。
2.本次多功能数字钟设计实验,从刚开始对Verilog语言非常陌生,到最后接近熟练地掌握Verilog语言的程度,期间花费不少时间和精力,同时也收获了很多,学会了使用Verilog语言编程仿真电路实验,掌握了可编程逻辑器件的应用开发技术,熟悉了一种EDA软件使用,掌握了Verilog设计方法,即分模块分层次的设计方法。
3.本次多功能数字钟设计实验,对于Verilog语言的学习与应用,可以说是一次很好的锻炼机会,在设计过程中,汲取了诸多经验教训,深刻体会到一个小小的错误可能会给整个程序所带来的严重后果。
所以,在以后的学习及程序设计当中,我们一定要倍加小心,在程序出现不正常运行的情况下要耐心调试,尽量做到精益求精。
4.由于时间有限,还有一部分选做内容没能够完成,即数字钟的自动报整点时数功能。
但本次设计实验已使我对Verilog语言产生了浓厚的兴趣,在以后的学习生活中会主动去了解更多有关这方面的知识及其在实践中的应用。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字电路 时钟 设计 verilog 语言 编写