基于FPGA的日历、时间、闹铃系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于FPGA的日历、时间、闹铃系统
前言:由于本人刚刚入门,只用了最基本的设计思维,所以可能浪费了许多芯片资源,要是哪位高手能帮忙把系统优
本人定然感激不尽。
系统功能:显示当前日期,时间,到点报时。可通过按键来调整日期时间,并且设置闹铃时间,闹铃响后,必须手动
模块说明:系统的顶层模块如下图所示,该系统由六个模块组成,分别为分频模块,按键模块,计数模块,LCD液晶
除法器模块,以及铃声模块。皆为可综合模块,可综合为门级网表,并在FPGA芯片上验证了其正确性。由于涉及版严禁用于商业目的,违者必究!
按键示意图:
各模块的verilog代码如下:
1,、分频器:
module div_1hz(clk,clock);
output reg clock;
input clk;//外部50MHZ时钟输入
reg[24:0] i;
always@(posedge clk)
begin
i=i+1;
if(i==25'h17d7840)
begin
i=0;
clock=~clock; //产生1HZ频率信号。
end
end
endmodule
2、按键模块:
module key(num,keyout,targe,keyout_en,keyin,rst,clk); output reg [3:0] keyout;
output [3:0] num;
output targe;
output reg keyout_en;
input rst,clk;
input [3:0]keyin;
reg [7:0] i;
reg [3:0] num;
reg [23:0] count;
reg [5:0] state,next_state;
reg [3:0] keyout_reg,keyin_reg;
parameter s0=6'b000001,
s1=6'b000010,
s2=6'b000100,
s3=6'b001000,
s4=6'b010000,
s5=6'b100000;
wire clock;
always@(posedge clk or negedge rst)
begin
if(!rst)
i<=0;
else
i<=i+1;
end
assign clock=i[7];
always@(posedge clock or negedge rst)
begin
if(!rst)
begin
count<=0;
keyout_en<=0;
end
else begin
if(keyin!=4'hf)
begin
if(count<'h4bb3)//去抖动
count<=count+1;
else
keyout_en<=1;
end
else if(state[5]||state[0])
begin
count<=0;
keyout_en<=0;
end
end
end
assign targe=(!(state==s0||state==s5))&&(keyin!=4'hf); always@(posedge clock)
begin
if(targe)
begin
keyout_reg<=keyout;
keyin_reg<=keyin;
end
else
begin
keyout_reg<=keyout_reg;
keyin_reg<=keyin_reg;
end
end
always@(keyout_reg or keyin_reg or clock)
begin
case({keyin_reg,keyout_reg})
8'b1110_1110: num <= 1 ;
8'b1110_1101: num <= 2 ;
8'b1110_1011: num <= 3 ;
8'b1110_0111: num <= 10 ;
8'b1101_1110: num <= 4 ;
8'b1101_1101: num <= 5 ;
8'b1101_1011: num <= 6 ;
8'b1101_0111: num <= 11 ;
8'b1011_1110: num <= 7 ;
8'b1011_1101: num <= 8 ;
8'b1011_1011: num <= 9;
8'b1011_0111: num <= 12;
8'b0111_1110: num <= 0;
8'b0111_1101: num <= 15;
8'b0111_1011: num <= 14;
8'b0111_0111: num <= 13;
endcase
end
always@(posedge clock or negedge rst)
begin
if(!rst)