FPGA出租车计价器设计.docx
- 文档编号:13103460
- 上传时间:2023-06-11
- 格式:DOCX
- 页数:21
- 大小:1.09MB
FPGA出租车计价器设计.docx
《FPGA出租车计价器设计.docx》由会员分享,可在线阅读,更多相关《FPGA出租车计价器设计.docx(21页珍藏版)》请在冰点文库上搜索。
FPGA出租车计价器设计
EDA课程设计目标
1.掌握用VerilogHDL语言的设计方法;
2.掌握VerilogHDL语言程序的基本结构,学习编写简单的VerilogHDL设计实用程序;
3.了解Quartus
软件的基本使用方法,数字电路系统的设计流程,掌握Quartus
的使用方法;
4.在Quartus
环境下,对其设计功能进行编程、仿真、并下载到EDA试验箱的FPGA芯片,验证其设计的正确性。
1、设计任务及要求
设计一个出租车计价器,要求显示里程和金额。
(1)出租车启动和停驶由司机控制;
(2)行程小于基本里程时,显示起步价,基本里程设3公里,起步价设5元;
(3)行程大于基本里程时,每多行一公里,在起步价上加2元;
(4)当出租车等待时,由司机按下等候键,每等待一分钟加1元,不足一分钟的按一分钟计算;
(5)此处用脉冲信号模拟轮胎的转数,设每计一个脉冲汽车前进100米,系统中所需脉冲均由50MHz晶振分频提供。
2、设计原理及总体框图
(1)设计总体框图
行驶里程计算
行驶
车启动
费用计算
等待时间计算
等待
图1.总设计框图
(2)设计总原理图
图2.设计总原理图
设计总原理:
测控FPGA芯片通过采集速度传感器脉冲信号WCLK进行行驶里程计算,利用外部脉冲信号CLK1产生标准时钟信号,用来计算等待时间,最后根据行驶里程、等待时间来计算计价值。
并用译码电路显示行驶里程、等待时间和计价值。
3、程序设计
1.VHDL语言简单介绍
VHDL的英文全名是VeryHighSpeedIntegratedCircuitHardwareDescriptionLanguage,即超高速集成电路硬件描述语言,被认为是标准的硬件描述语言,有专家认为,在新世纪中,VHDL与VerilogHDL语言将承担起几乎全部的数字系统设计任务。
VHDL主要用于描述数字系统的结构、行为、功能和接口。
除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件、一个电路模块或一个系统)分成外部(或称可视部分,即端口)和内部(或称不可视部分),即设计实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦内部开发完成后,其他的设计可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
VHDL具有功能强大的语言结构,可以用简洁明确的源代码来描述复杂的逻辑控制。
它具有多层次的设计描述功能,层层细化,最后可直接生成电路级描述。
VHDL支持同步电路、异步电路和随机电路的设计,这是其他硬件描述语言所不能比拟的。
VHDL还支持各种设计方法,既支持自底向上的设计,又支持自顶向下的设计;既支持模块化设计,又支持层次化设计。
VHDL具有多层次的设计描述功能,既可以描述系统级电路,又可以描述门级电路。
而描述既可以采用行为描述、寄存器传输描述或结构描述,也可以采用三者混合的混合级描述。
另外,VHDL支持惯性延迟和传输延迟,还可以准确地建立硬件电路模型。
VHDL支持预定义的和自定义的数据类型,给硬件描述带来较大的自由度,使设计人员能够方便地创建高层次的系统模型。
设计人员用VHDL进行设计时,不需要首先考虑选择完成设计的器件,就可以集中精力进行设计的优化。
当设计描述完成后,可以用多种不同的器件结构来实现其功能。
VHDL是一种标准化的硬件描述语言,同一个设计描述可以被不同的工具所支持,使得设计描述的移植成为可能。
基于以上种种优点,VHDL作为IEEE的工业标准硬件描述语言,得到众多EDA公司支持,在电子工程领域,已成为事实上的通用硬件描述语言。
2、模块及相应程序说明
(1)消除抖动模块
modulexiaodou(clk,kaishi,ks,zanting,zt,jieshu,js);//消抖模块
inputclk,kaishi,jieshu,zanting;//clk为全局时钟50MHZ,按键的输入分别是:
开始,结束,暂停
outputks,js,zt;//输出的是开始、结束、暂停的有效信号
regks_reg1,zt_reg1,js_reg1;
regks_reg2,zt_reg2,js_reg2;//ks_reg1,ks_reg2分别是扫描得到的输入信号
regks,zt,js;
reg[25:
0]count1;//计数器
always@(posedgeclk)
begin
count1<=count1+1'b1;
if(count1==500000)//扫描频率100Hz
begin
ks_reg1<=kaishi;
zt_reg1<=zanting;
js_reg1<=jieshu;
count1<=0;
end
ks_reg2<=ks_reg1;
zt_reg2<=zt_reg1;
js_reg2<=js_reg1;
ks<=ks_reg2&(!
ks_reg1);
zt<=zt_reg2&(!
zt_reg1);
js<=js_reg2&(!
js_reg1);//当扫描得到的两个信号不同时,说明按键按下则输出高电平脉冲
end
endmodule
消除因其他原因导致输出无效的信号引起系统误启动。
(2)状态模块
modulezhuangtai(clk,ks,zt,js,state);//状态模块
inputclk,ks,zt,js;//输入的是开始、暂停、结束的有效信号
outputstate;
reg[1:
0]state;/*state是不同的运行状态,0时显示hello及led8,1时运行并显示路程模块及led6,2时运行并显示时间模块及led10*/
initial
begin
state=0;//初始时显示stste0及led8
end
always@(posedgeclk)
begin
if(ks==1)state=1;//按下开始键后,state转换到1
if((!
state==0)&&zt==1)//当state非0时,每次按暂停,state加1;同时确保暂停键只在路程或时间模块有效
begin
state=state+1;
while(state>2);state=1;//保证按下暂停时只在路程和时间模块之间转换
end
if(js==1)state=0;//按下结束键时,转到state0
end
endmodule
控制计价器正常工作,停车等待,等不同工作状态下的计费。
(3)行车速度模块
modulesudu(clk,clksd);//速度模块
inputclk;//输入的是50MHz脉冲
outputclksd;//输出的是100Hz的模拟速度脉冲
regclksd;
reg[27:
0]count2;//计数器
always@(posedgeclk)
begin
count2=count2+1;
if(count2==12500000)beginclksd=~clksd;count2=0;end//每6249000翻转一次,即周期是0.25s,4Hz
end
endmodule
(4)时间模块
moduleshijian(clk,state,min,sec);//时间模块
inputclk;
input[1:
0]state;
output[6:
0]min;
output[6:
0]sec;//输出的是等待时间的分和秒
reg[6:
0]sec;
reg[6:
0]min;
reg[25:
0]count3;//计数器
always@(posedgeclk)
begin
if(state==0)//state为0时,分和秒置零
begin
min<=0;
sec<=0;
end
if(state==2)//state为2时,运行时间的累计
begin
count3=count3+1'b1;
if(count3==49999999)//每计数50000000次,计秒一次
begin
count3=0;
sec<=sec+1'b1;
end
if(sec>59)//每60秒,分加1
begin
min<=min+1'b1;
sec<=0;
end
end
end
endmodule
在停车等待时开始计时,记录停车等待的时间长短,当再次开始行车时停止计时,恢复正常计费。
(5)行车路程模块
modulelucheng(clksd,state,lck,lcm);//路程模块
inputclksd;//输入的事模拟速度脉冲
input[1:
0]state;
output[6:
0]lck;//输出以千米为基数的整数部分
output[6:
0]lcm;//输出以十米为基数的小数部分
reg[6:
0]lck;
reg[6:
0]lcm;
always@(posedgeclksd)
begin
if(state==0)//当state为0时,使两个输出都置零
begin
lck<=0;
lcm<=0;
end
if(state==1)//当state为1时,进行路程的累计
begin
lcm<=lcm+1'b1;
if(lcm>99)//小数部分每99向整数部分进1
begin
lck<=lck+1'b1;
lcm<=0;
end
end
end
endmodule
记录行车的路程长短,输出以千米为基数的整数部分以及输出以十米为基数的小数部分,在停车等待时暂停记录,恢复正常行车状态是恢复路程记录。
(6)总价模块
modulezongjia(clk,min,lck,zj);/*总价模块,起步价4元,包含3公里,超过3公里每累计1公里1元,
不到1公里不算,等待时间每累计1分钟1元,不到一分钟不计算*/
inputclk;
input[6:
0]min,lck;//输入路程的整千米数和时间的整分数
outputzj;
reg[7:
0]zj;
always@(clk)
begin
if(lck<3)
zj=5+min*1;//3公里内,总价为4+等待时间的整分数*1
else
zj=5+(lck-3)*1+min*1;//3公里外,总价为4*路程减二+等待时间的整分数*1
end
endmodule
价格显示模块,起步行驶不超过3公里只收起步价4元(包含3公里),超过3公里每多行1公里价格增加1元。
(7)显示模块
moduleled_drive(clk,state,sec,lck,lcm,zj,ksled,ztled,jsled,a,b,dp);
inputclk;
input[1:
0]state;
input[6:
0]sec,lck,lcm;
input[7:
0]zj;
outputa,b,dp,ksled,ztled,jsled;
reg[0:
7]c;
reg[3:
0]i;
regdp,ksled,ztled,jsled;
reg[0:
6]a;//a数码管选段
reg[0:
7]b;//b数码管选位
reg[0:
6]mem[0:
9];//数码管显示内容
reg[17:
0]count4;//扫描计数器
initial
begin//显示从0~9
mem[0]=7'b0000001;
mem[1]=7'b1111001;
mem[2]=7'b0010010;
mem[3]=7'b0000110;
mem[4]=7'b1001100;
mem[5]=7'b0100100;
mem[6]=7'b0100000;
mem[7]=7'b0001111;
mem[8]=7'b0000000;
mem[9]=7'b0000100;
i=0;
end
always@(posedgeclk)
begin
count4=count4+1'b1;
if(count4==100000)//计数器计数起到分频作用,降低扫描频率实现稳定的动态显示
begin
i=i+1'b1;
count4=0;
end
case(state)
0:
case(i)//显示state为0时的状态及led
0:
begina=8'b1111111;b=8'b01111111;dp=1;end
1:
begina=8'b1001000;b=8'b10111111;dp=1;end
2:
begina=8'b0110000;b=8'b11011111;dp=1;end
3:
begina=8'b1110001;b=8'b11101111;dp=1;end
4:
begina=8'b1110001;b=8'b11110111;dp=1;end
5:
begina=7'b0000001;b=8'b11111011;dp=1;end
6:
begina=8'b1111111;b=8'b11111101;dp=1;end
7:
begina=8'b1111111;b=8'b11111110;dp=1;end
8:
beginksled=0;ztled=0;jsled=1;end
endcase
1:
case(i)//显示state为1时的状态及led
0:
begina=mem[lck/10];b=8'b01111111;dp=1;end
1:
begina=mem[lck%10];b=8'b10111111;dp=~dp;end
2:
begina=mem[lcm/10];b=8'b11011111;dp=1;end
3:
begina=mem[lcm%10];b=8'b11101111;dp=1;end
4:
begina=7'b1111110;b=8'b11110111;dp=1;end
5:
begina=mem[zj/100];b=8'b11111011;dp=1;end
6:
begina=mem[zj/10];b=8'b11111101;dp=1;end
7:
begina=mem[zj%10];b=8'b11111110;dp=1;end
8:
beginksled=1;ztled=0;jsled=0;end
endcase
2:
case(i)//显示state为2时的状态及led
0:
begina=7'b1111111;b=8'b01111111;dp=1;end
1:
begina=7'b1111111;b=8'b10111111;dp=~dp;end
2:
begina=mem[sec/10];b=8'b11011111;dp=1;end
3:
begina=mem[sec%10];b=8'b11101111;dp=1;end
4:
begina=7'b1111110;b=8'b11110111;dp=1;end
5:
begina=mem[zj/100];b=8'b11111011;dp=1;end
6:
begina=mem[zj/10];b=8'b11111101;dp=1;end
7:
begina=mem[zj%10];b=8'b11111110;dp=1;end
8:
beginksled=0;ztled=1;jsled=0;end
endcase
endcase
if(i>8)i=0;//位选循环
end
endmodule
通过数码管,显示对应的等待时间,行车路程,最终价格。
4、编译及仿真
(1)仿真软件QuartusII的简单介绍和说明
Max+plusII作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。
目前Altera已经停止了对Max+plusII的更新支持。
QuartusII是Altera公司继Max+plusII之后开发的一种针对其公司生产的系列CPLD/FPGA器件的综合性开发软件,它的版本不断升级,目前已经发布了13.0版本,该软件有如下几个显著的特点:
该软件界面友好,使用便捷,功能强大,是一个完全集成化的可编程逻辑设计环境,是先进的EDA工具软件。
该软件具有开放性、与结构无关、多平台、完全集成化、丰富的设计库、模块化工具等特点,支持原理图、VHDL、VerilogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,内嵌有综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD、FPGA设计流程。
QuartusII可以在Windows、Linux以及Unix上使用,除了可以使用TCL脚本完成设计流程外,提供了完善的用户图形界面设计方式。
具有运行速度快,界面统一,功能集中,易学易用等特点。
QuartusII支持Altera公司的MAX3000A系列、MAX7000系列、MAX9000系列、ACEX1K系列、APEX20K系列、APEXII系列、FLEX6000系列、FLEX10K系列,支持MAX7000/MAX3000等乘积项器件。
支持MAXIICPLD系列、Cyclone系列、CycloneII、StratixII系列、StratixGX系列等。
支持IP核,包含了LPM/MegaFunction宏功能模块库,用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。
此外,QuartusII通过和DSPBuilder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。
图3.QuartusII软件的开发流程
(2)仿真波形图
图4.消抖模块波形图
图5.状态模块波形
图6.速度模块波形图
图7.时间模块波形图
图8.路程模块波形图
图9.总价模块波形图
图10.顶层文件波形图
图11.引脚分配
图12.资源占用
5、实物演示结果
6、心得体会
这次课程设计要求我们熟练掌握EDA理论、velilog语言等相关知识,独立思考完成自己的设计。
设计过程中出现很多问题,关于各个不同功能模块设计的实现,程序编写也出现了很多错误。
通过本次设计,我系统的了解了出租车计价器的设计流程,尤其是硬、软件的设计方法,掌握了verilog语言的编程方法,掌握了它的一般原理,也进一步掌握了QuartusⅡ的使用。
而且也开拓了思路,锻炼了实践动手能力,提高了分工协作能力和分析问题,解决问题的能力,达到了本次课程设计的目的。
天水师范学院
《基于EDA的出租车计价器设计》
实践报告
学院:
物理与信息科学学院
专业:
电子信息科学与技术
班级:
11级电信二班
姓名:
马尚荟,周文举
学号:
20111060218,20111060245
2013年12月31日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGA 出租车 计价器 设计