Contents
1设计目的及要求 2
1.1设计要求 2
1.2设计H的 2
2工作原理和系统框图 2
3各部分选定方案及电路组成、相关器件说明 2
3.1各部分选定方案 2
3.2相关器件说明 3
4调试过程 8
4.1调试步骤 8
4.2调试过程中出现的错误及修正方案 8
5功能测试 10
6设计结论 12
7设计心得与总结 12
7.1设计心得 12
7.2设计总结 13
8参考文献 13
9 附录 14
9.1附录一总体器件表及相关器件的功能表、管脚分布 14
9.2附录二总体设计图 14
9.3附录三仿真结果 14
9.4附录四小组各成员分工表及个人工作时间表 14
6设计结论
为了实现电梯控制器的设计,我们做了以下几点工作:
(1)整个设计过程分为了早期的基本功能的实现,中期的加速修改功能添加以及后期的
系统的仿真分析和请教同学,完成了对主要模块的仿真以及总体功能的测试。
(2)编写可逆计数器模块,通过正向和逆向计数,实现了电梯的上下楼功能;
(3)编写比较器模块,通过按键输入与计数器输入的比较,来控制计数器是正向计数还
是逆向计数;
(4)编写计时器模块,通过vivado自带的分频器和我们写的分频器进行二次分频,从而
可以在七段数码管上显示出计数的过程;
(5)编写译码器模块,将译码器的输入转化成可以有七段数码管绑定的管脚,从而实现
了整个电梯控制系统的显示模块;
(6)编写节拍发生器模块,通过FPGA有效的片选信号和段选信号实现了电梯所在楼层的
显示和乘客想去楼层的显示;
(7)后期我们进行了分模块的仿真和总体功能的测试,对出现的问题进行了反复的测试
和调试。
7设计心得与总结
7.1设计心得
【就本次实验来说】
(1)时钟的分频和调试花费了很长时间,EGO1开发板上给定的时钟是100MHZ,频率大快,刚开始时进行了2^15次方分频,调试之后发现,频率还是大快,计数器和计时器不 能显示数字的变化过程,通过查阅资料后发现,FPGA内部自带MMCM,于是进行了二次分频,显示恢复正常;
(2)绑定管脚之后,发现计数器总是在0和9之间变动,仔细查错后发现,计数器和比较
器的两个接口连接反了,调整连线后显示恢复正常;
(3)译码器的编写是本次实验的一个亮点,通过译码器将计数和计时直接译码显示在七
段数码管上,既方便又简单,避免了很多繁杂的小器件;
(4)节拍发生器的编写也是本次实验的一个亮点,开始实验时不大了解七段数码管的段选和片选,查阅资料和请教同学之后发现,编写一个节拍发生器,前一时刻显示电梯所在 楼层,后一时刻显示乘客要去楼层,由于时钟的脉冲较快,肉眼看来就是两片数码管同时 显示的;
(5)七段数码管的消隐,实验时发现七段数码管上各段都会亮,只不过不该亮的段颜色较晤,但也不易于区分,反复调试后发现是由于节拍发生器的时钟脉冲大快,在进行片选 时出现了显示的暂留,本文转载自http://www.biyezuopin.vip/onews.asp?id=15000对节拍发生器进行再次分频之后成功消隐;
(6)实验后期,我对实验的代码进行了简化,计时器、计数器、节拍发生器中都含有分
频的代码,于是我另做了分频器,将重复的代码删去,简化了代码的风格。
7.2设计总结
【总的来说】
(1)对数字逻辑和Verilog语言进行了巩固,运用更加熟练,对以后硬件方面的学习打
下坚实的基础。
(2)做实验要有充足的耐心,虽然会出现各种小bug,但通过思考、查阅资料、请教老师
同学之后总能解决的;
(3)一项成功的实验离不开正确的实验设计,确定实验选题之后,我就开始了对整个实
验框图的设计,反复修改并验证了可行性;
(4)把课上所学的知识运用到实践,和同组同学合力实现了电梯控制器的设计。电梯是我们日常生店中每天都在使用的器件,通过这个设计拉近了学习与生店之间的距离,也让 我更加了解自己的专业。
(5)对模块化程序设计的感触更加深刻,分模块编写最后组装,给实验的进行带来了很
大方便。
计时器有一个暂停键与计数器的使能瑞相连,当SW1=SW0=0时,计时器的暂停键有效,计时器不计时;当SW1=1或SW0=1,计时器工作,且每次计时完成后归0,并从下一次电梯开始工作时计时。
代码:module clock( input show, input clk, input pause, input rst,
output reg sm_bit, output reg[6:0]sm_seg
);
reg [3:0]timesec0;
initial begin sm_bit=1; sm_seg=1; timesec0=0; end
always @(posedge clk) begin if(pause) begin if(timesec0==9)
timesec0=0; else
timesec0=timesec0+1; end
end
always@(posedge show) begin
case(timesec0)
0:sm_seg= 7’b1111110; //显示0
1:sm_seg= 7’b0110000; //显示1
2:sm_seg= 7’b1101101; //显示2
3:sm_seg= 7’b1111001; //显示3
4:sm_seg= 7’b0110011; //显示4
5:sm_seg= 7’b1011011; //显示5
6:sm_seg= 7’b1011111; //显示6
7:sm_seg= 7’b1110000; //显示7
8:sm_seg= 7’b1111111; //显示8
9:sm_seg= 7’b1111011; //显示9 default:
sm_seg= 7’b0000000; //不显示
endcase end
endmodule
5)译码器
该译码器不同于一般的译码器,它有四个输入七个输出,四个输入直接接A或B,通过译码
器与七段数码管连接,显示出来。
代码:module translater(value,outled,en); input [3:0]value;
input en;
output reg [6:0]outled; always @(*)
begin if(!en)
outled=7’b0000001; else
case(value) 4’b0000:outled=7’b1111110; //显示0
4’b0001:outled=7’b0110000; //显示1
4’b0010:outled=7’b1101101; //显示2
4’b0011:outled=7’b1111001; //显示3
4’b0100:outled=7’b0110011; //显示4
4’b0101:outled=7’b1011011; //显示5
4’b0110:outled=7’b1011111; //显示6
4’b0111:outled=7’b1110000; //显示7
4’b1000:outled=7’b1111111; //显示8
4’b1001:outled=7’b1111011; //显示9 default:;
endcase end
endmodule
6)分频装置
因为时钟的频率大快了,实验结果不明显,所以我们采取分频的装置。
代码:module FenPin( input inclk, output outclk
);
reg [31:0]timeclk;
assign outclk = timeclk[19]; initial begin
timeclk = 0; end
always@(posedge inclk)begin timeclk = timeclk +1;
end endmodule