Quatus II数字钟.docx
- 文档编号:652257
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:17
- 大小:90.38KB
Quatus II数字钟.docx
《Quatus II数字钟.docx》由会员分享,可在线阅读,更多相关《Quatus II数字钟.docx(17页珍藏版)》请在冰点文库上搜索。
QuatusII数字钟
数字钟实验报告
一、实验目的
(1)综合之前的实验知识,完成一次综合设计。
(2)参考电子表或电子钟的功能设定方法,完成数字钟的一些基本功能,比如:
24小时计时,校时功能,闹钟功能,跑表功能。
(3)反思本学期所做过的所有实验得到的收获。
二、实验过程以及分析
本次实验关键在于要实现以下几个内容,一般时钟的计时功能,校时功能,闹钟功能以及跑表功能。
Shifter移位寄存器配合500hz分频器来实现防抖动,1hz分频器配合main_control模块实现时钟的秒分时的转换,此外main_control负责key0,1,2的相关功能的实现,并输出,sed配合D触发器实现跑表功能,out配合segmein模块实现数码管的控制,mode模块实现4种模式选择,4hz和50hz配合pulse模块实现闹钟的功能
三、模块代码
计时功能的实现要考虑以下几个内容,防抖动问题(用shifter模块配合500MHz用移位寄存器的方式解决)shifter模块代码如下:
moduleshifter(din,clk,nclr,cout);
`definesize4//7
inputdin,clk,nclr;
outputcout;
regcout;
reg[`size:
0]dout;
always@(posedgeclk)
begin
if(~nclr)dout<=0;
else
begin
dout<=dout<<1'b1;
dout[0]<=din;
end
cout<=|dout;
end
endmodule
500Hz分频模块如下:
moduleint_div500hz(clk,div_out);
inputclk;
outputregdiv_out;
reg[31:
0]clk_div;
parameterCLK_FREQ='D50_000_000;//系统时钟50MHz
parameterDCLK_FREQ='D1000;//输出频率1000/2Hz
always@(posedgeclk)
begin
if(clk_div<(CLK_FREQ/DCLK_FREQ))
clk_div<=clk_div+1;
else
begin
clk_div<=0;
div_out<=~div_out;
end
end
endmodule
跑表功能需要用到D触发器配合一个sed模块,这里用到的是上升沿触发,当上升沿来到时,输出等于输入。
D触发器:
moduledchufa(d,q,nq,clk);
inputclk,d;
outputnq,q;
regq,nq;
always@(posedgeclk)
begin
q<=d;
nq<=~d;
end
endmodule
sed模块代码如下:
modulesed(clk100hz,ti,count,stop,rst);
inputclk100hz;
inputstop;//配合D触发器的特性实现暂停跑表的功能
input[1:
0]count;
inputrst;
output[31:
0]ti;
reg[31:
0]ti;
always@(posedgeclk100hz)
begin
if(count==2'b11)
begin
ti[31:
24]<=8'd4;
if(stop)
begin
ti<=ti;
if(rst)
begin
ti[23:
0]<=0;
end
end
else
begin
if(ti[3:
0]==4'd9)
begin
ti[3:
0]<=4'd0;
if(ti[7:
4]==4'd9)
begin
ti[7:
4]<=4'd0;
if(ti[11:
8]==4'd9)
begin
ti[11:
8]<=4'd0;
if(ti[15:
12]==4'd5)
begin
ti[15:
12]<=4'd0;
if(ti[19:
16]==4'd9)
begin
ti[19:
16]<=4'd0;
if(ti[23:
20]==4'd5)
begin
ti[23:
20]<=4'd0;
if(ti[27:
24]==4'd9)
begin
ti[27:
24]<=4'd0;
ti[31:
28]<=ti[31:
28]+4'd1;
end
elseif(ti[31:
28]==4'd2&&ti[27:
24]==4'd3)
begin
ti[31:
28]<=4'd0;
ti[27:
24]<=4'd0;
end
elseti[27:
24]<=ti[27:
24]+4'd1;
end
elseti[23:
20]<=ti[23:
20]+4'd1;
end
elseti[19:
16]<=ti[19:
16]+4'd1;
end
elseti[15:
12]<=ti[15:
12]+4'd1;
end
elseti[11:
8]<=ti[11:
8]+4'd1;
end
elseti[7:
4]<=ti[7:
4]+4'd1;
end
elseti[3:
0]<=ti[3:
0]+4'd1;
end
end
else
begin
ti[31:
24]<=8'd4;
ti[23:
0]<=24'b0;
end
end
endmodule
需要一个main_control模块来协调整个程序的实现,它负责产生蜂鸣器,key1,key2,key3的响应,同时配合1hz输入(1hz用于产生秒的计时,同时,时和分的转换都在这个模块中)
Main_control:
modulemain_control(count,clk1hz,key1,key2,key3,q,beep,t);
input[1:
0]count;
inputclk1hz;
inputkey1;
inputkey2;
inputkey3;
outputbeep;
output[31:
0]q;
output[31:
0]t;
reg[31:
0]t;
reg[31:
0]q;
reg[31:
0]tempq;
regbeep;
always@(posedgeclk1hz)
begin
if(count==2'b00)
begin
q[31:
24]<=8'd1;//
begin
if(q[3:
0]==4'd9)
begin
q[3:
0]<=4'd0;
if(q[7:
4]==4'd5)
begin
q[7:
4]<=4'd0;
if(q[11:
8]==4'd9)
begin
q[11:
8]<=4'd0;
if(q[15:
12]==4'd5)
begin
q[15:
12]<=4'd0;
begin
if(q[19:
16]==4'd9)
begin
q[19:
16]<=4'd0;
q[23:
20]<=q[23:
20]+4'd1;
end
elseif(q[23:
20]==4'd2&&q[19:
16]==4'd3)
begin
q[19:
16]<=4'd0;
q[23:
20]<=4'd0;
end
elseq[19:
16]<=q[19:
16]+4'd1;
end
end
elseq[15:
12]<=q[15:
12]+4'd1;
end
elseq[11:
8]<=q[11:
8]+4'd1;
end
elseq[7:
4]<=q[7:
4]+4'd1;
end
elseq[3:
0]<=q[3:
0]+4'd1;
end
//xiamianshinaolingfunction
if(t[23:
8]==q[23:
8])
begin
beep<=1'b1;
end
elsebeep<=1'b0;
end
elseif(count==2'b01)
begin
q[31:
24]<=8'd2;//
beep<=1'b0;
if(q[11:
8]==4'd9&&key1==1'b1)
begin
q[11:
8]<=4'd0;
begin
if(q[15:
12]==4'd5)
q[15:
12]<=4'd0;
elseq[15:
12]<=q[15:
12]+4'd1;
end
end
elseq[11:
8]<=q[11:
8]+key1;
if(q[19:
16]==4'd9&&key2==1'b1)
begin
q[19:
16]<=4'd0;
q[23:
20]<=q[23:
20]+4'd1;
end
elseif(q[23:
20]==4'd2&&q[19:
16]==4'd3&&key2==1'b1)
begin
q[19:
16]<=4'd0;
q[23:
20]<=4'd0;
end
elseq[19:
16]<=q[19:
16]+key2;
end
elseif(count==2'b10)
begin
t[31:
24]<=8'd3;//
begin
if(t[11:
8]==4'd9&&key1==1'b1)//
begin
t[11:
8]<=4'd0;
begin
if(t[15:
12]==4'd5)
t[15:
12]<=4'd0;
elset[15:
12]<=t[15:
12]+4'd1;
end
end
elset[11:
8]<=t[11:
8]+key1;
if(t[19:
16]==4'd9&&key2==1'b1)//
begin
t[19:
16]<=4'd0;
t[23:
20]<=t[23:
20]+4'd1;
end
elseif(t[23:
20]==4'd2&&t[19:
16]==4'd3&&key2==1'b1)
begin
t[19:
16]<=4'd0;
t[23:
20]<=4'd0;
end
elset[19:
16]<=t[19:
16]+key2;
end
//qcontinue
begin
if(q[3:
0]==4'd9)
begin
q[3:
0]<=4'd0;
if(q[7:
4]==4'd5)
begin
q[7:
4]<=4'd0;
if(q[11:
8]==4'd9)
begin
q[11:
8]<=4'd0;
if(q[15:
12]==4'd5)
begin
q[15:
12]<=4'd0;
begin
if(q[19:
16]==4'd9)
begin
q[19:
16]<=4'd0;
q[23:
20]<=q[23:
20]+4'd1;
end
elseif(q[23:
20]==4'd2&&q[19:
16]==4'd3)
begin
q[19:
16]<=4'd0;
q[23:
20]<=4'd0;
end
elseq[19:
16]<=q[19:
16]+4'd1;
end
end
elseq[15:
12]<=q[15:
12]+4'd1;
end
elseq[11:
8]<=q[11:
8]+4'd1;
end
elseq[7:
4]<=q[7:
4]+4'd1;
end
elseq[3:
0]<=q[3:
0]+4'd1;
end
beep<=1'b0;
end
elseif(count==2'b11)
begin
q[31:
24]<=8'd4;//
beep<=1'b0;
begin
if(q[3:
0]==4'd9)
begin
q[3:
0]<=4'd0;
if(q[7:
4]==4'd5)
begin
q[7:
4]<=4'd0;
if(q[11:
8]==4'd9)
begin
q[11:
8]<=4'd0;
if(q[15:
12]==4'd5)
begin
q[15:
12]<=4'd0;
begin
if(q[19:
16]==4'd9)
begin
q[19:
16]<=4'd0;
q[23:
20]<=q[23:
20]+4'd1;
end
elseif(q[23:
20]==4'd2&&q[19:
16]==4'd3)
begin
q[19:
16]<=4'd0;
q[23:
20]<=4'd0;
end
elseq[19:
16]<=q[19:
16]+4'd1;
end
end
elseq[15:
12]<=q[15:
12]+4'd1;
end
elseq[11:
8]<=q[11:
8]+4'd1;
end
elseq[7:
4]<=q[7:
4]+4'd1;
end
elseq[3:
0]<=q[3:
0]+4'd1;
end
end
end
endmodule
将要实现的4种功能设置为4种模式,用一个mode模块来选择模式
Mode:
modulemode(key0,count,rst);
inputkey0;
inputrst;
output[1:
0]count;
reg[1:
0]count;
always@(posedgekey0)//用key0的上升沿来判断
begin
if(!
rst)
count<=0;
elseif(count==2'b11)//用count变量来计数,显示的数据即为显示的模式
count<=0;
else
count<=count+2'b1;
end
endmodule
out模块配合segmain模块来控制数码管的显示,这在之前的实验中已经实现
out模块:
moduleout(count,q,ti,clk100hz,qout,t);
input[31:
0]q;
input[31:
0]ti;
input[31:
0]t;
input[1:
0]count;
inputclk100hz;
output[31:
0]qout;
reg[31:
0]qout;
always@(posedgeclk100hz)
begin
if(count==2'b11)
begin
qout<=ti;
end
elseif(count==2'b10)
begin
qout<=t;
end
else
begin
qout<=q;
end
end
endmodule
segmain模块不在赘述。
Pulse模块用于产生脉冲来控制蜂鸣器
Pulse:
modulepulse(clk,d,spk);
inputclk;
input[12:
0]d;
outputspk;
reg[31:
0]clk_div;
regspk;
always@(posedgeclk)
begin
if(clk_div clk_div<=clk_div+1; else begin clk_div<=0; spk<=~spk; end end endmodule 最后需要产生乐曲,选择的乐曲为梁祝乐曲,需要一个tonetable模块来产生所发音符所需的分频预置数并且notetable模块中的计数器按照4Hz的时钟速率递增并依次输出分频预置数,并且控制好每个音符的持续时间。 依据课本上前几次实验的经验,对每个模块进行设定,编译,设置顶层等等步骤,最后下载到实验版上实现数字钟。 四、实验小结 通过本次的综合实验我回顾并掌握了之前几次实验的各种方法,对编程语言有了一个非常清楚的认识,并且进一步掌握了FPGA的开发流程,调试方法以及QuatusII软件的使用,QuartusII的涉及输入、仿真方法以及步骤,熟识QuatusII软件基本功能的使用,这对于本次实验的成功十分重要。 本学期的实验虽然只用到了开发板的硬件功能,但为我们今后的进一步学习打下了坚实的基础,而且我们还可以进行进一步的利用verilogHDL语言进行开发,而不仅仅停留在硬件功能上
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Quatus II数字钟 II 数字