基于FPGA的日历、时间、闹铃系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)

相关文档
最新文档