EDA课程设计

更新时间:2023-10-28 08:54:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

在系统编程技术课程设计 课程名称任课教师设计题目班级 姓名 学号 日期 在系统编程技术 谭敏 出租车自动计费器 05自动化(1)班 王娜 0510203027 2008年1月1日

1

出租车自动计费器EDA设计

1、题目分析

1.1 设计要求

设计一个出租车自动计费器,计费包括起步价、行车里程计费、等待时间计费3部分;用3位数码管显示金额,最大值为999.9元,最小计价单元为0.1元,行程3公里内,且等待时间3分钟以内,起步价为8元,超过3公里,以每公里1.6元计费,等待时间单价为每分钟1元;用两位数码管显示总里程,最大为99公里,用两位数码管显示等待时间,最大值为59MIN。

1.2设计原理

根据层次化设计理论,该设计问题自顶向下可分为分频模块、控制模块、计量模块、译码和动态扫描显示模块,其系统框图如下图所示,各模块功能如下所述。 FPGA

时钟信号 分频器 计费 译码 显示 等待信号 控制器 公里脉冲 计时 计程 计费/复位 出租车自动计费器系统方框图

1.3 模块分析

(1)分频模块:

分频模块对频率为240HZ的输入脉冲进行分频,得到的频率为16HZ,10HZ,1HZ的3种频率。该模块产生频率信号用于计费,每个1HZ脉冲为0.1元计费

控制,10HZ信号为1元的计费控制,16HZ信号用于1.6元计费控制。 (2)计量模块:

计量控制模块是出租车计费器系统的主体部分,该模块主要完成等待时间功能、计价功能、计程功能,同时产生三分钟的等待计时使能控制信号EN1、行程3公里外达的使能控制信号EN0。其中计价功能主要完成的任务是:行程3公里

2

内,且等待时间3分钟以内,起步价为8元,超过3公里,以每公里1.6元计费,等待时间单价为每分钟1元;计时功能完成的任务是:计算乘客的等待时间,计时器的量程为59分钟,满量程自动归零。计程功能主要完成的任务是:计算乘客所行驶的公里数,计时器的量程为99公里,满量程自动归零。 (3)译码显示模块:

该模块经过8选1选择器将计费数据(4位BCD码)、计时数据(2位BCD码)、计程数据(2位BCD码)动态显示输出。其中计费数据JIFEI4—JIEFEI1送入显示译码模块进行译码,最后送至以百元、十元、元、角为单价对应的数码管上显示,最大显示为999.9元;计时数据送入显示译码模块进行译码,最后送至以分为单位对应的数码管上显示,最大显示为59S;计程数据送入显示译码模块进行译码,最后送入以公里为单位的数码管上显示,最大显示为99公里。

2、出租车自动计费器的层次化设计方案

根据选定的方案,以自顶向下的方法实现此方案,编写应用程序并仿真画出波形图以及原件符号图,

(1)该电路的核心部分就是计数分频电路,通过VHDL语言的顺序语句

IF-THEN-ELSE 根据一个或一组条件来选择特定的执行通道,生成计费数据,计时数据和里程数据。

其VHDL源程序(Ⅰ)如下

library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity taxi is

port (clk_240:in std_logic; ---频率为240hz的时钟 start: in std_logic; ---计价时能信号 stop: in std_logic; ---等待信号

fin: in std_logic; ---公里脉冲信号 char1,char2,char0,char3:out std_logic_vector(3 downto 0); ----费用数据 km1,km0, :out std_logic_vector(3 downto 0); ----公里数据 min1,min0:out std_logic_vector(3 downto 0)); ----等待时间 end taxi;

architecture behav of taxi is

signal f10,f16,f1:std_logic ; -----频率为10HZ,16HZ,1HZ的信号 signal q10:integer range 0 to 23; ----24分频器 signal q16:integer range 0 to 14; -----15分频器 signal q1:integer range 0 to 239; ------240分频器 signal w:integer range 0 to 59; -----秒计数器

signal c3,c2,c1,c0:std_logic_vector(3 downto 0); ----10进制费用计数器 signal k1,k0:std_logic_vector(3 downto 0); ----公里计数器

3

signal m1:std_logic_vector(2 downto 0); -----分的10位计数器

signal m0:std_logic_vector(3 downto 0); -----分的个计数器

signal en1,en0,f:std_logic; -----时能信号 begin

feipin:process(clk_240,start) begin

if clk_240'event and clk_240='1' then

if start ='0'then q10<=0;q16<=0;f<='0';f10<='0';f16<='0'; else

if q10=23 then q10<=0;f10<='1'; -----此IF 语句得到频率为10HZ的信号 else q10<=q10+1;f10<='0'; end if;

