数字电路(出租车计费器).pdf
实用文档.一、课题要求(1)技术要求 1.掌握较复杂逻辑的设计、调试。2.进一步掌握用 VHDL 语言设计数字逻辑电路。3.掌握用 quartusII6.0 软件进行编程设计。(2)功能要求 1.能实现计费功能,计费标准为:按行驶里程收费,起步费为 7.00 元,并在车行 3 公里后再按 2.2 元/公里,当计费器达到或超过一定收费(如 20 元)。每公里加收 50%的车费,车停止不计费 2.实现预置功能、每公里收费、车行驶加费里程。3.实现模拟功能:能模拟汽车启动、停止、暂停、车速等状态。4.设计动态扫描电路 将车费显示出来。有两位小数。5.用 VHDL 语言设计符合上述功能要求的出租车计费器。并用层次化设计方法设计该电路。6.各计数器的技术状态用功能的方法验证,并用有关波形确认电路设计是否正确 7.完成电路全部设计后,通过系统试验箱下载验证设计课题的正确性。二 本人工作:本人主要负责软件和硬件电路方面的设计,并进行引脚设定,以及与软硬件之间的调试运行,及时修改程序,帮助查找和分析问题,确保能够成功完成出租车计费器的设计。三 设计方案:3.1 主要中心组成 3.2 FPGA 芯片内部主要程序:按键模块 FPGA 显示模块 实用文档.3.3 工作原理:基于 CPLDFPGA 的出租车计费器的组成如图 1 所示。各部分主要功能如下:(1)A 计数器对车轮传感器送来的脉冲信号进行计数(每转一圈送一个脉冲)。不同车型的车轮直径可能不一样,通过“设置 1”对车型做出选择,以实现对不同车轮直径的车进行调整。(2)B 计数器对百米脉冲进行累加,并输出实际公里数的 BCD 码给译码动态扫描模块。每计满 500 送出一个脉冲给 C 计数器。“设置 2”实现起步公里数预制。(3)C 计数器实现步长可变(即单价可调)的累加计数,每 500 米计费一次。“设置 3”用来完成超价加费、起步价预制等。(4)译码动态扫描将路程与费用的数值译码后用动态扫描的方式驱动数码管。(5)数码管显示将公里数和计费金额均用四位 LED 数码管显示(2 位整数,2 位小数)。实用文档.3.4 功能模块设计 出租车计费器由车型调整模块、计程模块、计费模块、译码动态及扫描等模块组成,整个系统采用模块化设计,首先用 VHDL 编写功能模块,然后用顶层原理图将各功能模块连接起来。四 单元模块设计:首先出租车计费器的设计需要分频,所以需要设计了两个频率:4.1 oneMHZ:由于给定的 50MHZ 太大,这个程序完成 5000 分频,实现第一次分频,确保实现动态计数,并且保证频率在驱动范围之内。library ieee;use ieee.std_logic_1164.all;entity oneMHZ is port(daclk:in std_logic;clkout:out std_logic);end oneMHZ;architecture one of oneMHZ is signal data:integer range 0 to 5000;signal Q:std_logic;begin process(daclk)begin if daclkevent and daclk=1 then if(data=5000)then data=0;Q=not Q;else data=data+1;end if;end if;clkout=Q;end process;end one;4.2 twoMHZ:这个程序完成 2500 分频,实现第二次分频,确保最后数码管显示频率在合适范围 library ieee;use ieee.std_logic_1164.all;entity twoMHZ is port(daclk:in std_logic;clkout:out std_logic);end twoMHZ;architecture one of twoMHZ is signal data:integer range 0 to 2500;signal Q:std_logic;begin process(daclk)begin if daclkevent and daclk=1 then if(data=2500)then 实用文档.data=0;Q=not Q;else data=data+1;end if;end if;clkout=Q;end process;end one;4.3 Charge:实现计费功能,按行驶里程收费,起步费为 7.00 元,并在车行 3 公里后再按 2.2 元/公里,当计费器达到或超过一定收费(如 20 元)。每公里加收 50%的车费,车停止不计费,实现预置功能、每公里收费、车行驶加费里程,实现模拟功能,能模拟汽车启动、停止、暂停、车速等状态,将车费显示出来。有两位小数。library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity charge is port(cp,ks,tz,zt:in std_logic;dis,mon:out integer range 0 to 9999);end charge;architecture ch of charge is begin process(cp,ks,tz,zt)variable dis1,mon1:integer range 0 to 9999;begin if(cpevent and cp=1)then if(tz=0)then dis1:=0;mon1:=0;elsif(ks=0)then dis1:=0;mon1:=700;elsif(ks=1and tz=1and zt=1)then dis1:=dis1+10;elsif(ks=1and tz=1and zt=0)then dis1:=dis1;mon1:=mon1;end if;if(dis1300)then null;elsif(dis1300)then mon1:=mon1+22;elsif(dis1=600)then mon1:=mon1+33;end if;mon=mon1;dis=dis1;end if;end process;end ch;实用文档.4.4 Transform 实现将电路计数分高低位显示,将二进制转化为数码管可识别的十进制 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity transform is port(daclk:std_logic;dis,mon:integer range 0 to 9999;dg,ds,db,dq,mg,ms,mb,mq:out std_logic_vector(3 downto 0);end transform;architecture tran of transform is begin process(daclk,dis)variable d:integer range 0 to 9999;variable d1,d2,d3,d4:std_logic_vector(3 downto 0);begin if(daclkevent and daclk=1)then if(ddis)then if(d1=9 and d2=9 and d3=9)then d1:=0000;d2:=0000;d3:=0000;d4:=d4+1;d:=d+1;elsif(d1=9 and d2=9)then d1:=0000;d2:=0000;d3:=d3+1;d:=d+1;elsif(d1=9)then d1:=0000;d2:=d2+1;d:=d+1;else d1:=d1+1;d:=d+1;end if;else d:=0;d1:=0000;d2:=0000;d3:=0000;d4:=0000;end if;end if;dg=d1;ds=d2;db=d3;dq=d4;end process;process(daclk,mon)variable m:integer range 0 to 9999;variable m1,m2,m3,m4:std_logic_vector(3 downto 0);begin if(daclkevent and daclk=1)then if(mmon)then if(m1=9 and m2=9 and m3=9)then m1:=0000;m2:=0000;m3:=0000;m4:=m4+1;m:=m+1;elsif(m1=9 and m2=9)then m1:=0000;m2:=0000;m3:=m3+1;m:=m+1;elsif(m1=9)then m1:=0000;m2:=m2+1;m:=m+1;实用文档.else m1:=m1+1;m:=m+1;end if;else m:=0;m1:=0000;m2:=0000;m3:=0000;m4:=0000;end if;end if;mg=m1;ms=m2;mb=m3;mqdadadadadadadadanull;end case;end process;end se;4.6 W 用第一次分频过的脉冲实现八进制计数,为下面实现动态扫描做准备 实用文档.library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity w is port(clk:in std_logic;a:out std_logic_vector(2 downto 0);end w;architecture ch1 of w is begin process(clk)variable b:std_logic_vector(2 downto 0);begin if(clkevent and clk=1)then if(b=111)then b:=000;else b:=b+1;end if;end if;aqqqqqqqqnull;end case;实用文档.end process;end one;4.8 数码管显示:显示模块由 8 个七段 LED 数码管组成。各个模块用四个数码管,三个表示整数部分,一个表示小数部分。由于小数点的位置是固定的,因此可以将小数点接到一个固定的高电平上一直显示。library ieee;use ieee.std-_logic_1164.all;entity led is port(a:in std_logic_vector(3 downto 0);L:out std_logic_vector(6 sownto 0);end led;architecture one of led is begin process(a)begin case a is when 0000=LLLLLLLLLLnull;end case;end process;end one;五 顶层模块设计:将各个程序块联合起来,实现层次化设计 实用文档.library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity taxi is port(cp,start,stop,pause:in std_logic;ss1:out std_logic_vector(7 downto 0);ss2:out std_logic_vector(6 downto 0);end entity taxi;architecture ym of taxi is component oneMHZ port(daclk:in std_logic;clkout:out std_logic);end component;component twoMHZ port(daclk:in std_logic;clkout:out std_logic);end component;component charge port(cp,ks,tz,zt:in std_logic;dis,mon:out integer range 0 to 9999);end component;component transform port(daclk:std_logic;dis,mon:integer range 0 to 9999;dg,ds,db,dq,mg,ms,mb,mq:out std_logic_vector(3 downto 0);end component;component w port(clk:in std_logic;a:out std_logic_vector(2 downto 0);end component;component sel port(c:in std_logic_vector(2 downto 0);dg,ds,db,dq,mg,ms,mb,mq:in std_logic_vector(3 downto 0);da:out std_logic_vector(3 downto 0);end component;component mux38a port(d:in std_logic_vector(2 downto 0);q:out std_logic_vector(7 downto 0);end component;component led port(a:in std_logic_vector(3 downto 0);L:out std_logic_vector(6 downto 0);end component;signal aa0,aa1:std_logic;signal a0,b0:integer range 0 to 9999;signal b2,a1,b1,c1,d1,e1,f1,g1,h1:std_logic_vector(3 downto 0);signal y:std_logic_vector(2 downto 0);begin u0:oneMHZ port map(daclk=cp,clkout=aa0);u1:twoMHZ port map(daclk=aa0,clkout=aa1);u2:charge port map(cp=aa1,ks=start,tz=stop,zt=pause,dis=a0,mon=b0);u3:transform port map(daclk=aa0,dis=a0,mon=b0,dg=a1,ds=b1,db=c1,dq=d1,实用文档.mg=e1,ms=f1,mb=g1,mq=h1);u4:w port map(clk=aa0,a=y);u5:sel port map(c=y,dg=a1,ds=b1,db=c1,dq=d1,mg=e1,ms=f1,mb=g1,mq=h1,da=b2);u6:mux38a port map(d=y,q=ss1);u7:led port map(a=b2,L=ss2);end ym;daclkclkoutdaclkclkoutcpkstzztdis13.0mon13.0daclkdis13.0mon13.0dg3.0ds3.0db3.0dq3.0mg3.0ms3.0mb3.0mq3.0clka2.0c2.0dg3.0ds3.0db3.0dq3.0mg3.0ms3.0mb3.0mq3.0da3.0d2.0q7.0a3.0L6.0twoMHZ:u1charge:u2transform:u3led:u7cpstartstoppausess17.0ss26.0w:u4oneMHZ:u0mux38a:u6sel:u5 六 调试结果:1、下载步骤:(1)安装驱动 插入 USB 下载线后,自动跳出窗口,手动设置 D:alteraquartus6.0driverusb_blaster(2)IDE 环境设置 Assigementsdeviceep2cst144c8 device&ping optionsconfigurationsuse configuration deviseEPCS1-编译(3)programmer Toolshardware setupusbblaster ModeSJTAG 选文件 xx.sof(4)下载成功后,先拔电源 VCC 再拔 USB 下载线。注意事项:保证下载板载断电情况下进行 ASP 或 JTAG 借口的插拔。实用文档.引脚安装图:出租车计费器成功运行,软硬件之间衔接全无问题,我们成功调试出预想结果,并且增加一些附加功能,比如考虑出租车夜晚和白天计费不一样,设计了加速计费功能,除了软件方面,在硬件上设计了显示灯,便于观察哪个功能起作用。虽然再调试过程出现了一些问题,但经过讨论以及观察摆出故障,测试完软硬件的独立运行,我们的软硬件之间的衔接运行相当顺利。七 实验中出现问题 在编写程序时出现了一些问题,例如编译错误,仿真结果不正确,但经过细心检查和查找资料,及时改正,尤其在实际顶层文件时出现一系列问题,但很大部分是由于更部分引脚接错造成问题。这大多由于粗心和不熟练造成的。在此过程中浪费了一些时间。并且在下载过程中,尽管操作不熟练,但还是顺利完成。再软硬件连接过程中,出现了一系列问题,刚开始出现乱码,经检查是数码管和 FPGA 引脚连错了,接着出现显示没有置数功能,经核查后发现为软硬件不协调,除此之外还有由于频率太快,造成显示太快,无法看清示数显示,经过一系列修改后终于达到预期要求,并增加附加功能。八、设计小结 出租车计费器系统的设计已全部完成,能按预期的效果进行模拟汽车启动、停止、暂停等功能,并设计动态扫描电路显示车费数目,由动态扫描电路来完成。车暂时停止不计费,车费保持不变。若停止则车费清零,等待下一次计费的开始。出租车计费器系统的设计已全部完成,能按预期的效果进行模拟汽车启动、停止、暂停等功能,并设计动态扫描电路显示车费数目,由动态扫描电路来完成。车暂时停止不计费,车费保持不变。若停止则车费清零,等待下一次计费的开始。各模块完成后,在将它们组合成完整的出租车系统,在设计过程中还需要改进的是控制系统的纠错功能。出租车计费系统的设计中体现了覆盖面广,描述能力强,是一个多层次的硬件描述语言及 PLD 器件速度快,使用方便,便于修改等特点,本设计在实用方面具有一定的价值。九 收获与体会:实用文档.两周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世。通过本次数字电路课程设计,我不但熟练的掌握了有关 EDA,VHDL 的设计方法以及上机的实际操作,而且还获知了有关出租车计费器基于 FPGA 的设计方法以及实际操作,并且成功的在多方面资料的帮助下设计出了出租车计费器。看到出租车计费器成功的运行,我由衷的高兴,在此次的方案设计过程中,一次次的困难并没有吓倒我们,反而激起我们解决它们的决心,一次次的挫折使我们对出租车计费器的了解更加深刻。在此感谢对我帮助过的同学们,谢谢你们对我的帮助和支持,让我感受到同学的友谊。由于本人的设计能力有限,在设计过程中难免出现错误,恳请老师们多多指教,我十分乐意接受你们的批评与指正,本人将万分感谢。参考文献:【1】数字电路课程设计指导书 江苏技术师范学院【2】EDA 技术及应用实验讲义 江苏技术师范学院【3】邓元庆 数字设计基础与应用 清华大学出版社【4】李云 VHDL 电路设计实用教程 机械工业出版社