计算机与信息学院
课程设计报告
课
程: 计算机设计与综合实践
专业班级:计算机科学与技术 11-4 班
学
姓
号:
名:
摘 要
本文介绍了一种采用可编程逻辑器件(FPGA(Sparten 6))进行出租车计价器的
设计思想以及实现方法。本设计实现了出租车计费器所需的一些基本功能,计价
金额包括起步价、里程计费、等待计时计费等。该设计采用模块化设计,在 Xilinx
软件平台下,采用 Verilog HDL 硬件描述语言描述和模拟仿真了分频模块、计程
模块、计时模块、计费模块、LED 显示模块,完成了出租车计费器仿真设计和
硬件电路的实现。
关键词:FPGA(Spartan6-LX45),出租车计价器,Xilinx,Verilog HDL
目录
一、 方案总设计................................................................................................................ 4
1.1 设计要求.................................................................................................................4
1.2 设计思想.................................................................................................................4
二、 软件功能单元设计和实现........................................................................................ 4
2.1 分频模块.........................................................................................................................4
2.1.1 计数器分频模块(FrequencyDiv1)....................................................................4
2.1.2 数码管显示分频模块(FrequencyDiv2)................................................................ 5
2.2 里程模块(Disatance_Cal 模块).................................................................................6
2.3 时间模块(Time_Cal 模块).........................................................................................7
2.4 计费模块(Money_Cal 模块)..................................................................................... 7
2.5 数码管显示模块(LED_Display 模块)........................................................................9
2.6 顶层模块(Taximeter 模块)................................................................................... 10
三、 硬件设计和实现...................................................................................................... 12
四、 问题总结.................................................................................................................. 15
五、 体会与感想.............................................................................. 错误!未定义书签。
附录: 单元模块 Verilog HDL 源代码................................................................................... 15
1. 计数器的分频模块(Frequency_Div)........................................................................... 15
2. 数码管的分频模块(Frequency_Div_2).......................................................................... 15
3. 里程模块(Distance_Cal)................................................................................................. 16
4. 时间模块(Time_Cal)....................................................................................................... 17
5. 计费模块(Money_Cal)....................................................................................................18
6. 数码管显示模块(LEDDisplay_Cal)..................................................................................21
7.顶层模块(Taximeter)........................................................................................................23
8. 引脚约束(Taximeter)................................................................................................... 25
一、 方案总设计
1.1 设计要求
设计一个出租车计价器。该计价器的计费系统:行程 3 公里内,且等待累计时间
2 分钟内,起步费为 10 元;3 公里外以每公里 1.6 元计费,等待累计时间 2 分钟外以
每分钟以 1.5 元计费,并能显示行驶公里数、等待累计时间、总费用。设计有分频模
块,控制模块,计量模块,译码模块, 显示模块。
1.2 设计思想
出租车的一般计费过程:乘客上车后,需要启动出租车计价器,所以这样就需要
一个控制出租车计价器开始工作的使能信号,使得有乘客上车后就要将计价表上显示
出起步价 10 元;而在计价的过程中又需要分两种情况:一种是按增加的里程来收费,
另一种是按照停车的时间来收费,因为在出租车行驶的过程中,有可能会遇到堵车或
红绿灯的情况,这样会耽误出租车的时间,所以当超过一定标准时间后,就应当计时
收费。
二、 软件功能单元设计和实现
本系统采用层次化、模块化的设计方法,设计顺序为自下向上。首先实现系统框
图中的各子模块,然后由顶层模块调用各子模块来完成整个系统。为了便于在数码管
里显示和演示,这里的路程、时间和费用计数器均用BCD码表示。
2.1 分频模块
这里主要是将实验板上提供的时钟信号进行分频,来得到我们想要的时钟脉冲。因
为我们所使用的实验板是Spartan6-LX45 ,它可以提供100MHz的时钟信号,而这个
信号对于我们来说实在是太快了,所以我们需要对其进行分频。在本次的设计中,我
们需要在两个地方用到不同的分频时钟,一个是在LED显示模块,而另外的几个模块
用另一个时钟信号。
2.1.1 计数器分频模块(FrequencyDiv1)
此模块的功能是对总的时钟进行分频,分出的频率是让计数器用的,因为我们使用
总的时钟频率是100MHz的,所以我们在设计该模块的时候用了一个32位的计数器,当计
数器计到25_000000的时候产生一个时钟信号,提供给里程模块,时间模块,计费模块
使用。其实我们是将100MHz分频后变成每一秒计数一次,这也是为了便于实验(在现实
生活中不一定是这样)。
其中需要输入和输出的参数如下表所示:
输入输出端口说明
端口
类型
clk_100M
reset
clk_final
Input
Input
Output
其仿真的结果如下图所示:
功能定义
系统时钟
启动1/复位0键
计数时钟
仿真过程中为了能看见显示结果,就将分频调小了,上图每八个系统时钟来时输出一次
我们需要的时钟信号。
2.1.2 数码管显示分频模块(FrequencyDiv2)
此模块产生的脉冲信号是提供给数码管的,因为要显示的数据有六位,所以数码管
的扫描频率应该要比计数分频模块更快。我们经过测试后,得到500000这个数值。当计
数到500000这个值时,输出一个脉冲信号,扫描一遍数码管,更新数码管上的数据。
其中需要输入和输出的参数如下表所示:
输入输出端口说明
端口
类型
clk_100M
reset
clk_final_1
Input
Input
Output
其仿真结果如下图所示:
功能定义
系统时钟
启动1/复位0键
数码管时钟
为了仿真演示方便,这里做了和上面相同的处理。
2.2 里程模块(Disatance_Cal 模块)
此模块的功能是计算出租车行驶的路程。在出租车启动并行驶的过程中(即复位/启
动信号 reset 为 1,行驶/停止信号 start 为 1),当输出时钟信号 clk_final 是上升沿的
时候,系统就对路程计数器 distance 的里程计数器进行加计数,而当路程超过三公里时,
系统将输出一个里程计费使能信号 distance_enable(为高电平),再将该信号传给计
费模块,就可以实现每增加一公里,费用增加 1.6 元的操作了。
其中需要输入和输出的参数如下表所示:
输入输出端口说明
端口
类型
功能定义
reset
start
clk_final
distance
time_enable
Input
Input
input
Output
Output
启动1/复位0键
1里程,0时间 计费
计数时钟
输出里程
时间计费使能信号
其仿真结果如下图所示:
如图所示,当 reset 为高电平,且 start 信号也为高电平时,开始公里的计数;
当将 reset(复位键)变成 0 时,公里清零;同样,将 start 信号为低电平时,公里
停止增加,但不清零。
2.3 时间模块(Time_Cal 模块)
此模块用于计算停车等待的时间。在出租车行进中,如果车辆停止等待,计数器则在
clk_final 信号的上升沿进行加计数,每 60 次产生进位脉冲使分钟计数器位进行加计数,
当累计等待时间超过 2 分钟(即当刚计时到三分钟)时,输出一个时间计费使能脉冲信号
time_enable,之后每增加一分种,就会有一个 time_enable 脉冲信号输出,这样再将信号
传到计费模块中,就可以实现每增加一分钟,费用增加 1.5 元。而在设计中,我们原本是有
分的十位和个位,以及秒的十位和个位,但是由于数码管的个数有限,所以在数码管上只显
示分的个位和秒的个位。
其中需要输入和输出的参数如下表所示:
输入输出端口说明
端口
类型
功能定义
reset
start
clk_final
min[7:0]
second[7:0]
time_enable
Input
Input
input
Output
Output
Output
其仿真结果如下图所示:
启动1/复位0键
1里程,0时间 计费
计数时钟
分的高四位和低四位
秒的高四位和低四位
时间计费使能信号
当 reset 为高电平,start 为低电平时,开始时间计时(高电平时是里程计费),当秒计时到
59 时,再加 1 后,就有从 0 开始计时,而分钟就要加 1;
2.4 计费模块(Money_Cal 模块)
费用计数器模块用于出租车启动后,根据行驶路程和等待时间计算费用。当出租车停车
时,时钟reset用于将费用计数器复位为起步价10元;当车处于行驶状态时,出现
distans_enable信号,若满3公里后路程每满1公里,费用计数器加1.6元;当出租车处于停
止等待状态且时钟满2分钟时,出现 time_enable脉冲信号,时间每满1分钟,费用计数器加
1.5元。
由于在该模块中,我们在最终的数码管上要显示的是 BCD 码,所以在计算时,我们是
分成三部分的(这里以按时计费模块来举例),分别是角位,元位,以及十元位,由于角位
只可能出现 5 和 0 这两种情况,所以就需要分成这两种情况来讨论。
当角位出现的是 0 时,元位也有两种情况出现,即小于 9,和大于等于 9。对于小于 9
的情况来说,只需要直接角位加 5,元位加 1 即可;而对于元位是大于等于 9 时,因为我们
需要的是 BCD 码,所以应该是角位直接加 5,而元位需要清零,然后向十元位进位,其实
进位时同样也要判断是否有大于等于 9 的情况,只需做同样工作即可(而我们假设一次的总
费用不会超过 99.9 元)。
角位的第二种情况,即出现 5 的情况时,也需要做同样的分析,即要看看元位是否计到
9。若没有计到 9,按上面所说的步骤对相应的位进行进位清零操作即可。而计到 9 之后,
就比较复杂一点,由于是要加 1.5 元,而此时元位角位出现的是 95,角位产生的进位也需要
加到元位,也就是说,元位加了 2,角位被清零了,这样理解后写出相应的实现代码也不是
很难了。
对于历程的计费过程就不再详述了,大致的思想和时间计费差不多,只是实现上有些许
区别。
其中需要输入和输出的参数如下表所示:
输入输出端口说明
端口
类型
功能定义
reset
clk_final
distance_enable
Time_enable
Money[11:0]
Input
input
Input
input
Input
启动1/复位0键
数码管时钟
里程计费使能信号
时间计费使能信号
总费用输出
其仿真结果如下图所示:
当 distance_enable 为 1 时,开始公里计费,此时 time_enable 为低电平, 1.6 元;