硬件描述语言

更新时间:2024-04-13 11:27:01 阅读量: 综合文库 文档下载

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

河北北方学院 毕业论文

题目: [ 出 租 车 计 价 器 ]

院 系:信息科学与工程学院 专 业:电 子 信 息 工 程 班 级: 2011级一班 姓 名: 李俊杰 学 号: 201142344 指导教师: 刘建军

日 期: 2013年12月

总体方案设计

一 设计要求 该出租车计价器实现功能:

1、行程≤4公里,且等待累计时间≤2分钟,起步费为8.0元。

2、行程4公里外,以每公里1.0元,等待累计时间2分钟外,以每分钟以1.0元计费。 3、能显示行驶公里数、等待累计时间和最后的总费用。 4、能通过修改程序来对计费要求实现改变。

用Verilog HDL语言设计符合上述功能要求的出租车计费器,并用层次化设计方法设计该电路,各计数器的计数状态用功能仿真的方法验证,并通过有关波形确认电路设计是否正

1技术,根据层次化设计理论,该设计问题自顶向下可分为分频模确。 方案论证 采用EDA○

块,控制模块 计量模块、译码和动态扫描显示模块,其系统框图如图所示:

二设计思想及原理

出租车的一般计费过程为:出租车载客后,启动计费器,整个系统开始运行,里程计数器和时间计数器从0开始计数,费用计数器从8开始计算。再根据行驶里程或停止等待的时间按以上的标准计费。若在行驶状态,则计程器开始加计数,当路程超过四公里后,计费器以每公里1元累加。若出租车停止等待状态,则计时器开始加计数,当时间超过两分钟后,计费器以每分钟1元累加。出租车到达目的地停止后,停止计费器,显示总费用。 根据课程设计要求计价器可根据车轮转数计算路程,车轮每转一圈送一个脉冲波,假设每转一圈为2米,车轮每转一圈送一个脉冲波( 可用传感器检测送出脉冲),本设计为了好模拟仿真假设的是车轮转动100圈才产生一个脉冲,即是一个脉冲是代表200米,则经过5分频器后是每1Km送一个脉冲到里程计算模块,这样方便在软件里面仿真观察,若要下载到实物应用中去,通过实际车轮周长自己设置不同的分频电路来达到产生任意精度的计程距离模块。而当车停止的时候通过分频模块产生秒脉冲,通过计时要求来产生计费,本设计重点就在计费控制模式模块和计费模块这两大模块的设计,则根据出租车计费器的工作过程,本系统采用分层次、分模块的方式设计。其中行驶路程计数模块、等待时间计数模块和计费模块,用来统计路程、等待时间和总费用,控制模块是用来控制计费模块,数码管显示模块用来显示行驶的公里数、等待累计时间和总费用等信息。三模块设计

本系统采用层次化、模块化的设计方法,设计顺序为自下向上。首先实现系统框图中的各子模块,然后由顶层模块调用各子模块来完成整个系统。为了便于在数码管里显示,这里的路程、时间和费用计数器均用十六进制表示。 3.1 分频模块 将时钟信号进行分频,分出的频率供后面的计程模块和计时模块用,以及后

面的数码显示扫描模块都会用到。 3.1.1 计数器分频模块 此模块的功能是对总的时钟进行分频,分出的频率是让计数器用的,因为总的时钟是50M的。设计该模块的时候用了一个32位的计数器,当计数器计到25_000000的时候产生时钟。在仿真的时候为了快速的方便观察,设计了一个5分频的电路。在此时假设车轮每转一圈为2米,则转动100圈送一个脉冲,即是200米,则在经5分频后,每1Km送一个脉冲到里程计算模块。同理,若知道车轮直径,即可算出分频比来设置合理的分频电路,当下载到实物时还是用的是2HZ的时钟

3.1.2

仿

