设计一出租车计价器,

三.设计一出租车计价器,要求如下:

1. 起步价8元(3公里),超过3公里但不足10公里内,每过0.5公里计价器累加0.75元;

2. 10公里后,每过0.5公里计价器累加1元;

3. 公里数7位数字显示,其中整数4位,小数3位。

4. 出租车计价器数字显示位数自己设计,要求显示0-15公里的计价器数字。

程序在modelsim中实现和仿真

源程序如下:

module taxicount(clk,rset,mileage_4,mileage_3,mileage_2,mileage_1,mileage1,mileage2,mileage3,fare_2,fare_1,fare1,fare2);
  input clk,rset;
  output reg[3:0] mileage_1,mileage_2,mileage_3,mileage_4,mileage1,mileage2,mileage3;
  output reg[3:0] fare_1,fare_2,fare1,fare2;
  reg[1:0] sel;
  wire[31:0] qout1,qout2,qout;
  //------里程表显示-----
  always @(posedge clk)//第三位小数
  begin
    if(!rset)
        mileage3<=0;
    else
      if(mileage3==9)
          mileage3<=0;
        else
          mileage3<=mileage3+1;
  end
  
  always @(posedge clk)//第二位小数
  begin
    if(!rset)
        mileage2<=0;
    else if(mileage3==9)
      begin
        if(mileage2==9)
          mileage2<=0;
        else
          mileage2<=mileage2+1;
      end
  end
  
  always @(posedge clk)//第一位小数
  begin
    if(!rset)
      begin
        mileage1<=0;
        //i<=0;
      end
    else if(mileage3==9&&mileage2==9)
      begin
        if(mileage1==9)
          mileage1<=0;
        else
          begin
          mileage1<=mileage1+1;
          end
      end
  end
  
  always @(posedge clk)//第一位整数
  begin
    if(!rset)
        mileage_1<=0;
    else if(mileage1==9&&mileage2==9&&mileage3==9)
      begin
        if(mileage_1==9)
          mileage_1<=0;
        else
          mileage_1<=mileage_1+1;
      end
  end
  
  always @(posedge clk)//第二位整数
  begin
    if(!rset)
        mileage_2<=0;
    else if(mileage_1==9&&mileage1==9&&mileage2==9&&mileage3==9)
      begin
        if(mileage_2==9)
          mileage_2<=0;
        else
          mileage_2<=mileage_2+1;
      end
  end
  
  always @(posedge clk)//第三位整数
  begin
    if(!rset)
        mileage_3<=0;
    else if(mileage_2==9&&mileage_1==9&&mileage1==9&&mileage2==9&&mileage3==9)
      begin
        if(mileage_3==9)
          mileage_3<=0;
        else
          mileage_3<=mileage_3+1;
      end
  end
  
  always @(posedge clk)//第四位整数
  begin
    if(!rset)
        mileage_4<=0;
    else if(mileage_3==9&&mileage_2==9&&mileage_1==9&&mileage1==9&&mileage2==9&&mileage3==9)
      begin
        if(mileage_4==9)
          mileage_4<=0;
        else
          mileage_4<=mileage_4+1;
      end
  end
  
 /* always @(posedge clk)
  begin
    if(!rset) 
      begin
        qout<=0;
        qout1<=0;
        qout2<=0;
      end
    else
      begin*/
      assign qout=mileage1+mileage_1*10+mileage_2*100; 
      assign qout1=(mileage1>4)?((mileage_1*2-5)*75+800):((mileage_1*2-6)*75+800);
      //assign qout2=(mileage3+mileage2*10+mileage1*100+mileage_1*1000+mileage_2*10000+mileage_3*100000+mileage_4*1000000-10000)*2+18500;
      assign qout2=(mileage1>4)?(((mileage_1+mileage_2*10)*2-19)*10+185):(((mileage_1+mileage_2*10)*2-20)*10+185);
      //((mileage_1+mileage_2*10+mileage_3*100+mileage_4*1000)*2+1):((mileage_1+mileage_2*10+mileage_3*100+mileage_4*1000)*2))-20)*10+185;
      //end
  //end
//----计价器显示--------//
always @(posedge clk)
begin
  if(!rset) 
    begin
      fare_1<=0;
      fare_2<=0;
      fare1<=0;
      fare2<=0;
    end
 else if(qout<35) sel<=1;//mileage_1<=3&&mileage_2==0&&mileage_3==0&&mileage_4==0&&mileage1<5
  else if(qout>=99) sel<=3;
    else sel<=2;
      case(sel)
        1:begin
          fare_2<=0;
          fare_1<=8;
          fare1<=0;
          fare2<=0;
          end
        2:begin
           fare2<=qout1%10;
           fare1<=(qout1/10)%10;
           fare_1<=(qout1/100)%10;
           fare_2<=(qout1/1000)%10;
          end
        3:begin
           fare2<=0;//(qout2/10)%10;
           fare1<=qout2%10;
           fare_1<=(qout2/10)%10;
           fare_2<=(qout2/100)%10;
          end
       endcase
end
endmodule


测试程序如下:

`timescale 1ns/1ns
module taxicount_tb();
  reg clk,rset;
  wire[3:0] mileage_4,mileage_3,mileage_2,mileage_1,mileage1,mileage2,mileage3;
  wire[3:0] fare_2,fare_1,fare1,fare2;
  parameter DELY=100;
  taxicount u1(.clk(clk),.rset(rset),.mileage_4(mileage_4),
               .mileage_3(mileage_3),.mileage_2(mileage_2),
               .mileage_1(mileage_1),.mileage1(mileage1),
                .mileage2(mileage2),.mileage3(mileage3),
                .fare_2(fare_2),.fare_1(fare_1),
                .fare1(fare1),.fare2(fare2));
always #(DELY/2) clk=~clk;
  initial begin
    clk=0;rset=0;
    #(DELY*2) rset=1;
    #(DELY*100) rset=0;
    #10 rset=1;
    #(DELY*1000000) $finish;
  end
  initial $monitor($time,,,"clk=%d,rset=%d,mileage_4=%d,mileage_3=%d,mileage_2=%d,
                    mileage_1=%d,mileage1=%d,mileage2=%d,mileage3=%d,
                    fare_2=%d,fare_1=%d,fare1=%d,fare2=%d",clk,rset,
                    mileage_4,mileage_3,mileage_2,mileage_1,mileage1,
                    mileage2,mileage3,fare_2,fare_1,fare1,fare2);
endmodule


  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值