第一篇:EDA报告模拟停车场管理系统的设计
辽东学院信息技术学院
《可编程逻辑器件原理及应用》教学实习报告
模拟停车场管理系统的设计
学生姓名:
学 号: 0915110606 班 级: B1106 专 业: 电子信息工程 指导教师:
2014年07月
【摘要】
随着人民生活水平的提高,我国汽车保有量不断提升,私家车的数量越来越多,在生活小区、办公场所、商场、旅游景点等地方,停车难问题也日益突出。解决停车难问题,除了加大基础设施投入(扩建停车场)外,有效地对现有的停车场进行合理分配、调度与管理,也是行之有效的措施,因而建设配套的停车场管理系统,对停车位进行有序地管理十分必要。目前,无论在生活小区或是在写字楼宇的建设规划中,均已对停车位的规划配备进行了充分考虑,停车场已成为人们生活服务的必备场所之一,停车场的数目增多,对停车场管理系统产生了强大的市场需求。基于上述两点需求,本文设计了一套停车场管理系统,从地感线圈、道闸、吐卡机、主控板到微机管理系统,全套软硬件系统实现了对场内车位有序地分配与调度。本文将从整体方案、硬件设计、软件设计、安装实施等方面进行全面地介绍该系统。同时,本套系统在比较市场同类产品的基础上,独到地将停车管理中的日常处理从上位机(微机)移至下位机(主控板),降低了整个系统对微机的依赖,显出了自己的竞争优势。
【关键词】:停车场、管理系统、无线射频卡
【Abstract】
With the improvement of people's living standard, car ownership in China is rising, more and more people own private cars, in the living quarters, offices, shopping malls, tourist attractions and other places, parking difficult issues are also increasingly prominent.To solve the parking problem, in addition to increase the investment of infrastructure(expansion of parking lot), effectively carries on the rational distribution, the existing parking lot scheduling and management, is the effective measure, parking management system and construction, the parking spaces for orderly management is very necessary.At present, no matter in the living quarters and office building planning, have parking space with the planning for a full account, parking has become one of the necessary place living services, the number of parking lots more, produced a strong market demand for parking management system.Based on the above two demands, this paper designs a set of parking management system, induction coil, main control gate, temple card machines, plate to the microcomputer management system from the ground, a full set of hardware and software system of the parking spaces and orderly allocation and scheduling.This paper from the overall system design, hardware design, software design, installation and other aspects of the implementation of a comprehensive introduction to the system.At the same time, the system based on the comparison of similar products on the market, will be unique to the daily management of parking from the host computer(PC)to the next machine(main control board), reduce the entire system to rely on the computer, showing its competitive advantage.Keywords:The parking lot, management system, radio frequency card
目录
绪论..........................................................................................................................1 1系统工作原理.......................................................................................................2
1.1 基本原理...................................................................................................2 2 设计......................................................................................................................2
2.1系统结构设计及分析................................................................................2 2.2分频模块....................................................................................................4 2.3消抖模块....................................................................................................4 2.4车牌显示模块...........................................................................................5 2.5 计时模块...................................................................................................5 2.6 费率器模块..............................................................................................6 2.7滚动模块....................................................................................................6 2.8译码模块....................................................................................................7 3 使用说明......................................................................................................8 4 结论......................................................................................................................8 参考文献..................................................................................................................9 附录A 源程序.....................................................................................................10 附录B 系统原理图...............................................................................................29
I
辽东学院信息技术学院EDA课程设计报告
绪论
近年来,随着中国经济的快速增长和国民收入的不断提高,汽车拥有量也日益增多,汽车已经逐步走进千家万户,使很多城市出现了“停车难”问题。为了满足日益增长的停车需求,大型、超大型停车场不断涌现,传统停车场管理系统已不能满足实际需求。存在的问题突出表现在:现有的停车场管理系统要求车辆在出入停车场时须停车验卡,车辆进出极其缓慢,经常造成上、下班堵车现象,不仅浪费时间,能源浪费也非常严重;随着停车场中车辆数量的增加,管理工作量和难度都成倍加大,传统停车场管理系统在安全性和效率方面暴露出严重的缺陷。因此,对现有的停车场管理系统进行升级更新,是停车场建设中的当务之急。本文针对上述实际问题,通过研究开发射频识别技术和红外通信技术,设计实现了一种远距离智能识别的停车场管理系统,以解决传统停车管理系统存在的问题。本设计基于射频芯片,设计了无线阅读器和无线智能电子标签通信系统,解决了远距离自动识别车辆信息的问题;所设计的车辆无线阅读识别系统与后台计算机管理系统相联结,便形成了一个功能强大和系统完善的远距离智能车辆识别系统。系统可以实现远距离车辆信息自动识别,实现车辆自动安全检测管理和收费等功能;系统还具有图像比对校验,车辆数据网络自动更新等新功能。远距离智能识别停车场管理系统将新颖的生活理念和建筑艺术、信息技术、计算机技术等现代高科技完美结合,提供的是一种操作简单、使用方便、功能先进的人性化系统。
辽东学院信息技术学院EDA课程设计报告
1系统工作原理
1.1 基本原理
当一辆车进入停车场,按键A被按下:计时器开始计时,同时把该车的车牌号和费率送入数码管显示(3个数码管显示拨码开关对应的十进制数:采用BCD码转换的方法;费率显示采用输入设置,可以通过按键+1的方式设置从1~99的费率)。当车驶出停车场时,按键B被按下,此时计时器停止计时,并把计时时间送入数码管显示(2位小时数、两位分钟数),同时显示车牌号信息及停车费用(三位显示:停车费用=停车时间×费率)。由于数码管位数不够采用滚动显示的方式。设计
2.1系统结构设计及分析
本系统主要包括以下七个模块:分频模块fpq,车牌BCD转换模块chepai,消抖模块xiaodou,计时模块jishi,费率模块feilvqi,滚动模块gundong,译码器模块ymq。先通过VHDL文本生成这些模块,再在顶层文件中调用这些模块。
系统的主程序流程图如图1所示。
辽东学院信息技术学院EDA课程设计报告
图1
辽东学院信息技术学院EDA课程设计报告
2.2分频模块
该模块对实验箱上的50MHz时钟进行分频,分成所需要的几种不同频率的时钟。分频的原理为:对50MHz时钟每来一个上升沿计一次数,当计数到一定值的时候,计数值清零并且让输出电平取反,根据计数值的不同可以得到不同的输出频率。在本设计中分频出0.1HZ,1HZ,100Hz,200Hz,500Hz的频率,以供不同的需要。
inst2fpqclkFP500HZoutFP200HZoutFP100HZoutFP1HZoutFP01HZout图2 2.3消抖模块
作为机械开关的键盘,在按键操作时,机械触点的弹性及电压突跳等原因,在触点闭合和开启瞬间会出现电压的抖动。为保证按键识别的准确性,在按键电压信号抖动的情况下不能进行状态输入。为此必须进行去抖动处理,消除抖动部分的电压信号,一般有硬件和软件两种方法。硬件就是加去抖动电路,这样可以从根本上解决按键抖动问题。软件消抖就是利用软件延时消抖,具体说就是当检测到高电平(有按键按下),1kHz脉冲来一个高电平计数值加1,一遇到低电平计数值清零,当计数值大于10时,说明按键是被真的按下,消除了抖动。本系统采用软件消抖。
xiaodouinst7dinclkdout图3
辽东学院信息技术学院EDA课程设计报告
2.4车牌显示模块
用8位拨码开关表示车号,拨码开关对应的8位二进制通过BCD转换为12位BCD码。
chepaikey[7..0]chep[11..0]inst图4
2.5 计时模块
当A键按下时,计时器开始计时,B键按下时,计时器停止计时,clk为计时脉冲,来一个上升沿,计数器加1,reset为总复位信号。
辽东学院信息技术学院EDA课程设计报告
2.6 费率器模块
初值为0,当费率在0-99范围内时,费率按键每按一次,费率加1。
图7
inst3feilvqiresetanjianfeilv[7..0]2.7滚动模块
滚动显示模块,当C=1时不滚动,但当C=0时滚动显示车牌、停车时间、及停车中费用。y[3..0]输出到译码器,sel为位选信号。
图8
gundongABdata[15..0]chep[11..0]price[11..0]feilv[7..0]clk_200Hzclk_1Hzsel[7..0]y[3..0]inst4辽东学院信息技术学院EDA课程设计报告
2.8译码模块
该模块将将输入的二进制信号译成相应的七段共阳极数码管的编码。数据输入data[3..0],译码输出led7s[6..0]。
图9
YMQIN4[3..0]DOUT7[6..0]inst8辽东学院信息技术学院EDA课程设计报告 使用说明
按键说明:
A按键:为开始按钮,即当车辆进入停车场时,按下A开始计时,并显示进入车辆的车牌号及收费费率。B按键:为停止按钮,即当车辆驶出停车场时,按下B按钮,停止计时,并滚动显示,车牌号、停车时间及停车费用。费率按键:为费率设置按钮,每按一次,费率加1。Reset按钮为总复位按钮。clk为系统时钟,绑定到实验箱上的50MHz的时钟上,led7s[6..0]为数码管段选控制信号,sel[7..0]为8个数码管的位选控制信号。
测试方法:首先按下复位键,然后设置八位拨码开关的值(车牌号),此时,数码管显示三位车牌号信息和费率,按下费率按键可以设置费率的值(每按一次加1,范围0~99),过一段时间,按下B键,此时8位数码管会滚动显示,三位车牌号,四位停车时间和三位停车费。按下复位键,可重新测试。结论
模拟停车场管理系统,虽然在速度上我没能赶上大部分同学,但是经过在之前将近一个月的前期准备和一周的集中设计让我体会到了很多的东西。
虽然在查找资料中找到了一个相似的程序,但是还是有很多的错误。后来,进过与同课题的同学的一起分析和改进终于还是完成了可用的程序。
在这场战斗中我有很大的收获,首先我采用层次化结构化设计,将此项设计任务分成若干模块,规定每一模块的功能和各模块之间的接口,然后再将各模块联合起来调试,加深了我们对层次化设计的概念的认识。在设计的过程中,虽然遇到了很多困难,但是通过向老师和同学请教以及自己不断摸索、测试,一个个难题迎刃而解。从而提高了我独立发现问题、分析问题、解决问题的能力,其次,我也明白了一个道理,任何一件事情,只有亲自去做的时候才知道它到底难不难,有多难。我们就像小马过河中的小马,需要自己多去尝试。
辽东学院信息技术学院EDA课程设计报告
参考文献
[1].《 EDA技术实用教程》潘松,黄继业..北京:科学出版社,2006 [2].《 VHDL设计实例与仿真》姜雪松,吴钰淳,王鹰等..北京:机械工业出版社,2007 [3].《基于Quartus Ⅱ的FPGA/CPLD设计》李洪伟,袁斯华..北京:电子工业出版社,2006
辽东学院信息技术学院EDA课程设计报告
附录A 源程序
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fpq is port(clk:in std_logic;
FP500HZout,FP200HZout,FP100HZout,FP1HZout,FP01HZout:out std_logic);end entity;architecture one of fpq is signal clkjs1:std_logic;signal clkjs2:std_logic;signal clkjs3:std_logic;signal clkjs4:std_logic;signal clkjs5:std_logic;signal cnq1:integer range 5000000 downto 0;signal cnq2:integer range 5000000 downto 0;signal cnq3:integer range 5000000 downto 0;signal cnq4:integer range 5000000 downto 0;signal cnq5:integer range 50000000 downto 0;
辽东学院信息技术学院EDA课程设计报告
begin
mk1: process(clk)
begin if clk'event and clk='1' then if cnq5<=2500000 then cnq5<=cnq5+1;else cnq5<=0;clkjs5<=not(clkjs5);
end if;end if;FP01HZout<=clkjs5;end process;mk2:process(clk)begin if clk'event and clk='1' then if cnq1<=500 then
cnq1<=cnq1+1;
else
cnq1<=0;clkjs1<=not(clkjs1);
辽东学院信息技术学院EDA课程设计报告
end if;end if;FP500HZout<=clkjs1;end process;mk3:process(clk)begin if clk'event and clk='1' then if cnq2<=12500000 then
cnq2<=cnq2+1;cnq2<=cnq2+1;else cnq2<=0;clkjs2<=not(clkjs2);end if;end if;FP200Hzout<=clkjs2;end process;mk4:process(clk)begin if clk'event and clk='1' then if cnq3<2500 then cnq3<=cnq3+1;
辽东学院信息技术学院EDA课程设计报告
else cnq3<=0;clkjs3<=not(clkjs3);end if;end if;FP100HZout<=clkjs3;end process;mk5:process(clk)begin if clk'event and clk='1'then if cnq4<250000000 then
cnq4<=cnq4+1;else cnq4<=0;clkjs4<=not(clkjs4);end if;end if;FP1HZout<=clkjs4;end process;end;library ieee;use ieee.std_logic_1164.all;
辽东学院信息技术学院EDA课程设计报告
use ieee.std_logic_unsigned.all;entity xiaodou is
port(clk:in std_logic;
din:in std_logic;
dout:out std_logic);end xiaodou;architecture arc of xiaodou is begin
process(clk,din)
variable temp:integer;
begin
if clk'event and clk='1' then
if(din='0')then
temp:=0;
end if;
if temp>15 then
dout<='1';
else
dout<='0';
end if;
辽东学院信息技术学院EDA课程设计报告
temp:=temp+1;
end if;
end process;
end arc;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);--输出数码管位选 std_logic_vector(11 downto 0)--数码管段码
chep
: out);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表示个位,signal cnt : integer range 0 to 3:=0;--数码管位选扫描程序 begin p<=conv_integer(key);--数据输入
辽东学院信息技术学院EDA课程设计报告
process(p)--显示查表进程
functionb_to_s4(bcd8421:integer 0 tO 9)return std_logic_vector is--BCD std_logic_vector
variable smg4: std_logic_vecto(3 downto 0);
begin
case bcd8421 IS
WHEN 0 => smg4:=“0000”;--0
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
--计算输出值
--gfedcba 共阳
辽东学院信息技术学院EDA课程设计报告
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
辽东学院信息技术学院EDA课程设计报告
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
辽东学院信息技术学院EDA课程设计报告
|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;
辽东学院信息技术学院EDA课程设计报告
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;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity jishi is port(A,B,reset:in std_logic;
clk_minhz:in std_logic;
data:out std_logic_vector(15 downto 0));end;architecture one of jishi is signal data1:std_logic_vector(15 downto 0);signal c:std_logic;begin process(clk_minhz,reset,A,B)begin
辽东学院信息技术学院EDA课程设计报告
if reset='1' then data1(15 downto 0)<=“***0”;else if(A'event and A='1')then
c<='1';end if;if B='1' then c<='0';end if;if c='1' then if clk_minhz'event and clk_minhz='1' then if data1(3 downto 0)=“1001” then
data1(3 downto 0)<=“0000”;if data1(7 downto 4)=“0101”then
data1(15 downto 8)<=data1(15 downto 8)+1;
data1(7 downto 4)<=“0000”;
else data1(7 downto 4)<=data1(7 downto 4)+1;end if;else data1(3 downto 0)<=data1(3 downto 0)+1;end if;end if;elsif c='0' then
辽东学院信息技术学院EDA课程设计报告
data(15 downto 0)<=data1(15 downto 0);end if;end if;end process;end;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity feilvqi is port(reset:in std_logic;
clk_minhz:in std_logic;
feilv:out std_logic_vector(7 downto 0));end feilvqi;architecture one of feilvqi is signal feilv1:std_logic_vector(7 downto 0);--signal c:std_logic;begin process(reset,clk_minhz)begin if reset='1'then feilv1<=“00000000”;elsif clk_minhz'event and clk_minhz='1'then
辽东学院信息技术学院EDA课程设计报告
if feilv1(3 downto 0)=“1001”then feilv1(3 downto 0)<=“0000”;if feilv1(7 downto 4)=“1001”then feilv1(7 downto 4)<=“0000”;else feilv1(7 downto 4)<=feilv1(7 downto 4)+1;end if;else feilv1(3 downto 0)<=feilv1(3 downto 0)+1;end if;end if;feilv<=feilv1;end process;end;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;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);
feilv:in std_logic_vector(7 downto 0);
clk_200HZ,clk_1HZ: in std_logic;
辽东学院信息技术学院EDA课程设计报告
sel:out std_logic_vector(7 downto 0);
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
辽东学院信息技术学院EDA课程设计报告
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<=“0001”;sel<=“00000001”;when“001”=>y<=data(11 downto 8);sel<=“00010000”;when“010”=>y<=data(7 downto 4);sel<=“00001000”;
辽东学院信息技术学院EDA课程设计报告
when“011”=>y<=data(3 downto 0);sel<=“00000100”;--when “001”=>y<=“1010”;sel<=“00001000”;when“100”=>y<=chep(3 downto 0);sel<=“00100000”;when“101”=>y<=chep(7 downto 4);sel<=“01000000”;when“110”=>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<=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<=“0000”;sel<=“00000001”;
when others=>null;end case;elsif cnt=“0001” then case count is
辽东学院信息技术学院EDA课程设计报告
when“000”=>y<=feilv(3 downto 0);sel<=“00000001”;when“001”=>y<=feilv(7 downto 4);sel<=“00000010”;
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”;
辽东学院信息技术学院EDA课程设计报告
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;ry ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity ymq is port(y: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
libra
辽东学院信息技术学院EDA课程设计报告
when others=>null;end case;
附录B 系统原理图
第二篇:停车场模拟管理系统实验报告
一.问题描述
1.实验题目:
设停车场是一个可停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端)。若停车场内已经停满 n辆车,那么后来的车只能在门外的便道上等候。一旦有车开走,则排在便道上的第一辆车即可开入。当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场。每辆停放在车场的车在它离开停车场时必须按它停留的时间长短缴纳费用。试为停车场编制按上述要求进行管理的模拟程序。
要求:根据各结点的信息,调用相应的函数或者语句,将结点入栈入队,出栈或者出队。
二.需求分析
1.程序所能达到的基本可能:
程序以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入数据的序列进行模拟管理。栈以顺序结构实现,队列以链表结构实现。同时另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车。输入数据按到达或离去的时刻有序。当输入数据包括数据项为汽车的“到达”(‘A’表示)信息,汽车标识(牌照号)以及到达时刻时,应输出汽车在停车场内或者便道上的停车位置;当输入数据包括数据项为汽车的“离去”(‘D’表示)信息,汽车标识(牌照号)以及离去时刻时,应输出汽车在停车场停留的时间和应缴纳的费用(便道上停留的时间不收费);当输入数据项为(‘P’,0,0)时,应输出停车场的车数;当输入数据项为(‘W’, 0, 0)时,应输出候车场车数;当输入数据项为(‘E’, 0, 0),退出程序;若输入数据项不是以上所述,就输出“ERROR!”。2.输入输出形式及输入值范围:
程序运行后进入循环,显示提示信息:“Please input the state,number and time of the car:”,提示用户输入车辆信息(“到达”或者“离开”,车牌编号,到达或者离开的时间)。若车辆信息为“到达”,车辆信息开始进栈(模拟停车场),当栈满,会显示栈满信息:“The parking place is full!”,同时车辆进队列(模拟停车
场旁便道),并显示该进入便道车辆的车牌编号,让用户知道该车的具体位置;若车辆信息为“离开”,会显示该车进入停车场的时间以及相应的停车费用,若该车较部分车早进停车场,这部分车需先退出停车场,暂时进入一个新栈为其让道,会显示进入新栈的车辆的车牌编号及其入停车场的时间,当待离开车离开停车场后,这部分车会重新进入停车场,同时便道上的第一辆车进入停车场;若输入(‘P’,0,0),会显示停车场的车数;若输入(‘W’,0,0),会显示便道上的车数;若输入(‘E’,0,0),程序会跳出循环,同时程序结束;若输入为其他字母,程序会显示“ERROR!”报错。若便道上没有车辆停靠,会显示便道为空的信息:用户每输入一组数据,程序就会根据相应输入给出输出。输入值第一个必须为字母,后两个为数字。
三.概要设计
为了实现上述功能,该程序以栈模拟停车场以及临时停放为给要离去的汽车让路而从停车场退出来的汽车的场地,以队列模拟车场外的便道,因此需要栈和队列这两个抽象数据类型。1.栈抽象数据类型定义: ADT SqStack{
数据对象:D={ai,bi,ci,di|aiint,biint,ciint,dichar,i=1,2,3....,n,n0}
数据关系:R={(ai,bi,di)|ai,bi,diD,ai,bi,distruct car};
基本操作:
Judge_Output(s,q,r);//根据r中车辆信息控制车辆是入栈s还是
入队q以及相关操作
A_cars(s,q, a);//将到达车辆a的信息入栈s或者入队q
D_cars(s,q, d);//将待离开车辆d出栈s,并将q中相应车辆
入栈并进行相关的操作 }ADT SqStack 2.队列抽象数据类型定义: ADT LinkQueue{ 2
数据对象:D={ai,bi,ci|aiQnode *,biQnode
*,ciint,i=1,2,3....,n,n0};
数据关系:R=;
基本操作:
Judge_Output(s,q,r);//根据r中车辆信息控制车辆是入栈s
还是入队q以及相关操作
A_cars(s,q, a);//将到达车辆a的信息入栈s或者入队q
D_cars(s,q, d);//将待离开车辆d出栈s,并将q中相应车
辆入栈并进行相关的操作 }ADT LinkQueue
3.主要算法流程图:
I.Judge_Output算法流程图:
开始F输入为E(e)TF输出输入为P(p)“STOP!”TF输入为W(w)输出停车场车辆的数目TF输入为A(a)输出便道上车辆数目T输入为D(d)调用A_cars函数调用D_cars函数结束II.A_cars算法流程图:
开始停车场未满TF车进停车场车进便道结束III.D_cars算法流程图:
开始该车是最后进T停车场的车F在该车后进的车退结账离开出停车场后让其结账离开便道上有车TF便道上第一辆车进停车场结束
4.本程序保护模块: 主函数模块
栈单元模块:实现栈的抽象数据类型 队列单元模块:实现队列的抽象数据类型 调用关系:
栈单元模块主函数模块队列单元模块四.详细设计
1.相关头文件库的调用说明: #include
#include
{ char bb;
int num;
int time;
};struct rangweicar {int num;int time;};typedef struct stackk {struct rangweicar H[MAXSIZE];int topp;
}SqStackk;#define QNODE struct Qnode QNODE { int data;
QNODE *next;
};3.栈类型和队列类型: typedef struct stack {struct car G[n];
int top;}SqStack;typedef struct linkqueue {QNODE *front,*rear;
int geshu;}LinkQueue;//部分基本操作的伪码实现
void Judge_Output(SqStack *s,LinkQueue *q,struct car *r){ if((*r).bb=='E'||(*r).bb=='e')printf(“STOP!n”);else if((*r).bb=='P'||(*r).bb=='p')printf(“The number of parking cars is %dn”,(s->top)+1);else if((*r).bb=='W'||(*r).bb=='w')printf(“The number of waiting cars is %dn”,q->geshu);else if((*r).bb=='A'||(*r).bb=='a')A_cars(s,q,*r);else if((*r).bb=='D'||(*r).bb=='d')D_cars(s,q,*r);else printf(“ERROR!n”);}
A_cars(SqStack *s,LinkQueue *q,struct car a){QNODE *t;if(s->top!=n-1){(s->top)++;(s->G[s->top]).bb=a.bb;(s->G[s->top]).num=a.num;(s->G[s->top]).time=a.time;} else {printf(“The parking place is full!n”);t=(QNODE *)malloc(sizeof(QNODE));t->data=a.num;t->next=NULL;q->rear->next=t;q->rear=t;printf(“the number of the car in the access road is:%dn”,q->rear->data);q->geshu++;} } int D_cars(SqStack *s,LinkQueue *q,struct car d){int i,j,l;float x,y;QNODE *p;SqStackk *k;if(d.num==(s->G[s->top]).num){x=d.time-(s->G[s->top]).time;y=fee*x;printf(“The time is %.2f hours,the fee is %.2f yuann”,x,y);if(q->geshu==0){printf(“The queue is empty!n”);
return 0;} else {p=q->front->next;
q->front->next=p->next;
(s->G[s->top]).num=p->data;
(s->G[s->top]).time=d.time;
free(p);
q->geshu--;
if(q->front->next==NULL)
q->rear=q->front;
return 1;
} } else {for(i=0;i<(s->top);i++)
{if((s->G[i]).num!=d.num)continue;else break;}
if(i>=(s->top))
{printf(“ERROR!n”);
return-1;
}
x=d.time-(s->G[i]).time;
y=fee*x;
printf(“The time is %.2f hours,the fee is %.2f yuann”,x,y);
k=(SqStackk *)malloc(sizeof(SqStackk));
k->topp=-1;
for(j=(s->top);j>i;j--)
{k->topp++;(k->H[k->topp]).num=(s->G[j]).num;
(k->H[k->topp]).time=(s->G[j]).time;
s->top--;
}
for(l=0;l<=(k->topp);l++){printf(“the information(number and time)in the new stack is:n”);
printf(“%d,%dn”,(k->H[l]).num,(k->H[l]).time);}
s->top--;
while(k->topp>=0)
{s->top++;
(s->G[s->top]).bb='A';
(s->G[s->top]).num=(k->H[k->topp]).num;
(s->G[s->top]).time=(k->H[k->topp]).time;
k->topp--;
}
if(q->geshu==0)
{printf(“The access road is empty!n”);
return 2;
}
else
{s->top++;
p=q->front->next;
q->front->next=p->next;
(s->G[s->top]).num=p->data;
(s->G[s->top]).time=d.time;
free(p);
q->geshu--;
if(q->front->next==NULL)
q->rear=q->front;
return 3;
}
}
}
4.主函数的伪码: main()
{SqStack *s;
LinkQueue *q;
QNODE *p;
struct car aa[MAXSIZE];
int i;
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;
q=(LinkQueue *)malloc(sizeof(LinkQueue));
p=(QNODE *)malloc(sizeof(QNODE));
p->next=NULL;
q->front=q->rear=p;
q->geshu=0;printf(“******************************************************************************n”);
printf(“*************************
*************************n”);
printf(“*************************
停车场管理系统
*************************n”);
printf(“*************************
*************************n”);
printf(“******************************************************************************n”);
for(i=0;i {printf(“Please input the state,number and time of the car:n”); scanf(“%c,%d,%d”,&(aa[i].bb),&(aa[i].num),&(aa[i].time)); getchar();Judge_Output(s,q,&aa[i]); if(aa[i].bb=='E'||aa[i].bb=='e')break; } } 5.函数调用关系: 调用A_cars函数调用Judge_Output函数main函数调用D_cars函数 五.测试分析: 1.出现问题及解决办法: 该程序是四个程序调试中最顺利的一个,只在一个地方上出了问题,就是输入字符时由于回车键也是字符,回车键总会被读入,导致经常输出“ERROR!”。后来找到原因后在scanf函数后紧接着加了一个getchar();语句后就恢复了正常。 2.方法优缺点分析: 优点:用栈和队列来模拟停车场让整个问题显得简单,易于实现; 缺点:栈和队列这两个数学模型用在停车场管理上还是有失妥当的,现实中停车场出口入口不可能为同一处,不可能当一辆车要离开,在它后面进来的车必须为它让路,因此无法用栈的“后进先出”原则来模拟;而且没有考虑便道上的车在等待过程中可以中途开走等情况,而这些都无法用队列的“先进先出”原则来模拟。 3.主要算法的时间和空间复杂度分析: (1)由于算法Judge_Output函数根据判断条件,每次只选择一个程序段执行,所以其时间复杂度是O(1); (2)由于算法A_cars函数根据判断条件,将数据入栈或入队列,所以其时间复杂度也是O(1); (3)由于算法D_cars函数在出栈数据不在最顶端时需将n个数据先出该栈,再入新栈,再回旧栈的操作,故其时间复杂度是O(n);(4)所有算法的空间复杂度都是O(1)。六.使用说明 程序运行后用户根据提示一次输入车辆的状态信息,车牌编号,时间,程序会根据车辆的状态信息调用相应的函数,并输出用户想得到的信息。 七.调试结果 输入数据:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3,20),(‘A’,4,25),(‘A’,5,30),(‘D’,2,35),(‘D’,4,40),(‘P’,0,0),(‘W’,0,0),(‘F’,0,0),(‘E’,0,0)。 输出数据:1号车停放时间为10小时,收费100元;2号车停放时间为25小时,收费250元;4号车停放5小时,收费50元;此时停车场有两辆车,便道上无车。若停车场已满,则会显示停车场已满的信息;若便道上无车等待停车,会显示便道上无车的信息;若中途有车离开,需其后的车让道,会显示进入临时停车场的车辆的信息;若输入(‘F’,0,0),输出“ERROR!”;若输入(‘E’,0,0),程序结束。运行结果截屏: 八.附录 源程序文件清单: #include /*调用的头文件库声明*/ #include /*用该结构体来存放车的状态,编号和时间信息 */ { char bb; int num; int time; };typedef struct stack /*用该栈来模拟停车场*/ {struct car G[n]; int top;}SqStack;struct rangweicar /*用该结构体来存放临时让出的车辆的编号以及时间信息*/ {int num;int time;};typedef struct stack /*用该栈来模拟临时让出的车辆的停靠场地*/ {struct rangweicar H[MAXSIZE];int topp;}SqStackk;#define QNODE struct Qnode QNODE { int data; /*链队结点的类型*/ QNODE *next; };typedef struct linkqueue /*用该链队来模拟便道*/ {QNODE *front,*rear; int geshu; }LinkQueue;void Judge_Output(SqStack *s,LinkQueue *q,struct car *r)/*该算法通过传递来的车辆信息调 { 用相关函数实现操作*/ if((*r).bb=='E'||(*r).bb=='e') /*若车辆状态为‘E’,终止程序*/ printf(“STOP!n”);else if((*r).bb=='P'||(*r).bb=='p') /*若车辆状态为‘P’,输出停车场车辆数*/ printf(“The number of parking cars is %dn”,(s->top)+1);else if((*r).bb=='W'||(*r).bb=='w') /*若车辆状态为‘W’,输出便道车辆数*/ printf(“The number of waiting cars is %dn”,q->geshu);else if((*r).bb=='A'||(*r).bb=='a') /*若车辆状态为‘A’,调用A_cars函数*/ A_cars(s,q,*r); else if((*r).bb=='D'||(*r).bb=='d') /*若车辆状态为‘D’,调用D_cars函数*/ D_cars(s,q,*r);else printf(“ERROR!n”); /*若车辆状态为其他字母,报错*/ } A_cars(SqStack *s,LinkQueue *q,struct car a) /*该算法实现对车辆状态为到达的车辆的操 {QNODE *t; 作*/ if(s->top!=n-1) /*若停车场还没有满,则车进停车场,并存入车辆的状态,车牌编 {(s->top)++; 号和到达时间信息*/ (s->G[s->top]).bb=a.bb; (s->G[s->top]).num=a.num; (s->G[s->top]).time=a.time;} else {printf(“The parking place is full!n”); /*若停车场已满,车进便道,并显示该车的车牌编 t=(QNODE *)malloc(sizeof(QNODE)); 号,同时记录便道车辆数目*/ t->data=a.num; t->next=NULL; q->rear->next=t; q->rear=t; printf(“the number of the car in the access road is:%dn”,q->rear->data); q->geshu++;} } int D_cars(SqStack *s,LinkQueue *q,struct car d) /*该算法实现车辆状态为离开的车 {int i,j,l; 辆的操作*/ float x,y;QNODE *p;SqStackk *k;if(d.num==(s->G[s->top]).num) /*若待离开车为最后进停车场的车的情况*/ {x=d.time-(s->G[s->top]).time; y=fee*x; /*直接计算停车时间,费用并离去*/ printf(“The time is %.2f hours,the fee is %.2f yuann”,x,y); if(q->geshu==0) /*若便道上无车,函数返回*/ {printf(“The queue is empty!n”); return 0; } Else /*若便道上有车,第一辆车进停车场*/ {p=q->front->next; q->front->next=p->next; (s->G[s->top]).num=p->data; /*并存入其车牌编号及进停车场的时间*/ (s->G[s->top]).time=d.time; free(p); q->geshu--; if(q->front->next==NULL) q->rear=q->front; /*若此时便道上无车,返回1*/ return 1; } } Else /*待离开的车不是最后进停车场的那辆车的情况*/ {for(i=0;i<(s->top);i++) /*先找到待离开车在停车场中的位置*/ {if((s->G[i]).num!=d.num)continue;else break;} if(i>=(s->top)) {printf(“ERROR!n”); return-1; } x=d.time-(s->G[i]).time; /*计算待离开车的停车时间并计算费用*/ y=fee*x; printf(“The time is %.2f hours,the fee is %.2f yuann”,x,y); k=(SqStackk *)malloc(sizeof(SqStackk)); /*设立一个新栈临时停放为该车离开而让 k->topp=-1; 路的车辆*/ for(j=(s->top);j>i;j--) {k->topp++;(k->H[k->topp]).num=(s->G[j]).num; (k->H[k->topp]).time=(s->G[j]).time; s->top--; } for(l=0;l<=(k->topp);l++){printf(“the information(number and time)in the new stack is:n”); printf(“%d,%dn”,(k->H[l]).num,(k->H[l]).time);} /*显示在新栈中的车辆信息*/ s->top--; while(k->topp>=0) /*将新栈中的车重新开入停车场中*/ {s->top++; (s->G[s->top]).bb='A'; (s->G[s->top]).num=(k->H[k->topp]).num; (s->G[s->top]).time=(k->H[k->topp]).time; k->topp--; } if(q->geshu==0) /*若便道上无车,则返回2,无车开入停车场中*/ {printf(“The access road is empty!n”); return 2; } Else /*若便道上有车,则第一辆车开入停车场中*/ {s->top++; p=q->front->next; q->front->next=p->next; (s->G[s->top]).num=p->data; (s->G[s->top]).time=d.time; free(p); q->geshu--; if(q->front->next==NULL) q->rear=q->front; return 3; } } } main() {SqStack *s; LinkQueue *q; QNODE *p; struct car aa[MAXSIZE]; int i; s=(SqStack *)malloc(sizeof(SqStack)); /*对停车场初始化*/ s->top=-1; q=(LinkQueue *)malloc(sizeof(LinkQueue)); p=(QNODE *)malloc(sizeof(QNODE)); /*对便道初始化*/ p->next=NULL; q->front=q->rear=p; q->geshu=0;printf(“******************************************************************************n”); printf(“************************* *************************n”); printf(“************************* 停车场管理系统 *************************n”); printf(“************************* *************************n”); printf(“******************************************************************************n”); for(i=0;i /*输入车辆信息*/ {printf(“Please input the state,number and time of the car:n”); scanf(“%c,%d,%d”,&(aa[i].bb),&(aa[i].num),&(aa[i].time)); getchar();Judge_Output(s,q,&aa[i]); if(aa[i].bb=='E')break; } } 17 停车场收费管理系统 需求报告 目录 1 2 3 摘要 项目背景介绍 停车场收费管理系统的现状 功能需求 4.1 通用基本功能 4.2 图像识别比较功能 4.3 先进的闸机安全安装 4.4 可增设中远距离车辆感应 5 性能需求 5.1 系统基本要求 5.2 数据管理能力要求 5.3 故障处理要求 外部接口说明 6.1 入口和出口部分 6.2 数据流程 7 修正系统开发计划 摘要 停车场电脑收费管理系统是现代化停车场车辆收费及设备自动化管理的统称,是将车场完全置于计算机管理下的高科技机电一体化产品。 根据多年设计、安装停车场收费系统的实际经验,我们在软件和系统设计上为停车场提供了一套最严格、最先进、易用、便于维护和运行可靠的收费系统;一套能有效的堵塞收费漏洞,降低操作成本,提高经济效益和减轻劳动强度,提高工作效率的现代化收费管理系统 随着时代的发展,私家车越来越多,而车位却十分紧张。在市区内有很多空间没 有被充分利用,大多车辆是停在路边或者简易停车场,缺乏管理,这样导致了资源的浪费,也造成了街道的拥堵。为了适应社会的发展,大量的现代化大规模的停车场会被投入使用,但管理方面又容易出现问题。因此,停车场管理系统的开发和应用是十分必要的。 此报告的目的重在分析此程序的总体需求,实现方案,并分析开发系统的可行性,为决策者提供是否开发该系统的依据和建议。项目背景介绍 2.1 开发软件名称:停车场管理系统 2.2项目开发者: 某软件开发小组 2.3用户单位: 某公司 2.4大体框架: 智能停车场收费管理系统 门禁管理系统 智能通道管理系统 考勤管理系统 智能巡更管理系统 收费管理系统等子系统 闭路监视系统(CCTV) 消防安全系统(FA)和保安系统(SA)紧急广播系统 停车场收费管理系统的现状 该系统具有很大的市场潜力,以现在的车辆增长速度推测,在不久的将来肯定会有许多大规模停车场(包括住宅小区)建成,此系统的开发很有价值。本系统现有的技术条件完全有能力顺利完成开发工作,硬件、软件上的配置也很容易满足开发者的要求,开发系统的计算机硬件已经非常普及,完全没有问题;现在的计算机各方面的技术都非常成熟,相对来说开发此系统的技术也要求比较简单,因此在技术方面是可行的;各类技术人员的数量、水平、来源等也能很容易满足;而且此系统的专业性不强,因此不需要相关行业人士,开发人员的选择就有很大余地。停车场计费管理系统的主要工作是减少人工计费带来的不便,提高办事效率,使车辆管理工作更加信息化,电子化。充分发挥计算机的信息传输速度快、准确度高的优势。功能需求 4.1通用基本功能: 入口读卡升闸、出口读卡验卡收费、车满显示、出入口与收费亭对讲、公正收费等等。 4.2 图像识别比较功能: 其他有图像识别功能的系统,其识别都是单向识别,即仅入口摄取,出口须由管理员目测比较。本系统入口、出口均采用摄像机比较,方便管理员直观比较。 4.3 先进的闸机安全安装: 道闸栏杆配的自动平稳装置,以及防抬杆、防砸车功能,检测功能具有高灵敏度和高可靠性。能很好地识别非机动车及人员等误报情况。 4.4 可增设中远距离车辆感应: 采用50-80cm中距离或5-8m远距离感应范围的读卡器,经多次实际认证为最方便的操作距离。系统如果没有特殊要求一般车辆经过读卡器的距离约为10--15cm。性能需求 5.1 系统基本要求 响应时间:系统的响应时间不能超过1分钟 警告时间及次数:每隔三分钟重复警告一次,每次警告时间持续一分钟。主存容量:内存:128MB RAM 磁盘容量:不小于1G 显示器:256色,800*600以上的兼容显示器 5.2 车辆管理能力要求 计费 分为入口和出口,中间设立岗楼,一人操作,高峰时期可两人操作,入口处发放计费卡,出口处凭借计费卡缴费,放行,操作简单快速方便。长期客户可办理月票。客户也可购买车位,实现车位预留 监控 全范围监控,无死角,监控画面与保安室相连接,可录像。一旦出现事故或意外,保安可第一时间赶到现场,必要时可以直接报警。出现紧急情况,如火灾时,会自动启动消防设备,并自动开启大门,放行车辆。自动引导车位 停车更加快速,有效,方便。 5.3 故障处理要求 列出可能的软件、硬件故障以及对各项性能而言所产生的后果和对故障处理的要求。输出发生错误时,在系统的代码部分进行修改 外部接口说明 6.1 入口和出口部分 入口控制部分: 智能停车场收费管理系统 门禁管理系统 智能通道管理系统 考勤管理系统 智能巡更管理系统 出口控制部分: 收费管理系统等子系统 闭路监视系统(CCTV) 消防安全系统(FA)和保安系统(SA)紧急广播系统 6.2 数据流程 修正系统开发计划 对于车辆的管理有待提高,如停车位置,出场路线等。在以后的系统中,会提供诸如此类的更加人性化的服务。 本系统会提供多国语言的电子录音,使此系统对不懂中文的客户也适用。 重庆邮电大学计算机科学与技术学院 《数据结构》实验设计报告 题目:停车场管理系统 姓名:** 学号: 2010211998 班级:0491002 学院:计算机科学与技术学院 重庆邮电大学计算机科学与技术学院 目录 一、问题描述………………………………………………………03 二、问题分析………………………………………………………03 三、数据结构描述…………………………………………………04 四、算法设计………………………………………………………04 五、程序优缺点分析及优化………………………………………05 六、程序源代码……………………………………………………07 七、程序运行结果…………………………………………………13 八、心得体会………………………………………………………15 附 一、优化后的程序…………………………………………………16 附 二、优化后程序的运行结果………………………………………23 重庆邮电大学计算机科学与技术学院 一、问题描述 设计一个停车场管理系统。 设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在停车场的最北端),若停车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。【基本要求】 以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车‚到达‛或‚离去‛信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。【选作内容】 (1)两个栈共享空间,思考应开辟数组的空间是多少? (2)汽车可有不同种类,则他们的占地面积不同,收费标准也不同,如1辆客车和1.5辆小汽车的占地面积相同,1辆十轮卡车占地面积相当于3辆小汽车的占地面积。 (3)汽车可以直接从便道上开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾。 二、问题分析 该问题需要以栈和队列作为基本的存储结构,以顺序栈模拟停车场,以链队列模拟车场外的便道。汽车进入停车场,即是在顺序栈上执行进栈操作,退出停车场即是在顺序栈上执行出栈操作;汽车进入便道,即是在链队列上执行入队操作,退出便道即是在链队列上执行出队操作。 当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场。设要删除的元素在顺序表St中位置为i,则从i到top之间的全部元素进入到一个临时栈St1中, 其次再删除该元素,然后将临栈St1的元素按照‚先进后出‛的原则重新回到St中。若链队不空,则使队头进栈St,并以当前时刻开始计费。 程序需要构造两个顺序栈St和St1,其中St用于模拟停车场,St1用作临时栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车。此外还需要构 重庆邮电大学计算机科学与技术学院 造一个链队列Qu用于模拟便道。 三、数据结构描述 /*定义顺序栈类型*/ typedefstruct { intCarNo[N]; /*车牌号*/ intCarTime[N]; /*进场时间*/ int top; /*栈指针*/ } SqStack; /*定义顺序栈类型*/ /*定义链队类型*/ typedefstructqnode { intCarNo; /*车牌号*/ structqnode *next;} QNode;typedefstruct { QNode *front;/*队首和队尾指针*/ QNode *rear;} LiQueue; 四、算法设计 1.对于子函数模块,则调用顺序栈的基本操作和链队列的基本操作。如下: /*顺序栈的基本运算算法*/ voidInitStack(SqStack *&s) intStackEmpty(SqStack *s) intStackFull(SqStack *s) /*S中的插入新元素*/ int Push(SqStack *&s,int e1,int e2) 重庆邮电大学计算机科学与技术学院 /*删除S的栈顶元素,并用e1,e2返回其值*/ int Pop(SqStack *&s,int&e1,int &e2) voidDispStack(SqStack *s) /*以下为链队列的基本运算算法*/ voidInitQueue(LiQueue *&q) intQueueLength(LiQueue *q) intQueueEmpty(LiQueue *q) voidenQueue(LiQueue *&q, int e)} intdeQueue(LiQueue *&q,int&e) voidDisplayQueue(LiQueue *q) 2.主程序模块 void main(){ 初始化; do { 接受命令; 处理命令; } while(命令!=‛退出‛); } 五、程序优缺点分析及优化 1.程序的优点 在程序中设置了kind变量,用于保存车的类别,便于计算不同类别车的停车费用,如下程序段: printf(“n请输入车的类别【车的类别:1.代表小汽车 2.代表客车 3.代表卡车】:n”);scanf(“%d”,&kind); 其中kind可取值1,2,3;若kind取2,则表示一辆客车单位时间内的停车费用 重庆邮电大学计算机科学与技术学院 是一辆小汽车的2倍,若kind取3,则表示一辆卡车单位时间内的停车费用是一辆小汽车的3倍。 当然printf(“n请输入车的类别【车的类别:1.代表小汽车 2.代表客车 3.代表卡车】:n”);中的1.2.3也可以根据实际情况改变。比如,若实际中,一辆小汽车单位时间内的停车费用 是一辆客车的2倍,一辆卡车单位时间内的停车费用是一辆客车的4倍,则可以改成: printf(“n请输入车的类别【车的类别:1.代表客车2.代表小汽车 4.代表卡车】:n”); 则kind可取值1,2,4; kind取1时对应的是客车,表示计算停车费用时以一辆客车单位时间内的停车费用为基数,若kind取2,则表示一辆小汽车单位时间内的停车费用是一辆客车的2倍,若kind取4,则表示一辆卡车单位时间内的停车费用是一辆客车的4倍。 2.程序的缺点 (1)输入时间时,程序没有检测错误功能 程序的输入形式如下: 设n=2,输入数据为:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3,20),(‘A’,4,25),(‘A’5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。其中:‘A’表示到达(arrival);‘D’表示离去(departure);‘E’表示输出结束(end)。 设每个输入项的形式为(Choose, CarNumber, Time),其中Choose表示每个括号中的第一项数据,即A/D/E; CarNumber表示每个括号中的第二项,即1/2/3;Time表示每个括号中的第三项,即5/10/15。设前后两次输入的数据中的第三项分别为Time1,Time2;则必须满足Time2≧Time1。而在实际输入过程中用户可能会忽略这一点,所以应该在输入Time是设置一个判断语句,若前后两次输入的Time不满足Time2≧Time1,则要求用户重新输入,直至满足要求为止。 (2)程序的界面不够清晰,一次性输入的数据项比较多,容易出错。3.改进思想(1) 为了保证前后两次输入的Time必须满足Time2≧Time1,使程序具有错误检测功能,在程序输入部分添加了如下代码: printf(“输入现在的时刻:n”); scanf(“%d”,&time2); while(time2 { printf(“时间输入错误,请重新输入:n”); scanf(“%d”,&time2); 重庆邮电大学计算机科学与技术学院 } time1=time2;//time1定义为静态变量 (2)为了使程序有更清晰的界面,可在主函数中加入菜单的显示方式。且数据可以采用一次输入一个数据项,分步输入的方式,使输入过程少出错。于是可以将主函数进行修改。(见附录一) 六、程序源代码 #include /*停车场内最多的停车数*/ #define Price 2 /*每单位停车费用*/ typedefstruct { intCarNo[N]; /*车牌号*/ intCarTime[N]; /*进场时间*/ int top; /*栈指针*/ } SqStack; /*定义顺序栈类型*/ /*定义链队类型*/ typedefstructqnode { intCarNo; /*车牌号*/ structqnode *next;} QNode;typedefstruct { QNode *front;/*队首和队尾指针*/ QNode *rear;} LiQueue; /*顺序栈的基本运算算法*/ voidInitStack(SqStack *&s){ s=(SqStack *)malloc(sizeof(SqStack));s->top=-1; 重庆邮电大学计算机科学与技术学院 } intStackEmpty(SqStack *s){ return(s->top==-1);} intStackFull(SqStack *s){ return(s->top==N-1);} /*S中的插入新元素*/ int Push(SqStack *&s,int e1,int e2){ if(s->top==N-1) return 0;s->top++;s->CarNo[s->top]=e1;s->CarTime[s->top]=e2;return 1;} /*删除S的栈顶元素,并用e1,e2返回其值*/ int Pop(SqStack *&s,int&e1,int &e2){ if(s->top==-1) return 0;e1=s->CarNo[s->top];e2=s->CarTime[s->top];s->top--;return 1;} voidDispStack(SqStack *s){ int i;for(i=0;i<=s->top;i++) printf(“%d ”,s->CarNo[i]);printf(“n”);} /*以下为链队列的基本运算算法*/ 重庆邮电大学计算机科学与技术学院 voidInitQueue(LiQueue *&q){ q=(LiQueue *)malloc(sizeof(LiQueue));q->front=q->rear=NULL;} intQueueLength(LiQueue *q){ int n=0;QNode *p=q->front;while(p!=NULL){ n++; p=p->next;} return(n);} intQueueEmpty(LiQueue *q){ if(q->rear==NULL) return 1;else return 0;} voidenQueue(LiQueue *&q, int e){ QNode *s;s=(QNode *)malloc(sizeof(QNode));s->CarNo=e;s->next=NULL;if(q->rear==NULL)/*若链队为空,则新结点是队首结点又是队尾结点*/ q->front=q->rear=s;else { q->rear->next=s;/*将*s结点链到队尾,rear指向它*/ q->rear=s;} } intdeQueue(LiQueue *&q,int&e){ QNode *t;if(q->rear==NULL)/*队列为空*/ return 0; 重庆邮电大学计算机科学与技术学院 if(q->front==q->rear)/*队列中只有一个结点时*/ { t=q->front; q->front=q->rear=NULL;} else /*队列中有多个结点时*/ { t=q->front; q->front=q->front->next;} e=t->CarNo;free(t);return 1;} voidDisplayQueue(LiQueue *q){ QNode *p=q->front;while(p!=NULL){ printf(“%d ”,p->CarNo); p=p->next;} } void main(){ char choose;/*用于选择命令*/ int no,e1,time,e2,kind;/*用于存放车牌号、当前停车时刻*/ inti,j;SqStack *St,*St1;/*临时栈St1,当停车场中间的车要推出去时,用于倒车*/ LiQueue *Qu;InitStack(St);InitStack(St1);InitQueue(Qu);printf(“ #”);printf(“n# #”);printf(“n# 欢迎使用停车场管理系统 #”); 重庆邮电大学计算机科学与技术学院 printf(“n# #”);printf(“n# 【输入提示】:汽车状态由A、D、E 表示。其中,A:表示汽车到达 D:表示汽车离去, #”);printf(“n# E:表示输出结束。每次输入的数据由三项构成,即:(汽车状态,车牌号,当前时刻)#”);printf(“n# 数据项之间以逗号分开。例如输入示范:A,1,5 #”);printf(“n #n”);printf(“n正在读取汽车信息...n”); do { printf(“n*****************************************************************”);printf(“n请分别输入汽车状态(A/D/E)、车牌号和当前时刻(数据之间以逗号分开):n”);scanf(“ %c,%d,%d”,&choose,&no,&time); switch(choose){ /*************************** 汽车到达 ******************************/ case 'A': case 'a': if(!StackFull(St)) /*停车场不满*/ { Push(St,no,time); printf(“该车在停车场中的位置是:%dn”,St->top+1); } else /*停车场满*/ { enQueue(Qu,no); printf(“n停车场已满,该车进入便道,在便道中的位置是:%dn”,QueueLength(Qu)); } break;/************************* 汽车离开 ********************************/ case 'D': case 'd': 重庆邮电大学计算机科学与技术学院 printf(“n请输入车的类别【车的类别:1.代表小汽车 2.代表客车 3.代表卡车】:n”);scanf(“%d”,&kind); for(i=0;i<=St->top && St->CarNo[i]!=no;i++); if(i>St->top)/*要离开的汽车在便道上*/ { /*汽车可以直接从便道上开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾*/ while(Qu->front->CarNo!=no) { enQueue(Qu,Qu->front->CarNo); // deQueue(Qu,Qu->front->CarNo); Qu->front = Qu->front->next; } deQueue(Qu,no);printf(“n便道上车牌号为%d的汽车已离开!n”,no); printf(“n当前便道中的车辆的车牌号分别是:”); DisplayQueue(Qu); printf(“n”); } else /*要离开的汽车在停车场中*/ { for(j=i;j<=St->top;j++) { Pop(St,e1,e2);/*e1,e2用来返回被删元素的车牌号和停车时刻*/ Push(St1,e1,e2);/*倒车到临时栈St1中,将e1,e2插入到临时栈中*/ } Pop(St,e1,e2); /*该汽车离开*/ printf(“n车牌号为%d的汽车停车时间为:%d。停车费用为:%dn”,no,time-e2,(time-e2)*Price*kind); /*对小汽车而言:当前时刻 减去 该车当时停车的时刻,再乘以价格就是费用,而对于客车和卡车而言,就要乘以kind倍小汽车的价格*/ while(!StackEmpty(St1))/*将临时栈St1重新回到St中*/ { Pop(St1,e1,e2); Push(St,e1,e2); } if(!QueueEmpty(Qu))/*队不空时,将队头进栈St*/ { 重庆邮电大学计算机科学与技术学院 deQueue(Qu,e1); Push(St,e1,time);/*以当前时间开始计费*/ } printf(“n当前停车场中的车辆的车牌号分别是:”);//输出停车场中的车辆 DispStack(St); } break;/************************ 结束 *********************************/ case 'E': case 'e': printf(“n正在退出系统...n”); if(!StackEmpty(St))//显示停车场情况 { printf(“n当前停车场中的车辆的车牌号分别是:”);//输出停车场中的车辆 DispStack(St); printf(“n”); } else printf(“n当前停车场中无车辆nn”); break;/************************ 结束 *********************************/ default: /*其他情况*/ printf(“输入的命令错误!n”); break;} } while(choose!='E'&&choose!='e');} 七、程序运行结果 取N=2,即停车场内最多的停车数为2 取 Price=2,即每单位停车费用为2 输入数据为:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3,20),重庆邮电大学计算机科学与技术学院 (‘A’,4,25),(‘A’5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。程序演示结果如下图所示: 重庆邮电大学计算机科学与技术学院 八、心得体会 (1)该实验涉及到顺序栈的建立、插入、删除等操作,涉及到了链队列的建立、插入、删除等操作。做这个实验,加深了我对以上知识点的认识和理解。(2)提高了 C 语言编程的能力。在程序设计过程中,需要经过反复地编写,调试,运行,发现问题并解决问题,在这次实验的设计中,我加深对程序的了解,提高自己的实际动手能力和独立思考的能力同时我也学会了综合以前学到的基本知识来解决较大问题的方法。 (3)一方面我养成了注重程序细节的意识。例如: printf(“n请分别输入汽车状态(A/D/E)、车牌号和当前时刻(数据之间以逗号分开):n”);scanf(“ %c,%d,%d”,&choose,&no,&time); 重庆邮电大学计算机科学与技术学院 %c,前面必须留一个空格,否则程序在显示的时候就会有一些问题。 (4)另一方面我也深刻地认识到了《数据结构》这门课程的重要性。“数据结构”在计算机科学中是一门综合性的专业基础课。数据结构的研究不仅涉及到计算机硬件的研究,而且和计算机软件的研究有着更密切的关系,无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配问题。在研究信息检索时也必须 考虑如何组织数据,以便使查找和存取数据元素更为方便。可以认为数据结构是介于数学、计算机硬件和计算机软件三者之间的一个核心内容,是从事计算机科学研究及其应 用的科技工作者必须掌握的重要内容 附 一、优化后的程序 #include /*停车场内最多的停车数*/ #define Price 2 /*每单位停车费用*/ typedefstruct { intCarNo[N]; /*车牌号*/ intCarTime[N]; /*进场时间*/ int top; /*栈指针*/ } SqStack; /*定义顺序栈类型*/ /*定义链队类型*/ typedefstructqnode { intCarNo;/*车牌号*/ structqnode *next;} QNode;typedefstruct { QNode *front;/*队首和队尾指针*/ QNode *rear;} LiQueue; /*顺序栈的基本运算算法*/ voidInitStack(SqStack *&s){ s=(SqStack *)malloc(sizeof(SqStack));s->top=-1;} 重庆邮电大学计算机科学与技术学院 intStackEmpty(SqStack *s){ return(s->top==-1);} intStackFull(SqStack *s){ return(s->top==N-1);} /*S中的插入新元素*/ int Push(SqStack *&s,int e1,int e2){ if(s->top==N-1) return 0;s->top++;s->CarNo[s->top]=e1;s->CarTime[s->top]=e2;return 1;} /*删除S的栈顶元素,并用e1,e2返回其值*/ int Pop(SqStack *&s,int&e1,int &e2){ if(s->top==-1) return 0;e1=s->CarNo[s->top];e2=s->CarTime[s->top];s->top--;return 1;} voidDispStack(SqStack *s){ int i;for(i=0;i<=s->top;i++) printf(“%d ”,s->CarNo[i]);printf(“n”);} /*以下为链队列的基本运算算法*/ voidInitQueue(LiQueue *&q){ q=(LiQueue *)malloc(sizeof(LiQueue)); 重庆邮电大学计算机科学与技术学院 q->front=q->rear=NULL;} intQueueLength(LiQueue *q){ int n=0;QNode *p=q->front;while(p!=NULL){ n++; p=p->next;} return(n);} intQueueEmpty(LiQueue *q){ if(q->rear==NULL) return 1;else return 0;} voidenQueue(LiQueue *&q, int e){ QNode *s;s=(QNode *)malloc(sizeof(QNode));s->CarNo=e;s->next=NULL;if(q->rear==NULL)/*若链队为空,则新结点是队首结点又是队尾结点*/ q->front=q->rear=s;else { q->rear->next=s;/*将*s结点链到队尾,rear指向它*/ q->rear=s;} } intdeQueue(LiQueue *&q,int&e){ QNode *t;if(q->rear==NULL)/*队列为空*/ return 0;if(q->front==q->rear)/*队列中只有一个结点时*/ { t=q->front; 重庆邮电大学计算机科学与技术学院 q->front=q->rear=NULL;} else /*队列中有多个结点时*/ { t=q->front; q->front=q->front->next;} e=t->CarNo;free(t);return 1;} voidDisplayQueue(LiQueue *q){ QNode *p=q->front;while(p!=NULL){ printf(“%d ”,p->CarNo); p=p->next;} printf(“n”);} void main(){ int choose;/*用于选择命令*/ int no,e1,time2,e2,no_away;/*no_away:汽车离开时输入车牌号;time2:当前停车时刻;*/ static int time1;/*静态变量time1用于存放上次时刻*/ inti,j;int kind;/*车的类别*/ time1=time2=0;SqStack *St,*St1;/*临时栈St1,当停车场中间的车要推出去时,用于倒车*/ LiQueue *Qu;InitStack(St);InitStack(St1);InitQueue(Qu);printf(“ ”);printf(“n# #”); 重庆邮电大学计算机科学与技术学院 printf(“n# 欢迎使用停车场管理系统 #”);printf(“n# #”);printf(“n n”);do { printf(“n******************** 主菜单 ****************************n”); printf(“** 1:车辆到达 **n”); printf(“** 2:车辆离开 **n”); printf(“** 3:显示停车场的车辆 **n”); printf(“** 4:显示便道中的车辆 **n”); printf(“** 0:退出 **n”); printf(“********************************************************n”); printf(“请选择:”); scanf(“%d”,&choose); switch(choose) { case 1: // #汽车到达 ###### printf(“输入输入车牌号、当前时刻(数据之间以逗号隔开):n”); scanf(“%d,%d”,&no,&time2);/*依次输入车牌号、当前停车时刻*/ while(time2 { printf(“时间输入错误,请重新输入当前时刻:n”); scanf(“%d”,&time2); } time1=time2; if(!StackFull(St)) /*停车场不满*/ { Push(St,no,time1); printf(“该车在停车场中的位置是:%dn”,St->top+1); 重庆邮电大学计算机科学与技术学院 } else /*停车场满*/ { enQueue(Qu,no); printf(“n停车场已满,该车进入便道,在便道中的位置是:%dn”,QueueLength(Qu)); } break; case 2: // ##汽车离开 #### printf(“输入车牌号:n”); scanf(“%d”,&no_away); printf(“请输入车的类别【车的类别:1.代表小汽车 2.代表客车 3.代表卡车】:n”);scanf(“%d”,&kind); printf(“输入现在的时刻:n”);/*现在的时刻time1得大于之前的时刻time1*/ scanf(“%d”,&time2); while(time2 { printf(“时间输入错误,请重新输入:n”); scanf(“%d”,&time2); } time1=time2; for(i=0;i<=St->top && St->CarNo[i]!=no_away;i++); if(i>St->top)/*汽车可以直接从便道上开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾*/ { while(Qu->front->CarNo!=no_away) { enQueue(Qu,Qu->front->CarNo); Qu->front = Qu->front->next; } deQueue(Qu,no_away);printf(“n便道上车牌号为%d的汽车已离开!n”,no_away); printf(“n当前便道中的车辆的车牌号分别是:”); DisplayQueue(Qu); printf(“n”); } else 重庆邮电大学计算机科学与技术学院 { for(j=i;j<=St->top;j++) { Pop(St,e1,e2);/*e1,e2用来返回被删元素的车牌号和停车时刻*/ Push(St1,e1,e2);/*倒车到临时栈St1中,将e1,e2插入到临时栈中*/ } Pop(St,e1,e2); /*该汽车离开*/ printf(“n车牌号为%d的汽车停车费用为:%dn”,no_away,(time2-e2)*Price*kind);/*对小汽车而言:当前时刻 减去 该车当时停车的时刻,再乘以价格就是费用,而对于客车和卡车而言,就要乘以kind倍小汽车的价格*/ while(!StackEmpty(St1))/*将临时栈St1重新回到St中*/ { Pop(St1,e1,e2); Push(St,e1,e2); } if(!QueueEmpty(Qu))/*队不空时,将队头进栈St*/ { deQueue(Qu,e1); Push(St,e1,time1);/*以当前时间开始计费*/ } } break; case 3: // #####显示停车场情况 if(!StackEmpty(St)) { printf(“当前停车场中的车辆的车牌号分别是:”);/*输出停车场中的车辆*/ DispStack(St); } else printf(“停车场中无车辆!n”); break; case 4: // ######显示便道情况 # if(!QueueEmpty(Qu)) { 重庆邮电大学计算机科学与技术学院 printf(“ 当前便道中的车辆的车牌号分别是:”);/*输出便道中的车辆*/ DisplayQueue(Qu); } else printf(“便道中无车辆!n”); break; case 0: // # 结束 ### printf(“n正在退出系统...n”); if(!StackEmpty(St)) { printf(“当前停车场中的车辆的车牌号分别是:”);/*输出停车场中的车辆*/ DispStack(St); } if(!QueueEmpty(Qu)) { printf(“ 当前便道中的车辆的车牌号分别是:”);/*输出便道中的车辆*/ DisplayQueue(Qu); } break; /**********************************************************/ default: /*其他情况*/ printf(“输入的命令错误!n”); break; } } while(choose!=0);} 附 二、优化后程序的运行结果 取N=2,即停车场内最多的停车数为2 取 Price=2,即每单位停车费用为2 输入数据为:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3,20),(‘A’,4,25),(‘A’5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。程序演示结果如下图所示: 重庆邮电大学计算机科学与技术学院 重庆邮电大学计算机科学与技术学院 重庆邮电大学计算机科学与技术学院 重庆邮电大学计算机科学与技术学院 重庆邮电大学计算机科学与技术学院 EDA 多 功 能 数 字 时 钟 专业:11级应用电子技术 班级:二班 学号:110372021307 姓名:贺成林 指导老师:祝宏 日期:2012年6月29日 一、实验目的 1、课程设计是一实践教学环节,是针对《数字电子技术》课程的要求,结合实践对学生进行综合设计性训练,在自学和实践训练中培养学生理论联系实践和实践动手能力,独立地解决实际问题能力。 2、通过课程设计是使学生熟悉和了解可编程专用数字逻辑电路的设计、开发流程,熟悉和了解现代EDA设计工具,掌握数字电子系统层次化的设计方法。 已知条件:MAX+Plus软件 基本功能: 1、以数字形式显示时、分、秒的时间; 2、小时计数器为24进制; 3、分秒计数器为60进制。 二、实验要求、综合应用《数字电子技术基础》课程中的理论知识去独立地完成一个设计课题; 2、熟悉和了解现代EDA设计、编程、编译、仿真及下载技术的全过程。 三、EDA 技术介绍 1、EDA 技术概况 EDA 是电子设计自动化(Electronic Design Automation)的缩写,在 20 世 纪 90 年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。EDA 技术就是以计算机为工 具,设计者在 EDA 软件平台上,用硬件描述语言 HDL 完成设计文件,然后由计算机 自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特 定目标芯片的适配编译、逻辑映射和编程下载等工作。EDA 技术的出现,极大地提 高了电路设计的效率和可*性,减轻了设计者的劳动强度。 2、ALTERA QUARTUS II 软件介绍 Quartus II 是 Altera 公司的综合性 PLD 开发软件,支持原理图、VHDL、VerilogHDL 以及 AHDL(Altera Hardware Description Language)等多种 设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件 配置的完整 PLD 设计流程。 四、关键词 数字计数器、动态显示、快速校分、整点报时、时段控制。 五、实验步骤 1、秒计数器是60进制的。当下面的74161到9时等下一个脉冲来是向上面的74161计数,到5时将两个74161共同预置。从而实现00—59秒的计数功能。 电路图如下: 进行编译及波形仿真,如下图: 将上述文件保存并打包,如图: 2、分计数器是60进制的。功能如秒计数器。其电路图如下: 波形图仿真及打包图如下: 3、小时计数器是24进制的。当下面的74161到9时等下一个脉冲来是向上面的74161计数。但是等到上面的记到2时下面的将不能超过4,所以等上面的记到2,下面的记到4时就将两个74161共同预置。从而实现00—24秒的计数功能。 原理图如下: 仿真的波形图及打包的文件图如下: 4、校时。校时是通过加快时分的计数速度来快速校准时间的。实际上我们把秒脉冲cps加到分计数和时计数上,是他们加快计数速度。所以其中我们需要通过开关来选择。 原理图及打包图如下: 5、时段控制:时段控制是通过7485集成电路的数据比较来控制的。 原理图及打包图如下: 6、整点报时:整点报时是通过整点时的二进制数据规律来报时的。 原理图及打包图如下: 7、将时分秒打包文件连成多功能数字电路图如下: 8、多功能数字钟硬件测试原理图如下: 9、部分制作过程图,如下: 六、实验工具 装有QuartusⅡ软件的电脑,EDA开发板,相关EDA设计方面的书籍。 七、设计中遇到问题及解决方法 1、实验后期的引脚分配及下载方法不当,实验所用电脑没有 quartus11.0 的 驱动。耗费时间较多。解决方法:参阅西安电子科技大学出版社出版的《数字电路设计及 Verilog HDL 实现》第 394 页关于引脚分配和下载验证的介绍; 2、下载验证过程中时段控制部分有错误,原代码在软件上仿真没有错误,但是下载到实验板验证时,出现错误。解决方法:通过去请教同学及查阅相关资料得到解决。 八、特点和实用性 利用 QuartusII 软件,结合所学的数字电路的知识设计一个 24 时多功能数 字钟,具有正常分、秒计时,动态显示、快速校分、整点报时、时段控制的功能。分析整个电路的工作原理,分别说明各子模块的设计原理和调试、仿真、编 程下载的过程,并对最终结果进行总结,最后提出在实验过程中出现的问题和解 决的方案。通过实验掌握一些逻辑组合器件的基本功能和用法,同时体会利用软件设计 电路的方便快捷,避免硬件布线的繁琐,提高效率。 九、心得体会 1、设计必须要有整体概念,提前熟悉软件。刚开始时没头绪,不知道该怎 样分块,进度很慢,加上对软件不是很熟悉,比如:封装要注意哪些,哪些不能 运行,哪些是不正确的操作等等,走了很多冤枉路。 2、设计的模块要分块调试,免得等所有都完工了再调试出错,那样的话很 难确定是什么出错,更加没头绪。有必要的话做一部分后就送到平台上调试,这 样会大大减少出错率。 3、没有硬件软件化的概念,开始设计时没有总体的规划,不知道什么是可行 的,什么是封装,怎样使搭配组合最优化。 4、遇到问题先自己摸索,查阅资料要有技巧,避免没有目的和思路。明白 自己要解决什么问题。同时请教老师,和同学交流。良好的沟通很重要。针对本次的毕业设计,用我国著名的数学家的话概括一下我的感受: “科学上没有平坦的大道,真理长河中有无数礁石险滩。只有不为畏攀登的采药者,只有不怕 巨浪的弄潮儿,才能登上高峰采得仙草,深入水底觅得骊珠。” 十、参阅教材及文献 1、蒋立平编著《数字电路》.南京理工大学翻印; 2、南京理工大学电子技术中心编著.《EDA 设计实验指导书》 南京理工大学,2008 年; 3、谭会生,张昌凡.《EDA 技术及应用》.西安电子科技大学出版社,2001年; 4、《数字电路设计及 Verilog HDL 实现》 西安电子科技大学出版社出版; 5、《电子线路实验设计与仿真讲义》。第三篇:停车场管理系统需求报告
第四篇:《停车场管理系统》实验设计报告
第五篇:EDA设计报告