FPGA出租车计价器设计

更新时间:2023-04-09 20:44:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

EDA课程设计目标

1.掌握用Verilog HDL语言的设计方法;

2.掌握Verilog HDL语言程序的基本结构,学习编写简单的Verilog HDL设计

实用程序;

3.了解Quartus II软件的基本使用方法,数字电路系统的设计流程,掌握Quartus

II的使用方法;

4.在Quartus II环境下,对其设计功能进行编程、仿真、并下载到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 的英文全名是Very High Speed Integrated Circuit Hardware Description Language,即超高速集成电路硬件描述语言,被认为是标准的硬件描述语言,有专家认为,在新世纪中,VHDL与Verilog HDL语言将承担起几乎全部的数字系统设计任务。

VHDL 主要用于描述数字系统的结构、行为、功能和接口。除了含有许多具有硬件特征的语句外,VHDL 的语言形式和描述风格与句法十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件、一个电路模块或一个系统)分成外部(或称可视部分,即端口)和内部(或称不可视部分),即设计实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦内部开发完成后,其他的设计可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL 系统设计的基本点。

VHDL具有功能强大的语言结构,可以用简洁明确的源代码来描述复杂的逻辑控制。它具有多层次的设计描述功能,层层细化,最后可直接生成电路级描述。VHDL支持同步电路、异步电路和随机电路的设计,这是其他硬件描述语言所不能比拟的。VHDL还支持各种设计方法,既支持自底向上的设计,又支持自顶向下的设计;既支持模块化设计,又支持层次化设计。

VHDL具有多层次的设计描述功能,既可以描述系统级电路,又可以描述门级电路。而描述既可以采用行为描述、寄存器传输描述或结构描述,也可以采用三者混合的混合级描述。另外,VHDL支持惯性延迟和传输延迟,还可以准确地建立硬件电路模型。VHDL支持预定义的和自定义的数据类型,给硬件描述带来较大的自由度,使设计人员能够方便地创建高层次的系统模型。

设计人员用VHDL进行设计时,不需要首先考虑选择完成设计的器件,就可以集中精力进行设计的优化。当设计描述完成后,可以用多种不同的器件结构来实现其功能。VHDL是一种标准化的硬件描述语言,同一个设计描述可以被不同的工具所支持,使得设计描述的移植成为可能。

基于以上种种优点,VHDL作为IEEE的工业标准硬件描述语言,得到众多EDA公司支持,在电子工程领域,已成为事实上的通用硬件描述语言。

2、模块及相应程序说明

(1)消除抖动模块

module xiaodou(clk,kaishi,ks,zanting,zt,jieshu,js); //消抖模块input clk,kaishi,jieshu,zanting; //clk为全局时钟50MHZ,按键的输入分别是:开始,结束,暂停

output ks,js,zt; //输出的是开始、结束、暂停的有效信号

reg ks_reg1,zt_reg1,js_reg1;

reg ks_reg2,zt_reg2,js_reg2; //ks_reg1,ks_reg2分别是扫描得到的输入信号

reg ks,zt,js;

reg [25:0] count1; //计数器

always @( posedge clk)

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)状态模块

module zhuangtai(clk,ks,zt,js,state); //状态模块

input clk,ks,zt,js; //输入的是开始、暂停、结束的有效信号

output state;

reg [1:0]state; /*state是不同的运行状态,0时显示hello及led8,1时运行并显示路程模块及led6,2时运行并显示时间模块及led10*/

initial

begin

state=0; //初始时显示stste0及led8

end

always @ (posedge clk)

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)行车速度模块

module sudu(clk,clksd); //速度模块

input clk; //输入的是50MHz脉冲

output clksd; //输出的是100Hz的模拟速度脉冲

reg clksd;

reg [27:0]count2; //计数器

always@ (posedge clk )

begin

count2=count2+1;

if(count2==12500000) begin clksd=~clksd; count2=0;end //每6249000翻转一次,即周期是0.25s,4Hz

end

endmodule

(4)时间模块

module shijian( clk,state,min,sec); //时间模块

input clk;

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 @(posedge clk)

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) //每计数50 000 000次,计秒一次

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)行车路程模块

module lucheng( clksd,state,lck,lcm); //路程模块

input clksd; //输入的事模拟速度脉冲

input [1:0]state;

output [6:0]lck; //输出以千米为基数的整数部分

output [6:0]lcm; //输出以十米为基数的小数部分

reg [6:0]lck;

reg [6:0]lcm;

