找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2523|回复: 1
收起左侧

FPGA实现出租车计价器

[复制链接]
ID:426797 发表于 2021-6-25 15:13 | 显示全部楼层 |阅读模式
  1. /*
  2.     *出租车计价器
  3.     *功能:1、初始化计价 10元
  4.            2、数码管按键切换显示价格和里程
  5.            3、速度300m/s
  6.            4、可以通过拨码开关进行清零和保持当前价格和里程
  7.            5、当里程十位无数据时,不显示
  8.            6、数码管最高位分别显示当前显示的内容字母,d显示距离,C显示价格
  9.     *匀速状态
  10.     *By:鱼芯工作室
  11. */

  12. module taxi_prj(clkin,rstn,led,dataout,dot,en,Key);

  13. input clkin,rstn;
  14. input [2:0] Key;
  15. output led;
  16. output[7:1] dataout;
  17. output dot;
  18. output[3:0] en;//COM使能输出

  19. reg led;
  20. reg [10:0] cnt;

  21. reg[7:1] dataout;//各段数据输出
  22. reg dot;//各段数据输出.
  23. reg[3:0] en;
  24. reg[1:0] cnt_scan;//扫描频率计数器
  25. reg[3:0] dataout_buf;
  26. reg [4:0] data_ten,data_ge,data_dot,init_cost;
  27. reg [16:0] distance;
  28. reg [16:0] cost;

  29. gen_div U1(.clkin(clkin),.rstn(rstn),.clkout(clkout));//1ms

  30. always@(posedge clkout or negedge rstn)
  31. begin
  32.     if(!rstn)  
  33.     begin
  34.         cnt <= 0;
  35.         distance <= 0;
  36.         data_ten<=0;
  37.         data_ge<=0;
  38.         data_dot<=0;
  39.         init_cost <= 10;
  40.         cost<=0;
  41.     end
  42.     else if(cnt == 2000)
  43.     begin
  44.         cnt <= 0;
  45.         led <= ~led;
  46.         if(Key[2]==1 || Key[1] == 1)
  47.         begin
  48.             if(Key[1] == 1)
  49.             begin
  50.                 distance <= 0;
  51.                 data_ten<=0;
  52.                 data_ge<=0;
  53.                 data_dot<=0;
  54.                 init_cost <= 10;
  55.                 cost<=0;
  56.             end
  57.             else
  58.             begin
  59.                 distance <= distance ;
  60.                 data_ten<=data_ten;
  61.                 data_ge<=data_ge;
  62.                 data_dot<=data_dot;
  63.                 cost<=cost;
  64.             end            
  65.         end
  66.         else
  67.         begin
  68.                 distance <= distance+300;
  69.                 data_ten<=distance/10000%10;
  70.                 data_ge<=distance/1000%10;
  71.                 data_dot<=distance/100%10;
  72.                 if(distance<=3000 && distance >0)
  73.                 begin
  74.                     init_cost <= 10;
  75.                     cost = init_cost *10;
  76.                 end
  77.                 else
  78.                     cost <=init_cost *10+2*(distance-3000)/100;
  79.         end
  80.     end
  81.     else cnt <= cnt + 1;
  82. end
  83. //segment
  84. always@(posedge clkout or negedge  rstn)
  85. begin
  86.     if(!rstn)
  87.         begin //低电平复位
  88.             cnt_scan<=0;
  89.         end
  90.     else
  91.         begin
  92.             cnt_scan<=cnt_scan+1;
  93.         end
  94. end

  95. always @(cnt_scan)//段码扫描频率
  96. begin
  97.   case(cnt_scan[1:0])
  98.       2'b00 :
  99.           en = 4'b1110;
  100.       2'b01 :
  101.           en = 4'b1101;
  102.       2'b10 :
  103.           en = 4'b1011;
  104.       2'b11 :
  105.           en = 4'b0111;
  106.       default :
  107.           en = 4'b1110;
  108.     endcase
  109. end

  110.   always @ (Key[0],en) //对应COM信号给出各段数据,段码
  111.     case(Key[0])
  112.         1'b0:
  113.             begin
  114.                 case(en)
  115.                   4'b1110:
  116.                   begin
  117.                         dataout_buf<= 13;//输入将要显示的数字
  118.                         dot <= 1;
  119.                         end
  120.                   4'b1101:
  121.                   begin
  122.                   if(data_ten!==0)
  123.                   begin
  124.                         dataout_buf<=data_ten;
  125.                         dot <= 1;
  126.                     end
  127.                     else
  128.                     begin
  129.                             dataout_buf<=7'b1111_111;
  130.                             dot <= 1;
  131.                         end
  132.                     end
  133.                   4'b1011:
  134.                   begin
  135.                         dataout_buf <=  data_ge;
  136.                         dot <= 0;
  137.                         end
  138.                   4'b0111:
  139.                   begin
  140.                         dataout_buf<=data_dot;  
  141.                         dot <= 1;
  142.                         end
  143.                   default:
  144.                         dataout_buf=1;
  145.               endcase
  146.           end
  147.         1'b1:
  148.                     begin
  149.                             case(en)
  150.                               4'b1110:
  151.                               begin
  152.                                     dataout_buf<= 12;//输入将要显示的数字
  153.                                     dot <= 1;
  154.                                     end
  155.                               4'b1101:
  156.                               begin
  157.                                     dataout_buf<=cost/100;
  158.                                     dot <= 1;
  159.                                     end
  160.                               4'b1011:
  161.                               begin
  162.                                     dataout_buf <= cost/10%10;
  163.                                     dot <= 0;
  164.                                     end
  165.                               4'b0111:
  166.                               begin
  167.                                     dataout_buf<=cost%10;   
  168.                                     dot <= 1;
  169.                                     end
  170.                               default:
  171.                                     dataout_buf=1;
  172.                           endcase
  173.                       end
  174.             default:dataout_buf=0;
  175.     endcase  


  176. always@(dataout_buf)
  177. begin
  178.     case(dataout_buf)  //将要显示的数字译成段码
  179.         4'b0000://0
  180.             dataout=7'b0000_001;
  181.         4'b0001://1
  182.             dataout=7'b1001_111;
  183.         4'b0010://2
  184.             dataout=7'b0010_010;
  185.         4'b0011://3
  186.             dataout=7'b0000_110;
  187.         4'b0100://4
  188.             dataout=7'b1001_100;
  189.         4'b0101://5
  190.             dataout=7'b0100_100;
  191.         4'b0110://6
  192.             dataout=7'b0100_000;
  193.         4'b0111://7
  194.             dataout=7'b0001_111;
  195.         4'b1000://8
  196.             dataout=7'b0000_000;
  197.         4'b1001://9
  198.             dataout=7'b0000_100;
  199.             4'b1010://A
  200.             dataout=7'b0001_000;
  201.             4'b1011://B
  202.                 dataout=7'b1100_000;
  203.             4'b1100://C
  204.             dataout=7'b0110_001;
  205.             4'b1101://D
  206.             dataout=7'b1000_010;
  207.             4'b1110://E
  208.             dataout=7'b0010_000;
  209.        default://这里仅编译了0-9这几个数字
  210.             dataout=7'b1111_111;//全灭
  211.      endcase
  212. end

  213. endmodule
复制代码
51hei.png

全部代码51hei下载地址:
taxi_prj.zip (3.12 MB, 下载次数: 20)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:894408 发表于 2021-11-12 18:58 | 显示全部楼层
前辈 我学习了这个程序,功能都能实现,但是我想在前面加一个分钟计时,就是在前两位数码管上加一个计时的,这个程序里面的位选我不太会,我不知道怎么改,希望前辈教一教我
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表