ISE实现多功能数字钟设计.docx

上传人:b****6 文档编号:3078341 上传时间:2022-11-17 格式:DOCX 页数:16 大小:20.22KB
下载 相关 举报
ISE实现多功能数字钟设计.docx_第1页
第1页 / 共16页
ISE实现多功能数字钟设计.docx_第2页
第2页 / 共16页
ISE实现多功能数字钟设计.docx_第3页
第3页 / 共16页
ISE实现多功能数字钟设计.docx_第4页
第4页 / 共16页
ISE实现多功能数字钟设计.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

ISE实现多功能数字钟设计.docx

《ISE实现多功能数字钟设计.docx》由会员分享,可在线阅读,更多相关《ISE实现多功能数字钟设计.docx(16页珍藏版)》请在冰豆网上搜索。

ISE实现多功能数字钟设计.docx

ISE实现多功能数字钟设计

一、任务要求

用FPGA器件和EDA技术实现多功能数字钟的设计。

基本功能要求:

能显示小时、分钟、秒钟(时、分用7段LED显示器,秒用LED灯)。

小时计数器为同步24进制;

要求手动校时、校分。

扩展功能要求:

任意时刻闹钟;

小时显示(12/24)切换电路

自动报整点时数。

二、建立工程

在ISE14,9软件中建立名为clock的工程文件。

芯片系列选择Spatan3E,具体芯片型号选择XC3S100E,封装类型选择CP132,速度信息选择-5。

三、原理设计

四、顶层模块设计

创建名为top_clock的文件,本设计中顶层模块用于调用各个子模块,以及将闹钟与整点报时模块综合在内,顶层源码如下:

moduletop_clock(

inputHchange,//24小时,12小时切换信号

inputChange,//用来进行时分和秒的显示切换

inputCLK_50,//50MHz时钟

inputnCR,EN,Clock_EN,

inputAdj_Min,Adj_Hour,Adj_Clock,//使能信号,小时分钟调时允许信号,闹钟使能信号(拨钮开关)

output[6:

0]HEX0,

outputregLed_Alarm,

outputreg[3:

0]HEX//共阳极数码管对应端

);

regAlarm;

wireENM_L,ENM_H,ENH;

wire[7:

0]Hour_24,TMinute,TSecond,CHour,CMinute;//中间变量声明,正常时钟变量和闹钟时钟变量

wire[7:

0]Hour_12,Display_HourT,Display_HourAdjust;

reg[3:

0]bcd=4'b0000;//记载数码管所要显示的数据

reg[7:

0]Display_Hour,Minute;

regLD_6_RADIO;

reg[7:

0]sum,counter;

supply1Vdd;

wireCP_1Hz;

//===========分频=============

Divider50MHzU0(.CLK_50M(CLK_50),

.nCLR(nCR),

.CLK_1HzOut(CP_1Hz));//用以时钟计数的CP

defparamU0.N=25,

U0.CLK_Freq=,

U0.OUT_Freq=1;

Divider50MHzU1(.CLK_50M(CLK_50),

.nCLR(nCR),

.CLK_1HzOut(CP_200Hz));//用以动态扫描的CP,供给数码管

defparamU1.N=18,

U1.CLK_Freq=,

U1.OUT_Freq=200;

//===========60进制秒计数器=========

Scounter10S0(TSecond[3:

0],nCR,EN,CP_1Hz);//秒:

个位

