Verilog出租车计费器课程设计.pdf
-目录引言.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 软件作为开发平台,使用VerilogHDL 语言编程,设计了一个出租车计费的计费器模型。在程序描述的过程中,用了行为描述方式和结构描述方式二种描述方式对计费器进行描述。该计费器能动态扫描电路,将车费和路显示出来,各有两位小数。整个自动控制系统由三个主要电路构成:里程和车费计算、译码和动态显示。最后给出了仿真的波形,并硬件实现。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();parameter qqq=20d7809;parameter qibj=8d80;-inputinputclk,rst_n,key_value,key_flag,key_up_flag,input 2:0inputinputoutput reg 19:0output reg 19:0luchen,chefei,output reg 2:0 led,output regbuzzer-parameter dj=8d25;parameter dj_1=8d38;reg 15:0 cnt;reg 2:0 key;always(posedge key_flag or posedge key_up_flag or negedge rst_n)beginif(!rst_n)beginkey=3b1111;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=3b110)-if(cheshu 8d30)cheshu=cheshu+2d2;elsecheshu=5;elsecheshu=cheshu;if(key=3b101)beginstart=start;led1=led1;endelsebeginstart=start;led1=led1;endif(key=3b011)beginstop=stop;led2=led2;endelsebeginstop=stop;led2=led2;endendend-reg 25:0 cnt1;reg cnt1_r0,cnt1_r1,cnt1_r2;always(posedge clk or negedge rst_n)beginif(!rst_n)begincnt1=0;cnt1_r0=0;endelsebeginif(cnt1 26d5000000)begincnt1=cnt1+26d1;cnt1_r0=0;endelsebegincnt1=0;cnt1_r0=1;endendendwire cnt1_flag;always(posedge clk or negedge rst_n)beginif(!rst_n)begin-cnt1_r1=0;cnt1_r2=0;endelsebegincnt1_r1=cnt1_r0;cnt1_r2=cnt1_r1;endendassign 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 20d3000)chefei=qibj;else if(luchen qqq)chefei=qibj+(luchen-20d3000)*dj/20d1000;-elsechefei=20d200+(luchen-qqq)*dj_1/20d1000;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 2显示译码器模块显示译码器模块本模块主要是将 4 位二进制数转换为十六进制表示。七段显示译码器模块的功能结构框图如图 4-3 所示:图 4-3 七段显示译码器的功能结构框图根据模块实现的功能设计 Verilog HDL 源代码如下:module seg();parameter se1=8b1111_1110;parameter se2=8b1111_1101;parameter se3=8b1111_1011;parameter se4=8b1111_0111;parameter se5=8b1110_1111;parameter se6=8b1101_1111;-inputinputinputoutput reg 7:0 data,output reg 7:0 selclk,rst_n,input19:0 time_z,19:0 time_y,-parameter se7=8b1011_1111;parameter se8=8b0111_1111;parameter se_1=8hf9;parameter se_2=8ha4;parameter se_3=8hb0;parameter se_4=8h99;parameter se_5=8h92;parameter se_6=8h82;parameter se_7=8hf8;parameter se_8=8h80;parameter se_9=8h90;parameter se_0=8hc0;parameter se_A=8h88;parameter se_B=8h83;parameter se_C=8hc6;parameter se_D=8ha1;parameter se_E=8h86;parameter se_F=8h8e;reg 15:0 cnt;reg 2:0 flip_led;always(posedge clk or negedge rst_n)beginif(!rst_n)begincnt=0;flip_led=0;endelsebegincnt=cnt+1b1;flip_led=cnt15:13;endend-/-reg 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=8hz;endcase0: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;-case(time1_shi)-6:time1_shi=se_6;7:time1_shi=se_7;8:time1_shi=se_8;9:time1_shi=se_9;default:time1_shi=8hz;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=8hz;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=8hz;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=8hz;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=8hz;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=8hz;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=8hz;endcasecase(flip_led)0:begindata=time1_qia;/0sel=se1;end1:begindata=time1_bai-8h80;sel=se2;end2:begindata=time1_shi;/2sel=se3;end3:begin-/1-endmodule程序定义输入输出端口如下:a:输入的 4 位二进制数。hex:输出的 1 位十六进制数。在Altera公司的软件工具Quartus(Windows XP环境下)中编译和波形仿真后得到的波形如图 4-4 所示:data=time1_ge;/3sel=se4;enddata=time2_qia;/4sel=se5;enddata=time2_bai;/5sel=se6;enddata=time2_shi-8h80;sel=se7;enddata=time2_ge;/7sel=se8;endbegindata=8hz;/sel=8bz;end/64:begin5:begin6:begin7:begindefault:endcaseend-图 4-4 七显示译码器的仿真波形4.3、按键扫描模块module key_scan_jitter#()();reg 19:0 cnt;/delay_5ms(249999)reg 2:0 state;/-always(posedge clk or negedge rst_n)beginif(!rst_n)cnt=20d0;elsebegincnt=cnt+1b1;if(cnt=20d249999)cnt=20d0;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_valueparameter KEY_WIDTH=3endend/-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=1b1;key_value=KEY_WIDTH1b0;endelse if(cnt=20d249999)/Delay_5msbegincase(state)0:1:2:3:begin-beginkey_value=key_data;/lock the key_valuestate=3;beginif(key_data!=KEY_WIDTH1b1)state=2;state=0;elsebeginif(key_data!=KEY_WIDTH1b1)state=1;state=0;elseendendend-4:beginif(key_data=KEY_WIDTH1b1)beginstate=0;key_flag_r=1b1;key_flag_r=1b0;/read the key_valueif(key_data=KEY_WIDTH1b1)state=4;state=3;elseendendelsebeginstate=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;endelsebegin-assign key_flag=key_flag_r1&key_flag_r0;assign key_up_flag=key_flag_r1&key_flag_rkey_flag_r0=key_flag_r;key_flag_r1=key_flag_r0;endend4.4 结构描述实现出租车计费器电路系统设计module qljs(inputinputclk,rst_n,input KEY_WIDTH-1:0key_data,output KEY_WIDTH-1:0led_value,output 7:0output 7:0outputdata,sel,buzzer);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#()U_key_scan_jitter(.clk(clk),.rst_n(rst_n),(key_data),(key_flag),-.KEY_WIDTH(KEY_WIDTH).key_data.key_flag-);dynamic_segled();seg();Endmodule.clk(clk),(luchen),(chefei),(data),(sel).rst_n.time_z.time_y.data.sel(rst_n),U_seg.clk(clk),.rst_n(rst_n),(key_value),(key_flag),(luchen),(chefei),(led_value),(buzzer)U_dynamic_segled.key_up_flag(key_up_flag),.key_value(key_value),.key_value.key_flag.luchen.chefei.led.buzzer.key_up_flag(key_up_flag),4.5、仿真电路图-5、硬件实现5.1、引脚锁定对出租车计费器进行实验验证时,需要确定用 DE2 开发板的哪些输入/输出端口(PIO)来表示设计电路的输入输出。根据 DE2 开发板提供的实验模式,可选择电平开关 SW2SW0 作为出租车计费器的控制信号;选择 HEX4HEX0 作为里程和车费的输出显示。出租车计费器与 DE2 中的目标芯片引脚连接的全部关系见表1-1。表 1-1 出租车计费器与 DE2 中的目标芯片引脚连接关系表端口名称stopstartpausecincin0hex00hex01hex02hex03hex04hex05hex06hex10hex11hex12hex13hex14hex15hex16hex20PIO 名称DPDT_SW0DPDT_SW1DPDT_SW2OSC_50OSC_50HEX00HEX01HEX02HEX03HEX04HEX05HEX06HEX10HEX11HEX12HEX13HEX14HEX15HEX16HEX20芯片引脚 PIN_N25 PIN_N26 PIN_P25 PIN_N2 PIN_N2 PIN_AF10 PIN_AB12 PIN_AC12 PIN_AD11 PIN_AE11 PIN_V14 PIN_V13 PIN_V20 PIN_V21 PIN_W21 PIN_Y22 PIN_AA24 PIN_AA23 PIN_AB24 PIN_AB23端口名称PIO 名称hex21hex22hex23hex24hex25hex26hex30hex31hex32hex33hex34hex35hex36hex40hex41hex42hex43hex44hex45hex46HEX21芯片引脚 PIN_V22HEX22 PIN_AC25HEX23 PIN_AC26HEX24 PIN_AB26HEX25 PIN_AB25HEX26HEX30 PIN_Y24 PIN_Y23HEX31 PIN_AA25HEX32 PIN_AA26HEX33HEX34HEX35HEX36HEX40HEX41HEX42HEX43HEX44HEX45HEX46 PIN_Y26 PIN_Y25 PIN_U22 PIN_W24 PIN_U9 PIN_U1 PIN_U2 PIN_T4 PIN_R7 PIN_R6 PIN_T3-5.2、编程下载将程序下载到 DE2 开发板上,扳动 SW0SW2,组成控制信号,从七段数码管HEX4HEX0 上观察里程和车费。6、总结与体会EDA 的设计至今为止已经进入了令人鼓舞的阶段,在进行了长达两个星期的时间的摸索与实验,使我不仅仅是对于 EDA 入门软件与硬件的常用设计与功能,还使我对于一项设计研究的制作过程所需要的详细步骤和具体的实现方法的力度的掌握。当然在这次宝贵的课程设计中,经验才是对于我们最大的收获,而且还增强了自身对未知问题以及对知识的深化认识的能力,用受益匪浅这个词语来概括这次难忘的活动我觉得再合适不过了。但是,光是完成了作品还是不可以自我满足的,在从一开始的时候就怀着将作品制作得更加人性化,更加令人满意,更加地使功能完美又方便地被应用领域这个最终目的下,随着对 EDA 这门学科的认识加深,到达了拓展的程度,我想这个目的将在不远的时期内被实现。总之,这次设计从软件编写、调试到软硬件联机调试,我倾注了大量的时间和心血。真是曾经为程序的编写而冥思查找过,曾经为无法找出错误而郁闷苦恼过,也曾经为某一功能不能实现而犹豫彷徨过,但最终我成功了。我不仅品味到了结果的喜悦,更明白了过程的弥足珍贵。7、参考文献1.康华光主编.电子技术基础(数字部分),高等教育出版社。2.阎石主编.电子技术基础(数字部分),清华大学出版社。3.陈大钦主编,电子技术基础实验,高等教育出版社。4.彭介华主编,电子技术课程设计指导,高等教育出版社。5.张原编著,可编程逻辑器件设计及应用,机械工业出版社。6.荀殿栋,徐志军编著,数字电路设计实用手册,电子工业出版社。7.刘洪喜,陆颖编著.VHDL 电路设计实用教程清华大学出版社-附录:电气信息学院课程设计评分表项目设计方案合理性与创造性(10%)优评价良中及格差开发板焊接及其调试完成情况*(10%)硬件设计或软件编程完成情况(20%)硬件测试或软件调试结果(10%)设计说明书质量(20%)答辩情况(10%)完成任务情况(10%)独立工作能力(10%)出勤情况(10%)*综 合 评 分指导教师签名:_日期:_注:表中标*号项目是硬件制作或软件编程类课题必填内容;此表装订在课程设计说明书的最后一页。课程设计说明书装订顺序:封面、任务书、目录、正文、评分表、附件(非 16K 大小的图纸及程序清单)。-