基于FPGA的电子时钟设计
1、设计目的:
(1)掌握Verilog HDL模块的基本结构 (2)掌握计数器的设计方法 (3)掌握分频器的设计方法 (4)掌握模块的调用方法
(5)掌握基于Quartus II的CPLD/FPGA开发流程
2、设计内容:
(1)设计有两个数码管能够实现秒钟显示,数字一秒钟变化一次。 (2)按下复位键时,计时器所有能够复位清零。 (3)利用Quartus II软件进行综合、适配
3、设计方案
(1)编写题目要求的程序;
(2)按照要求将相关程序进行检测和调试,运行正确的程序; (3)程序完成后,将其与开发板连接; (4)下载程序到芯片内;
(5)观察程序功能是否成功实现。
4、总体结构设计
总体结构设计如上图所示,从开发板提供的6MHz时钟信号分频得到周期为1s的控制信号,控制计数器改变状态,秒钟利用模60的BCD码计数器实现,BCD码通过4-7译码器译码后驱动两个数码管显示。
5、系统模块化设计
5.1 分频器
根据需求分析的要求,从6MHz系统时钟分频得到1Hz(周期1s)的控制信号,利用计数器实现分频然后能够异步复位。
程序入下:
module clock(clk,rest,clk_1s); input clk; input rest;
output clk_1s; reg clk_1s;
integer count=0;
always@(posedge clk or negedge rest) begin
if(rest==0) begin count=0; clk_1s=0; end else
begin
if(count==2999999) begin count<=0; clk_1s<=~clk_1s; end else count=count+1; end end
endmodule
5.2 模60的BCD加法计数器
模60BCD码加法计数器,计数器分为高4位与低4位分别控制,低4位每秒钟加1,变化状态为0~9,低4位状态变化到9时,高4位加1,变化状态为0~2。 VerilogBCD24程序如下
output [5:0] second; //输出秒 reg [5:0] second=0; //初始化秒为0
always@(posedge clk_1s)
if(second==24) //判断是否到24秒 begin
second<=second+1; //没到加1 end else begin
second<=0;//到24秒置0 End
5.3 4-7译码器
将4位二进制代码转换为驱动数码管的7位段选信号。 output SEG_L; output SEG_H; reg[6:0] SEG_L; reg[6:0] SEG_H;
always@(posedge second) begin
SEG_L=second; case(SEG_L)
4'd0:SEG_L=7'b1000000; 4'd1:SEG_L=7'b1111001; 4'd2:SEG_L=7'b0100100; 4'd3:SEG_L=7'b0110000; 4'd4:SEG_L=7'b0011001; 4'd5:SEG_L=7'b0010010; 4'd6:SEG_L=7'b0000010; 4'd7:SEG_L=7'b1111000; 4'd8:SEG_L=7'b0000000; 4'd9:SEG_L=7'b0010000; default: SEG_L=7'b1001000; endcase end
always@(posedge second) begin
SEG_H=second/10; case(SEG_H)
4'd0:SEG_H=7'b1000000; 4'd1:SEG_H=7'b1111001; 4'd2:SEG_H=7'b0100100; 4'd3:SEG_H=7'b0110000;
4'd4:SEG_H=7'b0011001; 4'd5:SEG_H=7'b0010010; 4'd6:SEG_H=7'b0000010; 4'd7:SEG_H=7'b1111000; 4'd8:SEG_H=7'b0000000; 4'd9:SEG_H=7'b0010000; default: SEG_H=7'b1001000; endcase end Endmodule
,,,,,,,,,,,,,,,,,,,,,,,,,所有程序
module clock(clk,SEG_L,SEG_H); input clk; reg clk_1s;
integer count=0;
always@(posedge clk) begin
if(count==2999) begin count<=0; clk_1s<=~clk_1s; end
else count=count+1; end
reg [5:0] second=0; //初始化秒为0 always@(posedge clk_1s)
if(second<=24) //判断是否到24秒 begin
second<=second+1; //没到加1 end else begin
second<=0;/ end output SEG_L; output SEG_H; reg[6:0] SEG_L;
reg[6:0] SEG_H;
always@(posedge second) begin
SEG_L=second; case(SEG_L)
4'd0:SEG_L=7'b1000000; 4'd1:SEG_L=7'b1111001; 4'd2:SEG_L=7'b0100100; 4'd3:SEG_L=7'b0110000; 4'd4:SEG_L=7'b0011001; 4'd5:SEG_L=7'b0010010; 4'd6:SEG_L=7'b0000010; 4'd7:SEG_L=7'b1111000; 4'd8:SEG_L=7'b0000000; 4'd9:SEG_L=7'b0010000; default: SEG_L=7'b1001000; endcase end
always@(posedge second) begin
SEG_H=second/10; case(SEG_H)
4'd0:SEG_H=7'b1000000; 4'd1:SEG_H=7'b1111001; 4'd2:SEG_H=7'b0100100; 4'd3:SEG_H=7'b0110000; 4'd4:SEG_H=7'b0011001; 4'd5:SEG_H=7'b0010010; 4'd6:SEG_H=7'b0000010; 4'd7:SEG_H=7'b1111000; 4'd8:SEG_H=7'b0000000; 4'd9:SEG_H=7'b0010000; default: SEG_H=7'b1001000; endcase end
endmodule