if q16=14 then q16<=0;f16<='1'; ----此IF 语句得到频率为16HZ的信号

else q16<=q16+1;f16<='0'; end if ;

if q1=239 then q1<=0;f1<='1'; ----此IF 语句得到频率为1HZ的信号

else q1<=q1+1;f1<='0'; end if ;

if en1='1' then f<=f10; ----此IF 语句得到计数脉冲f elsif en0='1'then f<=f16; else f<='0'; end if ; end if; end if;

end process;

main: process(f1) begin

if f1'event and f1='1'then if start ='0' then

w<=0;en1<='0';en0<='0';m1<=\elsif stop ='1'then

if w=59 then w<=0; ----此IF 语句完成等待计时 if m0=\ ----此IF 语句分计数 if m1<=\else m1<=m1 +1; end if;

else m0<=m0+1; end if ;

if m1&m0>\ ----此IF 语句得到en1使能信号

4

else en1<='0'; end if ;

else w<=w+1; en1<='0'; end if;

elsif fin='1'then

if k0=\ ----此IF 语句完成公里脉冲计数 if k1<=\

else k1<=k1 +1; end if;

else k0<=k0+1; end if ;

if k1&k0>\ ----此IF 语句得到en0使能信号 else en0<='0'; end if;

else en1<='0';en0<='0'; end if ;

char3<=c3;char2<=c2;char1<=c1;char0<=c0; -----费用数据输出

km1<=k1;km0<=k0;min1<='0'&m1;min0<=m0; -----公里数据、分钟数据输出 end if;

end process main; jifei:process(f,start) begin

if start ='0'then c3<=\elsif f'event and f='1'then

if c0=\ ----此IF 语句完成对费用的计数 if c1=\if c2=\if c3<=\else c3<=c3+1; END IF ;

else c2<=c2+1; END IF ;

else c1<=c1+1; END IF ;

else c0<=c0+1; END IF ; end if;

end process jifei; end behav;

该源程序包含3个进程模块。FENPIN进程对频率为240HZ的输入脉冲进行分

5

源程序中输入信号D[3。。0]为BCD码选择输入,Q[6。。0]为七段译码输出(高电平有效)。 其输出波形如图 4(a)所示,原件符号如图(b)所示

(a) 七段译码显示译码器di_LE仿真输出波形

(b) 七段译码显示译码器di_LED

3、 出租车自动计费器顶层电路电路的设计和仿真

根据出租车自动计费器系统方框图出租车自动计费器顶层电路分为4个模块,它们是出租车自动计费器系统的主体FPGA电路taxi模块,8选1选择器mux8_1模块,模8计数器se模块,七段数码显示译码器di-LED模块,生成动态扫描显示片选信号ide3-8译码器模块decode3-8,下图是顶层电路原理图。

11

(5)出租车自动计费器顶层电路原理图

按已确立的层次化设计思路,在QuarusⅡ图形编译器中分别调入前面的层次化设计方案中所设计的模块的元件富豪taxi.sym、mux8_sym、di_LED.sym、并加入相应的输入输出引脚辅助元件。而3_8.sym可以利用宏功能向导Mega Wizard Plug-In Manager 定制。尔后根据上图完成出租车自动计费器的顶层原理图输入。电路练好线,对其编译和方针。争取俄编译后仿真输出波形和元件符号如下

(6)出租车自动计费器顶层电路原件符号图

4、结论

出租车自动计费器,计费包括起步价、行车里程计费、等待时间计费3部分;用3位数码管显示金额,最大值为999.9元,最小计价单元为0.1元,行程3公里内,且等待时间3分钟以内,起步价为8元,超过3公里,以每公里1.6元计费,等待时间单价为每分钟1元;用两位数码管显示总里程,最大为99公里,用两位数码管显示等待时间,最大值为59MIN

12

5、课程总结

本次的MAX+plusⅡ应用系统设计对我们来说还算是比较得心应手,虽然只上了一学期的EDA课,但是由于我们两个月的实验课学习与训练,所以设计起来思路比较清晰,从方案的选定到软件的调试再到硬件的制作,整个过程完成的都比较顺利,当然其中也遇到了很多问题,比如我们是用汇编语言来编程的,但是功能不能实现,后来经过多次修改直至编程调试成功。然而,在仿真波形时却发现taxi的波形有误,只有char3char2char1char0显示数字km1km0、min1min0俊没有数字。引脚锁定是主程序taxi,顶层文件不容易锁定,本程序的关键时taxi来控制的,但在硬件调试时起初发现,计时器并不计时,经过仔细分析检查,知道,需出租车停止并等待3分钟才有显示。

