数字系统课程设计报告书基于FPGA的数字钟设计

梦醒童话 范文 报告范文
精选回答

数字钟

硬件描述语言Verilog

HDL

FPGA

1.

设计目的

1.掌握利用EDA开发工具QUARTUSII进行可编程逻辑器件设计的方法;

2.掌握用FPGA进行计数器设计的方法;

3.熟练掌握可编程逻辑器件的原理图输入层次化设计方法;

4.掌握利用QUARTUSII进行软件仿真及对可编程逻辑器件进行硬件下载的方法;

5.进一步巩固所学的理论知识,提高运用所学知识分析和解决实际问题的能力。

2.设计内容及要求

1.设计一个具有“时”、“分”、“秒”显示的计时器,(23时59分59秒);

2.“秒电路”、“分电路”均为00—59的六十进制计数、译码、显示电路;

3.“时电路”为00—23的二十四进制计数、译码、显示电路;

4.该实验是基于FPGA的设计,采用Verilog

HDL进行系统功能描述,采用自顶向下的设计方法,用QUARTUSⅡ软件进行仿真测试。

3.系统整体方案及设计原理

如下图(3.1)所示,该系统框图由6个模块组成,分别为:秒、分、时计数器模块,分频器模块(fp20m),计数器显示模块,1602显示驱动模块(

lcd_1602_drive)。

工作原理是:基准脉冲输入信号同时加到秒、分、时的脉冲输入端,采用并行计数的方式,秒的进位接到分的使能端上,分的进位接到时的使能端上,完成秒、分、时的循环计数。要求输入信号有1kHz/1Hz时钟信号、低电平有效的调秒信号set_state、低电平有效的调分信号min_state、低电平有效的调时信号hour_state。

图3.1

4.各模块电路设计与实现

4.1

分频模块设计与实现

4.1.1分频模块图

图(4.1)分频模块图

4.1.2分频模块程序

//输入频率:20MHz

//输出频率:1Hz,1000Hz

module

fp20m(clk,clk1,clk4,clk1000,clk6m);

input

clk;

output

clk1,clk4,clk1000,clk6m;

reg

clk1,clk4,clk1000,clk6m;

reg

[25:0]

cnt,cnt1,cnt2,cnt3;

[emailprotected](posedge

clk)

//1Hz分频

begin

if(cnt>=

9999999

)

//从0到9999999总共10000000次

begin

cnt=0;

clk1=~clk1;//每10000000次翻转,周期为20000000次,也就是1S

end

else

cnt=cnt+1;

end

[emailprotected](posedge

clk)

//1000Hz分频

begin

if(cnt1>=9999)

begin

cnt1=0;

clk1000=~clk1000;

end

else

cnt1=cnt1+1;

end

[emailprotected](posedge

clk)

//1Hz分频

begin

if(cnt2>=

1

)

//从0到9999999总共10000000次

begin

cnt2=0;

clk6m=~clk6m;//每10000000次翻转,周期为20000000次,也就是1S

end

else

cnt2=cnt2+1;

end

[emailprotected](posedge

clk)

//1Hz分频

begin

if(cnt3

>=

2499999

)

//从0到9999999总共10000000次

begin

cnt3=0;

clk4=~clk4;//每10000000次翻转,周期为20000000次,也就是1S

end

else

cnt3=cnt3+1;

end

endmodule

4.2

计数器模块设计与实现

4.2.1计数模块图

图(4.2)计数器模块图

4.2.2秒计数器程序

module

sec_count

(clk,sec_ten_c,//

分钟的十位的进位信号

sec_one_set,//小时的个位设置数

sec_ten_set,//小时的十位设置数

set_state,//设置状态,0的时候计数,1的时候置数

sec_one,//小时的个位

sec_ten);//小时的十位

input

clk;

input

set_state;

input

[3:0]sec_one_set;

input

[3:0]sec_ten_set;

output

[3:0]sec_one;

output

[3:0]sec_ten;

output

[3:0]sec_ten_c;

reg

[3:0]sec_one;

reg

[3:0]sec_ten;

reg

[3:0]sec_ten_c;

