基于fpga出租车计价器设计内容摘要:

大型设计,并对所做设计的逻辑电路进行严格的验证 [5]。 Verilog HDL 行为描述语言作为一种结构化和过程性的语言,其语法结构非常适合于算法级和 RTL级的模型设计。 这种行为描述语言具有以下功能: 1) 可描述顺序执行或并行执行的程序结构; 2) 用延迟表达式或事件表达式来明确地控制过程的启动时间; 3) 通过命名的事件来触发其它过程里的激活行为或停止行为; 4) 提供了条件如 ifelse,case 等循环程序结 构; 5) 提供了可带参数且非零延续时间的任务( task)程序结构; 6) 提供了可定义新的操作符的函数结构 (function)。 7) 提供了用于建立表达式的算术运算符、逻辑运算符、位运算符 [6]; QuartusⅡ开发环境 QuartusⅡ是 Altera 公司的 CPLD/FPGA 设计工具软件,适合单芯片可编程系统( SOPC)的最全面的设计环境。 它能够实现从设计输入到下载的所有功能。 QuartusⅡ软件包是 MAX+plusⅡ的升级版本, Altera 公司的第四代开发软件 ,支持原理图、 VHDL、 VerilogHDL 以及 AHDL( Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。 QuartusⅡ提供了方便的设计输入方式、快速的编译和直接易懂的器件编程。 QuartusⅡ软件包的编程器是系统的核心,提供功能强大的设计处理,设计者可以添加特定的约束条件来提高芯片的利用率 [7]。 QuartusⅡ还支持 Altera 的 IP核,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。 对第三方 EDA 工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三放 EDA工具。 8 4 设计与仿真验证 该出租车计价器要求实现的功能: 1) 出租车起步价为 元。 2)行程 2 公里,每公里加收费用 1元。 等待累计时间 2 分钟,每 2分钟加收费用 1 元。 3)能显示行驶公里数和最后的总费用。 4)能通过修改程序来对计费要求实现改变。 用 Verilog HDL 语言设计符合上述功能要求的出租车计费器,并用层次化设计方法设计该电路,各计数器的计数状态用功能仿真的方法验证,并通过有关波形和硬件下载确认电路 设计是否正确。 分频模块 计 程分频模块 图 41 计 程分频模块 本设计为了模拟仿真假设车轮 每转一圈为 1 米, 转动 100 圈才产生一个脉冲,即一个脉冲代表 100米,则经过 2020000分频器后是每行驶 100米送一个脉冲到里 程计算模块。 俩个 INPUT分别输入的是复位信号 reset和 20MHz的时钟信号,输出 OUTPUT是 10Hz信号,实现了将 20MHz 信号分成 10Hz 信号,路程分频模块如图 41 所示。 部分代码 : …… always@(posedge clk_20M) begin if(!reset) begin clk_10=0。 counter = 0。 9 end else begin if(counter==1000000) begin counter=0。 clk_10= ~ clk_10。 end else counter = counter + 1。 end end 输入是复位信号 reset,时钟信号 clk_20M,输出是时钟信号 clk_10。 将 20M 的脉冲信号进行 2020000 分频,在 clk_20M 时钟信号的上升沿, counter 进行加 1 计数,在counter=1000000 时, counter 进行取反, clk_10 输出的是 10Hz 的时钟信号。 计时分频模块和计费分频模块 图 42 计时分频模块和计费分频模块 在等待 时间超过 2 分钟后,每经过 2 分钟加收费用 1 元,所以给计时模块输入的是1Hz的秒脉冲。 当汽车行驶时,路程的计费是按照 1 公里加收 1元,所以给计费模块在按照里程计费时输入的是路程分频模块的十分频时钟信号,即 1Hz 脉冲信号,如图 42所示。 数码管动态显示分频模块 10 图 43 数码管动态显示分频模块 由于用 8个数码管进行显示,输入的时钟信号是 20MHz,将 20MHz 的时钟信号进行25000 分频,分频成 800Hz,数码管才可以进行动态显示,数码管动态显示分频模块如图43所示。 数码管动态显示分频模块仿真 图 44 数码管动态显示分频模块 从波形图 44可以看出在时钟 信号 clk_20M 的控制下 ,进行 25000 分频,输出 800Hz的时钟信号。 计程模块 计程模块电路 此模块的功能是计算出租车行驶的路程。 在出租车启动并行驶的过程中 (即复位 /启动信号 reset 为 1,行驶 /停止信号 start 为 1),当时钟 clk_10 是上升沿的时候,系统即对路程计数器 distance 的里程计数器进行加计数,当路程超过 2公里时,系统将输出标志正脉冲 distance_enable。 其模块如图 44 所示。 11 图 45 计程模块电路 部分计程代码如下: …… always@(posedge clk_10 or negedge reset)//异步复位 begin if(!reset)//低电平复位 begin distance=1639。 d0。 end else if(start)// start 高电平有效 begin if(distance[3:0]==9)//判断 distance 的低四位计到了 9 没有 begin distance[3:0]=439。 d0。 //计到 9 清零 ...... else distance[3:0]=distance[3:0]+139。 d1。 // distance 的低四位没有计到 9 的时候加一 end end //*产生 distance_enable 信号 *// always@(posedge clk_10 or negedge reset) ...... else if(distance=1639。 d20)// 大于 2 公里的时候 begin distance_enable=139。 d1。 //输出 distance_enable 信号 end end 输入是时钟信号 clk_10,汽车行驶信号 start 和 复位信号 reset, 输出是里程distance 和里程计费使能信号 distance_enable,当脉冲信号 10Hz 上升沿到来时,12 distance 开始进行加 1 计数,最小单位是米,当 distance 大于等于 20,即 2公里时,输出 distance_enable 信号。 计程模块仿真 图 46 计程模块仿真 从波形图 45 可以看出在时钟的控制下,当 reset=0 时,复位,里程计数归 0;当reset=1 且 start=1 的时候 distance 开始计数,当计到大于 2 的时候输出了distance_enable=1。 准备对第 2 公里以后的脉冲进行加计费。 计时模块 计时模块电路 此模块用于模拟出租车停车等待的时间。 在出租车行进中,如果车辆停止等待,计数器则在 1Hz 信号 clk_1的上升沿进行加计数,每 60 次产生进位脉冲使分钟计数器位进行加计数,当累计等待时间超过 2(不包括 2 分钟)分钟时,输出标志 time_enable 正脉冲信号。 其模块如图 46所示。 图 47 计时模块电路 13 部分计时代码如下: …… always@(posedge clk_1 or negedge reset)//异步复位 if(!reset) begin time_enable=0。 j=0。 end else if(!te) begin if(j==119) begin j=0。 time_enable=1。 end else begin j=j+1。 time_enable=0。 end end 输入是时钟信号 clk_1,复位信号 reset 和汽车行驶信号 te, 输出是时间计费使能信号 time_enable。 当 te=0(te 引脚与 start 输入连接 ),在输入脉冲信号 1Hz 的上升沿, j进行加 1 计数,当计到 119时,即 2分钟, time_enable 输出一个正脉冲。 计时模块仿真 14 图 48 计时模块仿真 从波形图 47可以看出在 clk_1的控制下当 reset=1且 te=0的时候时间计数,当时间大于 2分钟的时候, time_enable输出一个正脉冲,成为计费模块中等待时间计费的脉冲信号。 计费模块 计费模块电路 费用计数器模块用于出租车启动后,根据行驶路程和等待时间计算费用。 当出租车停车时,时钟 reset用于将费用计数器复位为起步价 8元;当车处于行驶状态时,若满 2公里后路程每满 1公里,费用计数器加 1元;当出租车 处于停止等待状态且时钟满 2分钟时,时间每满 2分钟,费用计数器加 1元。 其模块图如 48所示。 图 49 计费模块电路 部分等待时间计费代码如下 : …… always@( negedge reset or posedge clk )//异步 复位 begin if(!reset) //低电平有效 begin fee=1639。 d0。 end else if(fee[3:0]==439。 d9) //费用的低四位是不是计到了 9 begin 15 fee[3:0]=439。 d0。 //计到 9 清零 if(fee[7:4]==439。 d9) …… else fee[3:0]=fee[3:0]+139。 d1。 // 费用的低四位没有计到 9 加 1 //end begin end//end always 输入是时钟信号 clk 和 复位信号 reset,输出是费用 fee, clk 接的是 time_enable 信号,当 te=0时,出租车进入等待时间计费,在 clk的上升沿, fee进行加 1计数, time_enable每 2 分钟产生一个正脉冲,此程序实现了每 2分钟加费 1元的功能。 部分里程计费代码如下: …… always@( negedge reset or posedge clk_1 )//异步复位 begin if(!reset) //低电平有效 begin fee=1639。 d8。 end else if(en==1amp。 amp。 start==1) if(fee[3:0]==439。 d9) //费用的低四位是不是计到了 9 begin fee[3:0]=439。 d0。 //计到 9 清零 if(fee[7:4]==4。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。