从波形可以看出当reset为低电平的时候clk为零,当reset为高电平的时候clk的高电平占了clk_50M的5个周期,低电平也占了clk_50M的5个周期。 3.1.3 数码管分频模块 此模块的功能是对总的时钟进行分频,分出的频率是让数码管用的,当计数器计到50_000的时候产生时钟。此模块在整体仿真时,没有用到数码管显示,在此不在赘述以及仿真波形,在事物下载时必不可少,其模块如下图:

3.2 计程模块

3.2.1 计程模块电路 此模块的功能是计算出租车行驶的路程。在出租车启动并行驶的过程中(即复位/启动信号reset为1,行驶/停止信号start为1),当时钟clk是上升沿的时候,系统即对路程计数器distance的里程计数器进行加计数,当路程超过三公里时,系统将输出标志正脉冲distance_enable

3.2.2 计程模块仿真结果

从波形图可以看出在时钟的控制下,当reset为高电平且start为高电平的时候distance开始计数,当计到大于三的时候输出了distance_enable为高电平。准备对第4公里以后的脉冲进行加计费。 3.3 计时模块

3.3.1 计时模块电路 此模块用于计算停车等待的时间。图中s代表秒计时,m代表分钟数计时。在出租车行进中,如果车辆停止等待,计数器则在1Hz信号clk的上升沿进行加计数,每60次产生进位脉冲使分钟计数器位进行加计数,当累计等待时间超过2(不包括2分钟)分钟时,输出标志time_enable正脉冲信号。其模块如下图所示:

3.3.2 计时模块的仿真结果 1.两分钟之内(包括两分钟)的仿真结果如下所示: 从波形图可以看出在clk的控制下当start为低电平reset为高电平的时候时间计数,time_enable为低电平。

2.两分钟之外(不包括两分钟)的仿真结果如下所示:

从波形图可以看出在clk的控制下当start为低电平reset为高电平的时候时间计数,当时间大于二分钟的时候,time_enable为输出高电平,为超过2分钟后以每增加一分钟对计费进行加计数。 3.4 控制模块

3.4.1 控制模块电路 控制模块用于为计费模块提供时钟,当start高电平的时候选择公里计费,输出的时钟信号为distance_enable,当start低电平的时候选择时间计费,输出的时钟信号为time_enable。这样控制模块便控制着其计费模式。模块如下图所示:

3.4.2 计时模块的仿真结果 1.公里计费的仿真结果如下所示:

从波形图可以看出当start为高电平的时候输出的信号是distance_enable。此时控制模块选出的是distance_enable,即选出距离使能脉冲计费,则实现了按公里计费。 2.时间计费的仿真结果如下所示:

从波形图可以看出当start为低电平的时候输出的信号是time_enable。即选择了按等待时间

脉冲计费。

仿真上的公里脉冲和时间脉冲是为了仿真而简单的设置的波形,并非是前面信号组合检测而成,在后面整体组合电路中为进行模块的组合。这里为了便于功能仿真区别,没有设置过多的脉冲,以影响分辨控制模块所选择的计费模式。 3.5 计费模块

3.5.1 控制模块电路 费用计数器模块用于出租车启动后,根据行驶路程和等待时间计算费用。当出租车停车时,时钟reset用于将费用计数器复位为起步价6.0元;当车处于行驶状态时,select_clk信号选择distans_enable,若满4公里后路程每满1公里,费用计数器加1元;当出租车处于停止等待状态且时钟满2分钟时,select_clk信号选择time_enable信号,时间每满1分钟,费用计数器加1元。

3

.5.2

仿

从波形图可以看出reset用于将费用计数器复位为起步价8.0元;由于本仿真select_clk信号

并非是系统选择出来的公里脉冲和计时脉冲,通过认为设定,不影响其观察功能效果。 3.6 数码管显示模块

数码管有两种显示方式动态显示与静态显示,由于在本文中用到了八个数码管所以选择了动态显示,在时钟的控制下,当reset为高电平的时候把费用,公里,时间译码输出。这里没有数码管显示仿真效果不明显,即不给予仿真。以上单元模块设计完毕,通过每个单元模块代码的设计以及仿真验证每个模块的真确性,为确保后面整体模块电路的正确性奠定了基础。 4.整体顶层模块设计