reg

temp;

reg

temp2;

reg

sec_one_c;

initial

begin

sec_one

=

0

;

sec_ten

=

0

;

end

always

@(

posedge

clk)

begin

temp2

=

8

h59)

begin

sec_one

=

8

h58)

begin

sec_ten_c

=

9)

begin

sec_one

=

8

h59)

begin

min_one

=

8

h58)

begin

min_ten_c

=

9)

begin

min_one

=

8

h23)

begin

hour_one

=

9)

begin

hour_one

<=

0;

hour_ten

<=

hour_ten

+

1;

end

else

hour_one

<=

hour_one

+

1

;

end

end

temp

<=

min_ten_c;

end

endmodule

4.3

1602显示驱动模块设计与实现

4.3.1

1602显示驱动模块图

图(4.3)

4.3.2

1602显示驱动模块程序

module

lcd_1602_drive(clk,//500Hz时钟

set_state,second_one_set,second_ten_set,minute_one_set,minute_ten_set,hour_one_set,hour_ten_set,second_one,second_ten,minute_one,minute_ten,hour_one,hour_ten,rs,rw,en,data);

input

clk;

input

set_state;

input

[3:0]

second_one_set,second_ten_set;

input

[3:0]

minute_one_set,minute_ten_set;

input

[3:0]

hour_one_set,hour_ten_set;

input

[3:0]

second_one,second_ten;

input

[3:0]

minute_one,minute_ten;

input

[3:0]

hour_one,hour_ten;

output

rs,rw,en;

reg

rs,rw,en;

output

[7:0]

data;

reg

[7:0]

data;

reg

[7:0]

seg1,seg2,next;

reg

[31:0]

data_clock;

reg

[39:0]

data_chars;

reg

[27:0]

counter,counter1,counter2;

reg

[0:7]

m[10:0];

wire[31:0]

data_clock1;

wire[31:0]

set_clock;

parameter

chars=“CLOCK“;

parameter

state0=

8

d0,camd0=

8

d1,state1=

8

d2,camd1=

8

d3,state2=

8

d4,camd2=

8

d5,state3=

8

d6,camd3=

8

d7,state4=

8

d8,camd4=

8

d9,state5=

8

d10,data0=

8

d11,state6=

8

d12,camd5=

8

d13,state7=

8

d14,data1=

8

d15,state8=

8

d16;

initial

begin

m[0]

=8

b0011_0000;//字符“0”代码

m[1]

=8

b0011_0001;//字符“1”代码

m[2]

=8

b0011_0010;//字符“2”代码

m[3]

=8

b0011_0011;//字符“3”代码

m[4]

=8

b0011_0100;//字符“4”代码

m[5]

=8

b0011_0101;//字符“5”代码

m[6]

=8

b0011_0110;//字符“6”代码

m[7]

=8

b0011_0111;//字符“7”代码

m[8]

=8

b0011_1000;//字符“8”代码

m[9]

=8

b0011_1001;//字符“9”代码

m[10]=8

b0011_1010;//字符“:”代码

end

Assign

data_clock1={hour_ten,hour_one,4

d10,minute_ten,minute_one,4

d10,second_ten,second_one};

//8

assign

set_clock={hour_ten_set,hour_one_set,4

d10,minute_ten_set,minute_one_set,4

d10,second_ten_set,second_one_set};

//8

[emailprotected](posedge

clk)

begin

if(set_state==0)

begin

case(next)

//

初始化

//******************************************************************

state0:

begin

rs<=0;

rw<=0;

data<=8

h38;

en<=1;

next<=camd0;

//8位总线,显示2行

5*7

seg1<=8

b1000_0101;

//第一行首地址

seg2<=8

b1100_0011;

//第二行首地址

end

camd0:

begin

en<=0;

rw<=1;

next<=state1;

end

state1:

begin

rs<=0;

rw<=0;

data<=8

h0c;

en<=1;

next<=camd1;

end

//显示器打开,无光标,光标不闪烁

camd1:

begin

en<=0;

rw<=1;

next<=state2;

end

state2:

begin

rs<=0;