always @(posedge clksd )

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)总价模块

module zongjia(clk,min,lck,zj); /*总价模块,起步价4元,包含3公里,超过3公里每累计1公里1元,

不到1公里不算,等待时间每累计1分钟1元,不到一分钟不计算*/

input clk;

input [6:0]min,lck; //输入路程的整千米数和时间的整分数

output zj;

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)显示模块

module led_drive(clk,state,sec,lck,lcm,zj,ksled,ztled,jsled,a,b,dp); input clk;

input [1:0]state;

input [6:0]sec,lck,lcm;

input [7:0] zj;

output a,b,dp,ksled,ztled,jsled;

reg[0:7]c;

reg [3:0] i;

reg dp,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 @(posedge clk)

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:begin a=8'b1111111;b=8'b01111111;dp=1;end

1:begin a=8'b1001000;b=8'b10111111;dp=1;end

2:begin a=8'b0110000;b=8'b11011111;dp=1;end

3:begin a=8'b1110001;b=8'b11101111;dp=1;end

4:begin a=8'b1110001;b=8'b11110111;dp=1;end

5:begin a=7'b0000001;b=8'b11111011;dp=1;end

6:begin a=8'b1111111;b=8'b11111101;dp=1;end

7:begin a=8'b1111111;b=8'b11111110;dp=1;end

8:begin ksled=0;ztled=0;jsled=1;end

endcase

1:case(i) //显示state为1时的状态及led

0:begin a=mem[lck/10];b=8'b01111111;dp=1;end

1:begin a=mem[lck%10];b=8'b10111111;dp=~dp;end

2:begin a=mem[lcm/10];b=8'b11011111;dp=1;end

3:begin a=mem[lcm%10];b=8'b11101111;dp=1;end

4:begin a=7'b1111110;b=8'b11110111;dp=1;end

5:begin a=mem[zj/100];b=8'b11111011;dp=1;end

6:begin a=mem[zj/10];b=8'b11111101;dp=1;end

7:begin a=mem[zj%10];b=8'b11111110;dp=1;end

8:begin ksled=1;ztled=0;jsled=0;end

endcase

2: case(i) //显示state为2时的状态及led

0:begin a=7'b1111111;b=8'b01111111;dp=1;end

1:begin a=7'b1111111;b=8'b10111111;dp=~dp;end

2:begin a=mem[sec/10];b=8'b11011111;dp=1;end

3:begin a=mem[sec%10];b=8'b11101111;dp=1;end

4:begin a=7'b1111110;b=8'b11110111;dp=1;end

5:begin a=mem[zj/100];b=8'b11111011;dp=1;end

6:begin a=mem[zj/10];b=8'b11111101;dp=1;end

7:begin a=mem[zj%10];b=8'b11111110;dp=1;end

8:begin ksled=0;ztled=1;jsled=0;end

endcase

endcase

if(i>8)i=0; //位选循环

end

endmodule

通过数码管,显示对应的等待时间,行车路程,最终价格。

4 、编译及仿真

(1)仿真软件Quartus II的简单介绍和说明

Max+plus II作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。目前Altera已经停止了对Max+plus II的更新支持。Quartus II 是Altera公司继Max+plus II之后开发的一种针对其公司生产的系列CPLD/FPGA 器件的综合性开发软件,它的版本不断升级,目前已经发布了13.0版本,该软件有如下几个显著的特点:

该软件界面友好,使用便捷,功能强大,是一个完全集成化的可编程逻辑设计环境,是先进的EDA工具软件。该软件具有开放性、与结构无关、多平台、完全集成化、丰富的设计库、模块化工具等特点,支持原理图、VHDL、Verilog HDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌有综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD、FPGA 设计流程。

Quartus II可以在Windows、Linux以及Unix上使用,除了可以使用TCL脚本完成设计流程外,提供了完善的用户图形界面设计方式。具有运行速度快,界面统一,功能集中,易学易用等特点。

Quartus II支持Altera公司的MAX 3000A系列、MAX 7000系列、MAX 9000系列、ACEX 1K系列、APEX 20K系列、APEX II系列、FLEX 6000系列、FLEX 10K系列,支持MAX7000/MAX3000等乘积项器件。支持MAX II CPLD系列、Cyclone系列、Cyclone II、Stratix II系列、Stratix GX系列等。支持IP核,包含

了LPM/Mega Function宏功能模块库,用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。此外,Quartus II 通过和DSP Builder工具与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日

本文来源:https://www.bwwdw.com/article/apbl.html

Top