搜索
您的当前位置:首页FPGA Verilog时钟设计

FPGA Verilog时钟设计

时间:2021-12-28 来源:乌哈旅游


基于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%10;

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%10;

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

因篇幅问题不能全部显示,请点此查看更多更全内容

Top