rw<=0;

data<=8

h06;

en<=1;

next<=camd2;

end

//写入新数据光标右移,写入新数据后显示屏不移动

camd2:

begin

en<=0;

rw<=1;

next<=state3;

end

state3:

begin

rs<=0;

rw<=0;

data<=8

h01;

en<=1;

next<=camd3;

end

//清屏

camd3:

begin

en<=0;

rw<=1;

next<=state4;

end

//*******************************************************************

//

第一行,显示CLOCK

//******************************************************************state4:

begin

rs<=0;

rw<=0;

data<=seg1;

en<=1;

next<=camd4;

//if(seg1==8

b1000_0101)

seg1=8

b1000_0111;

//可在此处,设置让CLOCLK动态显示

//else

seg1<=seg1-1

b1;

end

camd4:

begin

en<=0;

rw<=1;

next<=state5;

data_chars<=chars;

end

state5:

begin

rs<=1;

rw<=0;

data<=data_chars[39:32];

en<=1;

next<=data0;

end

data0:

begin

if(counter1==5)

begin

next<=state6;counter1=0;end

else

begin

en<=0;rw<=1;counter1=counter1+1;

data_chars<=(data_chars<<8);next<=state5;end

end

//*******************************************************************

//

第二行显示,时间

//*******************************************************************

state6:

begin

rs<=0;

rw<=0;

data<=seg2;

en<=1;

next<=camd5;

//if(seg1==8

b1000_0101)

seg1=8

b1000_0111;

//可在此处,设置让CLOCLK动态显示

//else

seg1<=seg1-1

b1;

end

camd5:

begin

en<=0;

rw<=1;

next<=state7;

data_clock<=data_clock1;

end

state7:

begin

rs<=1;

rw<=0;

data<=m[data_clock[31:28]];

en<=1;

next<=data1;

end

data1:

begin

if(counter2==8)

begin

next<=state8;counter2=0;end

else

begin

en<=0;rw<=1;counter2=counter2+1;

data_clock<=(data_clock<<4);next<=state7;end

end

//*******************************************************************

//

延迟处理

//******************************************************************

state8:

begin

if(counter==100)

begin

counter=0;

next<=state3;end

else

counter=counter+1;

end

//*******************************************************************

endcase

end

if(set_state

==

1)

begin

case(next)

//

初始化

//******************************************************************

state0:

begin

rs<=0;

rw<=0;

data<=8

h38;

en<=1;

next<=camd0;

//8位总线,显示2行

5*7

seg1<=8

b1000_0101;

//第一行首地址

seg2<=8

b1100_0011;

//第二行首地址

end

camd0:

begin

en<=0;

rw<=1;

next<=state1;

end

state1:

begin

rs<=0;

rw<=0;

data<=8

h0c;

en<=1;

next<=camd1;

end

//显示器打开,无光标,光标不闪烁

camd1:

begin

en<=0;

rw<=1;

next<=state2;

end

state2:

begin

rs<=0;

rw<=0;

data<=8

h06;

en<=1;

next<=camd2;

end

//写入新数据光标右移,写入新数据后显示屏不移动

camd2:

begin

en<=0;

rw<=1;

next<=state3;

end

state3:

begin

rs<=0;

rw<=0;

data<=8

h01;

en<=1;

next<=camd3;

end

//清屏

camd3:

begin

en<=0;

rw<=1;

next<=state4;

end

//*******************************************************************

//

第一行,显示CLOCK

//*******************************************************************state4:

begin

rs<=0;

rw<=0;

data<=seg1;

en<=1;

next<=camd4;

//if(seg1==8

b1000_0101)

seg1=8

b1000_0111;

//可在此处,设置让CLOCLK动态显示

//else

seg1<=seg1-1

b1;

end

camd4:

begin

en<=0;

rw<=1;

next<=state5;

data_chars<=chars;

end

state5:

begin

rs<=1;

rw<=0;

data<=data_chars[39:32];

en<=1;

next<=data0;

end

data0:

begin

if(counter1==5)

begin

next<=state6;counter1=0;end

else

begin

