【Vivado】基于FPGA的出租车计价表设计

这篇具有很好参考价值的文章主要介绍了【Vivado】基于FPGA的出租车计价表设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

学校FPGA设计结课课设
主要做了出租车计价表,一个比较旧的课题,代码如下:

1.基本代码

基于fpga的出租车计费器源码,fpga开发
分模块编程,按照价目表写代码,具体注释见代码。

module taxi_cost(
    input clk,
    input rst,
    input key_start,
    input key_clear,
    output reg[3:0] en_seg,
    output reg[7:0] sseg
);
    reg[0:0] start_flag;  //是否开始计费 1为开始计费,0停止计费
    reg[1:0] cost_stage; //费用阶段,0 - 2km以内,5元; 
                         //         2 - 10km,每千米2元
                         //         10km以外,每千米3元
    reg[9:0] distance;  //行驶的总距离,用于判断在哪个费用阶段
    reg[9:0] cost;      //计算总费用
    reg[6:0] counter;   //计算次数
    
    /*
     状态初始化,起步价为5元
    */
    initial begin
        start_flag = 0;   //开始标志位清0
        cost_stage = 0;   //初始化为第一阶段 0-2km以内费用5元
        cost = 9'd5;      //初始费用5元
        distance = 0;     //初始距离为0km
        counter = 0;
    end
    
    always @(key_start) //判断开始计费按键是否按下
        if(key_start)
            start_flag = 1;
        else
            start_flag = 0;
    
    always @(key_clear)begin //如果清0按键按下,回到初始状态
        cost_stage = 0;
        cost = 9'd5;
        distance = 0;
        counter = 0;
        start_flag = 0;
    end
    
    /*
        路程计算
        假设出租车的车速为36km/h,即10m/s
        使用的输入时钟为100MHz,则每一周期为1ns,需要计算1_000_000_000才为1s
        故定义一个位宽为30的变量M(M的范围为0-2^30,即0-1073741824),每次自加1
        当加到1_000_000_000时,counter加1,加到100时,获得10*100 = 1000m = 1km
        (仿真时为了更快得出结果,M和counter的数字适当变小)
    */
    localparam M = 30;
    reg[M-1:0] regM;
    
    always @(posedge clk,posedge rst)
        if(rst)
            regM <= 0;
         else
            if(start_flag)
                regM <= regM + 1;
            
     always @* begin
        if(regM > 'd1_000_000_000)begin // 1s。regM清零,counter加1
            counter = counter + 1;
            regM = 0;
            if(counter == 100) begin //达到1km,路程加1km
                distance = distance + 1;
                counter = 0;
                case(cost_stage)     //根据阶段计费
                    2'b00:begin
                        cost = 'd5; //第一阶段 保持5元
                    end
                    2'b01:begin //第二阶段,每增加1km价格加2元
                        cost = cost + 'd2;
                    end
                    2'b10:begin //第三阶段,每增加1km价格加3元
                        cost = cost + 'd3;
                    end
                endcase
            end
        end
     end
     
     always @(distance) begin //判断阶段
        if(distance > 'd2) begin
            cost_stage = 1;
        end
        if(distance > 'd10) begin
            cost_stage = 2;
        end  
     end
     
     /*
      数码管显示
      设置了sigle、ten、hundred三个变量,每个变量都是4位(范围0-16,实际只用了0-9)
      为了营造四个数码管同时点亮的视觉效果,对数码管的片选时间定为1000Hz即可
      输入时钟为100MHz,故只要2^17分频即可获得约800Hz,再增加两位用于溢出判断是哪一位被选中
     */ 
    reg [3:0] sigle;
    reg [3:0] ten;
    reg [3:0] hundred;
    
    localparam N = 17;
    reg[N-1:0] regN;
    
    always @(posedge clk,posedge rst)
        if(rst)
            regN <= 0;
        else
            if(start_flag)
                regN <= regN + 1;
     //用于计算每个位的数字       
     always @* begin
        sigle = cost % 10;
        ten = cost % 100 / 4'd10;
        hundred = cost / 100;
     end
     
     //数码管显示
     always @*
        if(start_flag)
            case(regN[N-1:N-2])
                2'b00:begin
                    en_seg = 4'b1110;
                    sseg = tran_seg(sigle);
                end
                2'b01:begin
                    en_seg = 4'b1101;
                    sseg = tran_seg(ten);
                end
                2'b10:begin
                    en_seg = 4'b1011;
                    sseg = tran_seg(hundred);
                end
                2'b11:begin
                    en_seg = 4'b0111;
                    sseg = tran_seg(10);
                end
            endcase
        
        //将10进制转换成2禁止,用于数码管输出,选择的是共阴数码管,被选中段为1即输出
        function[7:0] tran_seg;
            input[3:0] data;
            begin
                case(data)
                    4'd0:tran_seg = 8'b0111_1110; //0 -> 0x7e
                    4'd1:tran_seg = 8'b0011_0000; //1 -> 0x30
                    4'd2:tran_seg = 8'b0110_1101; //2 -> 0x6d
                    4'd3:tran_seg = 8'b0111_1001; //3 -> 0x79
                    4'd4:tran_seg = 8'b0011_0011; //4 -> 0x33
                    4'd5:tran_seg = 8'b0101_1011; //5 -> 0x5b
                    4'd6:tran_seg = 8'b0101_1111; //6 -> 0x5f
                    4'd7:tran_seg = 8'b0111_0000; //7 -> 0x70
                    4'd8:tran_seg = 8'b0111_1111; //8 -> 0x7f
                    4'd9:tran_seg = 8'b0111_1011; //9 -> 0x7b
                    default:tran_seg = 8'b0000_000; //熄灭
                endcase
            end
         endfunction
endmodule

2.不同车流量段判断

基于fpga的出租车计费器源码,fpga开发

在module里新加一个input变量key_stage,用key_stage表示不同车流量段,用以计数

always @* begin
      if(regM > 'd100) begin //时间达到1s。regM清零,couner加1
          counter = counter + 1;
          regM = 0;
          if(counter == 10) begin //达到1km,路程加1km
              distance = distance + 1;
              counter = 0;
              case(cost_stage)     //根据阶段计费
                  2'b00:begin
                      cost = 'd10; //第一阶段 
                  end
                  2'b01:begin //第二阶段
                      if(key_stage)
                          cost = cost + 'd1;
                      else
                          cost = cost + 'd2; 
                  end
                  2'b10:begin //第三阶段
                       if(key_stage)
                          cost = cost + 'd2;
                       else
                          cost = cost + 'd3;
                  end
              endcase
          end
      end
end

3.夜晚白天判断

基于fpga的出租车计费器源码,fpga开发
在module里新增一个变量state来限定是在白天还是夜间文章来源地址https://www.toymoban.com/news/detail-762126.html

//判断收费阶段
always @(all_dist) begin
    if(all_dist < 3) begin
        cost_stage = STAGE_1;
    end
    if(all_dist > 3 & all_dist < 10) begin
        cost_stage = STAGE_2;
    end
    if(all_dist > 10) begin
        cost_stage = STAGE_3;
    end
    case (cost_stage) // 根据收费阶段计算费用
        STAGE_1: begin
            cost = cost;
        end
        STAGE_2: begin
            if(state) cost = cost + 3;
            else cost = cost + 2;
        end
        STAGE_3: begin 
            if(state) cost = cost + 4;
            else cost = cost + 3;
        end
    endcase
end

到了这里,关于【Vivado】基于FPGA的出租车计价表设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 出租车计价c语言

    本关任务:根据某城市普通出租车收费标准编写程序对车费进行计算。具体标准如下: 起步里程为3km,起步费为10元;10km以内超起步里程部分,每千米2元,超过10km以上的部分加收50%的回空补贴费,即每千米3元。营运过程中,因堵车及乘客要求临时停车的,按每5分钟2元计收

    2024年02月07日
    浏览(32)
  • 出租车自动计费器设计Verilog代码vivado Nexys4开发板

    名称:出租车自动计费器设计Verilog代码vivado  Nexys4开发板(文末获取) 软件:vivado 语言:Verilog 代码功能: 出租车自动计费器设计要求 设计一个出租车自动计费器,具有行车里程计费等候时间计费丶及起价三部分,用四位数码管显示总金额,最大值为999.9元 行车里程单价2元/公里

    2024年02月03日
    浏览(42)
  • 基于python的transbigdata实现出租车轨迹数据分析与可视化

    TransBigData是一个为交通时空大数据处理、分析和可视化而开发的Python包。TransBigData为处理常见的交通时空大数据(如出租车GPS数据、共享单车数据和公交车GPS数据等)提供了快速而简洁的方法。TransBigData为交通时空大数据分析的各个阶段提供了多种处理方法,代码简洁、高效、

    2024年02月01日
    浏览(34)
  • Java语言怎么编写一个程序计算出租车的运输费用:出租车起步15公里以内20块钱,需要支付调头费用

    下面是一个Java语言编写的计算出租车运输费用的程序:   ```java import java.util.Scanner;   public class TaxiFareCalculator {     public static void main(String[] args) {         Scanner input = new Scanner(System.in);           System.out.print(\\\"请输入出租车行驶的里程(公里):\\\");         double distance

    2024年02月12日
    浏览(39)
  • 出租车GPS轨迹数据分析

    •使用numpy、pandas等完成“00.csv”文件读取; •剔除无效数据:GPS 采集出租车轨迹数据的过程中,可能因设备问题 导致数据没有采集到,故而在原始轨迹数据集中记录为空值。因此,需 要将每个采样点中有效字段为空值的数据进行剔除,即剔除 DeviceID、 Longitude、Latitude、

    2024年02月04日
    浏览(36)
  • 企业spark案例 —— 出租车轨迹分析(Python)

    头歌的大数据作业,答案没找着,遂自己整了一份 第1关:SparkSql 数据清洗 任务描述 本关任务:将出租车轨迹数据规整化,清洗掉多余的字符串。 相关知识 为了完成本关任务,你需要掌握:1. 如何使用 SparkSQL 读取 CSV 文件,2. 如何使用正则表达式清洗掉多余字符串。 编程要

    2024年02月03日
    浏览(39)
  • LeetCode 2008. 出租车的最大盈利:动态规划 + 哈希表

    力扣题目链接:https://leetcode.cn/problems/maximum-earnings-from-taxi/ 你驾驶出租车行驶在一条有 n  个地点的路上。这 n  个地点从近到远编号为  1  到  n  ,你想要从 1  开到 n  ,通过接乘客订单盈利。你只能沿着编号递增的方向前进,不能改变方向。 乘客信息用一个下标从 0  开

    2024年02月04日
    浏览(36)
  • 仿滴滴打车百度地图定位查找附近出租车或门店信息

    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随

    2024年02月09日
    浏览(47)
  • 【Cocos 3d】从零开始自制3d出租车小游戏

    本文很长,建议收藏食用。 课程来源: 游戏开发教程 | 零基础也可以用18堂课自制一款3D小游戏 | Cocos Creator 3D 中文教程(合集)p1~p6 简介: 资源下载:https://github.com/cocos-creator/tutorial-taxi-game 适合学习人群:本教程假定你对编程有一定的了解,ts,js 学习过其中之一。 如果不

    2024年02月02日
    浏览(42)
  • 出租车模拟计费Verilog代码AX301开发板Quartus

    名称:出租车模拟计费Verilog代码AX301开发板Quartus 软件:Quartus 语言:Verilog 代码功能: 出租车模拟计费系统的实现 设计一个模拟的出租车计费系统,能显示里程和费用。 要求:(1)自行设定车速,根据计时转换为里程,里程显示方式为XXX,单位为km; (2)费用的计算及显

    2024年01月17日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包