4.1 整 体 顶 层 模 块 电 路 各模块设计仿真实现后,可分别创建成元件符号。顶层就是将各分模块用Verilog HDL语言或者是图形方法连接起来,便可实现系统电路。其Verilog HDL源代码详见其附录。其生成的顶层原理图如下所示:

5.系统功能仿真及调试 本设计采用Quartus II软件进行仿真设计,Quartus II 是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。

5.1 系 统 仿 真 及 调 试 各个单元模块完成后,即可将分模块和顶层模块进行仿真测试,同时可根据设计要求加入测试输入条件。仿真后得到的相应输出结果与预先的结果想比较,若不相符,则应修改设计,直到相符为止。为了仿真得到明显的效果,最好能能下载到带数码管的试验想上进行直接的数字观察。由于条件有限,为了能使仿真效果明显,采用

了不带译码显示的波形仿真,其电路原理图如下:首先,对以下输入输出端作以下解释和说

明,如表

为行驶中未停时的系统电路仿真结果:

a.

b.为行驶中停止时(在两分钟之内)的系统电路仿真结果:

c.为行驶中停止时(在两分钟之外)的系统电路仿真结果

从(a)可以看出当reset为1时,费用计数器为8元,系统启动,start=1表示出租车行驶,distance_enable每产生一个脉冲,路程计数器加1;路程4公里内,费用保持8不变,超过4公里,费用计数器进行加计数,每增加1公里费用加1元,此时等待时间计数器不变。而根据(b),(c)的仿真波形可知,当reset为1时,系统启动,start=0表示出租车处于停止等待状态,此时等待时间计数器计数,在2分钟等待时间内,费用计数器不变;等待时间超过2分钟后,每增加1分钟,费用计数器增加1元,此时路程计数器保持不变。从以上仿真可看出该出租车计价器整体功能实现都能完成,出租车计费器系统的设计已经全部完成,能按预期的效果进行模拟汽车起步价格,暂停,停止等功能各种计费,并能够通过LCD显示车费数目。本款出租车计价器包括总价输出、显示路程,显示其等待时间等功能。另外,如果再任意输入该出租车计价器的计费标准,那么,它的适用范围可能就更广泛了。(个人认为可调的话,会引起驾驶员改价作弊的问题,本设计没有外围可调电路,只能根据程序修改,因而防作弊。)

附(代码):

计程模块VerilogHDL源代码 module distancemokuai(clk,start,reset,distance,distance_enable); //端口的定义

input clk,start,reset; output [7:0] distance;// 输出的公里

reg [7:0] distance; output distance_enable;// 控制计费的公里信号 reg distance_enable;

always@(posedge clk or negedge reset)//异步复位 begin if(!reset)//低电平复位

begin distance<=8'd0; end else if(start)// start 高电平有效

begin if(distance[3:0]==9)//判断distance的低四位计到了9没有 begin distance[3:0]<=4'd0;//计到9清零

if(distance[7:4]==9) //判断distance的高四位计到了9没有 distance[7:4]<=4'd0;//计到9清零

else distance[7:4]<= distance[7:4]+1'd1; // distance的高四位没有计到9的时候加一 end

else distance[3:0]<=distance[3:0]+1'd1; // distance的低四位没有计到9的时候加一 end//end start end//end always

//*产生distance_enable信号*//

always@(posedge clk or negedge reset) begin if(!reset) begin distance_enable<=1'd0;//复位 end