en<=0;rw<=1;counter1=counter1+1;

data_chars<=(data_chars<<8);next<=state5;end

end

//****************************************************************

//

第二行显示,时间

//*******************************************************************

state6:

begin

rs<=0;

rw<=0;

data<=seg2;

en<=1;

next<=camd5;

//if(seg1==8

b1000_0101)

seg1=8

b1000_0111;

//可在此处,设置让CLOCLK动态显示

//else

seg1<=seg1-1

b1;

end

camd5:

begin

en<=0;

rw<=1;

next<=state7;

data_clock<=set_clock;

end

state7:

begin

rs<=1;

rw<=0;

data<=m[data_clock[31:28]];

en<=1;

next<=data1;

end

data1:

begin

if(counter2==8)

begin

next<=state8;counter2=0;end

else

begin

en<=0;rw<=1;counter2=counter2+1;

data_clock<=(data_clock<<4);next<=state7;end

end

//*******************************************************************

//

延迟处理

//*******************************************************************

state8:

begin

if(counter==100)

begin

counter=0;

next<=state3;end

else

counter=counter+1;

end

//*******************************************************************

endcase

end

end

Endmodule

5.

系统仿真及硬件下载

5.1系统仿真

5.1.1系统仿真步骤

(1)建立project项目,在软件主窗口单击File菜单后,单击New选项,选择Verilog

HDL

File选项。

(2)单击OK进入空白的文本编辑区,进行文本编辑。

(3)V文件名必须与模块名相同,将dff1.v文件设置为顶层文件,Project—Set

as

Top-level

Entity。

(4)单击编译器快捷方式按钮,完成编译后,弹

出菜单报告错误和警告数目,并生成编译报告。

(5)利用v文件生成原理图模块。在v文件编辑界面中,

File—Creat/Update—Creat

Symbol

Files

for

Curent

File.

(6)打开project

项目,新建波形仿真文件;在建立的波形文件左侧一栏中,点击鼠标右键,在弹出菜单中选择

Insert

Node

or

Bus。

(7)在出现的图中,选择Node

Finder,将打开Node

Finder

对话框,本试验对输入输出的管脚信号进行仿真,所以在Filter

中选择

Pins:all,点击List

按钮。

(8)在图左栏中选择需要进行仿真的端口通过中间的按钮加入到右栏中,点击OK,端口加入到波形文件中。

(8)选择一段波形,通过左边的设置工具条,给出需要的值,设置完成激励波形,保存。

(9)设置为功能仿真:Assignment—Timing

Analysis

Settings--

Simulator

Settings—Simulation

mode

选择Functional,生成网络表Processing—Generate

Functional

Simulation

Netlist;

点击快捷按钮,开始仿真,完成后得到波形。

5.1.2总原理图

图(5.1)

5.1.3仿真图

图(5.2)

5.2硬件下载

5.2.1引脚分配

(1)根据硬件接口设计,对芯片管脚进行绑定。选择Assignments菜单下Pins选项;

(2)双击对应管脚后Location空白框,出现下拉菜单中选择要绑定的管脚,

图(5.3)

5.2.2下载步骤

(1)对目标版适配下载,(此处认为实验板已安装妥当)单击按钮。

选择Hardware

Setup

,之后在图中选择添加硬件ByteBlasteMV

or

ByteBlaster

II,如图(5.4)所示。

图(5.4)

添加下载硬件

(2)可以根据需要添加多种硬件于硬件列表中,双击可选列表中需要的一种,使其出现在当前选择硬件栏中(本实验板采用ByteBlaster

II

下载硬件),如图(5.5)所示;

图(5.5)

选择当前下载硬件

(3)选择下载模式,本实验板可采用两种配置方式,AS模式对配置芯片下载,可以掉电保持,而JTGA模式对FPGA下载,掉电后FPGA信息丢失,每次上电都需要重新配置。

(4)选择下载文件和器件,JTAG

模式使用后缀为sof

的文件,AS模式使用后缀为pof的文件,选择需要进行的操作,分别如图(5.6),图(5.7)所示;使用AS模式时,还要设置Assignments

