课程设计(论文)-基于FPGA的出租车计费器设计.docx_第1页
课程设计(论文)-基于FPGA的出租车计费器设计.docx_第2页
课程设计(论文)-基于FPGA的出租车计费器设计.docx_第3页
课程设计(论文)-基于FPGA的出租车计费器设计.docx_第4页
课程设计(论文)-基于FPGA的出租车计费器设计.docx_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计任务书学生姓名: 专业班级:电子科学与技术0801班 指导教师: 工作单位: 信息工程学院 题 目: 出租车计费器的设计 初始条件:本次设计使用quartus软件编程,最终在fpga上实现。要求完成的主要任务: (包括课程设计工作量及技术要求,以及说明书撰写等具体要求) 实现计费功能,计费标准为武汉起步3元,1公里后4元,1.5公里后5元,2公里后6元,2.5公里后7元,车行3公里后跳为8元,以后为1.4元/公里,当计费达到20元后,每公里加收50%的车费,车停止每3分钟增加0.7元。车费动态扫描显示,有一位小数。时间安排:1、 2011 年 1 月 8 日集中,作课设具体实施计划与课程设计报告格式的要求说明。2、 2011 年 1 月 9 日,查阅相关资料,学习电路的工作原理。2、 2011 年 1 月 10 日 至 2011 年 1 月 18 日,方案选择和电路设计。2、 2011 年 1 月 18 日 至 2011 年 1 月 20 日,电路调试和设计说明书撰写。3、 2011 年 1 月 21 日上交课程设计成果及报告,同时进行答辩。课设答疑地点:鉴主13楼电子科学与技术实验室。指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日目录摘要iabstractii1 绪论12 设计内容及要求22.1设计的目的及主要任务22.1.1设计的目的22.1.2 设计任务及主要技术指标22.2设计思想23 设计原理及单元模块设计33.1 设计原理及方法33.2 单元模块设计33.2.1分频/计量控制模块33.2.2八进制计数器43.2.3 三八译码器模块43.2.4七段译码器模块53.2.5停车计时模块63.2.7计费模块74电路的仿真及分析84.1 单元模块的仿真及分析84.1.1八进制计数器仿真84.1.2 译码显示模块95 心得体会10参考文献11附录12武汉理工大学电子线路eda课程设计说明书摘要本文介绍了一种采用单片fpga芯片进行出租车计费器的设计方法,主要阐述如何使用新兴的eda器件取代传统的电子设计方法,利用fpga的可编程性,简洁而又多变的设计方法,缩短了研发周期,同时使出租车计费器体积更小功能更强大。本设计实现了出租车计费器所需的一些基本功能,计费包括起步价、行车里程计费、等待时间计费,同时考虑到出租行业的一些特殊性,更注重了把一些新的思路加入到设计中。主要包括采用了fpga芯片,使用vhdl语言进行编程,使其具有了更强的移植性,更加利于产品升级。关键词:vhdl;计费器;quartus;fpgaabstractthis paper describes the use of a single chip fpga for the design of accounting-fee machine, mainly on how to use the emerging eda electronic devices designed to replace traditional methods, using the programmable fpga, concise and changing the design ways to shorten the development cycle, so that taxi accounting-fee machine in a smaller more powerful. the design and implementation of the taxi accounting-fee machine for some basic functions, including billing starting price, driving metered, the waiting time billing, taking into account the special nature of some of the taxi industry, to pay more attention to a number of new ideas into the design. mainly including the use of the fpgachip, the use of vhdl programming, so as to make it a stronger transplanted, and more conducive to product upgrades. key words: vhdl, accounting-fee machine , quartus , fpga281 绪论人类社会已经进入信息化时代,信息社会的发展离不开电子产品的进步。现代电子产品在性能提高、复杂度降低的同时,价格却一直呈下降趋势,而且产品更新换代的步伐也越来越快,实现这种进步的主要原因就是生产制造技术和电子设计技术的发展。前者以微细加工技术为代表,目前已进展到深亚微米阶段,可以在几平方厘米的芯片上集成数万个晶体管;后者的核心就是eda技术。没有eda技术的支持,想要完成超大规模集成电路的设计制造是不可想象的,反过来,生产制造技术的不断进步又必须对eda技术提出新要求。eda代表了当今电子设计技术的最新发展方向,它的基本特征是:设计人员按照“自顶向下”的设计方法,对整个系统进行方案设计和功能划分,系统的关键电路用一片或几片专用集成电路(asic)实现,然后采用硬件描述语言(vhdl)完成系统行为级设计,最后通过综合器和适配器生成最终的目标器件1。可编程逻辑器件自20世纪70年代以来,经历了pal、gal、cpld、fpga几个发展阶段,其中cpld、fpga属高密度可编程逻辑器件,目前集成度以高达200万门/片,它将掩膜asic集成度高的优点和可编程逻辑器件设计生产方便的特点结合在一起,特别适合于样品研制和小批量产品开发,使产品能以最快的速度上市,而当市场扩大时,它可以和容易地转由asic实现,因此开发风险也大为降低。cpld/fpga器件已成为现代高层次电子设计方法的实现载体。 vhdl2是一种全方位的硬件描述语言,包括系统行为级、寄存器传输级和逻辑门级多个设计层次,支持结构、数据流和行为3种描述形式的混合描述,因此vhdl几乎覆盖了以往各种硬件描述语言的功能,整个自顶向下或自底向上的电路设计过程都可以用vhdl来完成。另外,vhdl还有以下优点:vhdl的宽范围描述能力使它成为高层次设计的核心,将设计人员的工作重心转移到了系统功能的实现和调试上,只需要花较少的精力用于物理实现;vhdl可以用简洁明确的代码描述来进行复杂控制逻辑的设计,灵活且方便,而且也便于设计结果的交流、保存和重用;vhdl的设计不依赖于特定的器件,方便了工艺的转换。vhdl是一个标准语言,为众多的eda场上支持,因此移植性好。2 设计内容及要求2.1设计的目的及主要任务2.1.1设计的目的(1)学会在quartus3环境中运用vhdl语言设计方法构建具有一定逻辑功能的模块,并能运用图形设计方法完成顶层原理图的设计。(2)掌握出租车自动计费器的主要功能与在fpga中的实现方法。 2.1.2 设计任务及主要技术指标(1)实现计费功能,计费标准为武汉起步3元,1公里后4元,1.5公里后5元,2公里后6元,2.5公里后7元,车行3公里后跳为8元,以后为1.4元/公里,当计费达到20元后,每公里加收50%的车费,车停止每3分钟增加0.7元。车费动态扫描显示,有一位小数。(2)运用quartus软件中的仿真功能对所设计的出租车自动计费器的各个模块及顶层电路的功能进行仿真分析。(3)将所设计的整个系统写入fpga器件中,加上需要的外围电路在实验箱上实现整个系统的硬件搭建。2.2设计思想本次设计首先在quartus环境中对出租车自动计费器的各个部分利用vhdl这一硬件描述语言予以设计,生成模块。而整个设计的核心部分就在分频/计量模块,该模块完成的功能主要包括计费脉冲的产生,等待计时、计价、计程功能。随后运用quartus中的仿真功能对其予以仿真,从仿真的结果中分析程序的正确性。待所有模块的功能正确之后,运用原理图搭建顶层电路并进行整体仿真直至达到最初的设计要求,最后再在实验箱上检验设计的正确与否。3 设计原理及单元模块设计3.1 设计原理及方法根据层次化设计理论,该设计问题自顶向下4可分为分频模块、控制模块、计量模块、译码动态扫描显示模块,其系统框图如图所示。图3-1 出租车自动计费器系统框图 如上图所示:由于缺乏条件,所以在设计中只能模拟出出租车计费其的功能,根据设计要求,可以在设计中控制信号来模拟路程计数的动态变化、计时整三分钟时刻的到来,车处于行驶状态还是停止状态的判断信号。当这些信号做出某些动作时,则可以触发计费的变化或路程的变化或计停止时间的变化。这些变化可以通过译码,宣示电路宣示在数码管上。3.2 单元模块设计3.2.1分频/计量控制模块 由于课程设计中需要用到较多的时钟信号,故分频器可调式设计方式。即分频技术的次数采用变量的形式,在用到某一频率的信号时,可调用该分频器模块,再输入与此信号频率的计数总次数即可。以下为分频器的模块原理框图 图3-2-13.2.2八进制计数器设计中用到八进制计数器的八个计数状态,来分别选中数码管要宣示的数据和相应的数码管。一下为八进制模块原理框图图 图3-2-23.2.3 三八译码器模块设计中由于需要用到八位气段数码管做宣示,其控制需要用到八个状态选中一位数码管,并把相应的数据送到数码管。若这八个状态快速轮流的变化,则可以将相应的数据静态的宣示在数码管上。当扫描的速度远快与数据变化的速度,则可观察到数码管上数据的变化。一下为三八译码器模块原理图 图3-2-33.2.4七段译码器模块通常在计数的过程中,我们都采用十进制计数,而计时间时还要用到六进制,而这些书只要用到四位二进制数就能都表示出来。当数码管宣示时,我们需要控制它的七个宣示段或者八个宣示段,故需要七位二进制数或八位二进制时来控制,故需要利用七段译码器将四位二进制的数据信息转化为七位或八位的控制信息。一下为七段译码器的模块原理框图 图3-2-43.2.5停车计时模块 设计指标中要求,当出租车停止时,每满三分钟,计费器所及费用要加上0.7元,我们可以这样做,当计时满三分钟时,计数器发出一个相当于进位信号的触发信号取通知计费器控制器去计费参数去进行修正,当然出租车行驶时则计时器计时功能被屏蔽掉,这可以通过关掉计时器计时的时钟源来实现。时间要宣示出去,可以通过计数器来分别选中每一位数据并送到数码管上。一下为计时块 的原理框图 图3-3-53.2.6行驶记路程模块只要出租车处于行驶中,记路程的模块就会工作,此时记录路程的数据就会随着行驶的过程慢慢的更新,进而通过对这些数据的判别,取控制计费数据的更新变化。在设计中,我是这样实现的,当计路程的脉冲到来时,路程数据就自加一,并判断是否越界,即超过了九。当超过了九,则低位数据归零,高位数据自加一,然后再逐次对路程数据的高位进行判断,其中以上脉冲是模拟0.1公里二设置的。当计脉冲记到个时,则需要修正计费数据的记录。我们在此设置一个触发脉冲取通知计费模块要修正数据了。然后计费器模块就会跟根据触发信号的来源判断,它要根据哪些数据进行变化。下图为路程计量原理框图 图3-2-63.2.7计费模块计费也是本次设计的关键,因为它对计费数据的修正要根据各种判断,比如要求数据修正的触发脉冲来自于何处,到底是时间的变化要求自己修改数据,还是路程的变化。知道了是时间的变化,则还要判断当前行驶路程是否大于二十公里,然后根据相应的规则进行数据的修正。若是路程的变化,则就相当的麻烦了,首先要判断当前行驶公里是否大于二十公里,若小于二十公里,则还要判断当前行驶公里数处于何数据段,然后分支去处理。另外,还要根据各种外部信号来处理当前的计费数据,如外部的清零信号,停止信号等信号做出相对应的处理。下图为计费控制模块原理框图 图3-2-74电路的仿真及分析在vhdl设计流程中,设计的验证是一个重要但费时的环节。由于验证方法手段不断改进和提高,对于一个系统的设计,提倡用软件、硬件协同验证方法,加速仿真过程。有经验的设计师认为,一个设计项目的成功与否,关键是仿真,其中涉及工作的90%时间花在仿真验证上。仿真有功能仿真5与时序仿真之分。在逻辑综合和布线之前对vhdl模型的逻辑功能进行仿真,可以有效提高效率。以下是对本次设计的各个模块以及顶层电路进行的功能仿真及分析。4.1 单元模块的仿真及分析4.1.1八进制计数器仿真 图4-1-1 图4-4-1为八进制计数器的功能仿真图,其中clk为时钟脉冲输入端,q为计数控制信号输出端,可以看出,当时钟沿上升时刻到来时,计数起的输出q就自加一,也就是q表示的三位二进制加一。当计数器输出端加到七时,再来一个脉冲上升沿,则计数的输出端归零,必要的时候,还可以设置一输出端,用来表示进位信号,表示当前计数器已经计满了八个数,用以提示下一级,使其作出相应的行为。本设计中并没有加入这一功能,因为本设计八进制计数器的功能主要是利用其计数的八个状态,进而去轮流控制数码管的位选信号和数码管的段选属兔信息。4.1.2 译码显示模块图4-1-2上图为三线-八线译码器的功能仿真图,其中前三个端口为信号输入端,也就上一图所示的八进制计数器的输出端。而后八个端口即为八位二进制信号的输出端。由上图可以看出:当datain(2 downto 0)=”000”,则dataouta(7 downto 0)=”01111111”当datain(2 downto 0)=”001”,则dataouta(7 downto 0)=” 10111111”当datain(2 downto 0)=”010”,则dataouta(7 downto 0)=”11011111”当datain(2 downto 0)=”011”,则dataouta(7 downto 0)=”11101111”当datain(2 downto 0)=”100”,则dataouta(7 downto 0)=”1111011”当datain(2 downto 0)=”101”,则dataouta(7 downto 0)=”11111011”当datain(2 downto 0)=”110”,则dataouta(7 downto 0)=”11111101”当datain(2 downto 0)=”111”,则dataouta(7 downto 0)=”11111110”5 心得体会本次课程设计,我自己感觉收获很大。我利用硬件描述语言设计设计出了出租车计费器,并基本实现了出租车计费的功能。整个设计过程使我对数字电路这门课程有了更深的了解,因为课程设计本身要求将以前所学的理论知识运用到实际的电路设计当中去,在电路的设计过程中,无形中便加深了对数字电路的了解及运用能力,对课本以及以前学过的知识有了一个更好的总结与理解;以前的数字实验只是针对某一个小的功能设计,而此次得eda课程设计对我们的总体电路的设计的要求更严格,需要通过翻阅复习以前学过的知识确立了实验总体设计方案,然后逐步细化进行各模块的设计;当然,在课程设计中也遇到了很多的问题,以前我一直时一个模块设计到底的忠实信徒,因为我觉得那样可以减少程序的行数,毕竟可以省掉原件例化的部分。当这次我却遭遇难以解决的困难。在初次设计中我用一个模块谢了整个的系统,后来编译出了错,这让我着实犯困,排出错后,又重新构架,它使我对电路故障的排查有了很大的提高;再次,通过此次课程设计,我对设计所用到的软件有了更加深刻地了解,这对我们以后的工作和学习的帮助都很有用处。参考文献1潘松,黄继业eda技术与vhdl北京:清华大学出版社,2007.12宋嘉玉,孙丽霞eda实用技术北京:人民邮电出版社,2006.12 3齐洪喜,陆颖vhdl电路设计实用技术北京:清华大学出版社,2004.54刘艳萍,高振斌,李志军eda实用技术及应用北京:国防工业出版社,2006.15章彬宏eda应用技术北京:北京理工大学出版社,2007.7附录-3进制计数器源程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt3 isport (clk,rst:in std_logic;q:out std_logic);end entity;architecture bhv of cnt3 isbeginprocess(clk)variable cnter :std_logic_vector (1 downto 0);beginif (rst=1) thencnter:=00;q=0;elseif rising_edge(clk) then if cnter=10 then cnter :=00;q=1;elsecnter:=cnter+1;q=0;end if;end if;end if;end process;end bhv;-8进制计数器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt8 isport (clk:in std_logic;q:out std_logic_vector(2 downto 0);end entity;architecture bhv of cnt8 isbeginprocess(clk)variable cnter :std_logic_vector (2 downto 0);beginif rising_edge(clk) then if cnter=111 then cnter :=000;elsecnter:=cnter+1;end if;end if;q=cnter;end process;end bhv;-10进制计数器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt10 isport(clk,rst:in std_logic; co:out std_logic; q:buffer std_logic_vector(3 downto 0);end entity;architecture bhv of cnt10 issignal cnter :std_logic_vector (3 downto 0);beginprocess(clk,rst) beginif (rst=1) thencnter=0000;co=0;elseif rising_edge(clk) then if cnter=1001 then cnter =0000;co=1;elsecnter=cnter+1;co=0;end if;end if;end if;q=cnter;end process;end bhv;-加法器但要判断是否溢出library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt10_7 isport(clk,rst:in std_logic;co:buffer std_logic;q:out std_logic_vector(3 downto 0);end entity;architecture bhv of cnt10_7 issignal cnter :std_logic_vector (3 downto 0);beginprocess(clk,rst)beginif (rst=1) thencnter=0000;co=0;elseif rising_edge(clk) then if cnter=1001 then cnter 2 then cnter=cnter+13;co=1;else cnter=cnter+7;co=0;end if;end if;end if;q=cnter;end process;end bhv;-清零为三的十进制计数器 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt10_d isport(clk,rst:in std_logic;co:out std_logic; q:out std_logic_vector(3 downto 0);end entity;architecture bhv of cnt10_d issignal cnter :std_logic_vector (3 downto 0);beginprocess(clk,rst)beginif (rst=1) thencnter=0011;co=0;elseif rising_edge(clk) then if cnter=1001 then cnter =0000;co=1;elsecnter=cnter+1;co=0;end if;end if;end if;q=cnter;end process;end bhv-24进制计数器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt24 is port (clk,rst:in std_logic; c1,c0:buffer std_logic_vector(3 downto 0);end entity;architecture bhv of cnt24 isbeginprocess(clk,rst)variable cnter :integer:=0 ;beginif (rst=1) thenc1=0000;c0=0000; elseif rising_edge(clk) then if (c0=1001 or (c0=0011 and c1=0010)then c0=0000;if c1=0010thenc1=0000;elsec1=c1+1;end if;elsec0=c0+1;end if;end if;end if;end process;end bhv;-60进制计数器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt60 isport (clk,rst:in std_logic; co:out std_logic; c1,c0:buffer std_logic_vector(3 downto 0);end entity;architecture bhv of cnt60 isbeginprocess(clk,rst)variable cnter :integer:=0 ;beginif (rst=1) thenc1=0000;c0=0000;co=0;elseif rising_edge(clk) then if (c0=1001) then c0=0000;if c1=0101thenc1=0000;co=1;elsec1=c1+1;co=0;end if;elsec0 led7s led7s led7s led7s led7s led7s led7s led7s led7s led7s led7s led7s led7s led7s led7s led7s null;end case;end process;end one;-分频器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fp isgeneric (n:integer); port ( clk:in std_logic; fpq:buffer std_logic);end entity;architecture bhv of fp isbeginprocess(clk)variable cnter :integer:=0;beginif rising_edge(clk) then if cnter=n-1 then cnter :=0;fpq=not fpq;else cnter:=cnter+1;end if;end if;end process;end bhv;-记路程模块源程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity mil isport(clk,rst,stop,d:in std_logic;wx:in std_logic_vector(2 downto 0);p_mil:out std_logic;datain:out std_logic_vector(3 downto 0);end entity mil;architecture one of mil iscomponent fp is generic (n:integer);port (clk:in std_logic;fpq:out std_logic);end component;component cnt10 isport(clk,rst:in std_logic;co:out std_logic;q:out std_logic_vector(3 downto 0);end component;signal clk_mil,rst_s,clk_s,cp:std_logic;signal ci_0,ci_1,ci_2,ci_3:std_logic;signal p_5:std_logic_vector(2 downto 0);signal mil3,mil2,mil1,mil0:std_logic_vector(3 downto 0);beginu0:cnt10 port map(clk_s,rst_s,ci_0,mil0);u1:cnt10 port map(ci_0,rst_s,ci_1,mil1);u2:cnt10 port map(ci_1,rst_s,ci_2,mil2);u3:cnt10 port map(ci_2,rst_s,ci_3,mil3);clk_s=cp and (not stop);rst_s=rst;process(cp,rst_s)beginif (rst_s=1) thenp_5=000;p_mil=0;elseif rising_edge(cp) and stop=0 then if p_5=100 then p_5 =000; p_mil=1;else p_5 =p_5+1; p_mil datain datain datain datain datain =1110 ;end case;end process;pro3:process(clk,d)variable jsq:integer:=0;beginif rising_edge(clk) then if d=0 thenif jsq=3 thenjsq:=jsq;elsejsq:=jsq+1;end if;if jsq=1 thencp=1;elsecp=0;end if;elsejsq:=0;end if;end if;end process;end architecture;-计时模块源程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity tim isport(clk_time,rst,stop:in std_logic;wx:in std_logic_vector(2 downto 0);p_up:out std_logic; datain:out std_logic_vector(3 downto 0);end entity tim;architecture one of tim iscomponent cnt3 isport (clk:in std_logic;q:out std_logic);end component;component cnt8 isport (clk:in std_logic;q:out std_logic_vector(2 downto 0);end component;component cnt24 isport (clk,rst:in std_logic;c1,c0:buffer std_logic_vector(3 downto 0);end component;component cnt60 isport (clk,rst:in std_logic;co:out std_logic;c1,c0:buffer std_logic_vector(3 downto 0);end component;signal clk,clk_hur,clk_min,co_sec,co_min:std_logic;signal sig_rst:std_logic;signal wx_signal:std_logic_vector(2 downto 0);signal clock_hur1,clock_min1,clock_sec1,clock_hur0,clock_min0,clock_sec0 :std_logic_vector(3 downto 0);beginu_hur:cnt24 port map(clk_hur,sig_rst,clock_hur1,clock_hur0);u_min:cnt60 port map(clk_min,sig_rst,co_min,clock_min1,clock_min0);u_sec:cnt60 port map(clk,sig_rst,co_sec,clock_sec1,clock_sec0);u3:cnt3port map(clk_min,p_up);clk=clk_time and stop;clk_min=co_sec;clk_hur=co_min;sig_rst=rst;wx_signal datain datain datain datain datain datain datain datain null;end case;end process;end architecture;-频率发生器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity taxi_fp isport(clk:in std_logic;clk_time,clk_mil,clk_scan,clk_v:out std_logic);end entity taxi_fp;arch

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论