电子表微控器设计 FPGA课程设计报告.docx

上传人:b****7 文档编号:10136723 上传时间:2023-02-08 格式:DOCX 页数:20 大小:233.66KB
下载 相关 举报
电子表微控器设计 FPGA课程设计报告.docx_第1页
第1页 / 共20页
电子表微控器设计 FPGA课程设计报告.docx_第2页
第2页 / 共20页
电子表微控器设计 FPGA课程设计报告.docx_第3页
第3页 / 共20页
电子表微控器设计 FPGA课程设计报告.docx_第4页
第4页 / 共20页
电子表微控器设计 FPGA课程设计报告.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

电子表微控器设计 FPGA课程设计报告.docx

《电子表微控器设计 FPGA课程设计报告.docx》由会员分享,可在线阅读,更多相关《电子表微控器设计 FPGA课程设计报告.docx(20页珍藏版)》请在冰豆网上搜索。

电子表微控器设计 FPGA课程设计报告.docx

电子表微控器设计FPGA课程设计报告

西安邮电学院

FPGA课程设计报告

 

题目:

电子表微控器设计

院系:

电子工程学院

专业班级:

微电子0901

学生姓名:

邢青青

导师姓名:

黄海生

起止时间:

2012/6/18至2012/6/29

 

年月日

 

基于FPGA的电子表微控器设计

一实验目的:

设计一个简单的电子表微控器。

用FPGA开发板的按键作为电子表的时间初值设置控制信号,数码管当前时间值输出。

用按键选择分别输出:

分、秒、1/10秒。

二功能描述:

1用开发板的拨码开关作为电子表时间初值设置控制信号,首先设置初始时间,并用数码管显示出当前时间,共用5个数码管,分别显示分,秒,和1/10秒,其中,分和秒均用两个数码管表示高低位,1/10秒用一个数码管表示。

2当复位信号有效时(复位信号低有效),系统清零,并且将所有时间都清零,不管是显示状态还是调整状态。

3拨码开关是总控制开关,为低时才可以修改即设置新时间,为高是显示当前时间,包括修改后的时间。

4按键1是1/10秒的初值设置和修改控制键。

5按键2是秒的初值设置和修改控制键。

6按键3是分的初值设置和修改控制键。

7用数码管显示开始和修改后的时间。

8结构框图:

三输入输出信号描述:

其中:

Clk:

输入信号,系统时钟,为50MHZ。

Reset:

异步复位信号,当下降沿来临时有效,此时系统清零,所有输出均为0。

Key:

模式选择键,用拨码开关实现。

当为低电平时,修改当前时间;当为高电平时,输出并用数码管显示当前时间。

此操作在复位端无效时进行,若复位端有效,则输出和显示均为0。

Button1:

输入信号,按键1是1/10秒的初值设置和修改控制键,当满10后进一。

Button2:

输入信号,按键2是秒的初值设置和修改控制键,当满60后进一。

Button3:

输入信号,按键3是分的初值设置和修改控制键,当满60后进一。

Clk1,2:

内部输出信号,为分频后的输出时钟,clk1控制按键消抖模块,clk2控制时钟显示模块。

Fen:

内部变量,分的输出。

Miao:

内部变量,秒的输出。

1/10miao:

内部变量,用于1/10秒的输出。

Count:

用于计数。

LED:

是八位输出,用于显示时间。

其中分和秒的显示均用两个数码管,一个显示高位,一个显示低位,当低位显示到9时,向高位进一,直到高位为6时清零。

而1/10秒特用两个数码管分别输出,同样低位为9时向秒位进一,1/10秒的数码管清零。

四功能模块描述:

1根据设计思想,大体要分以下几个模块,顶层结构框图如图:

2顶层模块划分:

(1)时钟模块:

a在这个模块中有1/10秒,秒,分,通过这几个时间来反映做出来的电子表,用板子里面的50MHZ产生出10HZ的分频(即0.1秒)作为1/10秒,从而进行计时。

b初值设置开关(总开关):

总开关用拨码开关控制,当拨到低电平(0)时,1/10秒,秒,分都停止,开始修改时间;当拨到高电平

(1)时,说明时间设置完毕,时钟开始正常显示和计时。

按键1(修改1/10秒):

按一次,1/10秒加1,加到10清零。

按键2(修改秒):

按一次,秒加1,加到60清零。

按键3(修改分):

按一次,分加1,加到60清零。

(2)按键消抖模块:

