基于FPGA的数字钟设计.docx
《基于FPGA的数字钟设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的数字钟设计.docx(10页珍藏版)》请在冰豆网上搜索。
![基于FPGA的数字钟设计.docx](https://file1.bdocx.com/fileroot1/2023-2/2/e2be1816-eb81-4d6e-b45c-7f9cb7920c1a/e2be1816-eb81-4d6e-b45c-7f9cb7920c1a1.gif)
基于FPGA的数字钟设计
基于FPGA的数字钟系统
姓名:
蒋佳霖
学号:
1023000657
学院:
物理与电子学院
摘要:
本文利用FPGA的Verilog语言设计数字钟系统。
并采用Quartuse进行综合,仿真,实验。
经过测试,本文所设计的系统基本可以实现数字的计时和显示,调整时间的功能。
关键字:
FPGA,Verilog语言,数字钟系统
1、设计所实现的功能
本文所设计的数字钟系统能进行时,分,秒的显示,和对时间的校正。
能够利用按键进行“调时”,“调分”,“清秒”的功能,随时对数码管进行调整和校正。
数字钟系统是由系统时钟,数码管,FPGA,三个功能键组成。
2、设计所采用的思想
本文所设计的数字钟系统采用Veriloig自顶而下的设计方法。
在编程中,通过键位的数值的判断来调用例化语句实现控制模块对计时模块和分频模块的控制。
3、各模块的代码及测试情况
分频模块的代码:
moduleszz_fenpin(clk,clk_1HZ);
inputclk;
outpitclk_1HZ;
reg[31:
0]count;
always@(posedgeclk)
begin
if(countbegin
count<=count+1;
end
else
begin
count<=0;
clk_1HZ<=~clk_1HZ;
end
end
endmodule
注:
本文所使用的分频模块只能进行偶数分频。
M为分频的倍数。
计时模块:
moduleszz_js(clk_1HZ,num1,num2,num3,num4,num5,num6);
inputclk_1HZ;
outputreg[3:
0]num1,num2,num3,num4,num5,num6;
always@(posedgeclk_1HZ)
begin
if((num6==4'b10)&&(num5==4'b100))
begin
num5=4'b0;
num6=4'b0;
end
elseif(num5==4'b1001)
begin
num6=num6+4'b1;
num5=4'b0;
end
elseif(num4==4'b0110)
begin
num5=num5+4'b1;
num4=4'b0;
end
elseif(num3==4'b1001)
begin
num3=4'b0;
num4=num4+4'b1;
end
elseif(num2==4'b0110)
begin
num2=4'b0;
num3=num3+4'b1;
end
elseif(num1==4'b1001)
begin
num1=4'b0;
num2=num2+4'b1;
end
else
begin
num1=num1+4'b1;
end
end
endmodule
注:
本文所使用的计时模块的代码采用状态机,非阻塞语句赋值,所以在判以后不会立即清零,所以判断采用是当其为5的时候才进行下一次状态,并在下一次状态进行清零。
控制语句:
moduleszz_kz(clk,rst,turn1,turn2,turn3,n1,n2,n3,n4,n5,n6,rs1,rs2,rs3,rs4,rs5,rs6);
inputclk,turn1,turn2,turn3,rst;
input[3:
0]n1,n2,n3,n4,n5,n6;
outputreg[3:
0]rs1,rs2,rs3,rs4,rs5,rs6;
reg[3:
0]num1,num2,num3,num4,num5,num6;
always@(posedgeclk)
begin
if(!
rst)
begin
rs1=n1;
rs2=n2;
rs3=n3;
rs4=n4;
rs5=n5;
rs6=n6;
end
else
begin
rs1=n1;
rs2=n2;
rs3=n3;
rs4=n4;
rs5=n5;
rs6=n6;
rs5=rs5+num5;
rs3=rs3+num3;
if(turn1)
begin
rs5=n5;
num5=num5+4'b1;
end
if(turn2)
begin
rs3=n3;
num3=num3+4'b1;
end
if(turn3)
begin
rs2=0;
rs1=0;
end
end
endmodule
注:
本控制程序是对键位的高电平进行监测,则进行清秒,调分,调时的功能。
4、程序的测试图
图为计数模块的部分的图形。
图为程序调试以后的结果
5、程序代码
注:
因为在FPGA的试验台上有1HZ的CLK信号,所以在实现时可以将CLK信号直接设置为1HZ,故省略例化分频语句。
moduleszz_js(clk_1HZ,num1,num2,num3,num4,num5,num6);
inputclk_1HZ;
outputreg[3:
0]num1,num2,num3,num4,num5,num6;
always@(posedgeclk_1HZ)
begin
if((num6==4'b10)&&(num5==4'b100))
begin
num5=4'b0;
num6=4'b0;
end
elseif(num5==4'b1001)
begin
num6=num6+4'b1;
num5=4'b0;
end
elseif(num4==4'b0110)
begin
num5=num5+4'b1;
num4=4'b0;
end
elseif(num3==4'b1001)
begin
num3=4'b0;
num4=num4+4'b1;
end
elseif(num2==4'b0110)
begin
num2=4'b0;
num3=num3+4'b1;
end
elseif(num1==4'b1001)
begin
num1=4'b0;
num2=num2+4'b1;
end
else
begin
num1=num1+4'b1;
end
end
endmodule
moduleszz_kz(clk,rst,turn1,turn2,turn3,n1,n2,n3,n4,n5,n6,rs1,rs2,rs3,rs4,rs5,rs6);
inputclk,turn1,turn2,turn3,rst;
input[3:
0]n1,n2,n3,n4,n5,n6;
outputreg[3:
0]rs1,rs2,rs3,rs4,rs5,rs6;
reg[3:
0]num1,num2,num3,num4,num5,num6;
always@(posedgeclk)
begin
if(!
rst)
begin
rs1=n1;
rs2=n2;
rs3=n3;
rs4=n4;
rs5=n5;
rs6=n6;
end
else
begin
rs1=n1;
rs2=n2;
rs3=n3;
rs4=n4;
rs5=n5;
rs6=n6;
rs5=rs5+num5;
rs3=rs3+num3;
if(turn1)
begin
rs5=n5;
num5=num5+4'b1;
end
if(turn2)
begin
rs3=n3;
num3=num3+4'b1;
end
if(turn3)
begin
rs2=0;
rs1=0;
end
end