本帖最后由 夏沫沫1112 于 2012-7-11 22:58 编辑  
 
出租车计价器的计费过程为: 
(1)系统上电显示自己的学号(8位:1005XXXX); 
(2)按下并松开S1(按下时S1=0,松开时S1=1),启动计费器,整个系统开始运行,里程计数器从0开始计数,费用计数器从6开始计算。在行驶状态,计程器开始累加计数。当路程超过3km后,计费器以每1元 / km累加,实时显示里程和费用; 
(3)出租车到达目的地停止后,按下并松开S2,停止计费器,显示总里程和总费用; 
(4)按下并松开S3则计费器清零。 
(5)重复(2)~(4)。 
----------------------------------------------------------------------------- 
以下是里程和计费模块 
 
module jiliang(clk,s3,s1,s2,distance,fee); 
//端口的定义 
input clk,s1,s2,s3; 
output [15:0] distance,fee;// 输出的公里,费用 
reg [15:0] distance,fee; 
reg start; 
always@(posedge[/email] clk or negedge s3 or negedge s1 or negedge s2)//异步启动,停止,清零 
 begin 
    if(!s1)//启动 
         start<=1'd1; 
    if(!s2)// 停止 
         start<=1'd0;  
    if(!s3)//清零 
        start<=1'd0; 
 end 
[email=always@(posedge]always@(posedge[/email] clk or negedge s3)  
 begin   
    if(!s3)//清零 
         distance<=15'd0;  
    else if(start)// start 高电平有效  
         begin 
           if(distance[3:0]==9)//判断distance的个位计到了9没有 
           begin 
            distance[3:0]<=4'd0;//计到9清零 
            if(distance[7:4]==9) //判断distance的十位计到了9没有 
           begin 
             distance[7:4]<=4'd0;//计到9清零 
           if(distance[11:8]==9)//判断distance的百位计到了9没有 
            begin 
              distance[11:8]<=4'd0;//计到9清零 
             if(distance[15:12]==9)//判断distance的千位计到了9没有 
               distance[15:12]<=4'd0;//计到9清零 
             else  distance[15:12]<= distance[15:12]+1'd1;// distance的千位没有计到9的时候加一 
            end 
           else  distance[11:8]<= distance[11:8]+1'd1; 
// distance的百位没有计到9的时候加一 
          end 
         else  distance[7:4]<= distance[7:4]+1'd1; 
// distance的十位没有计到9的时候加一 
        end 
      else distance[3:0]<=distance[3:0]+1'd1; 
// distance的个位没有计到9的时候加一 
    end//end start 
end//end always 
 
//计费模块// 
always@(posedge[/email] clk or negedge s1 or negedge s3)//异步启动,清零 
begin 
    if(!s3)//清零 
    begin 
        fee<=15'd0; 
    end 
    else if(!s1)//启动 
         begin 
            fee<=15'd6;//起步为六元 
         end 
         else if(distance>15'd2)//大于公里三的时候 
         begin 
         if(fee[3:0]==4'd9)//费用的个位是不是计到了9 
         begin 
        fee[3:0]<=4'd0;//计到9清零 
        if(fee[7:4]==4'd9)// 费用的十位是不是计到了9 
          begin     
          fee[7:4]<=4'd0; //计到9清零  
          if(fee[11:8]==4'd9)// 费用的百位是不是计到了9 
            begin     
            fee[11:8]<=4'd0; //计到9清零 
            if(fee[15:12]==4'd9)// 费用的千位是不是计到了9   
            fee[15:12]<=4'd0; //计到9清零 
            else fee[15:12]<=fee[15:12]+1'd1;// 费用的千位没有计到9加1 
            end 
          else fee[11:8]<=fee[7:4]+1'd1;// 费用的百位没有计到9加1 
            end 
       else fee[7:4]<=fee[7:4]+1'd1;// 费用的十位没有计到9加1 
        end 
else fee[3:0]<=fee[3:0]+1'd1;// 费用的个位没有计到9加1 
end//end begin 
end//end always 
endmodule//结束计量模块 
--------------------------------------------------------------------------------------------------------仿真结果为什么是这样?怎么改 |   
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册 
 
 
 
×
 
     
  
 |