北邮EDA实验报告.docx
- 文档编号:8455065
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:15
- 大小:253.52KB
北邮EDA实验报告.docx
《北邮EDA实验报告.docx》由会员分享,可在线阅读,更多相关《北邮EDA实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
北邮EDA实验报告
数字电路综合试验报告
题目:
简易出租车计价器
班级:
学号:
班内序号:
学生姓名:
2013/11/12Tuesday
一.实验介绍
1.实验目的
(1)进一步掌握VHDL和Quartus II软件的使用;
(2)理解状态机的工作原理和设计方法;
(3)掌握利用EDA工具进行自顶向下的电子系统设计方法。
2.实验所用仪器及元器件
(1)计算机;
(2)EDA开发板及相应元器件。
3.实验内容
设计一台出租车计价器,不同情况具有不同的收费标准。
基本要求:
1)行驶公里:
用时钟2秒钟表示出租车匀速行驶1公里,在行车5公里以内,按起步价13元收费,超过5公里部分,以每公里2元收费。
燃油附加费为每运次1元。
2)途中等待:
用按键控制中途等待,等待少于(包括)5秒不收费,超过5秒后每等待3秒钟加收1元。
3)用数码管分时显示计费金额、行驶里程和等候时间。
字母A表示当前处于显示计费金额状态,字母B表示当前处于显示行驶里程状态,字母C表示当前处于显示等待时间状态。
4)用按键控制出租车空载、载客状态并用点阵显示空载、载客状态。
二、系统设计
1.设计思路
首先考虑基本要求,我们要实现的功能主体部分都是计时器的操作,如2秒记1公里,5公里内按起步价收费、等待每3秒加收1元等。
都是我们对不同计时器的操作。
因此要先分频出一个1KHZ的时钟用作记秒。
至此我们就把基本要求1、2构思完成。
用若干按键改变选择支以及计费模式和显示数值,均为上升沿触发,完成对整个计价器的控制。
然后考虑数码管以及点阵显示问题,我们需要把上一部计算出的十进制数值转化成几个2进制数来表示,从而显示到数码管上。
(考虑到数码管位数限制,我们默认显示数值不会超过9999,即数值可以用4个4位2进制数来表示)。
至于点阵显示则事先考虑好要实现的图像以及需要如何扫描,不再赘述。
2.分块设计及总体框图
a)总体框图
数码管显示模块
分频及逻辑控制模块
数据译码模块
计费计里程计时模块
外部输入时钟
点阵显示模块
图2.2.1出租车计费器系统结构图
b)分块设计
分频及逻辑控制模块:
将外部输入时钟50MHz频率分成1KHz和1Hz时钟,分别用于数码管显示扫描及点阵显示扫描频率和计费计里程计时的时钟频率。
用按键btn1-btn3进行控制模块的工作状态和显示效果。
计费计里程计时模块:
根据输入的1Hz频率时钟完成对时间的计数,转换成2s累加1公里,再由公里数算出里程费,中途停车时进行1s一次累加的时间计数,再由时间算出中途停车的费用,将两项费用相加即为总费用。
数据译码模块:
用于得到的数据为整形数,不便于数码管的显示,为使其更为直观利于理解和显示,将得到的数据译码成个十百千四个4位BCD码的形式。
数码管显示模块:
将1KHz时钟提供给数码管选通信号cat0-cat4,根据译码的BCD码和输出种类标志flag用case语句选择出显示的信号输出到相应的数码管片上。
点阵显示模块:
根据控制模块的控制信号选择显示空载标志或载客标志,采用逐行扫描的方式显示。
c)流程图
三、仿真波形及波形分析
计费计里程计时模块仿真波形图
输入的时钟clk_1为1Hz频率(这里的仿真时钟周期不是1S),clk_1一个周期代表1s的时间,clk_1上升沿有效计数1s。
输入控制信号分别为carry和stop,控制载客状态和是否中途等待,两个信号均为上升沿触发代表按键的按下和松开。
初始化状态为空载状态,各项显示均为0,carry第一次有效触发表示进入载客状态,显示基础费用13元;第二次有效触发表示完成一次载客,准备付款,加上燃油附加费;第三次有效触发表示完成付款,各项记录清零重新进入空载状态。
stop信号在载客时上升沿触发有效,stop第一次有效触发表示中途等待,里程不再计数,等待时间开始计时,当计时时间超过5秒后每3秒加价1元;第二次有效触发表示结束中途等待,里程继续计数,等待时间不再计数。
里程(road)每两个时钟上升沿计数加1,表示2s每公里。
输出费用、里程、等待时间。
数据译码模块
该模块中输入的时钟信号clk为50MHz频率,也是为了尽可能快的得到显示信号拆分成个十百的形式。
由波形图可以看出clk上升沿触发,当14个上升沿之后,完成14次计数周期后,输出百位bai=0,十位shi=1,个位ge=4,完成了各位的拆分,为数码管显示作准备
数码管显示模块
该模块中输入的时钟信号clk_2为1KHz频率,这个频率为数码管的扫描频率。
输入信号ge、shi、bai、flag用于显示,cat0显示个位,cat1显示十位,cat2显示百位,cat3不显示,cat4显示标志。
初始化时cat为全0,不能选中数码管。
数码管输出信号按照输入信号用case语句选择出相应的7段显示码用于显示。
点阵显示模块
该模块输入时钟clk_2为1KHz频率,用于点阵的行扫描。
上面两张图分别为空载显示和载客显示。
在一个时钟上升沿选中一行row显示该行信息q2,逐行扫面显示相应图形。
carry信号用于控制显示。
4.元器件清单及资源利用情况
元器件主要是EMP1270T144C5芯片,共阴极七段数码管,8*8点阵,按键等。
资源利用情况:
四、源程序(部分)
分频模块
--50MHZ-1HZ分频器(主频率用于计费模块)
LIBRARYIEEE;--得到1s一次上升沿信号
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYfreq1IS
PORT(clk:
INSTD_LOGIC;
clk_1:
OUTSTD_LOGIC);
ENDfreq1;
ARCHITECTUREb1OFfreq1IS
SIGNALtmp1:
INTEGERRANGE0TO49999999;
BEGIN
p1:
PROCESS(clk)
BEGIN
IF(clk'eventANDclk='1')THEN
IFtmp1=49999999THEN
tmp1<=0;
ELSEtmp1<=tmp1+1;
ENDIF;
IFtmp1<=29999999THEN
clk_1<='1';
ELSE
clk_1<='0';
ENDIF;
ENDIF;
ENDPROCESSp1;
ENDb1;
计费模块
--计费器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYjifeiIS
PORT(
clk_1,carry,stop:
INSTD_LOGIC;
fee,road,stop_time:
OUTINTEGERRANGE0TO600);
ENDjifei;
ARCHITECTUREaOFjifeiIS
BEGIN
PROCESS(clk_1,carry,stop)
VARIABLEtime_temp1,time_temp2,road_temp,road_fee,stop_temp,stop_fee:
INTEGERRANGE0TO600:
=0;
VARIABLEstate1:
INTEGERRANGE0TO2:
=0;
VARIABLEstate2,oil:
INTEGERRANGE0TO1:
=0;
BEGIN
IF(carry'eventandcarry='1'andstate1=0)THEN
state1:
=1;
ELSIF(carry'eventandcarry='1'andstate1=1)THEN
state1:
=2;
ELSIF(carry'eventandcarry='1'andstate1=2)THEN
state1:
=0;
ENDIF;
IF(stop'eventandstop='1'andstate2=0)THEN
state2:
=1;
ELSIF(stop'eventandstop='1'andstate2=1)THEN
state2:
=0;
ENDIF;
IF(clk_1'eventandclk_1='1')THEN
IF(state1=0)THEN--全部清零
time_temp1:
=0;
time_temp2:
=0;
road_temp:
=0;
road_fee:
=0;
stop_fee:
=0;
stop_temp:
=0;
oil:
=0;
ELSIF(state1=1andstate2=0)THEN
IFtime_temp1=2THEN
time_temp1:
=1;
road_temp:
=road_temp+1;--里程
ELSE
time_temp1:
=time_temp1+1;
ENDIF;
IFroad_temp>5THEN
road_fee:
=(road_temp-5)*2+13;--里程费
ELSEroad_fee:
=13;
ENDIF;
ELSIF(state1=1andstate2=1)THEN
time_temp2:
=time_temp2+1;
stop_temp:
=time_temp2;--等待时间
IFstop_temp>5THEN
stop_fee:
=(stop_temp-5)/3;--等待费用
ELSEstop_fee:
=0;
ENDIF;
ELSIF(state1=2)THENoil:
=1;
ENDIF;
ENDIF;
fee<=road_fee+stop_fee+oil;--总费用
road<=road_temp;
stop_time<=stop_temp;
ENDPROCESS;
ENDa;
译码模块(进制转换)
--译码转换(4位10进制数)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYyimaIS
PORT(clk:
INSTD_LOGIC;--这个时钟比主时钟clk_1快很多,完成短时间的译码
xian_1:
ININTEGERRANGE0TO600;--需要被译码的信号
ge,shi,bai:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDyima;
ARCHITECTUREdOFyimaIS
SIGNALcounter_t:
INTEGERRANGE0TO600;
SIGNALge_t,shi_t,bai_t:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PROCESS(clk,xian_1)
BEGIN
IF(clk'EVENTANDclk='1')THEN
IF(counter_t IF(ge_t=9ANDshi_t=9)THEN ge_t<="0000"; shi_t<="0000"; bai_t<=bai_t+1; counter_t<=counter_t+1; ELSIF(ge_t=9)THEN ge_t<="0000"; shi_t<=shi_t+1; counter_t<=counter_t+1; ELSE ge_t<=ge_t+1; counter_t<=counter_t+1; ENDIF; ELSE--计数到达输入值后译码输出,所有临时信号清零 ge<=ge_t; shi<=shi_t; bai<=bai_t; counter_t<=0; ge_t<="0000"; shi_t<="0000"; bai_t<="0000"; ENDIF; ENDIF; ENDPROCESS; ENDd; 点阵显示 --8*8点阵显示 LIBRARYIEEE; USEIEEE.STD_LOGIC_1164.ALL; USEIEEE.STD_LOGIC_UNSIGNED.ALL; ENTITYdianzhenIS PORT(clk_2,carry: INSTD_LOGIC; row,q2: OUTSTD_LOGIC_VECTOR(7DOWNTO0));--行,列输出 ENDdianzhen; ARCHITECTUREfOFdianzhenIS SIGNALrow_temp,q2_temp: STD_LOGIC_VECTOR(7DOWNTO0); SIGNALcnt: INTEGERRANGE0TO7; BEGIN p1: PROCESS(clk_2,carry)--计数8行 BEGIN IF(clk_2'EVENTANDclk_2='1')THEN IF(cnt=7)THENcnt<=0; ELSE cnt<=cnt+1; ENDIF; ENDIF; ENDPROCESS; p2: PROCESS(clk_2,cnt,carry) VARIABLEstate,temp: INTEGERRANGE0TO1; BEGIN IF(carry'eventandcarry='1'andstate=0)THEN state: =1; ELSIF(carry'eventandcarry='1'andstate=1)THEN IFtemp=0THEN temp: =temp+1; state: =1; ELSIFtemp=1THEN temp: =0; state: =0; ENDIF; ENDIF; IF(clk_2'EVENTANDclk_2='1'ANDstate=0)THEN--行扫描 CASEcntIS WHEN0=>row_temp<="11111110";q2_temp<="00011000"; WHEN1=>row_temp<="11111101";q2_temp<="11111111"; WHEN2=>row_temp<="11111011";q2_temp<="10100101"; WHEN3=>row_temp<="11110111";q2_temp<="11000011"; WHEN4=>row_temp<="11101111";q2_temp<="01111110"; WHEN5=>row_temp<="11011111";q2_temp<="00011000"; WHEN6=>row_temp<="10111111";q2_temp<="00011000"; WHEN7=>row_temp<="01111111";q2_temp<="11111111";--显示空载标志“空” WHENOTHERS=>NULL; ENDCASE; ELSIF(clk_2'EVENTANDclk_2='1'ANDstate=1)THEN CASEcntIS WHEN0=>row_temp<="11111110";q2_temp<="00010000"; WHEN1=>row_temp<="11111101";q2_temp<="11111111"; WHEN2=>row_temp<="11111011";q2_temp<="00111110"; WHEN3=>row_temp<="11110111";q2_temp<="01100010"; WHEN4=>row_temp<="11101111";q2_temp<="10111110"; WHEN5=>row_temp<="11011111";q2_temp<="00111110"; WHEN6=>row_temp<="10111111";q2_temp<="00100010"; WHEN7=>row_temp<="01111111";q2_temp<="00100110";--显示载客标志“有” WHENOTHERS=>NULL; ENDCASE; ENDIF; ENDPROCESS; row<=row_temp; q2<=q2_temp; ENDf; 五、功能说明 本程序能完成的功能有: 全部基本功能以及夜间行驶的不同单价计费。 体现在实验板上为: btn7控制空驶及载人; btn8控制行驶中的等待及继续行驶; btn6控制夜间行驶或白天行驶; btn5控制数码管显示3种不同信息,A计费总价、B行驶里程、C等待时间 空驶时,点阵显示汉字“空”,载人时显示汉字“有” 数码管最左端用来显示A、b、c三个字母,右数4个数码管用来数字。 六、故障及问题分析 编写程序时注意到要求4中,“用按键控制出租车空驶、载客状态并用点阵显示空驶、载客状态”,即按下并松开按键会触发计量模式的改变,而不是以前的触发信号为“1”及为1状态,信号为“0”即为0状态。 可编写时没有考虑到这点,因此在第一遍下载时设定引脚为按键,却按拨码开关的模式去边学程序,所以导致无法正常实现转换计费模式,在仔细考虑题目要求后修改程序得到了解决。 第一遍编写时,直接把显示的车费当成了结算车费,而没有考虑到这是时时显示当前车费,最后下车结算时才加上燃油附加费,在第二次课程验收仿真波形时被老师提醒后改正。 由于我最主要的计量部分使用的是模拟算法,将btn按下松开的信号转化成btn1和btn2数值的变换,即控制行驶与否,等待与否,所以这部分并没有出现什么硬性问题。 顶层文件的编写难度较大,故而采用模块原理图连接后再直接生成顶层文件代码的方式。 但在连接原理图的时候由于粗心,有两个输入端口相连了,出现了端口重复赋值的编译问题,查了很久资料仍然是解决不了,在重新连接的时候才发现这个问题。 七、总结和结论 本次设计的首要问题是如何实现等待计时和行驶里程的不同计费,对于里程和等待时间的计数都使用的是计数器的原理,通过bnt1和btn2信号的不同值实现在不同情况下的计数;通过分频产生的1HZ对应的周期频率关系,由1HZ的信号控制计量模块,由控制器选择产生的信号作为计费模块的输入信号。 EDA课程设计中对于各个模块的设计是基础,这次实验就让我深刻的体会的了这一点。 本来开起来很庞杂的一个任务,被拆分成各个模块依次调试完成后,就很容易查错增删功能。 首先要分析清楚各个模块的功能,然后分别进行编程设计、验证,然后使用VHDL语言中的元件例化语句,将各个模块组合到一起,实现总的设计功能。 为期四周的数电实验可以说不是一个很短的时间,但是没有好好利用也会让这个任务赶得非常紧张,我之前一直没有考虑利用空闲时间提前到实验室下载验证一下软件,导致最后一天验收之前出现的硬件问题忙的焦头烂额,不能很好的冷静处理。 只能记住并提醒自己下次要好好分配利用时间,才能有个满意的结果。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北邮 EDA 实验 报告