北邮数电实验报告4人表决器共16页.docx
- 文档编号:27442496
- 上传时间:2023-07-01
- 格式:DOCX
- 页数:6
- 大小:19.62KB
北邮数电实验报告4人表决器共16页.docx
《北邮数电实验报告4人表决器共16页.docx》由会员分享,可在线阅读,更多相关《北邮数电实验报告4人表决器共16页.docx(6页珍藏版)》请在冰豆网上搜索。
北邮数电实验报告4人表决器共16页
北邮数电实验报告4人表决器
[模版仅供参考,切勿通篇使用]
数字电路综合实验设计 简易出租车计价器的设计与实现 学院:
电子工程学院班级:
20xx211203学号:
20xx210876姓名:
孙月鹏班内序号:
04 摘要 本文介绍了利用QuartusII综合性PLD/FPGA开发软件,在MAXII数字逻辑实验开发板上实现简易出租车计价器功能的设计与实现方法。
本方案采用自上而下的设计理念,将整体电路按照功能划分为分频、计数、控制、数码管显示电路、点阵显示电路等若干模块,模块内用VHDL语言完成逻辑设计,模块间用原理图进行连接,使整体可实现计费、计时等功能。
关键字:
可编程器件模块化设计出租车计价器VHDL语言 一、设计任务要求 基本要求:
1.行驶公里:
用时钟2秒钟表示出租车匀速行驶1公里。
在行车5公里以内,按起步价13元收费,超过5公里部分,以每公里2元收费。
燃油附加费每运次1元。
2.途中等待:
用按键控制中途等待,等待少于5秒不收费,超过5秒后没等待3秒钟加收1元。
3.用数码管分时显示计费金额、行驶里程和等候时间。
字母A表示当前处于显示计费金额状态,字母B表示当前处于显示行驶里程状态,字母C表示当前处于显示等候时间状态。
4.用按键控制出租车空驶、载客状态。
提高要求:
1.用点阵滚动显示收费单据。
2.具有夜间模式,基本单价加收20%的费用。
出租车收费以元为单位,元以下四舍五入。
3.出租车行驶速度可调可控。
4.多人乘车,分段计价。
5.自拟其他功能。
二、设计思路与结构框图 1.设计思路 图1结构框图 由结构框图可以分析得出,该系统的的主体是计数控制器。
该系统由外部控制载客控制信号和等待控制信号,以时钟信号的翻转为计数依据,完成对时间、里程和费用的计数,并将结果通过数码管译码电路显示出来。
该系统的控制信号可由拨码或按键输入,时钟由开发板内部时钟分频得出,输出有点阵输出和数码管输出。
因此,可将系统分为分频器、计数控制器、数码管译码和显示以及点阵显示四部分。
并以此得出系统的逻辑框图如下:
图2逻辑框图 2.控制器部分的状态转移图 该控制器一共有三个基本状态:
空驶状态、载客状态和等待状态。
分别由v、和w来进行控制。
三、分块电路和总体电路设计 总体电路设计 图3状态转移图 整体电路由数码管译码电路、转换电路、点阵译码电路、技术控制电路、 分频电路五部分构成。
分频电路将开发板内部的50MHz时钟分为500hz、 1Hz、、以及用于提高分频效率的其他若按频率。
计数控制电路由四部分构成,整体完成行驶距离的计数、等待时间的计 数以及费用的计数。
输出为三组十位二进制数。
转换电路有转换数据类型和在数码管上分时显示两个功能。
首先将输入 的十位二进制数转换为4位十进制数,并且利用除法和取余数的运算提取出个位、十位、百位、千位,并转换为四位二进制BCD码。
其次利用的时钟,将行驶里程、等待时间、计费金额以2秒为周期依次out1~4,供给数码管以便分时显示。
数码管译码电路以500HZ实现动态扫描,并将转换电路输出的5组BCD 码依次译码,完成显示。
点阵译码器根据载客控制信号,分别显示“O”、“X”静态图案。
分块电路设计1.分频器 电路模块关键代码 ENTITYdiv_100ISPORT;--ENDdiv_100; ARCHITECTUREa100OFdiv_100IS SIGNALtmp100:
INTEGERRANGE0TO99;--BEGIN p1:
PROCESS--p1BEGIN IFclear="0"THENtmp100 ELSIFclk100"eventANDclk100="1"THENIFtmp100=99THENtmp100 tmp100 ENDPROCESSp1; clk100:
输入时钟 clear:
复位端clk1:
输出时钟输入时钟输出时钟计数信号进行100进制的计数 p2:
PROCESS--p2输出占空比为50%的新时钟BEGIN IFclk100"eventANDclk100="1"THENIFtmp100>49THENclk1 clk1 ENDPROCESSp2;ENDa100; 仿真波形 图5200分频仿真波形 图65分频仿真波形 2.计数控制器 电路模块 计数控制器由四部分组成,输入为三个不同频率的时钟、载客控制信号v和等待控制信号w。
control1完成里程的计数cd和行驶费用cm1,control2完成等待时间ct的计数和等待开始计费信号outt,control3接收到outt后输出为等待时间的计费cm2,control4为总费用 关键代码 ENTITYcontrol2ISPORT);--等待时间输出ENDcontrol2; ARCHITECTUREcOFcontrol2ISSIGNALtempt:
STD_LOGIC_VECTOR;SIGNALtemp1:
INTEGERRANGE0TO999;BEGIN p3:
PROCESS--累加等待时间BEGIN IFTHENIFv="0"THEN tempt ELSIFw="0"THEN--行驶时保持状态tempt temp1 ELSEtempt IFtemp1>4THEN--大于5秒时outt=1outt ENDIF; ENDIF;ENDPROCESSp3; p4:
PROCESS--将信号赋给输出ctBEGIN ct ENDPROCESSp4;ENDc; 模块control3电路模块 当输入outt为1时,开始计数cm2为等待时间计费 关键代码 ENTITYcontrol3ISPORT);--等待计费ENDcontrol3; ARCHITECTUREcOFcontrol3IS SIGNALtempm:
STD_LOGIC_VECTOR;BEGIN p5:
PROCESSBEGIN IFoutt="1"THEN--大于5秒时开始计费IFTHENIFv="0"THEN tempm ELSEtempm ENDPROCESSp5; p6:
PROCESS BEGIN IFV="0"THEN cm2 cm2 ENDPROCESSp6;ENDc; control4电路模块 将等待计费cm2和行驶计费cm1相加,并加上 燃油费1元,得到总费用cm 关键代码 ENTITYcontrol4ISPORT;--行驶费用cm2:
inSTD_LOGIC_VECTOR;--等待费用 cm:
outSTD_LOGIC_VECTOR);--总费用ENDcontrol4; ARCHITECTUREcOFcontrol4ISBEGIN p5:
PROCESSBEGIN IFTHENIFv="0"THENcm ENDPROCESSp5;ENDc; 控制计数部分的总仿真波形 图8控制计数器仿真波形 3.转换器 电路模块 由三个输入:
行驶距离cd、等待时间ct、计费 金额cm 输出out1-5为四位二进制BCD码 实现功能:
将十位二进制数按照位数转为为 BCD码 关键代码 ENTITYtransformISPORT;--行驶距离ct:
inSTD_LOGIC_VECTOR;--等待时间cm:
inSTD_LOGIC_VECTOR;--总费用out1:
outstd_logic_vector;--输出个位out2:
outstd_logic_vector;--输出十位out3:
outstd_logic_vector;--输出百位out4:
outstd_logic_vector;--输出千位 out5:
outstd_logic_vector);--输出ABCENDtransform; ARCHITECTUREcOFtransformIS signalcc:
integerrange0to1023; signalt:
std_logic_vector;signalq1,q2,q3:
integerrange0to1000;BEGIN p1:
PROCESS--p1进行3进制的计数BEGIN IFTHENIFv="0"THENt elsift="00"thent elsift="01"thent elsift="10"thent elset ENDIF; ENDIF; ENDPROCESSp1;p2:
processBEGIN ifthen CASEtis--实现分时显示 when"00"=>cccccccc q1 q3 out1 endprocessp2;ENDc; 4.数码管译码电路 电路模块 关键代码 ENTITYshumaguanISPORT;g:
OUTSTD_LOGIC_VECTOR;cat:
OUTSTD_LOGIC_VECTOR);ENDshumaguan; ARCHITECTUREaOFshumaguanIS SIGNALtmpg:
STD_LOGIC_VECTOR;SIGNALtmpn:
STD_LOGIC_VECTOR;SIGNALtmpc:
INTEGERRANGE0TO5;BEGIN p1:
PROCESS--六进制计数BEGIN ifthen iftmpc=5thentmpc tmpc ENDPROCESSp1; p2:
PROCESS--数码管选通轮流显示BEGIN ifthen--将个位、十位等赋给各个数码管casetmpcis WHEN0=>tmpntmpntmpntmpn WHEN5=>tmpntmpn ENDPROCESSp2; p3:
PROCESS--译码电路BEGIN CASEtmpnIS WHEN"0000"=>tmpgtmpgtmpgtmpgtmpgtmpgtmpgtmpgtmpgtmpgtmpgtmpgtmpgtmpgtmpg 5.点阵译码电路 电路模块 关键代码ENTITYdzisPORT;--行 col:
OUTSTD_LOGIC_VECTOR);--列ENDdz; ARCHITECTUREaOFdzIS SIGNALtmp_row:
STD_LOGIC_VECTOR;SIGNALtmp_col:
STD_LOGIC_VECTOR;begin processbegin ifthenifv="0"thencasetmp_colis WHEN"11111110"=>tmp_coltmp_coltmp_coltmp_coltmp_coltmp_coltmp_coltmp_coltmp_col casetmp_colis WHEN"11111110"=>tmp_coltmp_coltmp_coltmp_coltmp_coltmp_col WHEN"11111011"=>tmp_col WHEN"11111101"=>tmp_coltmp_col 仿真波形 图9空载时显示“〇” 图10载客时显示“X” 四、实现功能说明 1,实现功能 实现计时、计里程、计费功能 数码管可分时显示行驶距离、费用、等待时间点阵显示载客和空载状态2.器材的资源占用情况 图11编译报告 图12逻辑元件表 由图11可得:
本电路一共用了576个逻辑元件,占总逻辑元件数的45%,总 管脚数37,占总管脚的32%。
由图12看到,除了transform模块之外,各模块占用资源均不大。
transform 模块因为用到了除法、取余数等运算。
因此占用资源较多,应在后期进行优化,降低资源利用率。
3.仿真波形图4.必要的测试方法 控制计数器整体仿真控制器与转换器整体仿真数码管赋值检查是否显示 故障时中间接输出,并且管脚设置为LED灯,看是否正常传输 五、故障与问题分析 1)计数显示不正确,有延迟解决办法:
在控制计数器内部,将组合逻辑部分和计数部分分到不同的进程,避免在时序进程出现大量运算,造成延迟。
2)计数时采用十位二进制计数,无法逐位读取,赋给各个数码管 解决办法1:
先将二进制转为十进制,再利用除法和取余数运算得到各位数值 2:
计数时改为逐位计数,后一位满十后向前一位进1 3)仿真时计数器正常工作,但下载到板子时一直显示为0,无法确定是计数器的问题还是数码管的问题 解决办法:
将计数器的一个输出作为LED的输入,发现LED不亮,说明控制器有问题。
六、总结和结论 这次数字电路综合实验是一次将理论、实验与现实应用结合在一起的实验。
当第一次课拿到题目时,我感觉无从下手,几乎没有思路。
但当三周后我基本完成了实验任务时,却又觉得整个电路结构无比清晰,甚至知道我的方案哪里做得好、哪里做得不好。
在这三周的时间里,我觉得我有如下的收获:
1.基础知识与动手操作并重由于我觉得自己基础不好,又加上是上学期的内容,因此在拿到题目后我并没有立即动手做,而是完整地阅读了一编实验教材,并且认真做了笔记。
在之后的设计中,无论是对于具体语句还是设计思想,都有了成竹在胸的感觉,甚至还可以帮助同学们解决一些小的知识点,做一些小的改进。
但光看书也是不够的,在编程的过程中,一开始仍有一些生涩,随着时间的推移,我的进度也逐渐加快。
因此,这说明,在做具体的项目时一定首先要打好基础,不能过于着急动手,当然也不能一味地抠细节,忽视实验的重要性。
2.整体的设计比具体的实现更重要在老师的讲课过程中,不止一遍强调数字电路的模块的划分、上层的设计要比具体的编程语句更重要。
一开始我并没有意识到这一问题,在做逻辑框图时细节和准确性都不够。
因为我习惯一边开始做,一边想下一步怎么做。
但在老师检 查过程中我的框图被指出错误之后,我又重新做了逻辑框图。
这一次,我感觉到在我认真思考后,我对整个电路的结构有了清晰地认识,特别是将电路划分为每一个细小的模块后,模块的具体实现就变得很简单,甚至很多都是现成的。
这让我明白上层的设计、模块的划分才是最有创造性、最有技术含量的部分,我们作为设计师,应当将重点放在设计思想上,而不是具体的一个个语句。
只有这样,我们的工作才是最具有价值的,而不是简单的模仿和重复。
3.硬件编程语言与普通编程语言是有区别的硬件编程语言侧重于10的逻辑实现,任何一段程序有一部分电路与之对应。
在编程的过程中,要养成做硬件的思维习惯。
比如这次,计数部分用了10位二进制来表示。
但后来的数码管显示需要提取出各位的数值。
不得已我用了除法和取余运算,造成的结果是用了大量的逻辑元件。
但是我看到我的同学在计数时就将各位单独进行运算,比我节省了大量的元器件。
这就是硬件语言的思维,在编程过程中应该尽量避免数据类型的转换、乘除法等,造成资源的浪费。
4.测试是编程的重要环节 因为我们做比较大型的项目不多,而这次实验,因为用了大量的模块化设计,合理、准确的测试就很重要了。
因为整体仿真的运算量太大,而且一旦出错很难发现什么地方出了问题,因此这就要求我们事先要对每一个模块都要进行仿真、测试。
而且最好还要对相连的模块进行整体仿真,避免出现问题。
而且在仿真、测试的过程中,选择合理的方法也很重要,设置适当的条件、选择合适的输入、输出等会让测试事半功倍。
总之,这次实验让我收获巨大。
当我实现了生活中可能用到的一个功能时,不仅让我收获了成就感与信心,还让我对生活中各种数字电路的实现产生了浓厚的兴趣。
看到生活中的电子产品时,有时候就会不自觉地思考这是怎么实现的?
可能要分为哪些模块?
这些模块有哪些功能,彼此又有什么联系?
这让我对进一步了解数字电路的应用提供了强大的推动力。
七、完整源程序 电路原理图、源程序代码见电路分析部分
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北邮数电 实验 报告 表决器 16