if(m1=9andm2=9andm3=9)then
m1:
="0000";m2:
="0000";m3:
="0000";m4:
=m4+1;m:
=m+1;
elsif(m1=9andm2=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;
endif;
else
m:
=0;m1:
="0000";m2:
="0000";m3:
="0000";m4:
="0000";
endif;
endif;
mg<=m1;ms<=m2;mb<=m3;mq<=m4;
endprocess;
endtran;
4.5Sel通过选择器将路程和车费每位分别输出,送到数码管
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityselis
port(c:
instd_logic_vector(2downto0);
dg,ds,db,dq,mg,ms,mb,mq:
instd_logic_vector(3downto0);
da:
outstd_logic_vector(3downto0)
);
endsel;
architectureseofselis
begin
process(c,dg,ds,db,dq,mg,ms,mb,mq)
variableco:
std_logic_vector(2downto0);
begin
co:
=c;
casecois
when"000"=>da<=dg;
when"001"=>da<=ds;
when"010"=>da<=db;
when"011"=>da<=dq;
when"100"=>da<=mg;
when"101"=>da<=ms;
when"110"=>da<=mb;
when"111"=>da<=mq;
whenothers=>null;
endcase;
endprocess;
endse;
4.6W用第一次分频过的脉冲实现八进制计数,为下面实现动态扫描做准备
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitywis
port(clk:
instd_logic;
a:
outstd_logic_vector(2downto0)
);
endw;
architecturech1ofwis
begin
process(clk)
variableb:
std_logic_vector(2downto0);
begin
if(clk'eventandclk='1')then
if(b="111")then
b:
="000";
elseb:
=b+1;
endif;
endif;
a<=b;
endprocess;
endch1;
4.73—8译码器:
通过八进制计数实现动态扫描
libraryieee;
useieee.std_logic_1164.all;
entitymux38ais
port(d:
instd_logic_vector(2downto0);
q:
outstd_logic_vector(7downto0));
endmux38a;
architectureoneofmux38ais
begin
process(d)
begin
casedis
when"000"=>q<="11101111";
when"001"=>q<="11011111";
when"010"=>q<="10111111";
when"011"=>q<="01111111";
when"100"=>q<="11111110";
when"101"=>q<="11111101";
when"110"=>q<="11111011";
when"111"=>q<="11110111";
whenothers=>null;
endcase;
endprocess;
endone;
4.8数码管显示:
显示模块由8个七段LED数码管组成。
各个模块用四个数码管,三个表示整数部分,一个表示小数部分。
由于小数点的位置是固定的,因此可以将小数点接到一个固定的高电平上一直显示。
libraryieee;
useieee.std-_logic_1164.all;
entityledis
port(a:
instd_logic_vector(3downto0);
L:
outstd_logic_vector(6sownto0));
endled;
architectureoneofledis
begin
process(a)
begin
caseais
when"0000"=>L<="0111111";
when"0001"=>L<="0000110";
when"0010"=>L<="1011011";
when"0011"=>L<="1001111";
when"0100"=>L<="1100110";
when"0101"=>L<="1101101";
when"0110"=>L<="1111101";
when"0111"=>L<="0000111";
when"1000"=>L<="1111111";
when"1001"=>L<="1101111";
whenother=>null;
endcase;
endprocess;
endone;
五顶层模块设计:
将各个程序块联合起来,实现层次化设计
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitytaxiis
port(cp,start,stop,pause:
instd_logic;
ss1:
outstd_logic_vector(7downto0);
ss2:
outstd_logic_vector(6downto0));
endentitytaxi;
architectureymoftaxiis
componentoneMHZ
port(daclk:
instd_logic;
clkout:
outstd_logic);
endcomponent;
componenttwoMHZ
port(daclk:
instd_logic;
clkout:
outstd_logic);
endcomponent;
componentcharge
port(cp,ks,tz,zt:
instd_logic;
dis,mon:
outintegerrange0to9999);
endcomponent;
componenttransform
port(daclk:
std_logic;
dis,mon:
integerrange0to9999;
dg,ds,db,dq,mg,ms,mb,mq:
outstd_logic_vector(3downto0));
endcomponent;
componentw
port(clk:
instd_logic;
a:
outstd_logic_vector(2downto0));
endcomponent;
componentsel
port(c:
instd_logic_vector(2downto0);
dg,ds,db,dq,mg,ms,mb,mq:
instd_logic_vector(3downto0);
da:
outstd_logic_vector(3downto0));
endcomponent;
componentmux38a
port(d:
instd_logic_vector(2downto0);
q:
outstd_logic_vector(7downto0));
endcomponent;
componentled
port(a:
instd_logic_vector(3downto0);
L:
outstd_logic_vector(6downto0));
endcomponent;
signalaa0,aa1:
std_logic;
signala0,b0:
integerrange0to9999;
signalb2,a1,b1,c1,d1,e1,f1,g1,h1:
std_logic_vector(3downto0);
signaly:
std_logic_vector(2downto0);
begin
u0:
oneMHZportmap(daclk=>cp,clkout=>aa0);
u1:
twoMHZportmap(daclk=>aa0,clkout=>aa1);
u2:
chargeportmap(cp=>aa1,ks=>start,tz=>stop,zt=>pause,dis=>a0,mon=>b0);
u3:
transformportmap(daclk=>aa0,dis=>a0,mon=>b0,dg=>a1,ds=>b1,db=>c1,dq=>d1,
mg=>e1,ms=>f1,mb=>g1,mq=>h1);
u4:
wportmap(clk=>aa0,a=>y);
u5:
selportmap(c=>y,dg=>a1,ds=>b1,db=>c1,dq=>d1,
mg=>e1,ms=>f1,mb=>g1,mq=>h1,da=>b2);
u6:
mux38aportmap(d=>y,q=>ss1);
u7:
ledportmap(a=>b2,L=>ss2);
endym;
六调试结果:
1、下载步骤:
(1)安装驱动
插入USB下载线后,自动跳出窗口,手动设置D:
altera\quartus6.0\driver\usb_blaster
(2)IDE环境设置
Assigements—device—ep2cst144c8
device&pingoptions—configurations—useconfigurationdevise—EPCS1
--编译
(3)programmer
Tools—hardwaresetup—usb—blaster
Mode—SJTAG选文件xx.sof
(4)下载成功后,先拔电源VCC再拔USB下载线。
注意事项:
保证下载板载断电情况下进行ASP或JTAG借口的插拔。
引脚安装图:
出租车计费器成功运行,软硬件之间衔接全无问题,我们成功调试出预想结果,并且增加一些附加功能,比如考虑出租车夜晚和白天计费不一样,设计了加速计费功能,除了软件方面,在硬件上设计了显示灯,便于观察哪个功能起作用。
虽然再调试过程出现了一些问题,但经过讨论以及观察摆出故障,测试完软硬件的独立运行,我们的软硬件之间的衔接运行相当顺利。
七实验中出现问题
在编写程序时出现了一些问题,例如编译错误,仿真结果不正确,但经过细心检查和查找资料,及时改正,尤其在实际顶层文件时出现一系列问题,但很大部分是由于更部分引脚接错造成问题。
这大多由于粗心和不熟练造成的。
在此过程中浪费了一些时间。
并且在下载过程中,尽管操作不熟练,但还是顺利完成。
再软硬件连接过程中,出现了一系列问题,刚开始出现乱码,经检查是数码管和FPGA引脚连错了,接着出现显示没有置数功能,经核查后发现为软硬件不协调,除此之外还有由于频率太快,造成显示太快,无法看清示数显示,经过一系列修改后终于达到预期要求,并增加附加功能。
八、设计小结
出租车计费器系统的设计已全部完成,能按预期的效果进行模拟汽车启动、停止、暂停等功能,并设计动态扫描电路显示车费数目,由动态扫描电路来完成。
车暂时停止不计费,车费保持不变。
若停止则车费清零,等待下一次计费的开始。
出租车计费器系统的设计已全部完成,能按预期的效果进行模拟汽车启动、停止、暂停等功能,并设计动态扫描电路显示车费数目,由动态扫描电路来完成。
车暂时停止不计费,车费保持不变。
若停止则车费清零,等待下一次计费的开始。
各模块完成后,在将它们组合成完整的出租车系统,在设计过程中还需要改进的是控制系统的纠错功能。
出租车计费系统的设计中体现了VHDL覆盖面广,描述能力强,是一个多层次的硬件描述语言及PLD器件速度快,使用方便,便于修改等特点,本设计在实用方面具有一定的价值。
九收获与体会:
两周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。
在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。
学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世。
通过本次数字电路课程设计,我不但熟练的掌握了有关EDA,VHDL的设计方法以及上机的实际操作,而且还获知了有关出租车计费器基于FPGA的设计方法以及实际操作,并且成功的在多方面资料的帮助下设计出了出租车计费器。
看到出租车计费器成功的运行,我由衷的高兴,在此次的方案设计过程中,一次次的困难并没有吓倒我们,反而激起我们解决它们的决心,一次次的挫折使我们对出租车计费器的了解更加深刻。
在此感谢对我帮助过的同学们,谢谢