这个模块完成的是按键的消抖,使用系统自带50MHZ时钟分频得到的25MHZ,再进行按键采样,人一般的反应时间在50ms左右,所以采样的计数设置为25MHZ*50ms。

(3)LED显示模块:

将计时模块所计数,输出到LED的输入端,从而来控制LED灯的显示,即对应的哪一段该亮那一段该灭,以此来显示时间。

(4)时钟分频模块:

将板子的50MHZ时钟经过分频,从而得到10HZ时钟,用于电子表计时,分频得到25MHZ,用于按键消抖模块时对按键采样的频率。

3子模块详细设计:

(1)键盘模块设计:

Key:

用它作为时钟的总开关,拨码开关,当它低电平(0)有效时,开始设置电子表的初值,否则,显示当前时间。

当按键1为1时显示1/10秒,当按键2为1时显示秒,当按键3为1时显示分。

Reset:

作为电子表的复位,当它为低电平时,把电子表的1/10秒,秒,分清零。

Button1:

作为1/10秒的初值设置控制键(每按键一次,1/10秒加1,到9时在返回到0并且向秒进位1)。

Button2:

作为秒的初值设置和修改控制键(每按键一次,秒加1,累加到59时,返回到0并且向分进位1)。

Button3:

作为分的初值设置和修改控制键(每按键一次,分加1,累加到59时返回到0)。

(2)时钟模块设计:

1.利用板子中晶振产生的50MHZ频率,把它分频成0.1秒即10HZ。

2.上面分频得到的0.1秒就是电子表的最小时间单位,当1/10秒从0开始走到9时,向秒进位1的同时,从9跳转到0,重新开始从零计时。

3.秒从0开始计数,当从1/10秒得到进位时,秒加1,直到计数计到59时,向分进位1的同时,从59跳转到0,重新开始从零计时。

4.分从0开始计数,当从秒得到进位时,分加1,直到计数计到59时,跳转到0,从零开始重新计时。

(3)LED数码管显示模块:

首先显示初值1/10秒,秒,分,如果有修改,那么LED液晶显示当前的时间值。

数码管编码:

输入

输出

0

1000000

1

1111001

2

0100100

3

0110000

4

0011011

5

0010010

6

0000010

7

1111000

8

0000000

9

0010000

其他

xxxxxxx

五程序清单:

1分频器:

(1)源代码:

modulefenpinqi(clk,clk1,clk2,reset);

inputclk,reset;

outputclk1,clk2;

regclk1,clk2;

reg[22:

0]count1;

Reg[1:

0]count2;

always@(posedgeclkornegedgereset)//clk1

begin

if(!

reset)

begin

count1<=0;

clk1<=0;

end

else

begin

