数字电路实验报告.docx
- 文档编号:10942041
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:33
- 大小:1.38MB
数字电路实验报告.docx
《数字电路实验报告.docx》由会员分享,可在线阅读,更多相关《数字电路实验报告.docx(33页珍藏版)》请在冰豆网上搜索。
数字电路实验报告
序言………………………………………………………………………………………4
第一章课题概述……………………………………………………………………4
1.1出租车计费系统的实验任务及要求………………………………………………5
1.2出租车计费系统的原理和方案设计………………………………………………5
1.3具体的方案设计……………………………………………………………………5
2.3.1硬件电路方案设计…………………………………………………………………5
2.3.2软件方案设计……………………………………………………………………6
第二章硬件电路……………………………………………………………………7
2.1时钟电路……………………………………………………………………………7
555电路…………………………………………………………………………8
2.2下载电路……………………………………………………………………………8
2.3开关电路……………………………………………………………………………9
2.4动态显示电路………………………………………………………………………9
第三章计费系统的VHDL设计…………………………………………………10
3.1分频模块……………………………………………………………………………11
3.2车行状态模块………………………………………………………………………12
3.3累加模块……………………………………………………………………………14
3.4计费模块……………………………………………………………………………15
3.5计程模块……………………………………………………………………………25
3.6译码模块……………………………………………………………………………27
第四章总程序的设计及其实现的结果……………………………………29
4.1无译码程序的计费系统TAXI设计………………………………………………29
4.2有译码程序的计费系统模块………………………………………………………31
参考文献………………………………………………………………………………33
附录……………………………………………………………………………………34
小结感悟……………………………………………………………………………………35
出租车计费器
序言
本次课程设计巩固和运用了所学课程,通过理论联系实际,提高了分析、解决计算机技术实际问题的独立工作能力,通过对一个出租车计费器的设计,进一步加深了对计算机原理以及数字电路应用技术方面的了解与认识,进一步熟悉了数字电路系统设计、制作与调试的方法和步骤。
当然这些都是有限的,而从中领会到的感悟则更加重要。
出租车计费器就是对车轮传感器送来的脉冲进行计数,本课程设计利用555产生的脉冲代替车轮传感器送来的脉冲。
当计费系统接收到一个脉冲信号,它将会实现计数的功能,并且通过外围的电路把所实现的功能实现出来。
本论文共分4章和1个附录,第1章介绍出租车计费系统的原理和方案设计第2章介绍了硬件设计。
第3章介绍了软件设计。
第4章介绍了总的设计以及其结果。
本课题的主要设计工作内容是能够显示出租车的车费和里程并完成安装与调试。
第一章课题概述
1.1出租车计费系统的实验任务及要求
(1)任务(最终的功能):
1.计费功能:
白天计费标准为:
按行驶里程收费,起步费为9.00元,并在车3公里后再按0.2元/0.1公里,当计程达到10并超过10公里时,再按0.3元/0.1公里收费。
晚上计费标准为:
按行驶里程收费,起步费为11.00元,并在车行10公里后再按0.3元/0.1公里收费,当计程超过10公里时,再按0.4元/0.1公里收费,停止时间累计达到0.5n公里的倍数时加n元(n取整数)。
2.预置功能:
预置起步费(白天黑夜选择不同)、每公里收费、车行加费里程。
3.模拟功能:
模拟汽车启动、停止、暂停状态。
(用脉冲来模拟行驶过程,看成匀速)
4.显示功能:
将即时的车费和里程用数码管显示出来。
(2)实验要求:
1.用VHDL语言设计符合上述功能要求的出租车计费器,并用层次化设计方法设计该电路。
2.各计数器的计数状态用功能仿真的方法验证,并通过有关波形确认电路设计是否正确。
系统的顶层框图:
1.2、出租车计费系统的原理和方案设计
信号输入:
各种控制信号(如:
555的时钟信号、使能信号等)经输入端给控制芯片。
控制芯片:
采用FPGA芯片板。
里程显示和动态显示电路:
我们实验采用的是共阳极数码管来实现功能的输出。
1.3、具体的方案设计
1.3.1、硬件电路方案设计
以下为硬件电路的结构简图:
各模块的组成和原理:
(1)时钟控制模块
此模块是由555电路所构成的。
(2)下载电路模块
此模块主要由下载线(我们实验采用杜邦线)组成。
作用:
使PC机中编写的VHDL语言的程序下载到FPGA芯片中,使电路实现所需的功能。
(3)开关模块:
该模块用于电路输入使能信号,来模拟出租车不同的状态。
(4)动态显示模块:
此模块由八个数码管和三个二极管所构成,三个二极管起到限制电流的作用,使得流到数码管的电流适当,防止数码管中的电流过大,而使得数码管损坏。
数码管将计费和里程动态的显示出来。
1.3.2软件方案设计
以下为软件结构简图:
各模块的功能:
1)分频器:
要模拟汽车的状态,需要较小频率的脉冲,而555无法完成,需要分频器将555产生的脉冲分频。
2)车行状态模块:
将汽车的启动、停止、暂停状态输出。
3)里程计数模块:
当来一个脉冲信号时,里程值加0.1公里,用于纪录行驶里程
4)车费计数模块:
白天其初值为9元,当里程超过3公里后每来一个脉冲(代表运行了0.1公里)其数值加0.2元,当计程超过10时每来一个脉冲其数值加0.3元。
晚上其初值为11元,当里程超过3公里后每来一个脉冲(代表运行了0.1公里)其数值加0.3元,当计程超过10时每来一个脉冲其数值加0.4元。
5)译码模块:
实现将车费计数模块和里程计数模块输出的十进制数转换成二进制数,做为显示译码管的驱动电路。
第二章硬件电路
根据前面第一章所提到的硬件电路的方案设计,这章介绍各模块的具体设计。
2.1时钟电路
555电路
在数字系统中,为了使各部分在时间上协调动作,需要有一个统一的时间基准。
用来产生时间基准信号的电路称为时基电路。
时基集成电路555就是其中的一种。
它是一种由模拟电路与数字电路组合而成的多功能的中规模集成组件,只要配少量的外部器件,便可很方便的组成触发器、振荡器等多种功能电路。
因此其获得迅速发展和广泛应用。
下图为由555定时器所构成的多谐振荡器,该电路可以用于脉冲输出、音响告警、家电控制、电子玩具、检测仪器、电源变换、定时器
图3.1.2555电路的接法
该电路的特点是“RA—7—RB—6.2—C”,RA与VCC相连。
公式是:
T1=0.693(RA+RB)*C,
T2=0.693RB*C,
F=1.443/(RA+2RB)*C
为了满足我的设计要求,因此取RA=RB其阻值为10K,取电容C的取值为10uf,电容C1的取值0.01uF。
2.2开关电路
它的作用是提供输入信号。
拨码开关的4个引脚FPGA芯片的引脚上。
根据拨码开关的高低电平来实现模拟汽车的相应的转态,如使能、暂停、复位、黑白天控制。
2.3显示电路
该电路用四个数码管所组成,其中两个数码管实现将车费动态的显示出来。
其动态的显示范围为0到99元。
还有两个数码管实现将汽车行驶的里程动态的显示出来,其动态的显示范围为0到99公里。
第三章计费系统的VHDL设计(软件部分)
传统的电子设计技术通常是自底向上的,即首先确定构成系统的最底层的电路模块或元器件的结构和功能,然后根据主系统的功能要求,将它们组合成更大的功能块,使它们的结构和功能满足高层系统的要求[10]。
以此流程,逐步向上递推,直至完成整个目标系统设计。
而在“自顶向下”的设计中,首先需要进行行为设计。
接着进行结构设计,根据该电子系统或芯片的特点,将其分解为接口清晰、相互关系明确、尽可能简单的子系统,得到一个总体结构。
下一步是把结构转换成逻辑图,即进行逻辑设计。
接着进行电路设计,逻辑图将进一步转化成电路图。
在很多情况下,这时需进行硬件仿真,以最终确定逻辑设计的正确性。
最后是进行版图设计,即将电路图转化成版图。
在本设计中采用的是自顶向下的设计方法,首先从系统功能设计开始,对系统高层模块进行行为描述和功能仿真.系统的功能验证完成后,将抽象的高层设计自顶向下逐级细化,直到与所用可编程逻辑器件相对应的逻辑描述。
在本设计中,具有6个模块:
1)分频器:
将时钟信号进行分频。
2)车行状态模块:
将汽车的启动、停止、暂停状态输出。
3)里程计数模块:
当来一个脉冲信号时,里程值加0.1。
4)计费模块
(1)白天其初值为9元,当里程超过3公里后每来一个脉冲(代表运行了0.1公里)其数值加0.2元,当计程超过10时每来一个脉冲其数值加0.3元。
(2)晚上其初值为11元,当里程超过3公里后每来一个脉冲(代表运行了0.1公里)其数值加0.3元,当计程超过10时每来一个脉冲其数值加0.4元。
(3)暂停计费模块:
当汽车暂停时暂停信号开始自加,当暂停信号是5的倍数时,计费模块自加1元。
5)译码模块:
实现将车费计数模块和里程计数模块输出的十进制数转换成二进制数输出。
下面具体介绍各个部分的设计。
3.1分频器
(1)实物图
图4.1分频器的实体图
CLK0:
输入信号
FOUT:
输出信号
(2)分频器的VHDL设计
本设计将输入的一个脉冲信号实现五分频。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYPULSEIS
PORT(CLK0:
INSTD_LOGIC;
FOUT:
OUTSTD_LOGIC);
ENDPULSE;
ARCHITECTUREONEOFPULSEIS
BEGIN
PROCESS(CLK0)
VARIABLECNT:
STD_LOGIC_VECTOR(2DOWNTO0);
VARIABLEFULL:
STD_LOGIC;
BEGIN
IFCLK0'EVENTANDCLK0='1'THEN
IFCNT="100"THEN
CNT:
="000";
FULL:
='1';
ELSE
CNT:
=CNT+1;
FULL:
='0';
ENDIF;
ENDIF;
FOUT<=FULL;
ENDPROCESS;
ENDONE;、
(3)波形仿真
从该波形图可以看出输入脉冲的频率是输出脉冲的频率的五倍,则符合我的设计的要求,可见该程序能够完成要求。
3.2车行状态模块
(1)实体图
4.2车行状态的实体图
CLK:
脉冲的输入信号
ENABLE:
开始按键提供的信号
STO:
暂停按键提供的信号
CLR:
复位按键提供的信号
ST[1..0]:
输出出租车的状态
(2)车行状态的VHDL设计
为了使计费系统能够满足设计的要求,能够模拟汽车的停止、启动、暂停等功能,可以用开关来模拟汽车的各种状态,开关有两种状态,一种是高电位,一种是低电位,假设当出租车停止的时候,代表停止的开关是低电平,即停止按钮是低电平有效,其他的同此道理。
其设计程序如下所示:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcentIS
PORT(CLK:
INSTD_LOGIC;
ENABLE:
INSTD_LOGIC;
STO:
INSTD_LOGIC;
CLR:
INSTD_LOGIC;
ST:
OUTSTD_LOGIC_VECTOR(1DOWNTO0));
ENDcent;
ARCHITECTUREONEOFcentIS
BEGIN
PROCESS(CLK,ENABLE,STO,CLR)
VARIABLECQI:
STD_LOGIC_VECTOR(9DOWNTO0);
VARIABLESTATE:
STD_LOGIC_VECTOR(1DOWNTO0);
BEGIN
IFCLR='0'THENCQI:
="0000000000";STATE:
="00";
ELSIFCLK'EVENTANDCLK='1'THEN
IFSTO='0'THENSTATE:
="00";CQI:
=CQI;
ELSIFENABLE='1'THENCQI:
=CQI+1;
IFCQI<=30THENSTATE:
="01";
ELSIFCQI>30ANDCQI<=100THENSTATE:
="10";
ELSESTATE:
="11";
ENDIF;
ENDIF;
ENDIF;
ST<=STATE;
ENDPROCESS;
ENDONE;
从波形图中可以看出当暂停信号作用的时候输出为“00”,当出租车行驶的公里数小于3时输出状态为“01”,当出租车行驶的公里数大于3小于10时其输出状态为“10”,当出租车行驶的公里数大于10时其输出状态为“11”。
由此可见,与我所希望的相符合,可见该程序是符合要求的。
3.3累加模块
(1)实体图
累加器的实体图
Clk:
输入的脉冲信号
en:
使能端,高电平有效。
Kk:
当累加到5个脉冲的时,kk输出为1;否则为0.
(2)累加模块的VHDL设计
(3)仿真的波形
从波形上可以看出:
en为1时有效,当脉冲累加5个时,kk输出为1.此功能是我所需要的。
与我所要设计的要求想符合。
3.4计费模块
(1)实体图
4.4计费模块的实体图
CLK_DIV:
输入的脉冲信号
CLR1:
复位信号,当该信号有效时,计费模块的输出为零
Si[1..0]:
出租车的行驶状态信号,该信号表示此时出租车是什么状态,比如是:
启动、停止、还是暂停
C2、C3、C4:
分别是出租车计费器的十位、个位、小数位
(2)计费模块的VHDL设计
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcounter1IS
PORT(CLK_DIV:
INSTD_LOGIC;
CLR1:
INSTD_LOGIC;
K:
INSTD_LOGIC;
SS:
INSTD_LOGIC;
SI:
INSTD_LOGIC_VECTOR(1DOWNTO0);
C2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
C3:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
C4:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDCOUNTER1;
ARCHITECTUREONEOFCOUNTER1IS
BEGIN
PROCESS(CLK_DIV,CLR1,SI,SS)
VARIABLEQ2:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEQ3:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEQ4:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
IFSS='0'THEN
IFCLR1='0'THENQ2:
="0000";Q3:
="0000";Q4:
="0000";
ELSIFCLK_DIV'EVENTANDCLK_DIV='1'THEN
CASESIIS
WHEN"00"=>IFK='0'THEN
Q2:
=Q2;Q3:
=Q3;Q4:
=Q4;
ELSEIFK='1'THEN
IFQ3<"1001"THEN
Q3:
=Q3+1;
ELSE
Q3:
="0000";
IFQ4<"1001"THEN
Q4:
=Q4+1;
ENDIF;
ENDIF;
ENDIF;
ENDIF;
注:
上述是汽车不在开的情况。
WHEN"01"=>Q3:
="1001";Q4:
="0000";Q2:
="0000";
注:
上述为0~3公里内行驶的情况。
WHEN"10"=>IFQ2<"1000"THEN
Q2:
=Q2+2;
ELSE
Q2:
="0000";
IFQ3<"1001"THEN
Q3:
=Q3+1;
ELSEQ3:
="0000";Q4:
=Q4+1;
ENDIF;
ENDIF;
注:
上述为3~10公里内行驶的情况。
WHEN"11"=>IFQ2<"0111"THEN
Q2:
=Q2+3;
ELSifQ2="0111"then
IFQ3<"1001"THEN
Q2:
="0000";
Q3:
=Q3+1;
elseQ2:
="0000";Q3:
="0000";Q4:
=Q4+1;
endif;
elsifQ2="1000"then
IFQ3<"1001"THEN
Q2:
="0001";
Q3:
=Q3+1;
elseQ2:
="0001";Q3:
="0000";Q4:
=Q4+1;
endif;
elsifQ2="1001"then
iFQ3<"1001"THEN
Q2:
="0010";
Q3:
=Q3+1;
elseQ2:
="0010";Q3:
="0000";Q4:
=Q4+1;
endif;
ENDIF;
注:
上述为10公里以上行驶的情况。
WHENOTHERS=>NULL;
ENDCASE;
ENDIF;
注:
上述为白天,下面程序表示晚上的情况
ELSE
IFCLR1='0'THENQ2:
="0000";Q3:
="0000";Q4:
="0000";
ELSIFCLK_DIV'EVENTANDCLK_DIV='1'THEN
CASESIIS
WHEN"00"=>IFK='0'THEN
Q2:
=Q2;Q3:
=Q3;Q4:
=Q4;
ELSEIFK='1'THEN
IFQ3<"1001"THEN
Q3:
=Q3+1;
ELSE
Q3:
="0000";
IFQ4<"1001"THEN
Q4:
=Q4+1;
ENDIF;
ENDIF;
ENDIF;
ENDIF;
WHEN"01"=>Q3:
="0001";Q4:
="0001";Q2:
="0000";
WHEN"10"=>IFQ2<"0111"THEN
Q2:
=Q2+3;
ELSifQ2="0111"then
IFQ3<"1001"THEN
Q2:
="0000";
Q3:
=Q3+1;
elseQ2:
="0000";Q3:
="0000";Q4:
=Q4+1;
endif;
elsifQ2="1000"then
IFQ3<"1001"THEN
Q2:
="0001";
Q3:
=Q3+1;
elseQ2:
="0001";Q3:
="0000";Q4:
=Q4+1;
endif;
elsifQ2="1001"then
iFQ3<"1001"THEN
Q2:
="0010";
Q3:
=Q3+1;
elseQ2:
="0010";Q3:
="0000";Q4:
=Q4+1;
endif;
ENDIF;
WHEN"11"=>IFQ2<"0110"THEN
Q2:
=Q2+4;
ELSifQ2="0110"then
IFQ3<"1001"THEN
Q2:
="0000";
Q3:
=Q3+1;
elseQ2:
="0000";Q3:
="0000";Q4:
=Q4+1;
endif;
ELSifQ2="0111"then
IFQ3<"1001"THEN
Q2:
="0001";
Q3:
=Q3+1;
elseQ2:
="0001";Q3:
="0000";Q4:
=Q4+1;
endif;
elsifQ2="1000"then
IFQ3<"1001"THEN
Q2:
="0010";
Q3:
=Q3+1;
elseQ2:
="0010";Q3:
="0000";Q4:
=Q4+1;
endif;
elsifQ2="1001"then
iFQ3<"1001"THEN
Q2:
="0011";
Q3:
=Q3+1;
elseQ2:
="0011";Q3:
="0000";Q4:
=Q4+1;
endif;
ENDIF;
WHENOTHERS=>NULL;
ENDCASE;
ENDIF;
ENDIF;
C2<=Q2;
C3<=Q3;
C4<=Q4;
ENDPROCESS;
ENDONE;
该模块通过开关量预制步长,当超过一定预制参数时改变步长。
计费模块也采用非压缩BCD码,但因步长不为1,所以在做非压缩BCD加法时必须调整,否则可能导致在超过或未超过预置参数时出现超程错误。
这里采用模仿微机的AF标志位,在其设立一个半进位标志,当累加和大于9或半进位标志为“1”时,对累加和进行调整。
其程序如下所示:
(3)仿真的波形
白天:
晚上:
从波形图中可以看到其C4是十位,C3是个位,C2表示角图中显示的是当车程已经超过10公里时的计费情况,白天它是按照每公里加3元来计费的,夜间它是按照每公里加4元来计费的,与我所要设计的要求想符合。
3.4计程模块
(1)实体图
4.5计程模块的实体图
CLKS:
输入的脉冲信号
CLR2:
复位信号,当该信号有效时,计费模块的输出为零.
SF[1...0]:
出租车的行驶状态信号,该信号表示此时出租车是什么状态,比如是:
启动、停止还是暂停。
(2)计程模块的VHDL设计
计程模块是一个模为10、步长为1的加法计数器。
该模块可以预制参数,使其实际计数值大于预制数值后,每送出一个脉冲,将计数值送译码动态扫描模块进行显示。
预制参数采用非压缩BCD码,所以在计数器设计时必须将二进制1010至1111六个状态跳过去。
其主要程序如下所示:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitylucis
port(clks,clr2:
instd_logic;
sf:
instd_logic_vector(1downto0);
k0,k1,k2:
outstd_logic_vecto
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字电路 实验 报告