北邮数电实验报告4人表决器北邮电子数电综合实验报告文档格式.docx
《北邮数电实验报告4人表决器北邮电子数电综合实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《北邮数电实验报告4人表决器北邮电子数电综合实验报告文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
![北邮数电实验报告4人表决器北邮电子数电综合实验报告文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/28/7d576e02-bfe3-4df9-8fbe-d4fb62029126/7d576e02-bfe3-4df9-8fbe-d4fb620291261.gif)
由结构框图可以分析得出,该系统的的主体是计数控制器。
该系统由外部控制载客控制信号和等待控制信号,以时钟信号的翻转为计数依据,完成对时间、里程和费用的计数,并将结果通过数码管译码电路显示出来。
该系统的控制信号可由拨码或按键输入,时钟由开发板内部时钟分频得出,输出有点阵输出和数码管输出。
因此,可将系统分为分频器、计数控制器、数码管译码和显示以及点阵显示四部分。
并以此得出系统的逻辑框图如下:
图2逻辑框图
2.控制器部分的状态转移图
该控制器一共有三个基本状态:
空驶状态、载客状态和等待状态。
分别由v、和w来进行控制。
三、分块电路和总体电路设计
(一)总体电路设计
图3状态转移图
整体电路由数码管译码电路、转换电路、点阵译码电路、技术控制电路、
分频电路五部分构成。
分频电路将开发板内部的50MHz时钟分为500hz(供给数码管和点阵)、
1Hz(控制器计时)、0.5Hz(行驶路程计费)、0.3Hz(等待时间计费)以及用于提高分频效率的其他若按频率。
计数控制电路由四部分构成,整体完成行驶距离的计数、等待时间的计
数以及费用的计数。
输出为三组十位二进制数。
转换电路有转换数据类型和在数码管上分时显示两个功能。
首先将输入
的十位二进制数转换为4位十进制数,并且利用除法和取余数的运算提取出个位、十位、百位、千位,并转换为四位二进制BCD码。
其次利用0.5hz的时钟,将行驶里程、等待时间、计费金额以2秒为周期依次out1~4,供给数码管以便分时显示。
数码管译码电路以500HZ实现动态扫描,并将转换电路输出的5组BCD
码依次译码,完成显示。
点阵译码器根据载客控制信号,分别显示“O”、“X”静态图案。
(二)分块电路设计1.分频器(以100分频为例)
1.1电路模块1.2关键代码
ENTITYdiv_100ISPORT(
clk100:
INSTD_LOGIC;
--clear:
clk1:
OUTSTD_LOGIC);
--ENDdiv_100;
ARCHITECTUREa100OFdiv_100IS
SIGNALtmp100:
INTEGERRANGE0TO99;
--BEGIN
p1:
PROCESS(clear,clk100)--p1BEGIN
IFclear=“0”THENtmp100
ELSIFclk100”eventANDclk100=“1”THENIFtmp100=99THENtmp100
tmp100
ENDPROCESSp1;
clk100:
输入时钟
clear:
复位端clk1:
输出时钟输入时钟输出时钟计数信号进行100进制的计数
p2:
PROCESS(clk100)--p2输出占空比为50%的新时钟BEGIN
IFclk100”eventANDclk100=“1”THENIFtmp10049THENclk1
clk1
ENDPROCESSp2;
ENDa100;
1.3
仿真波形
图5200分频仿真波形
图65分频仿真波形
2.计数控制器
2.1电路模块
计数控制器由四部分组成,输入为三个不同频率的时钟、载客控制信号v和等待控制信号w。
control1完成里程的计数cd和行驶费用cm1,control2完成等待时间ct的计数和等待开始计费(ct5s)信号outt,control3接收到outt后输出为等待时间的计费cm2,control4为总费用(cm1+cm2+燃油附加费
1
图7电路控制器
设计关键思想是将费用、行驶里程、等待时间三个计数过程分开处理,并且将行驶计费和等待计费也分开处理。
通过载客信号v、等待信号w分别触发不用的进程完成计数。
因为行驶过程中每两秒1公里,每公里两元,等待过程中每三秒1元,因此分别用1hz、0.5hz、0.33hz的时钟完成计时、计费、记里程。
2.2模块control12.2.1电路模块
行驶里程计数cd和行驶计费cm1
2.2.2关键代码
ENTITYcontrol1ISPORT(
clk2:
--输入是0.5Hz的时钟v:
--载客控制输入信号w:
--等待信号
cm1:
OUTSTD_LOGIC_VECTOR(9DOWNTO0);
--里程计费cd:
OUTSTD_LOGIC_VECTOR(9DOWNTO0));
--行驶距离ENDcontrol1;
ARCHITECTUREcOFcontrol1IS
SIGNALtemp1:
STD_LOGIC_VECTOR(9DOWNTO0);
SIGNALtemp_cm:
STD_LOGIC;
BEGIN
PROCESS(clk2,v,w)--p1里程计数BEGIN
IF(clk2”eventandclk2=“1”)THEN
IFv=“0”THEN--v=0时重新计数temp1
ELSIFw=“1”THEN--开始等待时里程保持不变temp1
ELSEtemp1
PROCESS(clk2,temp1)BEGIN
IFtemp1
ELSEcm1
cd
ENDc;
2.3模块control22.3.1电路模块
等待时间计数ct和等待开始计费信号outt(ct5s)
2.3.2关键代码
ENTITYcontrol2ISPORT(
--输入是1Hz的时钟v:
outt:
outSTD_LOGIC;
--若大于5秒,输出1
ct:
outSTD_LOGIC_VECTOR(9DOWNTO0));
--等待时间输出ENDcontrol2;
ARCHITECTUREcOFcontrol2ISSIGNALtempt:
SIGNALtemp1:
INTEGERRANGE0TO999;
p3:
PROCESS(clk1,v,w)--累加等待时间BEGIN
IF(clk1”eventandclk1=“1”)THENIFv=“0”THEN
tempt
ELSIFw=“0”THEN--行驶时保持状态tempt
temp1
ELSEtempt
IFtemp14THEN--大于5秒时outt=1outt
ENDIF;
ENDPROCESSp3;
p4:
PROCESS(clk1,tempt)--将信号赋给输出ctBEGIN
ct
ENDPROCESSp4;
2.4模块control32.4.1电路模块
当输入outt为1时,开始计数cm2为等待时间计费
2.4.2关键代码
ENTITYcontrol3ISPORT(
clk3:
--输入是0.3Hz的时钟
--为1时,等待时间大于5sv:
cm2:
--等待计费ENDcontrol3;
ARCHITECTUREcOFcontrol3IS
SIGNALtempm:
p5:
PROCESS(clk3,outt,v,w)BEGIN
IFoutt=“1”THEN--大于5秒时开始计费IF(clk3”eventandclk3=“1”)THENIFv=“0”THEN
tempm
ELSEtempm
ENDPROCESSp5;
p6:
PROCESS(clk3,tempm)
BEGIN
IFV=“0”THEN
cm2
ENDPROCESSp6;
2.5control42.5.1电路模块
将等待计费cm2和行驶计费cm1相加,并加上
燃油费1元,得到总费用cm
2.5.2关键代码
ENTITYcontrol4ISPORT(
--载客控制输入信号cm1:
inSTD_LOGIC_VECTOR(9DOWNTO0);
--行驶费用cm2:
--等待费用
cm:
--总费用ENDcontrol4;
ARCHITECTUREcOFcontrol4ISBEGIN
PROCESS(clk2,v)BEGIN
IF(clk2”eventandclk2=“1”)THENIFv=“0”THENcm
2.6控制计数部分的总仿真波形
图8控制计数器仿真波形
3.转换器
3.1电路模块
由三个输入:
行驶距离cd、等待时间ct、计费
金额cm
输出out1-5为四位二进制BCD码
实现功能:
将十位二进制数按照位数转为为
BCD码
3.2关键代码
ENTITYtransformISPORT(
clk:
--0.5hz的时钟v:
cd:
--行驶距离ct:
--等待时间cm:
--总费用out1:
outstd_logic_vector(3downto0);
--输出个位out2:
--输出十位out3:
--输出百位out4:
--输出千位
out5:
outstd_logic_vector(3downto0));
--输出ABCENDtransform;
ARCHITECTUREcOFtransformIS
signalcc:
integerrange0to1023;
signalt:
std_logic_vector(1downto0);
signalq1,q2,q3:
integerrange0to1000;
PROCESS(clk,v)--p1进行3进制的计数BEGIN
IF(clk”eventandclk=“1”)THENIFv=“0”THENt
elsift=“00”thent
elsift=“01”thent
elsift=“10”thent
elset
p2:
process(clk,t)BEGIN
if(clk”eventandclk=“1”)then
CASEtis--实现分时显示
when”00”=cccccccc
q1
q3
out1
endprocessp2;
4.数码管译码电路
4.1电路模块
4.2关键代码
ENTITYshumaguanISPORT(
---500hz数码管扫描时钟out5,out4,out3,out2,out1:
INSTD_LOGIC_VECTOR(3DOWNTO0);
g:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
cat:
OUTSTD_LOGIC_VECTOR(5DOWNTO0));
ENDshumaguan;
ARCHITECTUREaOFshumaguanIS
SIGNALtmpg:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALtmpn:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALtmpc:
INTEGERRANGE0TO5;
PROCESS(clk1)--六进制计数BEGIN
if(clk1”eventandclk1=“1”)then
iftmpc=5thentmpc
tmpc
PROCESS(clk1)--数码管选通轮流显示BEGIN
if(clk1”eventandclk1=“1”)then--将个位、十位等赋给各个数码管casetmpcis
WHEN0=tmpntmpntmpntmpn
WHEN5=tmpntmpn
PROCESS(tmpn)--译码电路BEGIN
CASEtmpnIS
WHEN”0000”=tmpgtmpgtmpgtmpgtmpgtmpgtmpgtmpgtmpgtmpgtmpgtmpgtmpgtmpgtmpg
5.点阵译码电路
5.1电路模块
5.2关键代码ENTITYdzisPORT(
clk500:
v:
row:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
--行
col:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
--列ENDdz;
ARCHITECTUREaOFdzIS
SIGNALtmp_row:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALtmp_col:
begin
process(v,clk500)begin
if(clk500”eventandclk500=“1”)thenifv=“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
5.3仿真波形
图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.测试是编程的重要环节
因为我们做比较大型的项目不多,而这次实验,因为用了大量的模块化设计,合理、准确的测试就很重要了。
因为整体仿真的运算量太大,而且一旦出错很难发现什么地方出了问题,因此这就要求我们事先要对每一个模块都要进行仿真、测试。
而且最好还要对相连的模块进行整体仿真,避免出现问题。
而且在仿真、测试的过程中,选择合理的方法也很重要,设置适当的条件、选择合适的输入、输出等会让测试事半功倍。
总之,这次实验让我收获巨大。
当我实现了生活中可能用到的一个功能时,不仅让我收获了成就感与信心,还让我对生活中各种数字电路的实现产生了浓厚的兴趣。
看到生活中的电子产品时,有时候就会不自觉地思考这是怎么实现的?
可能要分为哪些模块?
这些模块有哪些功能,彼此又有什么联系?
这让我对进一步了解数字电路的应用提供了强大的推动力。
七、完整源程序
电路原理图、源程序代码见电路分析部分