数字逻辑专题实验报告.docx
《数字逻辑专题实验报告.docx》由会员分享,可在线阅读,更多相关《数字逻辑专题实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
数字逻辑专题实验报告
数字逻辑专题实验实验报告
基于CPLD/FPGA的出租车计费器的设计
一.实验题目
设计一个基于CPLD/FPGA的出租车计费器,并实现如下功能:
1.A计数器对百米脉冲进行累加,并输出实际公里数的BCD码给译码动态扫描模块。
每计满500送出一个脉冲给B计数器。
同时可以设置起步公里数。
2.B计数器实现步长可变(即单价可调)的累加计数,每500米计费一次。
可以设置起步价格、每公里价格等。
3.译码/动态扫描将路程与计费的数值译码后用动态扫描的方式驱动数码管显示。
4.数码管显示将公里数和计费金额分别用三位LED数码管显示(两位整数,1位小数)。
二.实验目的
1.学会综合运用组合逻辑、时序逻辑设计数字系统电路的方法
2.学会使用EDA软件(MAX+PLUSII)设计调试电路的方法
3.掌握CPLD(复杂可编程逻辑器件)技术的层次化电路设计
4.掌握计数器、加法器、寄存器、锁存器及各种门的综合应用
三.系统设计方案
1.系统设计总体图
图1系统设计总体图
2.系统整体输入输出定义
1)10hz_input_by_wheet
系统从这里输入出租车前进时轮胎上传感器发出的信号,本系统中假设出租车每前进一米,该输入收到一个脉冲。
2)1khz
系统从这里输入1kHz信号,作为数码管的扫描信号。
3)reset
reset信号输入为0时,表示出租车空驶;为1时表示出租车上有乘客。
4)abcdefg及led1-6
系统结果输出端,分别连接实验装置中数码管的abcdefg输入及各数码管的控制输入。
3.系统各模块功能简介
1)Output_per100_inputs
基本计数模块。
每输入100个脉冲时,输出一个脉冲,即每100米输出一个脉冲。
2)Distance_counter_output
出租车路程计算及输出模块。
每100米输入一个脉冲之后,自动按BCD码输出计价器中十公里位、公里位、百米位需要显示的数字。
3)After_2km_output_per500m
控制计费器模块什么时候开始计费。
当出租车上乘客后,计费器只输出初始价,当车行进到2公里(可设置其他数值)时,计费器才开始按每公里的单价累加计费。
此需要模块每100米输入一个脉冲,同时还要车行进到2公里时输入一个买脉冲。
4)Price_counter_output
出租车计费及输出模块。
需要两公里之后每500米输入一个脉冲,自动按BCD码输出计价器中十元位、元位、角位需要显示的数字。
5)Display_to_6led
将路程及计费模块输出的数字显示到数码管中的模块,输入BCD码的各位,输出为数码管显示时需要的信号。
4.各模块功能图及输入输出分析图
1)Output_per100_inputs
模块功能图
图2output_per100_inputs模块功能图
此模块使用74162作为主要元件,经过实验,我发现将RCO接在高位计数器的ENT端后,虽然进位不会错,但是仍然为每输入99次输出一个脉冲,达不到实际要求。
故此处从另外一个思路进行设计:
当所有的数字都是0的时候,输出一个脉冲。
同时为了控制第一个脉冲的输出时间,避免在开始计数前所有输出位都是0的时候output_per100inputs输出脉冲,通过一个JKFF2控制。
当输出行进10米时,JKFF2的Q输出才变为1,这时output_per100inputs才能输出脉冲,准确的控制了输出。
输入输出分析图
图3output_per100inputs模块输入输出分析图1
从图中可以看到,在reset为0及刚刚变为1时,output_per100inputs并没有输出脉冲,符合需要。
图4output_per100inputs模块输入输出分析图2
从图中可以看到,在distance_10m,distance_1m输出都为9(即99米)时,output_per100inputs并没有进位,当再输入一个脉冲即到达100米后,output_per100inputs立刻输出一个脉冲,完成了在到达100米时输出一个脉冲的功能,准确无误。
而此处如果为每99米输出一个脉冲的话,对后续里程及价格计算将会有很大影响。
2)Distance_counter_output
模块功能图
图5Distance_counter_output模块功能图
将前一个模块每一百米输出一个脉冲的信号接在此模块的input_per100m输入端,输出即为可以直接用于显示输出的十进制BCD码十公里、公里、百米数字。
此模块仍使用74160作为主要元件,并用和前一模块相同的连接方法。
输入输出分析图
图6Distance_counter_output模块输入输出分析图
从两幅图中可以看到,在reset为0时,系统没有计算里程,达到要求。
而且进位准确,9.9公里时并没有进位,当再前进100米时,变为10公里,准确无误,达到要求。
3)After2km_output_per500m
模块功能图
图7after2km_output_per500m模块功能图
此模块使用JKFF2,使出租车行进到2公里时输出的信号能够保持,从而使74162的使能端从出租车行进到2公里时开始有效,即从两公里时开始每5次输入输出一次。
经过实验将74162的A端接VCC后,可正确的实现每500米输出一个脉冲。
这个模块在输入100米脉冲及2公里信号后,可以实现在出租车行进到2公里之后,每前进500米输出一个脉冲(从output_per500m),此脉冲用于后面的计费模块。
模块输入输出分析图
图8after2km_output_per500m模块输入输出分析图
由图中可以看出,在reset置1且input_2km输入一个信号(即出租车行进到2公里)之后,每5次输入信号(每次代表100米),输出一个信号,达到预期目标。
4)Price_counter_output
模块功能图
图9price_counter_output模块功能图
此模块为出租车计费模块。
Adder为自制的加法器模块,将in_1_1-4和in_2_1-4输入的数值相加后,将结果以十进制BCD码输出,carry为进位。
寄存器保存加法器输出的结果,然后再送入加法器,完成累加的功能。
通过将adder:
24的in_2_1-4输入端(输入信号为BCD码)与JKFF2:
Q输出端相连,设定每500米的单价(单位:
角),此次模拟设置每公里单价为6角;通过将adder:
25的in_2_1-4输入端(输入信号为BCD码)和VCC相连,设定出租车起步价格(单位:
元),此次模拟设置起步价为6元。
此模块完成reset为1时,输出起步价。
在出租车行进两公里后,每500米输入一个脉冲,这时开始将价格累加,并输出。
输出为十进制BCD码表示的计价器的十元位、元位、角位。
模块输入输出分析图
图10price_counter_output模块输入输出分析图
从图中可以看出,起步价设置为6元,每公里单价设置为6角之后,计价器完全实现正确计价,达到要求。
5)Adder
模块功能图
图11adder模块功能图
加法器模块。
实现将in_1_1-4和in_2_1-4输入的数值相加,结果输出为BCD码,carry为进位。
模块输入输出分析图
图12adder模块输入输出分析图
74283:
20|ab为加法器输入端,sum_[4..1]为加法器输出端,carry为进位,由图中可以看到,加法器功能准确无误。
6)Displayto6led
模块功能图
图13displayto6led模块功能图
此模块将输入的BCD码转化为直接连接在数码管的信号。
Select_led不间断的循环从led1-6依次输出脉冲,与3个74244相连,实现6位led管扫描输出。
模块输入输出分析图
图14displayto6led模块输入输出分析图
由图中可以看到,显示模块工作正常。
select_led1-6输出扫描频率稳定,扫描顺序稳定,正确无误。
连接数码管的abcdefg输出能准确显示输入的内容。
7)Select_led
模块功能图
图15select_led模块功能图
此模块为参考资料中的电路图。
输入为1000hz脉冲信号,实现不间断的循环从led1-6依次输出脉冲。
模块输入输出分析图
图16select_led模块输入输出分析图
由图中可以看出,当输入1000Hz作为扫描频率后,输出稳定,正确的实现了扫描6个LED管的功能。
四.系统总体分析
1.系统总体功能图
图17系统总体功能图
2.系统总体输入输出分析
图18系统总体输入输出分析图1
10hz_input_by_wheet为每前进一米输入的一个脉冲(模拟时周期为2us)。
1khz为display_6led及select_led模块所需的1khz输入(模拟时周期为200ns)。
由图可以看出,在reset为0时(即出租车空驶时),abcdef输出都是1,g输出是0,此时所有数码管输出0,显示正确。
在reset变为1时(即出租车开始载客后,模拟中假定10us时开始载客),仅当选择电路扫描到1yuan对应的数码管时,ab为0,其余为1,输出为6元起步价(之前在price_counter_output模块中设置),其余数码管均为0(因为还不足100米,所以里程显示都是0),显示正确。
图19系统总体输入输出分析图2
根据模拟时的假设,每前进100米的距离,在模拟时时间间隔为200us。
由图中可以看出,在210us之后时,已经输入100个脉冲,即出租车行进了100米,此时当扫描到100m对应的数码管(即select_led1_100m为1)时,bc为1,其余为0,显示输出1(即100米)显示正确。
而之前扫描到100m对应的数码管时,该数码管显示仍为0,也正确。
图20系统总体输入输出分析图3
由图中可以看出,在5.008ms时,距离显示为2.4公里,计价器角位为0,显示输出为6元;在5.01ms时,距离显示为2.5公里,计价器角位输出从0变为3(ef为0,其余为1,之前在price_counter_output模块中将每公里单价设为6角),显示输出6.3元,准确无误。
此后系统按照预计情况正确运行,显示完全正确,完成了题目要求的任务。
五.实验总结与心得
本次实验中,一开始选题时有一定思路,决定做这个题目。
但是做到一定程度之后发现很多东西以前都没有学过,无法解决。
于是便上网查阅大量的资料,了解器件的使用,不断添加需要的功能。
同时,我又在实验中不断摸索,发现理论与实际的不同点,用实践结果作为依据修改各个模块。
通过这次实验,我深刻的体会到了那句老话:
“实践是检验真理的唯一标准”。
最大的体会就是计数器的级联时,如果像常规的那样使用RCO连接下一级的CLK,就会出现许多错误,而连接下一级的ENT端虽然能够解决计数器内部的进位问题,但是在output_per100inputs模块中,如果使用最高级的RCO作为输出就会出现错误。
经过仔细思考,我换了一种思维方式,由于是同步计数器,当低位全部清零时,意味着高位此时应该收到进位,这时的进位应该是最准确的。
通过这种想法,经过实践的模拟,我使用了新的方法,完美的达到了要求。
另外在其他不熟悉的器件使用时,多询问老师,得到了老师的很大帮助。
由于自己在电路设计方面没有经验,许多简单的问题不知道怎么处理,而这时老师的帮助就显得尤为必要。
不仅帮助自己快速的解决了问题,还学到了一种新的方法,能为以后的学习实践提供思路。
最终经过自己的不懈努力以及老师的帮助,顺利完美的完成了任务,在这个过程中的收获比想象的要大多。
通过实验的训练,对思维能力有很大的培养,同时也培养了自己认真的性格,如何把复杂的线路理清楚,使人一目了然也是一件难事。
在用maxplus2时,由于软件设计上的某些不便,使许多本应简单的操作变得繁琐。
有的时候会失去耐性。
但是面对复杂问题,必须要解决,努力静下心来,一点一点地修改电路图,解决那些问题。
而当一个模块设计好并且准确无误的时候,那种成就感只有自己能够体会的到。
这个实验的完成,离不开马老师、朱老师的帮助,在这里感谢老师对我的辛勤教导。
六.参考资料
1.数字逻辑实验指导书.pdf
2.数字逻辑(第二版)鲍家元毛文林高等教育出版社