菜单下Device,选择图中Device

&

Pin

Options,选择使用的配置芯片,编译。

图(5.6)

JTAG下载模式

图(5.7)

AS下载模式

(5)点击Start按键,开始下载。

6.设计总结

本设计利用硬件描述语言Verilog

HDL和FPGA芯片相结合进行数字钟的研究,从中可以看到EDA技术的发展在一定程度上实现了硬件设计软件化。相信随着电子技术的发展,数字钟的功能会更加多样化,满足人们的各种需要。

通过本次数字钟的设计,我了解了用Verilog

HDL语言编程设计电路的一般方法。同时锻炼了自己的分析理解能力和动手能力,并且加深了对数电相关知识的理解。实验时需要十分细心,特别是用Verilog

HDL语言编辑程序,一不小心就容易出错。由于刚开始什么都不了解,EDA开发工具QUARTUSII软件也不会用,花费时间较多,老师讲解后,我们团队又在网上找相关资料,最后终于完成了数字钟设计。

这次EDA设计锻炼了我很多方面的能力,为将来的继续学习和工作都积累了宝贵的经验,令我受益匪浅。非常感谢学校能增加这种实习课程来培养我们的动手能力、分析能力,这些都是在理论课上不曾学到的。更要感谢刘艳昌老师的辅导,我们才可以顺利完成实习课程。

参考文献

[1]阎石.数字电子技术基础(第五版)[M].北京:高等教育出版社,2006.

[2]王金明.数字系统设计与Verilog

HDL(第4版)[M].北京:电子工业出版社,2011.

[3]冼进.Verilog

HDL数字控制系统设计实例[M].北京:中国水利水电出版社,2007.

[4]翁木云.FPGA设计与应用[M].西安:西安电子科技大学出版社,2002.

20

星月相随 2022-07-13 03:47:19

相关推荐

蚍蜉撼树是什么意思蚍(蚍蜉撼树是什么意思)

1、蜉蝣树(拼音pfhnsh)是中国成语,蜉蝣树(蜉蝣:一种大蚂蚁;Shake:摇动)比喻力量本来就很弱,但是你想摇动一个很强大的东西,就不能随心所欲了。这个成语一般用作主语、谓语、宾语,属于主谓式,含有贬义。...
展开详情

得意洋洋,反义词(得意洋洋的反义词)

1、得意洋洋的反义词有郁郁寡欢的,有空虚进取的书,有哭天抢地的,有郁郁寡欢的,有失意的,有垂头丧气的,有谦虚谨慎的,有黯然销魂的,有抑郁的。2、“得意”是中国成语,读作:dyyngyng,解释为:得意:明白意图...
展开详情

士大夫怎么读(士大夫)

1、士大夫,在古代是指有官职的人,也指不当官的有名望的学者。2、在中国古代,官员和学者的统称。055-79000:“仆亦承传送门之业,受朝廷调教,使得冠带之端,在士大夫之列。”陈继儒,明朝《晋书夏侯湛传》:“立...
展开详情

福兮祸所伏祸兮福所倚什么意思(福兮祸所伏祸兮福所倚)

1、福兮祸所伏祸兮福所倚是俗语,意思是福祸相依,相互转化。比喻能有好结果,好事也能有坏结果。建议人在富贵时要谦虚谨慎,戒骄戒躁;踌躇满志,狂妄自大,却滋生灾难,由福转祸;逆境中坚持,努力,可以化逆境为顺境,从苦...
展开详情

回眸一笑是啥意思(回眸一笑什么意思)

1、回首微笑,拼音是humuy和ao,中国成语,意思是翻白眼,微笑。常用来形容女人妩媚的表情,诱惑人,引人入胜。出自唐白居易《长恨歌》。2、唐白居易《长恨歌》:“只要她转过头来笑一笑,就有一百个符咒在施,六宫的...
展开详情

精选推荐更多>

凉州词王翰在什么情况下写的

