数字电路时钟设计verilog语言编写Word文件下载.docx
《数字电路时钟设计verilog语言编写Word文件下载.docx》由会员分享,可在线阅读,更多相关《数字电路时钟设计verilog语言编写Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
![数字电路时钟设计verilog语言编写Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-10/13/30270792-f5bd-4228-8dc3-28b240815591/30270792-f5bd-4228-8dc3-28b2408155911.gif)
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]Hour,Minute,Second;
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:
h9))||(Minute[3:
h9)&
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?
((Minute==8'
h59)&
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,
h01,
h02,
h03,
h04:
Alarm_Clock_1KHz=CP_1KHz;
defaultAlarm_Clock_1KHz=1'
b0;
endcase
elseAlarm_Clock_1KHz=1'
//任意时刻闹钟
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:
d9);
assignEN2=(Qn[7:
4]==4'
d9)&
(Qn[3:
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:
always@(posedgeCPornegedgenCR)
begin
if(~nCR)Q<
=4'
d0;
elseif(EN)
begin
if(Q>
d9)
Q<
=4'
elseQ<
=Q+1'
d1;
end
elseQ<
=Q;
end
assignnCO=~(Q[3]&
Q[0]);
//****************模6计数器******************
modulecounter6(Q,nCO,nCR,EN,CP);
if(Q==4'
d5)
assignnCO=~(Q[2]&
//**********模60计数,用来构成分、秒计数**********
modulecounter60(Qnt,CO,nCR,EN,CP);
output[7:
0]Qnt;
outputCO;
wire[7:
counter10U0(Qnt[3:
0],nCO_10,nCR,EN,CP);
counter6U1(Qnt[7:
4],nCO_6,nCR,Qnt[3:
d9,CP);
assignCO=~((Qnt[7:
d5)&
(Qnt[3:
d9));
//********************模24计数器********************
modulecounter24(CntH,CntL,nCR,EN,CP);
inputCP,nCR,EN;
output[3:
0]CntH,CntL;
reg[3:
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}<
elseif((CntH==2)&
(CntL<
3))
beginCntH<
=CntH;
CntL<
=CntL+1'
b1;
elseif(CntL==9)
=CntH+1'
CntL<
b0000;
else
=Cnt