我本次主要设计的是设计一个出租车自动计费器,计费包括起步价、行车里程计费、等待时间计费3部分;用3位数码管显示金额,最大值为999.9元,最小计价单元为0.1元,行程3公里内,且等待时间3分钟以内,起步价为8元,超过3公里,以每公里1.6元计费,等待时间单价为每分钟1元;用两位数码管显示总里程,最大为99公里,用两位数码管显示等待时间,最大值为59MIN。而且这次的设计是我独立完成的,在设计过程把我们所学过的编程语言运用的如此完善。

通过本次自主完成MAX+plusⅡ的应用系统设计,让我更深入地了解了EDA这门学课应用广泛性,也让我们又一次体验了应用而EDA设计的方法,这为我们以后的毕业设计打下了坚实的基础。

参考文献

(1)刘昌华 数字逻辑EDA设计与实践-----MAX+PLUSⅡ与QuartusⅡ双剑合

璧 国防工业出版社2006年8月第一版

(2)付家才 EDA工程实践技术 化学工业出版社2007年3月北京第二版第

一次印刷

(3)赵明富 李立军 石新锋等EDA技术基础 北京大学出版社2007年6

月第一次印刷

(4)潘松 黄继业 EDA技术使用教程 科学出版社2007年5月第26次

印刷

(5)丁文霞 EDA技术在现代数字系统中的应用 电子技术应用 2000.11 (6)王成华 邓仰东 数字集成系统的结构设计与高层次综合 北京清华大学

出版社 2000

(7)赵雅兴 FPGA原理、设计与应用 天津大学出版社 1999年4月 (8)卢毅 赖杰 VHDL与数字设计 北京科学出版社 2001年

13

附录源程序 :

(1) 出租车自动计费器系统的主体FPGA电路taxi模块

library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity taxi is

port (clk_240:in std_logic; ---频率为240hz的时钟 start: in std_logic; ---计价时能信号 stop: in std_logic; ---等待信号

fin: in std_logic; ---公里脉冲信号 char1,char2,char0,char3:out std_logic_vector(3 downto 0); ----费用数据 km1,km0, :out std_logic_vector(3 downto 0); ----公里数据 min1,min0:out std_logic_vector(3 downto 0)); ----等待时间 end taxi;

architecture behav of taxi is

signal f10,f16,f1:std_logic ; -----频率为10HZ,16HZ,1HZ的信号 signal q10:integer range 0 to 23; ----24分频器 signal q16:integer range 0 to 14; -----15分频器 signal q1:integer range 0 to 239; ------240分频器 signal w:integer range 0 to 59; -----秒计数器

signal c3,c2,c1,c0:std_logic_vector(3 downto 0); ----10进制费用计数器 signal k1,k0:std_logic_vector(3 downto 0); ----公里计数器

signal m1:std_logic_vector(2 downto 0); -----分的10位计数器

signal m0:std_logic_vector(3 downto 0); -----分的个计数器

signal en1,en0,f:std_logic; -----时能信号 begin

feipin:process(clk_240,start) begin

if clk_240'event and clk_240='1' then

if start ='0'then q10<=0;q16<=0;f<='0';f10<='0';f16<='0'; else

if q10=23 then q10<=0;f10<='1'; -----此IF 语句得到频率为10HZ的信号 else q10<=q10+1;f10<='0'; end if;

if q16=14 then q16<=0;f16<='1'; ----此IF 语句得到频率为16HZ的信号

else q16<=q16+1;f16<='0'; end if ;

if q1=239 then q1<=0;f1<='1'; ----此IF 语句得到频率为1HZ的信号

14

else q1<=q1+1;f1<='0'; end if ;

if en1='1' then f<=f10; ----此IF 语句得到计数脉冲f elsif en0='1'then f<=f16; else f<='0'; end if ; end if; end if;

end process;

main: process(f1) begin

if f1'event and f1='1'then if start ='0' then

w<=0;en1<='0';en0<='0';m1<=\elsif stop ='1'then

if w=59 then w<=0; ----此IF 语句完成等待计时 if m0=\ ----此IF 语句分计数 if m1<=\else m1<=m1 +1; end if;

else m0<=m0+1; end if ;

if m1&m0>\ ----此IF 语句得到en1使能信号

else en1<='0'; end if ;

else w<=w+1; en1<='0'; end if;

elsif fin='1'then

if k0=\ ----此IF 语句完成公里脉冲计数 if k1<=\

else k1<=k1 +1; end if;

else k0<=k0+1; end if ;

if k1&k0>\ ----此IF 语句得到en0使能信号 else en0<='0'; end if;

else en1<='0';en0<='0'; end if ;

15

本文来源:https://www.bwwdw.com/article/cqe2.html

Top