欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    Verilog出租车计费器课程设计.doc

    • 资源ID:23976093       资源大小:349.50KB        全文页数:86页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Verilog出租车计费器课程设计.doc

    Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-dateVerilog出租车计费器课程设计2.1 CPLD简介目录引言11、设计内容12、设计原理13、 CPLD简介23.1 、CPLD的基本结构23.2、 CPLD的特点34、系统功能模块设计44.1、计算里程和车费模块44.3、按键扫描模块174.4结构描述实现出租车计费器电路系统设计204.5、仿真电路图215、硬件实现225.1、引脚锁定225.2、编程下载236、总结与体会237、参考文献23附录:电气信息学院课程设计评分表24引言Verilog HDL是一种硬件描述语言(HDL:Hardware Discription Language),是一种用文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。Verilog HDL和VHDL是目前世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。现在,随着系统级FPGA以及片上系统的出现,软硬件协同设计和系统设计变得越来越重要。传统意义上的硬件设计越来越倾向于与系统设计和软件设计相结合。随着出租车行业的发展,对出租车计费器的要求也越来越高,用户不仅要求计费器性能稳定计费准确,而且要求在乘坐出租车时,显示起步价、行车里程二部分,由自动计费器自动记录。安装在与汽车轮相连接的传感器在汽车行进时向自动计费器发送脉冲信号,在一定的公里数内,按起步价计费;超过这一里程后,自动计费器按里程计费;超过一定费用后,则则增加里程费用;如果停车等候,则不收费。本文以Altera公司的DE2开发板为中心,Quartus 软件作为开发平台,使用Verilog HDL语言编程,设计了一个出租车计费的计费器模型。在程序描述的过程中,用了行为描述方式和结构描述方式二种描述方式对计费器进行描述。该计费器能动态扫描电路,将车费和路显示出来,各有两位小数。整个自动控制系统由三个主要电路构成:里程和车费计算、译码和动态显示。最后给出了仿真的波形,并硬件实现。1、设计内容(1)实现计费功能,计费标准为:按行驶里程计费,起步价为8.00元,并在车行3Km后按2.50元/Km计费,当计费器达到或超过20元时,公里加收50的车费,车停止不计费。(2)现场模拟功能:能模拟汽车起动、停止、暂停以及加速等状态。(3)按计动态扫描电路,将车费和路程显示出来,各有两位小数。2、设计原理本文设计了一个出租车计费器的模型,其接口信号如图(一) 所示。图(一)出租车计费器模型方框图车的状态由传感器传回来当作控制信号,用控制信号来控制计算里程和车费模块,然后分别将里程和车费送到译码模块译码,输出的数据一起送到动态扫描模块,由片选信号控制哪部分译码模块输出的数据用数码管显示。当车启动后,计算里程和车费模块就开始计数,起步价为7.00元,并在车行3Km后按2.5元/Km计费,当计费器达到或超过20元时,每公里回收50%的车费,车停止和暂停时不计费;然后将里程和车费送到译码模块译码和动态显示模块动态显示,最后显示在七段数码管上,动态显示的时间间隔为秒钟。3、 CPLD简介复杂可编程逻辑器件CPLD与现场可编程门阵列FPGA都是在PLA、PAL、GAL等逻辑器件的基础上发展起来的。与以往的PLA、PAL、GAL等相比较,FPGA/CPLD的规模比较大,它可以替代几十甚至几千块通用IC芯片。这样的FPGA/CPLD实际上就是一个子系统部件。这种芯片受到世界范围内电子工程设计人员的广泛关注和普遍欢迎。3.1 、CPLD的基本结构CPLD的集成度在千门/片以上,其基本结构是由与阵列、或阵列、输入缓冲电路、输出宏单元组成。其与阵列比PAL大得多,但并非靠简单的增大阵列的输入、输出端口达到。阵列占用芯片的面积随其输入端数的增加而急剧增加,而芯片面积的增大不仅使芯片的成本增大,还使信号在阵列中传输延迟加大而影响其运行速度。所以CPLD通常是由多个类似PAL功能块组成,具有很大的固定于芯片上的布线资源,通过位于中心的互连矩阵连接在一起。互连阵列要将来自I/O的信号和逻辑块的输出布线到器件内任何逻辑块的输入。一般互连矩阵有两种形式:基于阵列的互连和基于多路开关的互连。基于阵列的互连是纵横开关的实现方式,它允许任何输入到互连矩阵中的信号布线到任何逻辑块,是完全可布通的。基于多路开关的互连是对逻辑块的每个输入有一个多路转换器,输入到互连矩阵的信号被连接到每个逻辑块的大量多路开关的输入端,这些多路转换器的选择是可编程的,只允许其一个输入通过它进入逻辑块。所以布通率与多路转换器的输入宽度有关,宽度愈大,所占面积增加,性能降低。与FPGA相比,CPLD不采用分段互连方式,因而具有较大的时间可预测性,产品可以给出引腿到引腿的最大延迟时间;此外,CPLD具有很宽的输入结构,适合于实现高级的有限状态机;具有ISP性能的CPLD,可以直接在系统内对其进行编程,因而类似于具有ISP性能的SRAM查找表类型的FPGA。3.2、 CPLD的特点20世纪80年代中期,Altera和Xilinx分别推出了类似于PAL结构的扩展型CPLD和与标准门阵列类似的FPGA ,它们都具有体系结构和逻辑单元灵活、集成度高以及适用范围宽等特点。这两种器件兼容了PLD和通用门阵列的优点,可实现较大规模的电路,编程也很灵活,具有以下特点:(1) 目前的 CPLD主要是基于E2 PROM或 FLASH存储器编程 ,编程次数达 1万次。其优点是在系统断电后 ,编程信息不丢失。CPLD又可分为在编程器上编程和在系统编程 (ISP) CPLD两种。 ISP器件的优点是不需要编程器 ,可先将器件装焊于印制板 ,再经过编程电缆进行编程,编程、调试和维护都很方便 。(2) CPLD是将多个可编程阵列逻辑 (PAL)器件集成到一个芯片 ,具有类似 PAL的结构。一般情况下CPLD器件中至少包含三种结构 :可编程逻辑功能块 (FB);可编程 I/ O单元 ;可编程内部连线 。(3) 在速度上CPLD优于 FPGA。由于 FPGA是门级编程 ,且 CLB之间是采用分布式互连 ;而 CPLD是逻辑块级编程 ,且其逻辑块互连是集总式的。因此 ,CPLD比 FPGA有较高的速度和较大的时间可预测性 ,产品可以给出引腿到引腿的最大延迟时间 。(4) FPGA/CPLD软件包中有各种输入工具和仿真工具,以及版图设计工具和编程器等全线产品,电路设计人员在很短的时间内就可完成电路的输入、编译、优化、仿真,直至最后芯片的制作。(5) 电路设计人员使用FPGA/CPLD进行电路设计时,软件易学易用。4、系统功能模块设计4.1、计算里程和车费模块本模块主要是计算里程和车费。按行驶里程计费,起步价为8.00元,并在车行3Km后按2.5元/Km计费,当计费器达到或超过20元时,每公里回收50%的车费,车停止和暂停时不计费。在本模块中,一个脉冲代表是里程要加1米。计算里程和车费的模块的功能结构框图如图4-1所示。图4-1根据模块实现的功能设计Verilog HDL源代码如下:module dynamic_segled(inputclk,inputrst_n,input 2:0key_value,inputkey_flag,inputkey_up_flag,outputreg 19:0 luchen,outputreg 19:0 chefei,outputreg 2:0led,outputregbuzzer);parameter qqq = 20'd7809;parameter qibj = 8'd80;parameter dj = 8'd25;parameter dj_1 = 8'd38;reg 15:0cnt;reg 2:0key;always(posedge key_flag or posedge key_up_flag or negedge rst_n)beginif(!rst_n)beginkey =3'b1111;endelsebeginkey = key_value;endendreg stop,start;reg7:0 cheshu;always(posedge key_up_flag or negedge rst_n)beginif(!rst_n)beginstart = 0;start = 0;led = 0;cheshu = 5;endelsebeginif(key = 3'b110)if(cheshu < 8'd30)cheshu = cheshu + 2'd2;elsecheshu = 5;elsecheshu = cheshu;if(key = 3'b101)beginstart = start;led1 = led1;endelsebeginstart = start;led1 = led1;endif(key = 3'b011)beginstop = stop;led2 = led2;endelsebeginstop = stop;led2 = led2;endendendreg 25:0cnt1;reg cnt1_r0,cnt1_r1,cnt1_r2;always(posedge clk or negedge rst_n)beginif(!rst_n)begincnt1 <= 0;cnt1_r0 <= 0;endelse beginif(cnt1 < 26'd5000000)begincnt1 <= cnt1 + 26'd1;cnt1_r0 <= 0;endelsebegincnt1 <= 0;cnt1_r0 <= 1;endendendwire cnt1_flag;always(posedge clk or negedge rst_n)beginif(!rst_n)begincnt1_r1 <= 0;cnt1_r2 <= 0;endelsebegincnt1_r1 <= cnt1_r0;cnt1_r2 <= cnt1_r1;endend assign cnt1_flag = cnt1_r1&cnt1_r2;always(posedge cnt1_flag or negedge rst_n)beginif(!rst_n)beginluchen = 0;chefei = 0;endelsebeginif(stop)beginif(start)beginluchen = luchen + cheshu;if(luchen < 20'd3000)chefei = qibj;else if(luchen < qqq)chefei = qibj + (luchen - 20'd3000) * dj /20'd1000; elsechefei = 20'd200 +(luchen - qqq) * dj_1 /20'd1000;endelseluchen = luchen;chefei = chefei;endelsebeginluchen = 0;chefei = 0;endendendendmodule该模块定义输入输出端口如下: clk:全局时钟信号,这里为1Hz的时钟。 key_value:当stop=0时,车停止;stop=1时,车没停止。 led: 当start= 0时,车起动,但没有走;start= 1时,车开动了。 key_flag: 当pause =0时,车暂停;pause =1时,车不暂停。 chefei: 表示车费。 lucheng:表示里程。在Altera公司的软件工具Quartus (Windows7环境下)中编译和波形仿真后得到的波形如图4-2所示: 图4-2计算里程和车费模块的仿真波形2显示译码器模块本模块主要是将4位二进制数转换为十六进制表示。七段显示译码器模块的功能结构框图如图4-3所示: 图4-3 七段显示译码器的功能结构框图根据模块实现的功能设计Verilog HDL源代码如下:module seg(inputclk,inputrst_n,input 19:0time_z,input19:0time_y,outputreg 7:0data,outputreg 7:0sel);parameter se1 = 8'b1111_1110;parameter se2 = 8'b1111_1101;parameter se3 = 8'b1111_1011;parameter se4 = 8'b1111_0111;parameter se5 = 8'b1110_1111;parameter se6 = 8'b1101_1111;parameter se7 = 8'b1011_1111;parameter se8 = 8'b0111_1111;parameter se_1 = 8'hf9;parameter se_2 = 8'ha4;parameter se_3 = 8'hb0;parameter se_4 = 8'h99;parameter se_5 = 8'h92;parameter se_6 = 8'h82;parameter se_7 = 8'hf8;parameter se_8 = 8'h80;parameter se_9 = 8'h90;parameter se_0 = 8'hc0;parameter se_A = 8'h88;parameter se_B = 8'h83;parameter se_C = 8'hc6;parameter se_D = 8'ha1;parameter se_E = 8'h86;parameter se_F = 8'h8e;reg 15:0cnt;reg 2:0flip_led;always(posedge clk or negedge rst_n)/beginif(!rst_n)begincnt <= 0;flip_led <= 0;endelsebegincnt <= cnt + 1'b1;flip_led <= cnt15:13;endendreg 7:0 time1_ge;reg 7:0 time1_shi;reg 7:0 time1_bai;reg 7:0 time1_qia;reg 7:0 time2_ge;reg 7:0 time2_shi;reg 7:0 time2_bai;reg 7:0 time2_qia;always(flip_led or time_z or time_y)begintime1_ge = time_z/10%10;time1_shi = time_z/100%10;time1_bai = time_z/1000%10;time1_qia = time_z/10000%10;case(time1_ge)0:time1_ge = se_0;1:time1_ge = se_1;2:time1_ge = se_2;3:time1_ge = se_3;4:time1_ge = se_4;5:time1_ge = se_5;6:time1_ge = se_6;7:time1_ge = se_7;8:time1_ge = se_8;9:time1_ge = se_9;default:time1_ge = 8'hz;endcasecase(time1_shi)0:time1_shi = se_0;1:time1_shi = se_1;2:time1_shi = se_2;3:time1_shi = se_3;4:time1_shi = se_4;5:time1_shi = se_5;6:time1_shi = se_6;7:time1_shi = se_7;8:time1_shi = se_8;9:time1_shi = se_9;default:time1_shi = 8'hz;endcasecase(time1_bai)0:time1_bai = se_0;1:time1_bai = se_1;2:time1_bai = se_2;3:time1_bai = se_3;4:time1_bai = se_4;5:time1_bai = se_5;6:time1_bai = se_6;7:time1_bai = se_7;8:time1_bai = se_8;9:time1_bai = se_9;default:time1_bai = 8'hz;endcasecase(time1_qia)0:time1_qia = se_0;1:time1_qia = se_1;2:time1_qia = se_2;3:time1_qia = se_3;4:time1_qia = se_4;5:time1_qia = se_5;6:time1_qia = se_6;7:time1_qia = se_7;8:time1_qia = se_8;9:time1_qia = se_9;default:time1_qia = 8'hz;endcasetime2_ge = time_y%10;time2_shi = time_y/10%10;time2_bai = time_y/100%10;time2_qia = time_y/1000%10;case(time2_ge)0:time2_ge = se_0;1:time2_ge = se_1;2:time2_ge = se_2;3:time2_ge = se_3;4:time2_ge = se_4;5:time2_ge = se_5;6:time2_ge = se_6;7:time2_ge = se_7;8:time2_ge = se_8;9:time2_ge = se_9;default:time2_ge = 8'hz;endcasecase(time2_shi)0:time2_shi = se_0;1:time2_shi = se_1;2:time2_shi = se_2;3:time2_shi = se_3;4:time2_shi = se_4;5:time2_shi = se_5;6:time2_shi = se_6;7:time2_shi = se_7;8:time2_shi = se_8;9:time2_shi = se_9;default:time2_shi = 8'hz;endcasecase(time2_bai)0:time2_bai = se_0;1:time2_bai = se_1;2:time2_bai = se_2;3:time2_bai = se_3;4:time2_bai = se_4;5:time2_bai = se_5;6:time2_bai = se_6;7:time2_bai = se_7;8:time2_bai = se_8;9:time2_bai = se_9;default:time2_bai = 8'hz;endcasecase(time2_qia)0:time2_qia = se_0;1:time2_qia = se_1;2:time2_qia = se_2;3:time2_qia = se_3;4:time2_qia = se_4;5:time2_qia = se_5;6:time2_qia = se_6;7:time2_qia = se_7;8:time2_qia = se_8;9:time2_qia = se_9;default:time2_qia = 8'hz;endcasecase(flip_led)0:begindata = time1_qia;/'0'sel = se1;end1: begindata = time1_bai - 8'h80;/'1'sel = se2;end2: begindata = time1_shi; /'2'sel = se3;end3: begindata = time1_ge;/'3'sel = se4;end4: begindata = time2_qia;/'4'sel = se5;end5: begindata = time2_bai;/'5'sel = se6;end6: begindata = time2_shi - 8'h80;/'6'sel = se7;end7: begindata = time2_ge;/'7'sel = se8;enddefault: begindata = 8'hz;/sel = 8'bz;endendcaseendendmodule程序定义输入输出端口如下: a: 输入的4位二进制数。 hex:输出的1位十六进制数。在Altera公司的软件工具Quartus (Windows XP环境下)中编译和波形仿真后得到的波形如图4-4所示: 图4-4 七显示译码器的仿真波形4.3、按键扫描模块module key_scan_jitter#(parameter KEY_WIDTH = 3)(input clk,input rst_n,input KEY_WIDTH-1:0 key_data,output key_flag,output key_up_flag,output reg KEY_WIDTH-1:0 key_value);reg 19:0 cnt; /delay_5ms(249999)reg 2:0 state;/-always (posedge clk or negedge rst_n)beginif(!rst_n)cnt <= 20'd0;elsebegincnt <= cnt + 1'b1;if(cnt = 20'd249999)cnt <= 20'd0;endend/-reg key_flag_r;reg KEY_WIDTH-1:0 key_data_r;reg key_r;always(posedge clk or negedge rst_n)beginif(!rst_n)beginkey_flag_r <= 1'b1;key_value <= KEY_WIDTH1'b0;endelse if(cnt = 20'd249999) /Delay_5msbegincase(state)0:beginif(key_data != KEY_WIDTH1'b1)state <= 1;elsestate <= 0;end1:beginif(key_data != KEY_WIDTH1'b1)state <= 2;elsestate <= 0;end2:beginkey_value <= key_data; /lock the key_valuestate <= 3;end3:beginkey_flag_r <= 1'b0; /read the key_valueif(key_data = KEY_WIDTH1'b1)state <= 4;elsestate <= 3;end4:beginif(key_data = KEY_WIDTH1'b1)beginstate <= 0;key_flag_r <= 1'b1;endelsebeginstate <= 4;key_flag_r <= key_flag_r ;endendendcaseendend/-/Capture the falling endge of the key_flagreg key_flag_r0,key_flag_r1;always(posedge clk or negedge rst_n)beginif(!rst_n)beginkey_flag_r0 <= 0;key_flag_r1 <= 0;endelsebeginkey_flag_r0 <= key_flag_r;key_flag_r1 <= key_flag_r0;endendassign key_flag = key_flag_r1 & key_flag_r0;assign key_up_flag = key_flag_r1 & key_flag_r4.4结构描述实现出租车计费器电路系统设计module qljs(input clk,input rst_n,input KEY_WIDTH-1:0 key_data,output KEY_WIDTH-1:0 led_value,output 7:0data,output 7:0sel,outputbuzzer); parameter KEY_WIDTH = 3;wire key_flag;wire key_up_flag;wire KEY_WIDTH-1:0 key_value;wire 19:0 luchen,chefei;key_scan_jitter#(.KEY_WIDTH(KEY_WIDTH)U_key_scan_jitter(.clk(clk),.rst_n(rst_n),.key_data(key_data),.key_flag(key_flag),.key_up_flag(key_up_flag),.key_value(key_value),);dynamic_segledU_dynamic_segled(.clk(clk),.rst_n(rst_n),.key_value(key_value),.key_flag(key_flag),.key_up_flag(key_up_flag),.luchen(luchen),.chefei(chefei),.led(led_value),.buzzer(buzzer);segU_seg(.clk(clk),.rst_n(rst_n),.time_z(luchen),.time_y(chefei),.data(data),.sel(sel);Endmodule4.5、仿真电路图5、硬件实现5.1、引脚锁定对出租车计费器进行实验验证时,需要确定用DE2开发板的哪些输入/输出端口(PIO)来表示设计电路的输入输出。根据DE2开发板提供的实验模式,可选择电平开关SW2SW0作为出租车计费器的控制信号;选择HEX4HEX0作为里程和车费的输出显示。出租车计费器与DE2中的目标芯片引脚连接的全部关系见表1-1。表1-1 出租车计费器与DE2中的目标芯片引脚连接关系表端口名称PIO名称 芯片引脚端口名称PIO名称芯片引脚stopDPDT_SW0 PIN_N25hex21HEX21 PIN_V22startDPDT_SW1 PIN_N26hex22HEX22 PIN_AC25pauseDPDT_SW2 PIN_P25 hex23HEX23 PIN_AC26cinOSC_50 PIN_N2hex24HEX24 PIN_AB26 cin0OSC_50 PIN_N2hex25HEX25 PIN_AB25hex00HEX00 PIN_AF10hex26HEX26 PIN_Y24hex01HEX01 PIN_AB12 hex30HEX30 PIN_Y23hex02HEX02 PIN_AC12hex31HEX31 PIN_AA25hex03HEX03 PIN_AD11hex32HEX32 PIN_AA26hex04HEX04 PIN_AE11 hex33HEX33 PIN_Y26hex05HEX05 PIN_V14 hex34HEX34 PIN_Y25 hex06HEX06 PIN_V13 hex35HEX35 PIN_U22hex10HEX10 PIN_V20 hex36HEX36 PIN_W24 hex11HEX11 PIN_V21hex40HEX40 PIN_U9 hex12HEX12 PIN_W21hex41HEX41 PIN_U1 hex13HEX13 PIN_Y22 hex42HEX42 PIN_U2hex14HEX14 PIN_AA24hex43HEX43 PIN_T4 hex15HEX15 PIN_AA23hex44HEX44 PIN_R7hex16HEX16 PIN_AB24 hex45HEX45 PIN_R6 hex20HEX20 PIN_AB23hex46HEX46 PIN_T3 5.2、编程下载将程序下载到DE2开发板上,扳动SW0SW2,组成控制信号,从七段数码管HEX4HEX0上观察里程和车费。6、总结与体会EDA的设计至今为止已经进入了令人鼓舞的阶段

    注意事项

    本文(Verilog出租车计费器课程设计.doc)为本站会员(豆****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开