资源描述
长 沙 学 院
课程设计说明书
题目
模拟停车场管理系统的设计
系(部)
电子与通信工程系
专业(班级)
姓名
学号
指导教师
刘辉、龙英、谢明华
起止日期
2010.5.31-2010.6.11
EDA技术课程设计任务书
系(部):电子与通信工程系 专业:电子信息工程 指导教师:刘辉、龙英、谢明华
课题名称
模拟停车场管理系统的设计
设计内容及要求
实现一个模拟停车场管理系统,使用8位拨码开关表示车号,按键A按下一次表示该车进入停车场,同时数码管显示该车车号信息(3个数码管显示拨码开关对应的十进制数)及收费费率(位方便模拟,按1元/分钟);按键B按下一次表示该车从停车场出来,该车出来时用数码管显示的信息包括:3位车号、停车时间(2位小时数、两位分钟数)、3位停车费用。(数码管位数不够可采用滚动显示的方式)
设计工作量
1、VHDL语言程序设计;
2、波形仿真;
3、在实验装置上进行硬件测试,并进行演示;
4、提交一份完整的课程设计说明书,包括设计原理、程序设计、程序分析、仿真分析、硬件测试、调试过程,参考文献、设计总结等。
进度安排
起止日期(或时间量)
设计内容(或预期目标)
备注
第1天
课题介绍,答疑,收集材料
第2天
设计方案论证及设计
第3-7天
设计VHDL语言程序
第8-9天
在实验装置上进行硬件测试
第5~9天,第10天上午
在实验装置上进行硬件测试
第10天下午
编写设计说明书
教研室
意见
年 月 日
系(部)主管领导意见
年 月 日
长沙学院课程设计鉴定表
姓名
谭鑫
学号
2007044228
专业
电子信息工程
班级
2
设计题目
模拟停车场管理系统的设计
指导教师
刘辉、龙英、谢明华
指导教师意见:
评定等级: 教师签名: 日期:
答辩小组意见:
评定等级: 答辩小组长签名: 日期:
教研室意见:
教研室主任签名: 日期:
系(部)意见:
系主任签名: 日期:
说明
课程设计成绩分“优秀”、“良好”、“及格”、“不及格”四类;
目 录
1.设计思路分析 1
1.1题目要求 1
1.2设计思路 1
2.系统结构设计及分析 2
2.1分频模块 4
2.2消抖模块 6
2.3车牌显示模块 7
2.4计时模块 9
2.5费率器模块 11
2.6滚动模块 12
2.7译码模块 15
3.使用说明 17
4.心得与体会 18
参考文献 18
1.设计思路分析
1.1题目要求
实现一个模拟停车场管理系统,使用8位拨码开关表示车号,按键A按下一次表示该车进入停车场,同时数码管显示该车车号信息(3个数码管显示拨码开关对应的十进制数)及收费费率(位方便模拟,按1元/分钟);按键B按下一次表示该车从停车场出来,该车出来时用数码管显示的信息包括:3位车号、停车时间(2位小时数、两位分钟数)、3位停车费用。(数码管位数不够可采用滚动显示的方式)
1.2设计思路
分析题目要求,宜采用“模块法”的设计方法。(模块法——先用VHDL语言设计各个模块,将这些模块生成图形文件,在顶层文件中再调用这些图形。)
具体思路:
当一辆车进入停车场,按键A被按下:计时器开始计时,同时把该车的车牌号和费率送入数码管显示(3个数码管显示拨码开关对应的十进制数:采用BCD码转换的方法;费率显示采用输入设置,可以通过按键+1的方式设置从1~99的费率)。当车驶出停车场时,按键B被按下,此时计时器停止计时,并把计时时间送入数码管显示(2位小时数、两位分钟数),同时显示车牌号信息及停车费用(三位显示:停车费用=停车时间×费率)。由于数码管位数不够采用滚动显示的方式。
2.系统结构设计及分析
本系统主要包括以下八个模块:分频模块fpq,车牌BCD转换模块chepai,消抖模块xiaodou,计时模块jishi,费率模块feilvqi,计价器模块jjq,滚动模块gundong,译码器模块YMQ。先通过VHDL文本生成这些模块,再在顶层文件中调用这些模块。
系统的主程序流程图如图1所示。
图1.系统主程序流程图
系统的顶层文件,即为本系统的总原理图,如图2所示。
图2.系统总原理图
2.1分频模块
该模块对实验箱上的50MHz时钟进行分频,分成所需要的几种不同频率的时钟。分频的原理为:对50MHz时钟每来一个上升沿计一次数,当计数到一定值的时候,计数值清零并且让输出电平取反,根据计数值的不同可以得到不同的输出频率。在本设计中分频出0.1HZ,1HZ,100Hz,200Hz,500Hz的频率,以供不同的需要。
分频模块源程序: 图3 分频模块
2.2消抖模块
作为机械开关的键盘,在按键操作时,机械触点的弹性及电压突跳等原因,在触点闭合和开启瞬间会出现电压的抖动。为保证按键识别的准确性,在按键电压信号抖动的情况下不能进行状态输入。为此必须进行去抖动处理,消除抖动部分的电压信号,一般有硬件和软件两种方法。硬件就是加去抖动电路,这样可以从根本上解决按键抖动问题。软件消抖就是利用软件延时消抖,具体说就是当检测到高电平(有按键按下),1kHz脉冲来一个高电平计数值加1,一遇到低电平计数值清零,当计数值大于10时,说明按键是被真的按下,消除了抖动。本系统采用软件消抖。 图4.消抖模块
图5.消抖模块波形仿真
消抖模块源程序:
2.3车牌显示模块
用8位拨码开关表示车号,拨码开关对应的8位二进制通过BCD转换为12位BCD码。
图5.拨码开关BCD转换模块
8位拨码开关BCD码转换程序:
--拨码开关对应数码管显示
--**************库定义、 包定义********************
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.All;
USE ieee.STD_LOGIC_UNSIGNED.ALL;
--******************实体定义***********************
ENTITY chepai IS
PORT(--clk : IN STD_LOGIC;--时钟输入
key : in std_logic_vector(7 downto 0);--键入
-- l : out STD_LOGIC_VECTOR(7 downto 0);--输出数码管位选
chep : out STD_LOGIC_VECTOR(11 downto 0)--数码管段码
);
END chepai ;
--**************构造体定义********************
ARCHITECTURE an OF chepai IS
signal clock : std_logic;--分频后时钟
signal p : integer range 0 to 255;--显示数据寄存器
signal b0,b1,b2 : integer range 0 to 9;--显示数位寄存器,b0表示个位,b1表示十位,b2表示百位
signal cnt : integer range 0 to 3:=0;--数码管位选扫描程序
begin
p<=conv_integer(key);--数据输入
process(p)--显示查表进程
FUNCTION b_to_s4(bcd8421:INTEGER RANGE 0 TO 9) RETURN STD_LOGIC_VECTOR IS--BCD转换七段函数
VARIABLE smg4: STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
CASE bcd8421 IS --计算输出值
WHEN 0 => smg4:="0000";--0 --gfedcba 共阳
WHEN 1 => smg4:="0001";--1
WHEN 2 => smg4:="0010";--2
WHEN 3 => smg4:="0011";--3
WHEN 4 => smg4:="0100";--4
WHEN 5 => smg4:="0101";--5
WHEN 6 => smg4:="0110";--6
WHEN 7 => smg4:="0111";--7
WHEN 8 => smg4:="1000";--8
WHEN 9 => smg4:="1001";--9
when others=>null;
END CASE;
RETURN smg4;
END b_to_s4;
begin
case p is
when 0|10|20|30|40|50|60|70|80|90|100|110|120|130|140|150|160|170
|180|190|200|210|220|230|240|250=>b0<=0;
when 1|11|21|31|41|51|61|71|81|91|101|111|121|131|141|151|161|171
|181|191|201|211|221|231|241|251=>b0<=1;
when 2|12|22|32|42|52|62|72|82|92|102|112|122|132|142|152|162|172
|182|192|202|212|222|232|242|252=>b0<=2;
When 3|13|23|33|43|53|63|73|83|93|103|113|123|133|143|153|163|173
|183|193|203|213|223|233|243|253=>b0<=3;
When 4|14|24|34|44|54|64|74|84|94|104|114|124|134|144|154|164|174
|184|194|204|214|224|234|244|254=>b0<=4;
When 5|15|25|35|45|55|65|75|85|95|105|115|125|135|145|155|165|175
|185|195|205|215|225|235|245|255=>b0<=5;
When 6|16|26|36|46|56|66|76|86|96|106|116|126|136|146|156|166|176
|186|196|206|216|226|236|246=>b0<=6;
When 7|17|27|37|47|57|67|77|87|97|107|117|127|137|147|157|167|177
|187|197|207|217|227|237|247=>b0<=7;
When 8|18|28|38|48|58|68|78|88|98|108|118|128|138|148|158|168|178
|188|198|208|218|228|238|248=>b0<=8;
When 9|19|29|39|49|59|69|79|89|99|109|119|129|139|149|159|169|179
|189|199|209|219|229|239|249=>b0<=9;
when others=>
end case;
case p is
when 0|1|2|3|4|5|6|7|8|9|100|101|102|103|104|105|106|107|108|109
|200|201|202|203|204|205|206|207|208|209=>b1<=0;
when 10|11|12|13|14|15|16|17|18|19|110|111|112|113|114|115|116|117
|118|119|210|211|212|213|214|215|216|217|218|219=>b1<=1;
when 20|21|22|23|24|25|26|27|28|29|120|121|122|123|124|125|126|127
|128|129|220|221|222|223|224|225|226|227|228|229=>b1<=2;
when 30|31|32|33|34|35|36|37|38|39|130|131|132|133|134|135|136|137
|138|139|230|231|232|233|234|235|236|237|238|239=>b1<=3;
when 40|41|42|43|44|45|46|47|48|49|140|141|142|143|144|145|146|147
|148|149|240|241|242|243|244|245|246|247|248|249=>b1<=4;
when 50|51|52|53|54|55|56|57|58|59|150|151|152|153|154|155|156|157
|158|159|250|251|252|253|254|255=>b1<=5;
when 60|61|62|63|64|65|66|67|68|69|160|161|162|163|164|165|166|167
|168|169=>b1<=6;
when 70|71|72|73|74|75|76|77|78|79|170|171|172|173|174|175|176|177
|178|179=>b1<=7;
when 80|81|82|83|84|85|86|87|88|89|180|181|182|183|184|185|186|187
|188|189=>b1<=8;
when 90|91|92|93|94|95|96|97|98|99|190|191|192|193|194|195|196|197
|198|199=>b1<=9;
when others=>--b0<=10;
end case;
if p<100 then
b2<=0;
elsif p>=100 and p<200 then
b2<=1;
elsif p>=200 then
b2<=2;
end if;
chep(3 downto 0)<=b_to_s4(b0);
chep(7 downto 4)<=b_to_s4(b1);
chep(11 downto 8)<=b_to_s4(b2);
end process;
end an;
2.4计时模块
当A键按下时,计时器开始计时,B键按下时,计时器停止计时,clk为计时脉冲,来一个上升沿,计数器加1,reset为总复位信号。
计时模块程序:
图7.计时模块波形仿真
2.5费率器模块
初值为0,当费率在0-99范围内时,费率按键每按一次,费率加1。
图7.费率器波形仿真图 8.费率器模块图形文件
费率器模块源程序:
2.6滚动模块
滚动显示模块,当C=1时不滚动,但当C=0时滚动显示车牌、停车时间、及停车中费用。y[3..0]输出到译码器,sel为位选信号。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all; 图9 滚动模块图形文件
entity gundong is
port ( A,B:in std_logic;
data: in std_logic_vector(15 downto 0);
chep:in std_logic_vector(11 downto 0);
price:in std_logic_vector(11 downto 0);
feilv:in std_logic_vector(7 downto 0);
clk_200Hz,clk_1Hz: in std_logic;
sel: out std_logic_vector(7 downto 0);--weixuan
y: out std_logic_vector(3 downto 0));
end ;
architecture body_chooser of gundong is
signal c:std_logic;
signal count: std_logic_vector (2 downto 0);
signal cnt:std_logic_vector(3 downto 0);
begin
-- process(clk_200Hz)
-- begin
process(A,B)
begin
if (A'event and A='1') then
c<='1';
end if;
if B='1' then
c<='0';
end if;
end process;
process(clk_200Hz)
begin
if(clk_200Hz'event and clk_200Hz='1')then
if count<"111" then
count<=count+1;
else count<="000";
end if;
end if;
end process;
process(clk_1Hz)
begin
if clk_1Hz'event and clk_1Hz='1' then
if cnt<"1100" then
cnt<=cnt+1;
else cnt<="0000";
end if;
end if;
end process;
process(c,cnt,count)
begin
if c='1' then
case count is
--when "000"=>y<="1010";sel<="00000001";
when "000"=>y<=feilv(3 downto 0);sel<="00000010";
when "001"=>y<=feilv(7 downto 4);sel<="00000100";
--when "011"=>y<="1010";sel<="00001000";
when "010"=>y<=chep(3 downto 0);sel<="00100000";
when "011"=>y<=chep(7 downto 4);sel<="01000000";
when "100"=>y<=chep(11 downto 8);sel<="10000000";
when others=>null;
end case;
elsif cnt="0000" then
case count is
when "000"=>y<=chep(11 downto 8);sel<="10000000";
when "001"=>y<=chep(7 downto 4);sel<="01000000";
when "010"=>y<=chep(3 downto 0);sel<="00100000";
when "011"=>y<="1010";sel<="00010000";
when "100"=>y<=data(15 downto 12);sel<="00001000";
when "101"=>y<=data(11 downto 8);sel<="00000100";
when "110"=>y<=data(7 downto 4);sel<="00000010";
when "111"=>y<=data(7 downto 4);sel<="00000001";
when others=>null;
end case;
elsif cnt="0001" then
case count is
when "000"=>y<=chep(7 downto 4);sel<="10000000";
when "001"=>y<=chep(3 downto 0);sel<="01000000";
when "010"=>y<="1010";sel<="00100000";
when "011"=>y<=data(15 downto 12);sel<="00010000";
when "100"=>y<=data(11 downto 8);sel<="00001000";
when "101"=>y<=data(7 downto 4);sel<="00000100";
when "110"=>y<=data(3 downto 0);sel<="00000010";
when "111"=>y<="1010";sel<="00000001";
when others=>null;
end case;
elsif cnt="0010" then
…
elsif cnt="0011" then
…
elsif cnt="0100" then
…
elsif cnt="0101" then
…
elsif cnt="0110" then
…
elsif cnt="0111" then
…
elsif cnt="1000" then
…
elsif cnt="1001" then
…
elsif cnt="1010" then
…
elsif cnt="1011" then
…
elsif cnt="1100" then
case count is
when "000"=>y<="1010";sel<="10000000";
when "001"=>y<=chep(11 downto 8);sel<="01000000";
when "010"=>y<=chep(7 downto 4);sel<="00100000";
when "011"=>y<=chep(3 downto 0);sel<="00010000";
when "100"=>y<="1010";sel<="00001000";
when "101"=>y<=data(15 downto 12);sel<="00000100";
when "110"=>y<=data(11 downto 8);sel<="00000010";
when "111"=>y<=data(7 downto 4);sel<="00000001";
when others=>null;
end case;
end if;
end process;
end body_chooser;
图10 滚动显示
2.7译码模块
该模块将将输入的二进制信号译成相应的七段共阳极数码管的编码。数据输入data[3..0],译码输出led7s[6..0]。
图11.译码模块图形文件
译码模块程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity ymq is
port(data: in std_logic_vector(3 downto 0);
led7s: out std_logic_vector(6 downto 0));
end ;
architecture one of ymq is
begin
process(y)
begin
case y is
when "0000"=>led7s<="1000000"; --0
when "0001"=>led7s<="1111001"; --1
when "0010"=>led7s<="0100100"; --2
when "0011"=>led7s<="0110000"; --3
when "0100"=>led7s<="0011001"; --4
when "0101"=>led7s<="0010010"; --5
when "0110"=>led7s<="0000010"; --6
when "0111"=>led7s<="1111000"; --7
when "1000"=>led7s<="0000000"; --8
when "1001"=>led7s<="0010000"; --9
when others=>null;
end case;
end process;
end ;
图12.译码模块波形仿真
3. 使用说明
按键说明:
A按键:为开始按钮,即当车辆进入停车场时,按下A开始计时,并显示进入车辆的车牌号及收费费率。B按键:为停止按钮,即当车辆驶出停车场时,按下B按钮,停止计时,并滚动显示,车牌号、停车时间及停车费用。费率按键:为费率设置按钮,每按一次,费率加1。Reset按钮为总复位按钮。clk为系统时钟,绑定到实验箱上的50MHz的时钟上,led7s[6..0]为数码管段选控制信号,sel[7..0]为8个数码管的位选控制信号。
测试方法:首先按下复位键,然后设置八位拨码开关的值(车牌号),此时,数码管显示三位车牌号信息和费率,按下费率按键可以设置费率的值(每按一次加1,范围0~99),过一段时间,按下B键,此时8位数码管会滚动显示,三位车牌号,四位停车时间和三位停车费。按下复位键,可重新测试。
系统的引脚绑定如图13所示,实际操作中只需要按下图绑定即可。
图13.系统引脚绑定
4. 心得与体会
两周的EDA课程设计,我终于能在第8天成功的设计出了我的课题:模拟停车场管理系统,虽然在速度上我没能赶上部分同学,但是与他们不同的是,从软件到硬件完全是我一个人做出来的。没有人跟我同一个题目,网上也找不到资料,完全是一个人的战斗,但最后,我相信我赢得了这场战斗的胜利,圆满完成了模拟停车场管理系统的软硬件设计。
在这场战斗中我有很大的收获,首先我采用层次化结构化设计,将此项设计任务分成若干模块,规定每一模块的功能和各模块之间的接口,然后再将各模块联合起来调试,加深了我们对层次化设计的概念的认识。在设计的过程中,虽然遇到了很多困难,但是通过向老师和同学请教以及自己不断摸索、测试,一个个难题迎刃而解。从而提高了我独立发现问题、分析问题、解决问题的能力,其次,我也明白了一个道理,任何一件事情,只有亲自去做的时候才知道它到底难不难,有多难。我们就像小马过河中的小马,需要自己多去尝试。
参考文献
[1].《 EDA技术实用教程》潘松,黄继业.. 北京:科学出版社,2006
[2].《 VHDL设计实例与仿真》姜雪松,吴钰淳,王鹰等.. 北京:机械工业出版社,2007
[3]. 《基于Quartus Ⅱ的FPGA/CPLD设计》李洪伟,袁斯华..北京:电子工业出版社,2006
展开阅读全文