您的当前位置:首页正文

实用多功能数字时钟设计verilog

来源:画鸵萌宠网


题 目

EDA课程设计

学生姓名: 梅泽霖 学 号: 1211002015 专 业: 电子科学与技术 完成日期: 2014年 1月15日

实用多功能数字时钟设计

一、设计要求

数字钟具有整点报时和校时功能。

(1)以4位LERD数码管显示时、分,时为24进制。

(2)时、分显示数字之间以小数点间隔,小数点以1Hz频率、50%占空比的亮、灭规律表示秒计时。

(3)整点报时采用蜂鸣器实现。每当整点前控制蜂鸣器以低频鸣响4次,响1s、停1s,直到整点前一秒以高频响1s,整点时结束。

(4)采用两个按键分别控制“校时”或“校分”。按下“校时”键时,时显示值以0~23循环变化;按下“校分”键时,分显示值以0~59循环变化,但时显示值不能变化。

二、背景知识介绍

(1)Verilog HDL简介

Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。

Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。

Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。

(2)Quartus工程说明

创建工程时,路径中不允许有中文。

选择芯片系列:Cyclone II

选择芯片型号:EP2C8Q208C8

其余直接下一步。

(创建的工程文件名为:*.qpf文件) 与工程设置:

Assignments -> Settings 弹窗右上角:Device„

Device and Pin Options -> Configuration ->

Use configuration device: EPCS1

Device and Pin Options -> Dual-Purpose Pins -> nCEO : Use as regular I/O

创建Verilog文件,和 Block Diagram文件。 完成编译后,下载。

编译:Processing -> Start Compilation

引脚分配:Assignments -> Pin Planner 下载程序:Tools -> Programmer ->

Hardware Setup„: 选择对应的下载方式

Mode: JATG

注意文件名后缀为:*.sof 并勾选: Program/Configure

连接下载器线,和USB电源线,点击“Start”下载。 Progress:绿色100%,完成。

该下载方式:掉电后消失,须重新下载。

三、硬件设计

硬件配置

硬件搭建图

引脚配置图

四、软件设计

(1)Modelsim仿真

1.主程序

module led(clk,clr,miao,fen1,fen2,shi1,shi2,a,jiaos,jiaof,Ring,

sel,seg);

input clk,clr;

input jiaos,jiaof,sel;

output miao,fen1,fen2,shi1,shi2,seg; reg [3:0] fen1,fen2,shi1,shi2; reg miao;

reg [3:0] sfbz; output reg[7:0] a; output reg Ring; output reg[1:0] sel; output reg[6:0] seg;

always @(posedge clk) begin if(clr) miao<=0; else

miao=~miao; end

always @(posedge miao or clr) begin

if(clr) a<=0;

