数字逻辑电路专题实验报告
——基于CPLD/FPGA的出租车计费器设计
目 录
一.实验目的 ...................................................................................................................................... 2 二.设计项目实现的目标................................................................................................................... 2 三.项目设计概要 .............................................................................................................................. 3
1. 项目整体设计概述: ...................................................................................................... 3 2. 项目设计特点: .............................................................................................................. 3 3. 个人任务说明: .............................................................................................................. 3
四.系统设计方案 .............................................................................................................................. 3
1. 系统功能模块示意图: ................................................................................................. 3 2. 功能模块说明: ............................................................................................................. 4
五.测试结果及分析 ........................................................................................................................ 19 六.项目总结 .................................................................................................................................... 21 七结束语 ............................................................................................................................................ 22 八.参考书 ........................................................................................................................................ 22
一.实验目的
数字系统设计实验是在数字逻辑课程基础上所开设的一门实践课。其目的使大家把所学到的课程知识,在实践中得到综合的运用并加深对课程知识的理解,同时学会一般数字系统的设计方法。根据课程特点结合现有的实验条件选择相应的题目,在老师的指导下,由学生自己独立完成实验电路设计和调试工作。应用可编程逻辑器件EDA技术,完成自己的设计任务,初步掌握较复杂逻辑电路的设计调试方法,为以后的学习和工作奠定良好的基础
二.设计项目实现的目标
基于CPLD/FPGA的出租车计费器的组成如图1所示。各部分主要功能如下:
(1) A计数器对车轮传感器送来的脉冲信号进行计数(每转一圈送一个脉冲)。不同车型的车轮直径可能不一样,通过“设置1”对车型做出选择,以实现对不同车轮直径的车进行调整。
(2) B计数器对百米脉冲进行累加,并输出实际公里数的BCD码给译码动态扫描模块。每计满500送出一个脉冲给C计数器。“设置2”实现起步公里数预置。
(3) C计数器实现步长可变(即单价可调)的累加计数,每500米计费一次。“设置3”用来完成起步价格、公里价格预置等。
(4) 译码/动态扫描将路程与计费的数值译码后用动态扫描的方式驱动数码管显示。
(5) 数码管显示将公里数和计费金额分别用三位LED数码管显示(两位整数,1位小数)。
三.项目设计概要
1. 项目整体设计概述:
出租车计费器由车型调整模块、计程模块、计费模块、显示模块模块组成。车型调整模块主要实现对出租车轮胎直径的选择以及百米计数;计程模块主要实现起步里程的设置和里程计数;计费模块实现公里价格的预置、起步价格的预置和计费;显示模块实现里程和费用的显示。
2. 项目设计特点:
整个系统采用模块化设计,首先按照系统功能模块划分,对各个功能模块电路单独设计、仿真调试,然后用顶层原理图将各功能模块连接起来。
3. 个人任务说明:
此次实验是由我一个人完成的。
四.系统设计方案
1. 系统功能模块示意图:
2. 功能模块说明:
系统功能模块电路图
COUNTA/CLRINPUTVCCINPUTVCCINPUTVCCPIN_87set10PIN_115set11/CLRCLKSET10SET11instRCOPIN_118set20INPUTVCCPIN_113COUNTB/CLRENTSET20SET21CLKout0out1out2out3out4out5out6out7out8out9out10out11RCOOUTPUTOUTPUTOUTPUTOUTPUTOUTPUTOUTPUTOUTPUTOUTPUTOUTPUTOUTPUTOUTPUTOUTPUTDI0DI1DI2set21INPUTVCCDI3DI4PIN_114DI5DI6DI7DI8DI9DI10DI11PIN_121PIN_122PIN_52PIN_53PIN_48PIN_51PIN_45PIN_47PIN_43PIN_44PIN_41PIN_42inst7CLKINPUTVCCPIN_75FARESET30INPUTVCCINPUTVCCINPUTVCCINPUTVCCPIN_104SET31PIN_112SET32PIN_119SET33PIN_120SET30SET31SET32SET33/CLRCLKFX0FX1FX2FX3FX4FX5FX6FX7FX8FX9FX10FX11OUTPUTFX0OUTPUTOUTPUTFX1FX2OUTPUTOUTPUTOUTPUTOUTPUTOUTPUTOUTPUTOUTPUTOUTPUTOUTPUTFX3FX4FX5FX6FX7FX8FX9FX10FX11PIN_32PIN_40PIN_30PIN_31PIN_93PIN_92PIN_96PIN_97PIN_100PIN_99PIN_103PIN_101inst1
1.车型调整模块 模块功能
出租车车型并非单一,各个车型的轮胎直径亦有所不同。据调查统计,现行出租车轮胎直径大致有四种,直径分别为520mm、540mm、560mm和580mm。若要使不同车型的出租车每行驶一百米均送出一个脉冲,可通过设置“可预置分
频器”的系数来完成。根据上述车轮直径计算出的分频系数分别为61、59、57和55。预置数据受两个车型设置开关控制,DIP开关状态与车轮直径对应关系如表1所示(表中“1”为高电平,“0”为低电平)。
表1 车型设置:
车轮直径(mm) 520 540 560 580 DIP开关(两位) 00 01 10 11
车型调整模块(COUNTA)电路图
封装后的模块为
COUNTA/CLRCLKSET10SET11instRCO
其中SET1模块用来预置行驶百米所需的车轮转数,EQUAL模块用来根据SET1的设置的数值与车轮转数是否相等来判断是否进位。
1.1 SET1模块的源程序为
封装后的模块
SET1A[1..0]B[7..0]inst
1.2 EQUAL模块的电路图为
A0B0INPUTVCCINPUTVCCXORinst12XORA1B1INPUTVCCINPUTVCCinst13XORA2B2INPUTVCCINPUTVCCinst14XOROR8A3B3INPUTVCCINPUTVCCinst15OUTPUT/EQUA4B4INPUTVCCINPUTVCCXORinst16XORinstA5B5INPUTVCCINPUTVCCinst17XORA6B6INPUTVCCINPUTVCCinst18XORA7B7INPUTVCCINPUTVCCinst19 封装后的模块
EQUALA0B0A1B1A2B2A3B3A4B4A5B5A6B6A7B7inst/EQU
2.计程模块
模块功能
计程模块是一个模为10、步长为1的加法计数器。该模块可以预置参数,使其实际计数值大于预置数值后,每500米送出一个脉冲,并将计数值送译码动态扫描模块进行显示。预置参数采用非压缩BCD码,所以在计数器设计时必须将二进制1010至1111六个状态跳过去。
计程模块带有“开始”/“清零”端。“起步里程”开关设置对应关系如表2所示。
表2 起步里程设置:
起步里程(km) 2.0 3.0 4.0 5.0 DIP开关(2位) 00 01 10 11
计程模块(COUNTB)电路图
741607416074160 封装后的模块
COUNTB/CLRENTSET20SET21CLKout0out1out2out3out4out5out6out7out8out9out10out11RCO 其中SET2用来预置起步里程数,EQUAL12模块用来判断是否达到预置的起步里程,RCOB模块用来判断是否进位(即是大于起步里程数后每500米输出一个脉冲)
inst2.1 SET2模块的源程序
封装后的模块
SET2A[1..0]B[7..0]inst
2.2 EQUAL12模块的电路图
XORA0INPUTVCCB0INPUTVCCinst12XORA1INPUTVCCB1INPUTVCCinst13XORA2INPUTVCCB2INPUTVCCinst14XORA3INPUTVCCOR12B3INPUTVCCinst15XORA4INPUTVCCB4INPUTVCCinst16XORA5INPUTVCCB5INPUTVCCinst17XORA6INPUTVCCB6INPUTVCCinst18instXORA7INPUTVCCB7INPUTVCCinst19XORA8INPUTVCCB8INPUTVCCinst20XORA9INPUTVCCB9INPUTVCCinst21XORA10INPUTVCCB10INPUTVCCinst22XORA11INPUTVCCB11INPUTVCCinst23
封装后的模块
OUTPUT/EQU EQUAl12A0/EQUB0A1B1A2B2A3B3A4B4A5B5A6B6A7B7A8B8A9B9A10B10A11B11inst
2.3 RCOB模块的电路图
NAND274160LDNABCDENTENPCLRNCLKinst2instENTINPUTVCCQAQBQCQDRCOOUTPUTRCOCOUNTERVCC74160LDNABCDENTENPCLRNCLKinst22/EQUINPUTVCCNOTinst12QAQBQCQDRCOCLK/CLRINPUTVCCINPUTVCCCOUNTERGND
封装后的模块
RCOBENTRCO/EQUCLK/CLRinst
3.计费模块
模块功能
计费模块是一个模为10、步长可变的加法计数器。该模块通过开关量预置步长,当超过一定预置参数时改变步长。计费模块也采用非压缩BCD码,但因步长不为1,而为0.5km单价数,所以在做非压缩BCD加法时必须调整,否则可能导致在超过或未超过预置参数时出现超程错误。
计程模块应带有“开始”/“清零”端。“公里价格”、“ 起步价格”开关设置对应关系如表3、表4所示。
表3 每公里价格设置:
公里价格(元) 1.2 1.6 2.0 2.4 DIP开关(2位) 00 01 10 11
表4 起步价格设置:
起步价格(元) 5.0 6.0 7.0 8.0 DIP开关(2位) 00 01 10 11
计费模块(FARE)的电路图
封装后的模块
FARESET30SET31SET32SET33/CLRCLKFX0FX1FX2FX3FX4FX5FX6FX7FX8FX9FX10FX11inst (注:SET30~SET33中前两位设置起步价,后两位设置公里价格)
其中COUNTB模块实现公里价格的预置、起步价格的预置以及加法器的译码部分,RIGEST 模块为寄存器
3.1 COUNTC的源程序
封装后的模块
ParameterSD0SD1SD2SD3COUNTCSL[3..0]A[11..0]B[11..0]Value681012inst 3.2RIGEST 模块的电路图
B0DPRNQA0CLRNinstB1DPRNQA1CLRNinst1B2DPRNQA2CLRNinst2B3DPRNQA3CLRNinst3B4DPRNQA4CLRNinst4B5DPRNQA5CLRNinst5B6DPRNQA6CLRNinst6B7DPRNQA7CLRNinst7B8DPRNQA8CLRNinst8B9DPRNQA9CLRNinst9B10DPRNQA10CLRNinst10B11DPRNQA11CLRNinst11/CLRCLK 封装后的模块
RIGESTERB0A0B1A1B2A2B3A3B4A4B5A5B6A6B7A7B8A8B9A9B10A10B11A11/CLRCLKinst
4. 显示模块
显示模块由动态扫描显示实现
五.测试结果及分析
1. 模拟仿真测试方案
系统功能模块分为三个模块:车型调整模块、计程模块、计费模块。将三个功能模块分别进行仿真侧试。最后将三个模块合在进行仿真测试在一起。
2. 车型调整模块仿真波形图
车型调整模块可预置4种情况,图中只给出车轮转61圈就可到100米的那一种。
3.计程模块仿真波形图
计程模块可预置4种情况,图中只给出起步公里为3公里的情况。
4.计费模块仿真波形图
由上图可知,计费模块的输出波形有一些“毛刺”,但波形仍然比较清楚,仔细分析可知是正确的。此模块可预置16种情况,此处只给出了其中一种,即起步价为6.0元,公里价格为1.6元。
5.系统仿真波形图
六.项目总结
出租车计费系统比较复杂,我在设计的过程中也遇到了一些困难。在设计总体框架的时候,我并没有费多大力气,因为事实上题中交代的已经非常清楚了。困难主要是计程模块的实现、计费模块的实现以及三个模块间的结合。车型调整模块较简单,在设计是没遇到多大困难。计程模块中,在设计“大于起步公里数后每500米计数依次” (COUNTB模块中的RCOB模块)时遇到了一些困难,但通过认真分析解决了这个困难。计费模块中主要是“可变步长的加法”比较难实现,而这又主要是实现非压缩的十进制的加法调整。最后通过VHDL语言解决了这个问题。最后就是连接三个模块了,这主要是两个进位。即COUNTA向COUNTB的进位,COUNTB向FARE的进位。在调试这一步时,COUNTB出了问题,原因是单独调试时虽然看起来是正确的,但实际上一些使能端没有考虑进去(即始终置为有效)。
出租车计费系统虽然完成了,但此系统还存在一些不足之处。观察FARE的波形图可以发现,波形存在一些毛刺。虽然它在一般的情况下不会出错,也绝对可以满足日常生活中的要求,但如果时钟脉冲频率极高时,它就会出现一些错误。我觉得这主要是COUNTC模块与RIGESTER模块连接的问题,FARE模块都用
语言编写,不要非为两个模块,应该可以解决这个问题。另外,也还需要补充一些功能,例如超过一定公里数后,公里价格可以变化等。
七结束语
通过数字系统设计实验,把学到的课程知识运用于实践,我加深了对课程知识的理解,同时学会了一般数字系统的设计方法。在老师的指导下我完成了实验电路的设计,同时也学到了一些设计和调试的方法,锻炼了我分析问题以及解决问题的能力。这会让我在以后的工作和生活中受益匪浅。
八.参考书
毛文林等编 数字逻辑 高等教育出版社 2002
徐志军编 EDA技术与VHDL设计 电子工业出版社 2009
因篇幅问题不能全部显示,请点此查看更多更全内容