if(count1[22:

0]==23'd2499999)

begin

count1<=0;

clk1<=~clk1;

end

else

begin

count1[22:

0]<=count1[22:

0]+1'b1;

end

end

End

always@(posedgeclkornegedgereset)//clk2

begin

if(!

reset)

begin

Count2<=0;

Clk2<=0;

end

else

begin

if(count2[1:

0]==2'd2)

begin

Count2<=0;

Clk2<=~clk2;

end

else

begin

Count2[1:

0]<=count2[1:

0]+1'b1;

end

end

end

endmodule

 

(2)分频时钟:

Clk1

2时钟显示:

代码:

moduleclock(reset,clk1,key,button1,button2,button3,fen,miao,one_miao);

inputclk1,reset;

inputbutton1,button2,button3,key;

output[7:

0]fen,miao;

output[3:

0]one_miao;

reg[7:

0]fen,miao;

reg[3:

0]one_miao;

always@(posedgeclk1ornegedgereset)//reset?

?

?

?

?

begin

if(!

reset)

begin

one_miao<=0;

fen<=0;

miao<=0;

end

else//reset?

?

//reset=1

begin

if(key)

//key=1

begin

one_miao[3:

0]<=one_miao[3:

0]+1'b1;

if(one_miao[3:

0]==4'd9)

begin

one_miao[3:

0]<=0;

miao[3:

0]<=miao[3:

0]+1'b1;

if(miao[3:

0]==4'd9)

begin

miao[3:

0]<=0;

miao[7:

4]<=miao[7:

4]+1'b1;

if(miao[7:

4]==7'd5)

begin

miao[6:

0]<=0;

fen[3:

0]<=fen[3:

0]+1'b1;

if(fen[3:

0]==4'd9)

begin

fen[3:

0]<=0;

fen[7:

4]<=fen[7:

4]+1'b1;

if(fen[7:

4]==4'd5)

begin

fen[7:

4]<=0;

miao<=0;

one_miao<=0;

end

end

end

end

end

end////

else//?

?

?

?

elsekey,tiaozheng

begin

if(!

button1)//

begin

one_miao[3:

0]<=one_miao[3:

0]+1'b1;

if(one_miao[3:

0]==4'd9)

begin

one_miao[3:

0]<=0;

miao[3:

0]<=miao[3:

0]+1'b1;

end

end

if(!

button2)

begin

miao[3:

0]<=miao[3:

0]+1'b1;

if(miao[3:

0]==4'd9)

begin

miao[3:

0]<=0;

miao[7:

4]<=miao[7:

4]+1'b1;

if(miao[7:

4]==4'd5)

begin

miao[7:

0]<=0;

fen[3:

0]<=fen[3:

0]+1'b1;

end

end

end

if(!

button3)

begin

fen[3:

0]<=fen[3:

0]+1'b1;

if(fen[3:

0]==4'd9)

begin

fen[3:

0]<=0;

fen[7:

4]<=fen[7:

4]+1'b1;

if(fen[7:

4]==4'd5)

begin

fen[7:

4]<=0;

miao<=0;

one_miao<=0;

end

end

end

end

end//endkey

end

endmodule

 

3数码管显示:

代码:

moduleshumaguan1(dec_in1,dec_out1);

input[3:

0]dec_in1;

output[6:

0]dec_out1;

reg[6:

0]dec_out1;

always@(dec_in1[3:

0])

begin

case(dec_in1[3:

0])

4'd0:

dec_out1<=7'b1000000;

4'd1:

dec_out1<=7'b1111001;

4'd2:

dec_out1<=7'b0100100;

4'd3:

dec_out1<=7'b0110000;

4'd4:

dec_out1<=7'b0011001;

4'd5:

dec_out1<=7'b0010010;

4'd6:

dec_out1<=7'b0000010;

4'd7:

dec_out1<=7'b1111000;

4'd8:

dec_out1<=7'b0000000;

4'd9:

dec_out1<=7'b0010000;

default:

dec_out1<=7'bx;

endcase

end

endmodule

共用5个同样的数码管,显示分,秒,和1/10秒。

数码管波形:

4按键消抖模块:

modulekey(clk2,key_in,key_out);

inputclk2;//50MHzclockin

inputkey_in;

outputkey_out;

reg[22:

0]count_high;

reg[22:

0]count_low;

regkey_reg;

assignkey_out=key_reg;

always@(posedgeclk2)//

if(key_in==1'b0)

count_low<=count_low+1;

else

count_low<=23'h00_0000;

always@(posedgeclk2)//

if(key_in==1'b1)

count_high<=count_high+1;

else

count_high<=23'h00_0000;

always@(posedgeclk2)//

begin

if(count_high==23'h25_0000)

key_reg<=1'b1;

elseif(count_low==23'h25_0000)

key_reg<=1'b0;

else

key_reg<=key_reg;

end

endmodule

5顶层模块:

moduletop(reset,clk,key,button1,button2,button3,dec_out1,dec_out2,dec_out3,dec_out4,dec_out5);

inputclk,key,reset,button1,button2,button3;

output[7:

0]dec_out1,dec_out2,dec_out3,dec_out4,dec_out5;

wire[3:

0]one_miao;

wire[7:

0]miao,fen;

fenpinqiu1(.clk(clk),.reset(reset),.clk1(clk1));

clocku2(.reset(reset),.clk1(clk1),.key(key),

.button1(button1),.button2(button2),

.button3(button3),.fen(fen),.miao(miao),.one_miao(one_miao));

keyu3(.clk2(clk2),.key_in(key_in),.key_out(key_out));

shumaguan1u4(.dec_in1(one_miao),.dec_out1(dec_out1));

shumaguan2u5(.dec_in2(miao[3:

0]),.dec_out2(dec_out2));

shumaguan3u6(.dec_in3(miao[7:

4]),.dec_out3(dec_out3));

shumaguan4u7(.dec_in4(fen[3:

0]),.dec_out4(dec_out4));

shumaguan5u8(.dec_in5(fen[7:

4]),.dec_out5(dec_out5));

endmodule

激励:

moduletop_test;

regclk,key,reset,button1,button2,button3;

wire[7:

0]dec_out1,dec_out2,dec_out3,dec_out4,dec_out5;

toptop_test(reset,clk,key,button1,button2,button3,dec_out1,dec_out2,dec_out3,dec_out4,dec_out5);

initial

begin

reset<=0;

clk<=0;

button1<=1;

button2<=1;

button3<=1;

#10reset<=1;

#10key<=1;

#20key<=0;

button1<=0;

#20button2<=0;

#20button3<=0;

end

always#5clk<=~clk;

endmodule

六仿真结果:

1总体波形显示:

2综合及布局布线报告和引脚分布报告:

 

七实验心得体会:

我觉得这次的课程设计是我上大学以来最有收获的一次课程设计。

首先,通过这次课程设计,我对更加的了解了,不像以前,写好程序,不会下载到板子,还要找同学帮忙。

而且,对所使用的这个板子有了进一步的了解,因为这次课程设计,我使用到了它的按键、拨动开关、LED显示。

其次,我这次做的是电子表,虽然说难度不是很大,但当把按键加到程序中时,我碰到了难题。

每次按下按键调整秒和1/10秒时,分也在发生变化,后来才发现是因为没有button3的有效语句,我把它全写在case情况下,所以会出现那种情况。

一开始自己思路很清楚,但是就是写不出来正确的代码,不是这有问题就是那有问题每次加入按键,改变的时间不是老师所要求的,经过老师的提醒和同学的讨论,我才发现存在的问题,一个是按键消抖时采样的时间不够,一个是通过按键改变时钟的时间时,要把clock首先置成低电平,这样没有上升沿后,电子表的1/10秒就不会走了。

而且按键消抖模块必须得有,有时候因为按得时间长了,他就会连续跳过好几个,加上按键消抖,这种现象就不会产生。

通过解决这些问题,使我的FPGA的功底更加的牢固了,这将会对我未来找工作有很大的帮助。

我们的指导老师是促成我这次能成功的尽早的完成课程设计最大帮助。

以前因为自己动手的比较少,对软件很陌生,不周到怎么装驱动,不知道怎么下载,老师检查让我自己从头操作一遍,感觉很难,害怕自己不会弄,结果发现还可以,就是管脚分配有点问题,由于不知道怎么全部复制,只会一个一个输入,显得很慢,后来才知道可以一起输进去,但是要注意,一起复制过去要在管脚顺序相同的条件下,要不然显示的就是与本身完全相反的数字,因为你的管脚分配的就是反的,除非你改程序中的译码,不过还是挺庆幸的,毕竟学会了些东西一其他的还好了,也对软件的操作更加熟悉了。

最后,人不可能一直坐在电脑面前写代码,所以适当的时候应该转移一下注意力,比如去帮助一下其他同学,因为有可能通过帮助其他同学,你能找到解决你自己问题的方法。

刚开始时我写时钟计时模块的代码时,仿真总不成功,就是因为没有注意时钟的上升沿。

还有一点就是写电子表计时代码时,没有联系到LED是使用BCD码,当我看到其他人在写代码时才恍然大悟。

原来写成BCD码更简单,因为直接可以使用到显示。

总之,收获很大。

八参考资料等

《verilog数字系统设计教程》第二版夏宇闻著

杜慧敏.基于verilog的FPGA设计基础.西安电子科技大学,

 

西安邮电学院电子功能学院系FPGA成绩鉴定表

学生姓名

邢青青

班级/学号

微电子0901/04094030/

进行时间

2012年6月18日—2012年6月28日

成绩鉴定

学习内容(20分)

与教学任务计划结合程度(10分)

与专业培养结合程度(6分)

其它(4分)

接受单位评价

(20分)

实践能力(10分)

学习态度(6分)

学习纪律(4分)

报告鉴定

(60分)

报告内容与实践过程紧密结合(15分)

报告内容与教学计划内容紧密结合(15分)

报告质量(主题、结构、观点、逻辑、资料、字数30分)

评阅教师姓名

职称

成绩

评语

 

评阅教师签字

年月日

西安邮电学院电子工程学院系FPGA过程考核表

学生姓名

邢青青

班级/学号

微电子0901/04094030

承担任务实验室(单位)

所在部门

实施时间

2012年6月18日—2012年6月28日

具体内容

第一周

第二周

……

 

指导教师(师傅)姓名

职务或职称

指导教师(师傅)

对学生的评价

学习态度

□认真□一般□不认真

学习纪律

□全勤□偶尔缺勤□经常缺勤

实践能力

□很强□一般□较差

指导教师(师傅)对学生专业知识或社会实践能力等情况的意见

 

指导教师(师傅)签字

年月日

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1