打印

【求助】这个程序怎么改??

[复制链接]
963|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 夏沫沫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//结束计量模块
--------------------------------------------------------------------------------------------------------仿真结果为什么是这样?怎么改

未命名.jpg (85.2 KB )

未命名.jpg

相关帖子

沙发
GoldSunMonkey| | 2012-7-11 21:32 | 只看该作者
把star分成单独一个进程。
代码太乱了。

使用特权

评论回复
板凳
夏沫沫1112|  楼主 | 2012-7-11 23:03 | 只看该作者
照楼上说的改的不知对不,仿真结果不对啊,麻烦再给看一下?

使用特权

评论回复
地板
GoldSunMonkey| | 2012-7-12 13:29 | 只看该作者
结果不对,证明你完成上面的功能不正确。自己检查不正确的地方的时许关系

使用特权

评论回复
5
GoldSunMonkey| | 2012-7-12 13:30 | 只看该作者
看代码,我现在没有空扣的太仔细。

或者你把你认为是错的波形标出来,给我看一下。

使用特权

评论回复
6
greenapl1985| | 2012-7-16 22:30 | 只看该作者
是不是计费那里有问题,distance都已经停下来了,fee还在不停的加

always@(posedge clk or negedge s1 or negedge s3 or negedge start)//异步启动,清零
begin
    if(!s3)//清零
    begin
        fee<=15'd0;
    end
    else if(!start)
    begin
        fee<=fee;
    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

使用特权

评论回复
7
greenapl1985| | 2012-7-16 22:31 | 只看该作者
else if(!start)
    begin
        fee<=fee;
    end

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

2

帖子

0

粉丝