Scounter6S1(TSecond[7:

4],nCR,(TSecond[3:

0]==4'h9),CP_1Hz);//秒:

十位

//===========60进制分计数器=========

Mcounter10M0(TMinute[3:

0],nCR,ENM_L,EN,CP_1Hz);//分:

个位

Mcounter6M1(TMinute[7:

4],nCR,ENM_H,EN,CP_1Hz);//分:

十位

assignENM_L=Adj_Min?

Vdd:

(TSecond==8'h59);//分钟按书上CP调时

assignENM_H=(Adj_Min&&(TMinute[3:

0]==4'h9))||(TMinute[3:

0]==4'h9)&&(TSecond==8'h59);//24小时制

counter24H0(Hour_24[7:

4],Hour_24[3:

0],nCR,ENH,EN,CP_1Hz);

assignENH=Adj_Hour?

Vdd:

((TMinute==8'h59)&&(TSecond==8'h59));

//===========12小时与24小时进制切换控制==========

assignDisplay_HourAdjust=((Hour_24==8'h20)||(Hour_24==8'h21))?

(Hour_24-24):

(Hour_24-18);

assignHour_12=(Hour_24<8'h13)?

Hour_24:

Display_HourAdjust;

assignDisplay_HourT=Hchange?

Hour_12:

Hour_24;

//===========闹钟============

//----------时钟秒---------

//counter60CCS(nCR,CP_1Hz,EN,CSecond[7:

4],CSecond[3:

0]);

//----------时钟分---------

counter60CCM(nCR,CP_1Hz,CMin_EN,CMinute[7:

4],CMinute[3:

0]);

//--产生分使能信号--

assignCMin_EN=(!

EN&&Adj_Clock&&Adj_Min);

//----------时钟时---------

Counter24CCCH(nCR,CP_1Hz,CHour_EN,CHour[7:

4],CHour[3:

0]);

//--产生时使能信号--

assignCHour_EN=(!

EN&&Adj_Clock&&Adj_Hour);

//--闹钟响--

always@(ENorClock_EN)//闹钟开关

begin

if(EN&&Clock_EN&&(CHour==Display_HourT)&&(CMinute==TMinute))Alarm<=1;

elseAlarm<=0;

end

always@(posedgeCLK_50ornegedgeENornegedgeAlarm)//表示闹钟的LED

begin

if(~EN)Led_Alarm<=0;

else

begin

if(~Alarm)Led_Alarm<=0;

elseLed_Alarm<=~Led_Alarm;

end

end

//alarm_clockAL0(Hour24,Minute,CP_1Hz,Set_Alarm,Close_clock,nCR,KeySet_Hour_ev,KeySet_Minute_ev,LD_7,Alarm_Hour,Alarm_Minute);

//===========数码显示=========

always@(Adj_Clock)//确定数码管显示闹钟还是正常时钟

begin

if(Adj_Clock)beginDisplay_Hour<=CHour;Minute<=CMinute;end

elsebeginDisplay_Hour<=Display_HourT;Minute<=TMinute;end

end

always@(posedgeCP_200Hz)

begin

if(Change==1)//数码管进行时分显示

begin

case(HEX)

4'b1110:

beginHEX<=4'b0111;bcd<=Display_Hour[7:

4];end//第一根数码管显示小时十位

4'b0111:

beginHEX<=4'b1011;bcd<=Display_Hour[3:

0];end//第二根显示小时个位

4'b1011:

beginHEX<=4'b1101;bcd<=Minute[7:

4];end//第三根显示分钟十位

4'b1101:

beginHEX<=4'b1110;bcd<=Minute[3:

0];end//第四根显示分钟个位

default:

beginHEX<=0111;bcd<=Display_Hour[7:

4];end

endcase

end

else//数码管进行秒显示,change为低电平时显示秒

begin

case(HEX)

4'b1110:

beginHEX<=4'b1101;bcd<=TSecond[7:

4];end//第三根显示秒十位

4'b1101:

beginHEX<=4'b1110;bcd<=TSecond[3:

0];end//第四根显示秒个位

default:

beginHEX<=1101;bcd<=TSecond[7:

4];end

endcase

end

end

SEG7_LUTL0(HEX0,bcd);//调用数码管子函数

//======整点报时==========

assignLD_6=LD_6_RADIO;

always@(CP_1Hz)

begin

if((Minute[7:

0]==8'h00)&&(counter[7:

0]<(Hour_24[7:

4]*10+Hour_24[3:

0])))

begin

LD_6_RADIO<=CP_1Hz;

end

else

begin

LD_6_RADIO<=0;

end

end

always@(posedgeCP_1Hz)

if(Minute[7:

0]==8'h00)

begin

counter[7:

0]<=counter[7:

0]+1'b1;

end

else

begin

counter[7:

0]<=8'h00;

end

endmodule

五、顶层模块设计图

六、子模块设计

1、50MHz分频器

moduleDivider50MHz(CLK_50M,nCLR,CLK_1HzOut);

parameterN=25;//位宽

parameterCLK_Freq=;//50MHz时钟输入

parameterOUT_Freq=1;//1Hz时钟输出

inputnCLR,CLK_50M;//输入端口说明

outputregCLK_1HzOut;//输出端口说明

reg[N-1:

0]Count_DIV;//内部节点,存放计数器的输出值

always@(posedgeCLK_50MornegedgenCLR)

begin

if(!

nCLR)beginCLK_1HzOut<=0;Count_DIV<=0;end

elsebegin

if(Count_DI

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

当前位置:首页 > 法律文书 > 调解书

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

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