单电梯微控器设计方案FPGA课程设计方案报告.docx
《单电梯微控器设计方案FPGA课程设计方案报告.docx》由会员分享,可在线阅读,更多相关《单电梯微控器设计方案FPGA课程设计方案报告.docx(20页珍藏版)》请在冰点文库上搜索。
单电梯微控器设计方案FPGA课程设计方案报告
题目:
单电梯微控器设计
院系:
电子工程学院
专业班级:
微电子0901
学生姓名:
张宏伟
导师姓名:
黄海生
起止时间:
2012/6/18至2012/6/29
年月日
FPGA课程设计报告提纲
1.任务
设计一个单电梯微控器,用FPGA开发板的按键作为手动上下设置开关,led指示当前所在楼层,数码管显示当前电梯工作状态(上/下/停)。
2.目的
3.使用环境(软件/硬件环境,设备等)
4.FPGA课程设计详细内容
4.1技术规范
4.1.1功能定义
(1).异步复位,复位信号与时钟信号不同步
(2).分频器把基准时钟(50HZ)分成10HZ,即0.1秒便于人眼观察,设计0.1-0.3秒钟电梯上升或下降一个楼层
(3).用三个拨码开关设置选择楼层,三个开关可以实现7层楼的设计,拨001为楼层第1层,以后以此类推,最高可达111第7层
(4).用led显示当前选中的楼层,选中某层时,当层的led亮,当电梯降至或升至所选楼层时led灯一直亮(采用独热码)
(5).使用数码管显示电梯状态,上升状态显示“U”,下降状态显示“D”,显示“S”为停止状态,停止时间用第二次输入为准
(6).手动设置电梯工作状态,key1为上升,key2为下降状态
(7).上电复位时电梯初始状态调为第一层
(8).当电梯到第1时下降按键key2无效,当电梯到第7层时上升按键key1无效
(9).电梯运行时可以选择要去的中间楼层,当电梯没有选择所要去的楼层时,上升/下降按键无效3
4.1.2系统结构框图
总体设计可以分为以上几个模块,各模块的功能简要介绍:
1.div模块:
把基准时钟(50MHZ)分成1HZ输出
2.elevator_state模块:
用于总的实现各种功能,各个模块的输入都有此模块进行分析输出
3.display1模块:
用于产生拨码开关的输入值,以方便知道所选择的楼层是多少
4.display模块:
实现电梯的工作状态,上升/下降/停止
5.led模块:
显示当前所在楼层,采用独热码,方便显示
6.floor_time模块:
用于改变楼层上升或下降到相邻楼层的时间,由于给的count给的为数较少,故只能实现0.1-0.3秒任意值,如果还想实现更长的时间则需要改变count的位数
7.top模块:
把所有的模块连在一起
4.1.3应用范围
用于控制电梯的运作,可实现上/下/停止等功能。
4.1.4引脚描述
输入输出信号描述
信号名称
输入/输出
目标/源
功能描述
clk
input
pin
系统时钟(50MHZ)
reset
input
pin
异步清零,低电平有效
chose[2:
0]
input
pin
楼层选择,000不用,001-111
key1
input
pin
电梯上升按键
key2
input
pin
电梯下降按键
display[6:
0]
output
pin
数码管显示工作状态,升/降/停
display1[6:
0]
output
pin
显示所要去的楼层
led[6:
0]
output
pin
发光二极管显示当前楼层
4.2设计方案
把基准时钟进行分频,即50MHZ分成1HZ以便于现实,否则频率太大就会由于人眼的视觉暂留效应而无法分辨,而只能看到所选择的楼层亮,而其他楼层则不亮,分成10HZ就会看见灯是一个一个亮的,led灯采用独热码便于观察,当电梯上电时进行复位,则电梯被复位至1层,此时1层灯一直亮着意味着此时电梯在一楼,当有上升按键按下同时选择所去楼层时电梯工作,电梯工作时,按按键无效,当电梯在第一层按下降按键无效,同理在第七层按上升按键无效,如果电梯上升数码管display显示U,下降时显示D,停止时显示S,当电梯到了所选楼层时,此楼层的灯一直亮着。
独热码编码:
楼层
独热码
一层
0000001
二层
0000010
三层
0000100
四层
0001000
五层
0010000
六层
0100000
七层
1000000
共阳极数码管显示管脚图:
显示
对应编码
0
1000000
1
1111001
2
0100100
3
0110000
4
0011001
5
0010010
6
0000010
7
1111000
8
0000000
9
0010000
A
0001000
B
0000011
C
1000110
D
0100001
E
0000110
F
0001110
U
1000001
5.各个功能模块描述
5.1。
分频器模块:
功能:
把系统时钟(50MHZ)分成10HZ便于人眼观察
代码:
modulediv(clk,reset,fclk)。
inputclk,reset。
outputfclk。
regfclk。
reg[25:
0]count。
always@(posedgeclkornegedgereset)
begin
if(!
reset)
begin
count<=0。
fclk<=0。
end
else
begin
if(count[25:
0]==26'd2499999)
begin
count<=0。
fclk<=~fclk。
end
else
begin
count[25:
0]<=count[25:
0]+1'b1。
end
end
end
Endmodule
模块功能仿真:
5.2.display模块
功能:
用于显示电梯的工作状态,S代表停止,U代表上升,D代表下降
代码:
moduledecode(dec_in,display)。
input[1:
0]dec_in。
output[6:
0]display。
reg[6:
0]display。
always@(dec_in)
begin
case(dec_in)
2'd0:
display[6:
0]=7'b0010000。
2'd1:
display[6:
0]=7'b1000001。
2'd2:
display[6:
0]=7'b0100001。
default:
display[6:
0]=7'bx。
endcase
end
Endmodule
模块功能仿真:
5.3.display1模块
功能:
用于显示要去的楼层,从第一楼开始直到第七楼
代码:
moduledecode1(dec_in1,display1)。
input[2:
0]dec_in1。
output[6:
0]display1。
reg[6:
0]display1。
always@(dec_in1)
begin
case(dec_in1)
3'd0:
display1[6:
0]=7'b1000000。
3'd1:
display1[6:
0]=7'b1111001。
3'd2:
display1[6:
0]=7'b0100100。
3'd3:
display1[6:
0]=7'b0110000。
3'd4:
display1[6:
0]=7'b0011001。
3'd5:
display1[6:
0]=7'b0010010。
3'd6:
display1[6:
0]=7'b0000010。
3'd7:
display1[6:
0]=7'b1111000。
default:
display1[6:
0]=7'bx。
endcase
end
endmodule
模块仿真:
5.3.led模块
功能:
用于显示当前楼层,电梯在哪层,哪层的灯亮
代码:
moduleled(floor,light)。
input[2:
0]floor。
output[6:
0]light。
reg[6:
0]light。
always@(floor)
begin
case(floor)
3'd1:
light[6:
0]<=7'b0000_001。
3'd2:
light[6:
0]<=7'b0000_010。
3'd3:
light[6:
0]<=7'b0000_100。
3'd4:
light[6:
0]<=7'b0001_000。
3'd5:
light[6:
0]<=7'b0010_000。
3'd6:
light[6:
0]<=7'b0100_000。
3'd7:
light[6:
0]<=7'b1000_000。
default:
light[6:
0]<=7'bx。
endcase
end
Endmodule
功能仿真:
5.5.elevator_state模块
功能:
总体控制模块,用于控制电梯的工作,同时向各个模块输出对应的数值,以用于在各个模块中显示。
代码:
moduleelevator_state(fclk,reset,key1,key2,chose,count,floor,dec_in,dec_in1)。
inputfclk,reset,key1,key2。
input[2:
0]chose。
input[1:
0]count。
output[2:
0]floor。
output[1:
0]dec_in。
output[2:
0]dec_in1。
reg[1:
0]dec_in。
reg[2:
0]dec_in1。
reg[2:
0]floor。
reg[1:
0]state。
wire[1:
0]count。
parameterstop=2'd0,up=2'd1,down=2'd2。
always@(posedgefclkornegedgereset)
begin
if(!
reset)
begin
dec_in1[2:
0]<=3'b001。
end
else
begin
dec_in1[2:
0]<=chose[2:
0]。
end
end
always@(posedgefclkornegedgereset)
begin
if(!
reset)
begin
state<=stop。
floor[2:
0]<=3'b001。
dec_in[1:
0]<=2'b00。
end
else
begin
case(state)
stop:
begin
if(dec_in1>floor)
begin
if(!
key1)
begin
if(floor[2:
0]==3'b111)
begin
state<=stop。
dec_in[1:
0]<=2'b00。
end
else
begin
state<=up。
dec_in[1:
0]<=2'b01。
end
end
end
elseif(dec_in1begin
if(!
key2)
begin
if(floor[2:
0]==3'b001)
begin
state<=stop。
dec_in[1:
0]<=2'b00。
end
else
begin
state<=down。
dec_in[1:
0]<=2'b10。
end
end
end
else
begin
state<=stop。
dec_in[1:
0]<=2'b00。
end
end
up:
begin
if(count[1:
0]==2'd2)
begin
floor[2:
0]=floor[2:
0]+1'b1。
if(chose[2:
0]==floor[2:
0])
begin
state<=stop。
dec_in[1:
0]<=2'b00。
end
end
else
begin
state<=up。
dec_in[1:
0]<=2'b01。
end
end
down:
begin
if(count[1:
0]==2'd2)
begin
floor[2:
0]=floor[2:
0]-1'b1。
if(chose[2:
0]==floor[2:
0])
begin
state<=stop。
dec_in[1:
0]<=2'b00。
end
end
else
begin
state<=down。
dec_in[1:
0]<=2'b10。
end
end
default:
begin
state<=stop。
dec_in[1:
0]<=2'b00。
end
endcase
end
end
Endmodule
功能仿真:
5.6.floor_time模块
功能:
用于控制电梯上升和下降相邻楼层的时间
代码:
modulefloor_time(fclk,reset,count)。
inputfclk,reset。
output[1:
0]count。
reg[1:
0]count。
always@(posedgefclkornegedgereset)
begin
if(!
reset)
begin
count[1:
0]<=0。
end
else
begin
if(count[1:
0]==2'd2)
begin
count[1:
0]<=0。
end
else
count[1:
0]<=count[1:
0]+1'b1。
end
end
Endmodule
模块仿真:
5.7.top顶层模块:
功能:
用于各个模块之间的连接以实现整体功能
代码:
moduletop(clk,reset,key1,key2,chose,display,display1,light)。
inputclk,reset,key1,key2。
input[2:
0]chose。
output[6:
0]display,display1。
output[6:
0]light。
wire[1:
0]dec_in。
wire[2:
0]dec_in1。
wire[2:
0]floor。
wire[1:
0]count。
divtop1(.clk(clk),.reset(reset),.fclk(fclk))。
decodetop2(.dec_in(dec_in),.display(display))。
decode1top3(.dec_in1(dec_in1),.display1(display1))。
elevator_statetop4(.fclk(fclk),.reset(reset),.key1(key1),.key2(key2),.chose(chose),.dec_in(dec_in),.dec_in1(dec_in1),.floor(floor))。
floor_timetop5(.fclk(fclk),.reset(reset),.count(count))。
ledtop6(.fclk(fclk),.reset(reset),.floor(floor),.light(light))。
endmodule
6.综合布线布局
管脚分配:
7.课程设计的心得体会
本次课程设计自己独立完成,学习到了很多东西,完善了自己很多的不足,比如说不喜欢写设计规范,以至于后面在编写代码的时候出现很多没有想到的问题,解决起来没有头绪,对设计造成了很大麻烦,最后虽然完成了设计要求,但是还是有很多的问题存在。
总体来说,本次设计还是对我学习fpga有很大帮助的。
8.参考资料
[2]夏宇文.Verilog数字系统设计教程.北京航空航天出版社.2008
[3]杜慧敏.基于verilog的FPGA设计基础.西安电子科技大学,
西安邮电学院电子功能学院系FPGA成绩鉴定表
学生姓名
张宏伟
班级/学号
微电子0901/04094004/
进行时间
2012年6月18日—2012年6月28日
成绩鉴定
学习内容(20分)
与教案任务计划结合程度(10分)
与专业培养结合程度(6分)
其它(4分)
接受单位评价
(20分)
实践能力(10分)
学习态度(6分)
学习纪律(4分)
报告鉴定
(60分)
报告内容与实践过程紧密结合(15分)
报告内容与教案计划内容紧密结合(15分)
报告质量(主题、结构、观点、逻辑、资料、字数30分)
评阅教师姓名
职称
成绩
评语
评阅教师签字
年月日
西安邮电学院电子工程学院系FPGA过程考核表
学生姓名
张宏伟
班级/学号
微电子0901/04094004
承担任务实验室(单位)
所在部门
实施时间
2012年6月18日—2012年6月28日
具体内容
第一周
第二周
……
指导教师(师傅)姓名
职务或职称
指导教师(师傅)
对学生的评价
学习态度
□认真□一般□不认真
学习纪律
□全勤□偶尔缺勤□经常缺勤
实践能力
□很强□一般□较差
指导教师(师傅)对学生专业知识或社会实践能力等情况的意见
指导教师(师傅)签字
年月日