基于FPGA出租车计价器设计报告(LCD显示).doc_第1页
基于FPGA出租车计价器设计报告(LCD显示).doc_第2页
基于FPGA出租车计价器设计报告(LCD显示).doc_第3页
基于FPGA出租车计价器设计报告(LCD显示).doc_第4页
基于FPGA出租车计价器设计报告(LCD显示).doc_第5页
免费预览已结束,剩余19页可下载查看

下载本文档

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

文档简介

CPLD/FPGA原理及应用课程设计课程设计报告题 目: 出租车计价器 院 (系): 信息科学与工程学院 专业班级: 学生姓名: 学 号: 指导教师: CPLD/FPGA原理及应用课程设计任务书目 录1前言1页码2课程设计目的2页码3课程设计题目描述和要求 2页码4课程设计报告内容2页码4.1分屏模块电路2页码4.2计程模块电路3页码4.3计费模块电路4页码4.4LCD显示屏的输入时钟电路 4页码4.5LCD显示屏模块电路 5页码5各模块源代码6页码5.1分频模块源代码6页码5.2LCD分频模块源代码 7页码5.3计程模块源代码8页码5.4计费模块电路9页码5.5LCD显示模块源代码12页码6总结与体会18页码参考文献 19页码(要求:目录题头用三号黑体字居中书写,隔行书写目录内容。目录中各级题序及标题用小四号黑体)1.前言随着出租车行业的发展,对出租车计费器的要求也越来越高。最近几年出租车行业发展迅速,在全国有几千万家出租车公司。因此出租车计费器市场是庞大的。而出租车计费器成为不可缺少的一部分。出租车计价器是出租车营运收费的专用智能化仪表,随着电子技术的发展,出租车计价器技术也在不断进步和提高。国内出租车计价器已经经历了4 个阶段的发展。从传统的全部由机械元器件组成的机械式,到半电子式即用电子线路代替部分机械元器件的出租车计价器;再从集成电路式到目前的单片机系统设计的出租车计价器,以及FPGA计价器.出租车计价器计费是否准确,运数据的管理是否方便都是人们最关注的。该计价器能实现按时间和里程综合计算车价,能显示里程、总车价等相关信息显示。信息社会的现代电子产品,性能越来越高,复杂度越来越大,更新步伐也越来越快。实现这种进步的主要原因就是微电子技术和电子技术的发展。而电子技术的发展后者的核心就是电子设计自动化技术。EDA是指以计算机为工作平台,融合了应用电子技术、计算机技术、智能化技术的最新成果而开发出的电子CAD通用软件包,它根据硬件描述语言HDL完成的设计文件,自动完成逻辑编译、化简、分割、综合、优化、布局布线及仿真,直至完成对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。没有EDA技术的支持,想要完成超大规模集成电路的设计制造是不可想象的;反过来,生产制造技术的不断进步又必将对EDA技术提出新的要求。本设计采用Verilog HDL语言来设计实现出租车计费系统,具有良好的电路行为描述和系统描述的能力,并在语言易读性和层次化、结构化设计方面,表现了强大的生命力和应用潜力。源程序经ALTERA的Quartus II 9.0软件调试优化,通过下载到特定芯片后,可应用于实际的出租车计费系统中。本次课程设计巩固和运用了所学课程,通过理论联系实际,提高了分析、解决技术实际问题的独立工作能力,通过对一个出租车计费器的设计,进一步熟悉了数字电路系统设计、制作与调试的方法和步骤。12.课程设计目的1.学会在Quartus II环境中运行VHDL语言设计方法构建具有一定逻辑功能的模块,并能运用图形设计方法完成顶层原理图的设计。2.掌握出租车计价器的主要功能与在FPGA中的实现方法。3 设计题目和要求:1. 实现计费功能。按行驶里程计费,车行驶后按1.0元/km计费,当计费器达到或超过20元时,每千米加收50%的车费;2. 设计数码管动态扫描电路,将车费和路程显示出来,有一位小数。3. 实现预置功能:能预置起步费、每公里收费、车行加费里程。4. 用VHDL语言设计符合上述功能要求的出租车计费器,并用层次化设计方法设计该电路。5. 完成电路全部设计后,通过实验下板载验证设计的正确性。4.课程设计报告内容4.1 分频模块电路此模块的功能是对总的时钟进行分频,分出的频率是让计数器用的,因为总的时钟是50M的。设计该模块的时候用了一个32位的计数器,当计数器计到25_000000的时候产生时钟。在仿真的时候为了快速的方便观察,设计了一个50M分频的电路。 4.2 计程模块电路此模块的功能是计算出租车行驶的路程。在出租车启动并行驶的过程中,当时钟clk是上升沿的时候,系统即对路程计数器km0,km1的里程计数器进行加计数。其模块如下:4.3 计费模块电路费用计数器模块用于出租车启动后,根据行驶路程和等待时间计算费用。时间每满1秒,费用计数器加1元。行驶路程超过20公里按1.5元/km计费4.4 LCD显示屏的输入时钟电路此模块的功能是对总的时钟进行分频,分出的频率是让计数器用的,因为总的时钟是50M的。设计该模块的时候用了一个32位的计数器,当计数器计到50的时候产生时钟。在仿真的时候为了快速的方便观察,设计了一个100分频的电路。4.5 LCD显示屏模块电路LCD的显示有两种显示方式动态显示与静态显示,由于在本文中用到了LCD的静态显示和动态显示,在时钟的控制下,当CLK为高电平的时候把费用,公里,时间译码输出。4.6 整体顶层模块电路以上单元模块设计完毕,通过每个单元模块代码的设计以及仿真验证每个模块的真确性,为确保后面整体模块电路的正确性奠定了基础。各模块设计仿真实现后,可分别创建成元件符号。顶层就是将各分模块用Verilog HDL语言或者是图形方法连接起来,便可实现系统电路。其Verilog HDL源代码详见其附录。其生成的顶层原理图如下所示:5单元模块Verilog HDL源代码5.1 计数器的分频模块VerilogHDL源代码library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity pin1hz isport(clkin :instd_logic; reset: IN STD_LOGIC;clkout :outstd_logic);end pin1hz;architecture a of pin1hz isbeginprocess(clkin)variable cnttemp: integer range 0 to 49999999;beginif clkin=1 and clkinevent thenif cnttemp=49999999 then cnttemp:=0;elseif cnttemp25000000 then clkout=1;else clkout=0;end if;cnttemp:=cnttemp+1;end if;end if;end process;end a;5.2LCD的分频模块VerilogHDL源代码LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY PIN100K ISPORT(CLK_50M_IN: IN STD_LOGIC; CLK_100K_OUT: OUT STD_LOGIC);END PIN100K;ARCHITECTURE ARC OF PIN100K ISBEGINPROCESS(CLK_50M_IN)VARIABLE CNTTEMP : INTEGER RANGE 0 TO 499;BEGIN IF CLK_50M_IN =1AND CLK_50M_INEVENT THEN IF CNTTEMP=499 THEN CNTTEMP:=0; ELSE IF CNTTEMP250 THEN CLK_100K_OUT=1; ELSE CLK_100K_OUT =0; END IF; CNTTEMP:=CNTTEMP+1; END IF; END IF;END PROCESS;END ARC;5.3 计程模块VerilogHDL源代码LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY lichen IS PORT(CLK:IN STD_LOGIC; reset:IN STD_LOGIC; km0:out STD_LOGIC_VECTOR(3 DOWNTO 0); km1:out STD_LOGIC_VECTOR(3 DOWNTO 0);END lichen;ARCHITECTURE ART OF lichen ISsignal k0:STD_LOGIC_VECTOR(3 DOWNTO 0);signal k1:STD_LOGIC_VECTOR(3 DOWNTO 0);signal en :std_logic; BEGIN km0=k0; km1=k1;PROCESS(CLK,reset)BEGIN IF(reset=1)THEN -异步复位 k0=0000; k1=0000;ELSIF(CLKEVENT AND CLK=1)THEN IF(k0=9)THEN k0=0000; k1=k1+1; -计数功能的实现 ELSE k0=k0+1; END IF;if k1=0001 and k0=1001 then en=1;end if; END IF; -END IF LOAD END PROCESS;END ART;5.4 计费模块VerilogHDL源代码LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY jifei IS PORT(CLK:IN STD_LOGIC; reset:IN STD_LOGIC; char0:out STD_LOGIC_VECTOR(3 DOWNTO 0); char1:out STD_LOGIC_VECTOR(3 DOWNTO 0); char2:out STD_LOGIC_VECTOR(3 DOWNTO 0); char3:out STD_LOGIC_VECTOR(3 DOWNTO 0);END jifei;ARCHITECTURE behave OF jifei ISsignal c0,c1,c2,c3:STD_LOGIC_VECTOR(3 DOWNTO 0);signal en :std_logic;beginchar0=c0;char1=c1;char2=c2;char3=c3;PROCESS(reset,clk,en) BEGIN IF(reset=1)THEN -异步复位 c0=0000; c1=0000; c2 = 0000; c3 = 0000;ELSIF(CLKEVENT AND CLK=1)THEN IF en = 0 THEN -小于20公里时,每公里1元 IF c1 = 1001 THEN c1 = 0000; IF c2 = 1001 THEN c2 = 0000; IF c3 = 1001 THEN c3 = 0000; ELSE c3 = c3+1; END IF; ELSE c2 = c2+1; END IF; ELSE c1= c1+1; END IF; ELSE -超过20公里,每公里1.5元 IF (c0 = 0101 AND c1 = 1000) OR c1 = 1001 THEN -等于XX9.5时,累加得XX1.0 IF c1 = 1001 AND c0 = 0101 THEN c0 = 0000; c1 = 0001; -等于XX9.0时,累加得XX0.5 ElSIF c1 = 1001 AND c0 = 0000 THEN c0 = 0101; c1 = 0000; -等于XX8.5时,累加得XX0.0 ELSIF c1 = 1000 AND c0 = 0101 THEN c0 = 0000; c1 = 0000; END IF; IF c2 = 1001 THEN c2 = 0000; IF c3 = 1001 THEN c3 = 0000; ELSE c3 = c3 + 1; END IF; ELSE c2 = c2 + 1; END IF; ELSIF c0 = 0000 THEN c0 = 0101; c1 = c1 + 1; ELSE c0 = 0000; c1 = c1 + 0010; END IF; END IF; END IF; END PROCESS; END behave;5.5 LCD显示模块VerilogHDL源代码-80H 81H 82H 83H 84H 85H 86H 87H-90H 91H 92H 93H 94H 95H 96H 97H-88H 89H 8AH 8BH 8CH 8DH 8EH 8FH-98H 99H 9AH 9BH 9CH 9DH 9EH 9FHlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use IEEE.STD_LOGIC_ARITH.ALL;entity clock_lcd_disp is port(clk:in std_logic; km0:in STD_LOGIC_VECTOR(3 DOWNTO 0); km1:in STD_LOGIC_VECTOR(3 DOWNTO 0) ; char0:in STD_LOGIC_VECTOR(3 DOWNTO 0); char1:in STD_LOGIC_VECTOR(3 DOWNTO 0); char2:in STD_LOGIC_VECTOR(3 DOWNTO 0); char3:in STD_LOGIC_VECTOR(3 DOWNTO 0); rw,rs,e,lcd_rst:out std_logic; lcd_data:out std_logic_vector(7 downto 0);end clock_lcd_disp;architecture tcl of clock_lcd_disp is type state is(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9); signal current_s:state; type data_buffer is array(0 to 15)of std_logic_vector(7 downto 0); type data_buffer0 is array(0 to 7)of std_logic_vector(7 downto 0); type data_buffer1 is array(0 to 7)of std_logic_vector(7 downto 0); signal disp_time0:data_buffer0:=(x31,x32,x3a,x33, x34,x3a,x35,x36); signal disp_time1:data_buffer1:=(x31,x32,x3a,x33, x34,x3a,x35,x36) ; constant data_buf0:data_buffer:=(x20,x20,x20,x20, xbc,xc6,xb3,xcc, xa1,xc3,x20,x20, xa2,xb2,x20,x20); constant data_buf1:data_buffer:=(x20,x20,x20,x20, xbc,xc6,xb7,xd1, xa1,xc3,x20,x20, xa2,xb2,x20,x20); begin disp_time0(7)=x20; disp_time0(6)=x20; disp_time0(5)=x20; disp_time0(4)=km0(3 DOWNTO 0)+x30; disp_time0(3)=km1(3 DOWNTO 0)+x30; disp_time0(2)=x20; disp_time0(1)=x20; disp_time0(0)=x20; disp_time1(7)=x20; disp_time1(6)=x20; disp_time1(5)=char0(3 DOWNTO 0)+x30; disp_time1(4)=x2e; disp_time1(3)=char1(3 DOWNTO 0)+x30; disp_time1(2)=char2(3 DOWNTO 0)+x30; disp_time1(1)=char3(3 DOWNTO 0)+x30; disp_time1(0)rw=1;rs=1;e=1;cnt1:=cnt1+1; if cnt1500 then lcd_rst=0; elsif cnt11000 then lcd_rst=1; elsif cnt1=1000 then lcd_rst=1;cnt1:=0;current_scnt_1:=cnt_1+1; if cnt_11*3 then e=1;rs=0;rw=0; elsif cnt_12*3 then lcd_data=x0c; elsif cnt_110*3 then e=0; elsif cnt_1=10*3 then cnt_1:=0;current_scnt_1:=cnt_1+1; if cnt_11*3 then e=1;rs=0;rw=0; elsif cnt_12*3 then lcd_data=x80; elsif cnt_110*3 then e=0; elsif cnt_1=10*3 then cnt_1:=0;current_s if cnt_11*3 then e=1;rs=1;rw=0; elsif cnt_12*3 then lcd_data=data_buf0(data_cnt); elsif cnt_1=2*3 then data_cnt:=data_cnt+1; elsif cnt_1100 then e=0; end if; cnt_1:=cnt_1+1; if cnt_1=100 then cnt_1:=0; if data_cnt=16 then current_scnt_1:=cnt_1+1; if cnt_11*3 then e=1;rs=0;rw=0; elsif cnt_12*3 then lcd_data=x88; elsif cnt_110*3 then e=0; elsif cnt_1=10*3 then cnt_1:=0;current_s if cnt_11*3 then e=1;rs=1;rw=0; elsif cnt_12*3 then lcd_data=data_buf1(data_cnt); elsif cnt_1=2*3 then data_cnt:=data_cnt+1; elsif cnt_1100 then e=0; end if; cnt_1:=cnt_1+1; if cnt_1=100 then cnt_1:=0; if data_cnt=16 then current_scnt_1:=cnt_1+1; if cnt_11*3 then e=1;rs=0;rw=0; elsif cnt_12*3 then lcd_data=x90; elsif cnt_110*3 then e=0; elsif cnt_1=10*3 then cnt_1:=0;current_s if cnt_11*3 then e=1;rs=1;rw=0; elsif cnt_12*3 then lcd_data=disp_time0(data_cnt); elsif cnt_1=2*3 then data_cnt:=data_cnt+1; elsif cnt_1100 then e=0; end if; cnt_1:=cnt_1+1; if cnt_1=100 then cnt_1:=0; if data_cnt=8 then current_scnt_1:=cnt_1+1; if cnt_11*3 then e=1;rs=0;rw=0; elsif cnt_12*3 then lcd_data=x98; elsif cnt_110*3 then e=0; elsif cnt_1=10*3 then cnt_1:=0;current_s if cnt_11*3 then e=1;rs=1;rw=0; elsif cnt_12*3 then lcd_data=disp_time1(data_cnt); elsif cnt_1=2*3 then data_cnt:=data_cnt+1; elsif cnt_1100 then e=0; end if; cnt_1:=cnt_1+1; if cnt_1=100 then cnt_1:=0; if data_cnt=8 then current_scurrent_s=s0; end case; end if;end process;end tcl;6.总结与体会通过学习了数字数字系统设计和Verilog HDL语言,对EDA技术有了一些了解,但那厚厚的一本书讲的都是理论的东西。通过这本次课程设计,我才把学到的东西与实践相结合。

温馨提示

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

评论

0/150

提交评论