王翰的《凉州词二首》具体创作时间未能确证,《凉州词》是乐府歌词,是按凉州(今甘肃省河西、陇右一带)地方乐调歌唱的。这首诗地方色彩极浓。从标题看,凉州属西北边地;从内容看,葡萄酒是当时西域特产,夜光杯是西域所进,琵琶更是西域所产,胡笳更是西北流行乐器。这些无一不与西北边塞风情相关。
原文节选:
葡萄美酒夜光杯,欲饮琵琶马上催。
醉卧沙场君莫笑,古来征战几人回?
译文:
酒筵上甘醇的葡萄美酒盛满在精美的夜光杯之中,歌伎们弹奏起急促欢快的琵琶声助兴催饮,想到即将跨马奔赴沙场杀敌报国,战士们个个豪情满怀。
今日一定要一醉方休,即使醉倒在战场上又何妨?此次出征为国效力,本来就打算马革裹尸,没有准备活着回来。
《凉州词二首》是唐代诗人王翰的组诗作品。第一首诗渲染了出征前盛大华贵的酒筵以及战士们痛快豪饮的场面,表现了战士们将生死置之度外的旷达、奔放的思想感情;第二首诗抓住边塞风光景物的特点,抒写边关将士们夜闻笳声而触动的思乡之情。这两首诗意境开阔,语言华美,节奏明快,富有浪漫气息。

霸凌的意思

“霸凌”通常是指人与人之间权力不平等的欺凌与压迫,它一直长期存在于社会中,包括肢体或言语的攻击、人际互动中的抗拒及排挤,也有可能是类似性骚扰般的谈论性或对身体部位的嘲讽、评论或讥笑,或者是因嫉妒等个人原因对其进行辱骂和讽刺。
“霸凌”造句:
1、报复只会升高施霸凌者的侵犯气焰。
2、正如施霸凌者值得你的注意,受害者也一样。
3、试著找出施霸凌背后的真正原因,再提供适合的援助。
4、教育部透过宣示活动展现反霸凌决心。
5、对那些孤离、少与同侪互动的学生要注意,孤离的学生最易成为施霸凌的目标。

鸟的天堂是什么意思

鸟的天堂一指的是茂盛的大榕树,人们把它叫做“鸟的天堂”。二指地方是鸟儿理想的栖息之地。出自《鸟的天堂》,作者巴金,散文,里面主要内容是说作者巴金游玩鸟的天堂所见到的景色及其感受。
在此文中,作者以清新流畅之笔,发掘和描绘了自然胜景之美,寄托了自己美好的情思,创造出一种清丽悠远的意境。同时,作者不是孤立地描绘这“鸟的天堂”,而是把它放在南国初夏水乡的夕照、青山、塔影、波光、田畴、朝暾的联系、烘托下加以凸显的。全文虽用语简朴无华,平铺直叙,却到处呈现出如诗似画的美趣,流贯着一种祥和宁静而又生机勃勃的田园牧歌情调。

王羲之是什么朝代

王羲之(303年-361年)是东晋大臣、书法家,字逸少,琅琊临沂(今山东省临沂市)人。丹阳尹王旷的儿子,太尉郗鉴的女婿,有“书圣”之称。
凭借门荫入仕,历任秘书郎、江州刺史、会稽太守,累迁右军将军,人称“王右军”。永和九年(353年),组织兰亭雅集。撰写的《兰亭序》,成为“天下第一行书”。永和十一年(355年),称病弃官,迁居于绍兴金庭。升平五年(361年)去世,安葬于瀑布山。
善于书法,兼善隶、草、楷、行各体,精研体势,心摹手追,广采众长,备精诸体,冶于一炉,摆脱汉魏笔风,自成一家,影响深远。风格平和自然,笔势委婉含蓄,遒美健秀。在书法史上,与钟繇并称“钟王”,与其子王献之合称“二王”。李志敏评价:“王羲之的书法既表现以老庄哲学为基础的简淡玄远,又表现以儒家的中庸之道为基础的冲和。”
常见热点问答
热点搜索
1-20
21-40
41-60
61-80
81-100
101-120
121-140
141-160
161-180
181-200
作文大全
1-20
21-40
41-60
61-80
81-100
101-120
121-140
141-160
161-180
181-200