else if (a==8'd59) a<=0; else a<=a+1; end

always @(posedge miao or clr) begin if(clr) fen1<=0;

else if(jiaof && fen1<4'd9) fen1<=fen1+1;

else if(jiaof && fen1==4'd9) fen1<=0;

else if(fen1==4'd9 && a==8'd59) fen1<=0;

else if (a==8'd59 && (a+1)==8'd60) fen1<=fen1+1; else fen1<=fen1; end

always @(posedge miao or clr) begin if(clr) fen2<=0;

else if(jiaof && fen1==4'd9 && fen2<5) fen2<=fen2+1;

else if(fen2==5 && fen1==9 && a==8'd59) fen2<=0;

else if(fen1==9 && a==8'd59) fen2<=fen2+1; else

fen2<=fen2; end

always @(posedge miao or clr ) begin

if (clr) shi1<=0;

else if(jiaos && shi1<4'd9) shi1=shi1+1;

else if(jiaos && shi1==4'd9) shi1<=0;

else if(shi1==8'd3 && fen1==8'd9 && fen2==8'd5 && a==8'd59 && shi2==4'd2) begin shi1<=0; shi2<=0; end

else if( fen1==8'd9 && fen2==8'd5 && a==8'd59 && shi1==8'd9) shi1<=0;

else if( fen1==8'd9 && fen2==8'd5 && a==8'd59) shi1<=shi1+1; else shi1<=shi1; end

always @(posedge miao or clr) begin

if (clr) shi2<=0;

else if(jiaos && shi2<4'd2) shi2=shi2+1;

else if(shi1==8'd3 && fen1==8'd9 && fen2==8'd5 && a==8'd59 && shi2==2) shi2<=0;

else if( fen1==8'd9 && fen2==8'd5 && a==8'd59 && shi1==8'd9) shi2<=shi2+1; else shi2<=shi2; end

always@(fen1 or fen2 or miao) if(fen1==8'd9 && fen2==8'd5) case (a)

8'd51:Ring=1; 8'd53:Ring=1; 8'd55:Ring=1; 8'd57:Ring=1; 8'd59:Ring=1; default:Ring=1'b0; endcase else

Ring=1'b0; endmodule 2.测试程序

module ledtest1; reg clk,clr;

wire [3:0] fen1,fen2,shi1,shi2; wire miao; wire Ring;

wire [7:0] a; reg jiaos,jiaof;

led u1(clk,clr,miao,fen1,fen2,shi1,shi2,a,jiaos,jiaof,Ring); initial begin

#10 clk=1; #10 clr=1; #10 clr=1; #10 clr=0; #100 jiaof=0; #100 jiaos=0; #100000 jiaof=1; #100000 jiaos=1; #100 jiaof=0; #100 jiaos=0; clr=0; end

always #10 clk=~clk; endmodule

3.Modelsm程序仿真

4

(2) QuartusII仿真 1.主程序

module led(clk,clr,miao,jiaos,jiaof,Ring,sel,seg); input clk,clr; input jiaos,jiaof; output miao,seg,sel;

reg [3:0] fen1,fen2,shi1,shi2; reg [21:0] div;

reg miao,clkd; reg[7:0]seg; reg[3:0]sel,nsel; reg[3:0]sfbz; reg[7:0] a;

output reg Ring;

always @(posedge clk) begin if(~clr) div<=0;

else if(div==21'b111111111111111111111) div<=0; else

div<=div+1; end

always @(posedge clk ) begin if(~clr) clkd<=0; else if(div==21'b111111111111111111111) clkd<=~clkd; else clkd<=clkd; end

always @(posedge clkd) begin if(~clr) miao<=0; else

miao=~miao; end

always @(posedge miao or negedge clr) begin if(~clr) a<=0; else if (a==8'd59) a<=0; else a<=a+1; end

always @(posedge miao or negedge clr) begin if(~clr)

fen1<=0;

else if(!jiaof && fen1<4'd9) fen1<=fen1+1;

else if(!jiaof && fen1==4'd9) fen1<=0;

else if(fen1==4'd9 && a==8'd59) fen1<=0;

else if (a==8'd59 && (a+1)==8'd60) fen1<=fen1+1; else fen1<=fen1; end

always @(posedge miao or negedge clr) begin if(~clr) fen2<=0;

else if(!jiaof && fen1==4'd9 && fen2<5) fen2<=fen2+1;

else if(!jiaof && fen1==4'd9 && fen2==5) fen2<=0;

else if(fen2==5 && fen1==9 && a==8'd59) fen2<=0;

else if(fen1==9 && a==8'd59) fen2<=fen2+1; else

fen2<=fen2; end

always @(posedge miao or negedge clr ) begin if (~clr) shi1<=0; else if(!jiaos &&shi2<=1 && shi1<4'd9) shi1<=shi1+1; else if(!jiaos &&shi2==2&& shi1<4'd3) shi1<=shi1+1; else if(!jiaos && shi1==4'd9) shi1<=0; else if(!jiaos && shi2==2&& shi1==4'd3) shi1<=0; else if( fen1==8'd9 && fen2==8'd5 && a==8'd59 && shi1==8'd9) shi1<=0; else if( fen1==8'd9 && fen2==8'd5 && a==8'd59) shi1<=shi1+1; else shi1<=shi1; end

always @(posedge miao or negedge clr)

begin if (~clr) shi2<=0; else if(!jiaos && shi2<4'd2 &&shi1==9) shi2<=shi2+1; else if(!jiaos && shi2==4'd2 && shi1==3) shi2<=0; else if(shi1==8'd3 && fen1==8'd9 && fen2==8'd5 && a==8'd59 && shi2==2) shi2<=0; else if( fen1==8'd9 && fen2==8'd5 && a==8'd59 && shi1==8'd9) shi2<=shi2+1; else shi2<=shi2; end

always@(fen1 or fen2 or miao) begin

if(fen1==8'd9 && fen2==8'd5) case (a)

8'd51:Ring=1; 8'd53:Ring=1; 8'd55:Ring=1; 8'd57:Ring=1; 8'd59:Ring=1; default:Ring=1'b0; endcase else Ring=1'b0; end

always@(posedge clk or negedge clr) begin if(~clr) sel<=4'b0000; else sel<=nsel; end

/*always@(posedge clk) begin if(~clr) seg=7'b11000000; end*/ always@(sel) begin

case(sel) 4'b0000: nsel=4'b1000; 4'b1000: nsel=4'b0100; 4'b0100: nsel=4'b0010;

4'b0010: nsel=4'b0001; 4'b0001: nsel=4'b0000; default:nsel=4'b0000; endcase end

always@(sel) begin case(sel)

4'b0010:sfbz=fen2; 4'b0001:sfbz=fen1; 4'b1000:sfbz=shi2; 4'b0100:sfbz=shi1; default:sfbz=4'b0000; endcase end

always@(sfbz) begin

case(sfbz) 4'b0000:seg=8'b11000000; 4'b0001:seg=8'b11111001; 4'b0010:seg=8'b10100100; 4'b0011:seg=8'b10110000; 4'b0100:seg=8'b10011001; 4'b0101:seg=8'b10010010; 4'b0110:seg=8'b10000010; 4'b0111:seg=8'b11111000; 4'b1000:seg=8'b10000000; 4'b1001:seg=8'b10010000; default:seg=7'b11000000; endcase end

endmodule

五、课程设计心得体会

xx:课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职

业工作前一个必不少的过程.”千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义.我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础。

通过这次课程设计,本人在多方面都有所提高。通过这次课程设计,综合运用本专业所学课程的理论和生产实际知识进行一次汽车尾灯设计工作的实际训练从而培养和提高学生独立工作能力,巩固与扩充了Verilog等课程所学的内容,掌握设计的方法和步骤,

同时各科相关的课程都有了全面的复习,独立思考的能力也有了提高。

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

Top