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

上传人:b****3 文档编号:1425667 上传时间:2022-10-22 格式:DOCX 页数:11 大小:88.63KB
下载 相关 举报
数字电路时钟设计verilog语言编写.docx_第1页
第1页 / 共11页
数字电路时钟设计verilog语言编写.docx_第2页
第2页 / 共11页
数字电路时钟设计verilog语言编写.docx_第3页
第3页 / 共11页
数字电路时钟设计verilog语言编写.docx_第4页
第4页 / 共11页
数字电路时钟设计verilog语言编写.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

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

《数字电路时钟设计verilog语言编写.docx》由会员分享,可在线阅读,更多相关《数字电路时钟设计verilog语言编写.docx(11页珍藏版)》请在冰豆网上搜索。

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

数字电路时钟设计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.下载到CycloneFPGA实验平台上,实际测试数字钟的逻辑功能。

六.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<=Cnt

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

当前位置:首页 > 经管营销

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

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