else if(distance>8'd2)// 大于公里三的时候

begin distance_enable<=1'd1;//输出distance_enable信号 end end//end always endmodule//结束计程模块

计时模块VerilogHDL源代码 module timemokuai(clk,reset,start,s,m,time_enable); // 端口的定义

input clk,reset,start; output [7:0] s;//输出的秒 output [7:0] m;//输出的分 output time_enable; //输出的控制计费的信号

reg [7:0] s; reg [7:0] m; wire time_enable; always@(posedge clk or negedge reset)//异步复位

begin if(!reset)//低电平有效 begin //复位

s<=8'd0; m<=8'd0; end else if(!start)//start 信号低电平有效 begin if(s[3:0]==9)// 秒的低四位是9 begin s[3:0]<=4'd0;//清零

if(s[7:4]==5) // 秒的高四位是5 begin s[7:4]<=4'd0; //清零

if(m[3:0]==9) // 分的低四位是9 begin m[3:0]<=4'd0; //清零 if(m[7:4]==9) // 分的高四位是9 m[7:4]<=4'd0; //清零

else m[7:4]<=m[7:4]+1'd1; // 分的高四位不是9加一 end else m[3:0]<=m[3:0]+1'd1; //分的低四位不是9加一 end else s[7:4]<=s[7:4]+1'd1; // 秒的高四位不是5加一 end else s[3:0]<=s[3:0]+1'd1; //秒的低四位不是9加一 end //end

always end assign time_enable=((m[7:0]>8'd2)&&(s[7:0]==8'd0))?1'd1:1'd0; //产生time_enable信号。

Endmodule //结束计时模块

控制模块VerilogHDL源代码 module control(start,distance_enable,time_enable,select_clk); input start,distance_enable,time_enable; output select_clk;//输出选择的时钟信号

wire select_clk; //*当start高电平的时候选择公里计费,输出的时钟信号为distance_enable,当start低电平的时候选择时间计费,输出的时钟信号为time_enable*// assign select_clk=start?distance_enable:time_enable; endmodule//结束控制模块

计费模块VerilogHDL源代码 module feemokuai(select_clk,reset,fee,clk); input select_clk,reset,clk; output[7:0] fee; //输出的费用

reg [7:0] fee; always@(posedge clk or negedge reset)//异步复位 begin if(!reset) //低电平有效 begin fee<=8'd8; //起步为八元

end else if(select_clk==1'd1) begin if(fee[3:0]==4'd9) //费用的低四位是不是计到了9 begin fee[3:0]<=4'd0;//计到9清零

if(fee[7:4]==4'd9)// 费用的高四位是不是计到了9 fee[7:4]<=4'd0; //计到9清零

else fee[7:4]<=fee[7:4]+1'd1;// 费用的高四位没有计到9加1

end else fee[3:0]<=fee[3:0]+1'd1;// 费用的低四位没有计到9加1 end//end begin end//end always

endmodule //结束计费模块

整体顶层模块VerilogHDL源代码

module taximeter(clk_50M,reset,start,seg,dig);//端口的定义 input clk_50M,reset,start;//总的时钟信号,复位信号,开始信号 output[7:0] seg,dig;//数码管的输出 wire [7:0]distance;//公里 wire [7:0] s;//秒 wire [7:0] m;//分 wire[7:0] fee;//费用 wire clk; //计数时钟

wire distance_enable;//公里控制费用的信号 wire time_enable; //时间控制费用的信号 wire select_clk; //控制信号

wire clk1; //数码管显示的时钟 //*模块的调用*//

div u0(.clk_50M(clk_50M),.clk(clk),.reset(reset)); //调用计数分频模块

div1 u1(.clk_50M(clk_50M),.clk1(clk1),.reset(reset)); //调用数码管显示分频模块

distancemokuai

u2(.clk(clk),.start(start),.reset(reset),.distance(distance),.distance_enable(distance_enable)); //调用计程模块timemokuai u4(.clk(clk),.reset(reset),.start(start),.s(s),.m(m),.time_enable(time_enable)); //调用计时模块 control

u3(.start(start),.distance_enable(distance_enable),.time_enable(time_enable),.select_clk(select_clk)); //调用控制模块 feemokuai

u5(.reset(reset),.fee(fee),.select_clk(select_clk), .clk(clk)); //调用计费模块scan_led U6(.clk1(clk1),.dig(dig),.seg(seg),.distance(distance), .s(s),.m(m),.fee(fee)); //调用数码管显示模块

endmodule//结束顶层模块

1.EDA是电子设计自动化(Electronic Design Automation)的缩写,在20世纪60年代中期从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。

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

Top