ISE实现多功能数字钟设计Word文档下载推荐.docx
《ISE实现多功能数字钟设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《ISE实现多功能数字钟设计Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
。
nCLR(nCR),
CLK_1HzOut(CP_1Hz));
//用以时钟计数的CP
defparamU0.N=25,
U0.CLK_Freq=50000000,
U0.OUT_Freq=1;
Divider50MHzU1(.CLK_50M(CLK_50),
nCLR(nCR),
。
CLK_1HzOut(CP_200Hz));
//用以动态扫描的CP,供给数码管
defparamU1.N=18,
U1.CLK_Freq=50000000,
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:
h9)&
&
(TSecond==8'
h59);
//24小时制
counter24H0(Hour_24[7:
4],Hour_24[3:
0],nCR,ENH,EN,CP_1Hz);
assignENH=Adj_Hour?
((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:
//——产生时使能信号——
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
if(~EN)Led_Alarm<
else
begin
if(~Alarm)Led_Alarm<
elseLed_Alarm<
=~Led_Alarm;
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)//确定数码管显示闹钟还是正常时钟
if(Adj_Clock)beginDisplay_Hour〈=CHour;
Minute〈=CMinute;
end
elsebeginDisplay_Hour<
=Display_HourT;
Minute〈=TMinute;
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:
end//第三根显示分钟十位
4'
b1101:
beginHEX〈=4'
b1110;
bcd〈=Minute[3:
0];
end//第四根显示分钟个位
default:
=0111;
=Display_Hour[7:
endcase
end
else//数码管进行秒显示,change为低电平时显示秒
b1110:
beginHEX〈=4’b1101;
bcd〈=TSecond[7:
end//第三根显示秒十位
4’b1101:
=4’b1110;
bcd〈=TSecond[3:
0];
end//第四根显示秒个位
default:
=1101;
bcd〈=TSecond[7:
4];
end
SEG7_LUTL0(HEX0,bcd);
//调用数码管子函数
//======整点报时==========
assignLD_6=LD_6_RADIO;
always@(CP_1Hz)
if((Minute[7:
0]==8’h00)&
&(counter[7:
0]〈(Hour_24[7:
4]*10+Hour_24[3:
0])))
LD_6_RADIO〈=CP_1Hz;
else
LD_6_RADIO<
=0;
always@(posedgeCP_1Hz)
if(Minute[7:
0]==8'
h00)
counter[7:
0]<
=counter[7:
0]+1'
b1;
else
counter[7:
0]〈=8’h00;
end
endmodule
五、顶层模块设计图
六、子模块设计
1、50MHz分频器
moduleDivider50MHz(CLK_50M,nCLR,CLK_1HzOut);
parameterN=25;
//位宽
parameterCLK_Freq=50000000;
//50MHz时钟输入
parameterOUT_Freq=1;
//1Hz时钟输出
inputnCLR,CLK_50M;
//输入端口说明
outputregCLK_1HzOut;
//输出端口说明
reg[N-1:
0]Count_DIV;
//内部节点,存放计数器的输出值
always@(posedgeCLK_50MornegedgenCLR)
if(!
nCLR)beginCLK_1HzOut〈=0;
Count_DIV<
elsebegin
if(Count_DIV<
(CLK_Freq/(2*OUT_Freq)—1))//计数器模
Count_DIV〈=Count_DIV+1'
//分频器计数加1
elsebegin
Count_DIV<
//分频器输出清零
CLK_1HzOut〈=~CLK_1HzOut;
//输出信号取反
2、秒模10计数器
moduleScounter10(Q,nCR,EN,CP);
inputCP,nCR,EN;
outputQ;
reg[3:
0]Q;
always@(posedgeCPornegedgenCR)
begin
if(~nCR)Q〈=4’b0000;
//异步清零
elseif(~EN)Q〈=Q;
//暂停计数
elseif(Q==4’b1001)Q<
=4'
b0000;
elseQ〈=Q+1’b1;
3、秒模6计数器
moduleScounter6(Q,nCR,EN,CP);
inputCP,nCR,EN;
outputQ;
reg[3:
0]Q;
always@(posedgeCPornegedgenCR)
elseif(~EN)Q<
=Q;
elseif(Q==4'
b0101)Q<
b0000;
elseQ〈=Q+1'
b1;
4、分模10计数器
moduleMcounter10(Q,nCR,EN1,EN2,CP);
inputCP,nCR,EN1,EN2;
reg[3:
if(~nCR)Q〈=4’b0000;
elseif(~EN1||!
EN2)Q<
=Q;
b1001)Q〈=4'
5、分模6计数器
moduleMcounter6(Q,nCR,EN1,EN2,CP);
inputCP,nCR,EN1,EN2;
if(~nCR)Q〈=4'
elseif(~EN1||~EN2)Q〈=Q;
b0101)Q〈=4'
elseQ<
=Q+1’b1;
6、模24计数器
modulecounter24(CntH,CntL,nCR,EN1,EN2,CP);
outputreg[3:
0]CntH,CntL;
//小时的十位和个位输出
always@(posedgeCPornegedgenCR)
if(~nCR){CntH,CntL}<
=8'
h00;
//异步清零
elseif(~EN1||~EN2){CntH,CntL}〈={CntH,CntL};
//暂停计数
elseif((CntH)>
2||(CntL>
9)||(CntH)==2&
&(CntL)〉=3)
{CntH,CntL}<
=8’h00;
//对小时计数器出错时的处理
elseif((CntH)==2&&
(CntL)〈3)//进行20~23计数
beginCntH〈=CntH;
CntL〈=CntL+1’b1;
elseif(CntL==9)//小时十位的计数
beginCntH<
=CntH+1’b1;
CntL<
=4’b0000;
else
beginCntH〈=CntH;
=CntL+1'
7、模60计数器
modulecounter60(nCLR,Clk,EN,CntH,CntL);
inputnCLR,Clk,EN;
0]CntH,CntL;
always@(posedgeClkornegedgenCLR)
if(~nCLR)
{CntH,CntL}<
//异步清零
elseif(~EN)
{CntH,CntL}<
={CntH,CntL};
//暂停信号
elseif(((CntH>
5)||(CntL>
9))||((CntH==5)&&
(CntL==9)))
{CntH,CntL}〈=8’h00;
//异常处理
elseif(CntL==9)
beginCntH〈=CntH+1'
CntL〈=0;
end//十位计数
=CntH;
CntL〈=CntL+1'
end//个位计数
8、数码管显示
moduleSEG7_LUT(oSEG,iDIG);
input[3:
0]iDIG;
//二进制输入
outputreg[6:
0]oSEG;
//7段码输出
always@(iDIG)
case(iDIG)
4'
h0:
oSEG=7'
b000_0001;
h1:
b100_1111;
4’h2:
oSEG=7’b001_0010;
4’h3:
oSEG=7’b000_0110;
4’h4:
b100_1100;
h5:
b010_0100;
h6:
b010_0000;
h7:
b000_1111;
h8:
oSEG=7’b000_0000;
h9:
oSEG=7’b000_0100;
default:
oSEG=7'
b1111111;
endcase
七、各模块仿真
1、模10计数器
测试代码:
//Inputs
regnCR;
regEN;
regCP;
//Outputs
wire[3:
//InstantiatetheUnitUnderTest(UUT)
counter10uut(
。
Q(Q),
nCR(nCR),
EN(EN),
。
CP(CP)
);
parameterPERIOD=40;
//时钟信号周期设置为40ns
alwaysbegin
CP=1'
b0;
#(PERIOD/2)CP=1’b1;
#(PERIOD/2);
initialbegin
//InitializeInputs
nCR=0;
EN=1;
CP=1;
//Wait100nsforglobalresettofinish
#100;
nCR=1;
//Addstimulushere
2、模6计数器
//Inputs
regEN;
wire[3:
counter6uut(
.Q(Q),
.nCR(nCR),
EN(EN),
.CP(CP)
);
CP=1’b0;
#(PERIOD/2)CP=1'
nCR=0;
EN=1;
nCR=1;
3、模24计数器
regnCR;
wire[3:
0]CntH;
0]CntL;
counter24uut(
CntH(CntH),
CntL(CntL),
.EN(EN),
parameterPERIOD=40;
b0;
#(PERIOD/2)CP=1’b1;
CP=1;
#100;
4、模60计数器
regnCLR;
regClk;
0]CntL;
counter60uut(
nCLR(nCLR),
Clk(Clk),
CntL(CntL)
Clk=1'
#(PERIOD/2)Clk=1'
#(PERIOD/2);
nCLR=0;
Clk=1;
#100;
nCLR=1;
//Addstimulush