zoukankan      html  css  js  c++  java
  • 实时控制系统软件设计第二周作业-停车场门禁状态机-杨静梧

    作业内容

    根据本周课堂内容,设计一个停车场门禁控制系统的状态机。

    门禁控制系统的输入信号包括:

    • 起落杆位置传感器:有两个位置值信号(升起/落下)
    • 汽车入闸传感器:有两个值(True/False)
    • 汽车出闸传感器:有两个值(True/False)

    门禁控制系统的输出信号包括:

    • 起落杆电机控制信号:(上升/下降)
    • 通行灯信号:(红灯/绿灯)

    一辆汽车的通过流程为:

    • 起落杆处于落下状态,通行灯为红灯。
    • 汽车进入门禁系统,入闸传感器值变为True。
    • 控制起落杆上升,直到起落杆位置传感器到达升起位置。
    • 通行灯为绿灯。
    • 汽车离开门禁,触发汽车出闸传感器值为True。
    • 控制起落杆下降,直到起落杆位置传感器到达落下位置。
    • 通行灯变为红灯。

    所描述的控制系统的状态机包括:

    • 状态机的所有状态
    • 状态机所接收到的外部事件
    • 状态机所产生的动作
    • 状态机的所有状态跃迁:(原状态、新状态、触发条件、产生动作)

    状态机分析

     

    Verilog代码

    module carlight(
    
      car_in      ,  //入闸传感器信号
    
      car_out     ,  //出闸传感器信号
    
      gan_up      ,  //起落杆上方传感器信号
    
      gan_down    ,  //起落杆下方传感器信号
    
      motion_up   ,  //起落杆电机上升控制信号
    
      motion_down ,  //起落杆电机下降控制信号
    
      light_red   ,  //红灯信号
    
      light_green ,  //绿灯信号
    
      clk         ,  //时钟信号
    
      ncr         ); //复位信号
    
    //输入信号
    
    input clk , ncr         ;
    
    input car_in , car_out  ;
    
    input gan_up , gan_down ;
    
    //输出信号
    
    output motion_up , motion_down ;
    
    output light_red , light_green ;
    
    //寄存器
    
    reg [1:0] state , next_state ;
    
    reg motion_up , motion_down  ;
    
    reg light_red , light_green  ;
    
    //状态机四种状态
    
    parameter [1:0] down    = 2'b00 ,  //杆处于下方状态
    
                    down2up = 2'b01 ,  //杆处于上升状态
    
                    up      = 2'b11 ,  //杆处于上方状态
    
                    up2down = 2'b10 ;  //杆处于下降状态
    
     
    
    always@(posedge clk or negedge ncr) begin
    
    if(~ncr)
    
      state <= down ;
    
    else
    
      state <= next_state ;         //状态转移
    
    end
    
     
    
    always@(*) begin
    
    case(state)
    
      down: begin                   //down状态时,有car_in信号,转换到down2up状态,否则,状态不变
    
        if(car_in==1)
    
          next_state = down2up ;
    
        else
    
          next_state = down ;
    
      end
    
      down2up: begin                //down2up状态时,有gan_up信号,转换到up状态,否则,状态不变
    
        if(gan_up==1)
    
          next_state = up ;
    
        else
    
          next_state = down2up ;
    
      end
    
      up: begin                     //up状态时,有car_out信号,转换到up2down状态,否则,状态不变
    
        if(car_out==1)
    
          next_state = up2down ;
    
        else
    
          next_state = up ;
    
      end
    
      up2down: begin                //up2down状态时,有gan_down信号,转换到down状态,否则,状态不变
    
        if(gan_down==1)
    
          next_state = down ;
    
        else
    
          next_state = up2down ;
    
      end
    
      default: next_state = down ;
    
    endcase
    
    end
    
     
    
    always@(posedge clk or negedge ncr) begin
    
    if(~ncr) begin
    
        motion_up   = 0 ;
    
        motion_down = 0 ;
    
        light_red   = 1 ;
    
        light_green = 0 ;
    
    end
    
    else begin
    
      case(state)
    
        down: begin                //down状态时对应的输出
    
          motion_up   = 0 ;
    
          motion_down = 0 ;
    
          light_red   = 1 ;
    
          light_green = 0 ;
    
        end
    
        down2up: begin             //down2up状态时对应的输出
    
          motion_up   = 1 ;
    
          motion_down = 0 ;
    
          light_red   = 1 ;
    
          light_green = 0 ;
    
        end
    
        up: begin                  //up状态时对应的输出
    
          motion_up   = 0 ;
    
          motion_down = 0 ;
    
          light_red   = 0 ;
    
          light_green = 1 ;
    
        end
    
        up2down: begin             //up2down状态时对应的输出
    
          motion_up   = 0 ;
    
          motion_down = 1 ;
    
          light_red   = 0 ;
    
          light_green = 1 ;
    
        end
    
        default: begin
    
          motion_up   = 0 ;
    
          motion_down = 0 ;
    
          light_red   = 1 ;
    
          light_green = 0 ;
    
        end
    
      endcase
    
    end
    
    end
    
    endmodule

    实际状态机

     

    RTL电路图

    C++代码

    #include <iostream>
    
    #include <string>
    
    using namespace std;
    
     
    
     
    
    string state;
    
    bool car_in,car_out;  //出入闸信号
    
    bool gan_up,gan_down;  //杆上下传感器信号
    
    bool light_red,light_green;  //红绿灯控制信号
    
    bool motion_up,motion_down;  //杆上下动作控制信号
    
     
    
    void change_state()   //状态迁移函数
    
    {
    
        if (state=="down")
    
        {
    
            if (car_in == true) state = "down2up";
    
            else state = "down";
    
        }
    
        else if (state == "down2up")
    
        {
    
            if (gan_up == true) state = "up";
    
            else state = "down2up";
    
        }
    
        else if (state == "up")
    
        {
    
            if (car_out == true) state = "up2down";
    
            else state = "up";
    
        }
    
        else if (state == "up2down")
    
        {
    
            if (gan_down == true) state = "down";
    
            else state = "up2down";
    
        }
    
    }
    
     
    
    void action()    //状态动作函数
    
    {
    
        if (state == "down")
    
        {
    
            light_red = true;
    
            light_green = false;
    
            motion_up = false;
    
            motion_down = false;
    
        }
    
        else if (state == "down2up")
    
        {
    
            light_red = true;
    
            light_green = false;
    
            motion_up = true;
    
            motion_down = false;
    
        }
    
        else if (state == "up")
    
        {
    
            light_red = false;
    
            light_green = true;
    
            motion_up = false;
    
            motion_down = false;
    
        }
    
        else if (state == "up2down")
    
        {
    
            light_red = false;
    
            light_green = true;
    
            motion_up = false;
    
            motion_down = true;
    
        }
    
    }
    
     
    
    void ncr()       //复位函数
    
    {
    
        car_in = false;
    
        car_out = false;
    
        gan_down = false;
    
        gan_up = false;
    
    }
    
     
    
    void read(string m)      //测试信号函数
    
    {
    
        if (m=="1y") car_in = true;          //汽车入闸传感器为true
    
        else if (m == "1n") car_in = false;  //汽车入闸传感器为false
    
        else if (m == "2y") car_out = true;  //汽车出闸传感器为true
    
        else if (m == "2n") car_out = false;  //汽车出闸传感器为false
    
        else if (m == "3y") gan_up = true;   //杆上方传感器为true
    
        else if (m == "3n") gan_up = false;  //杆上方传感器为false
    
        else if (m == "4y") gan_down = true; //杆下方传感器为true
    
        else if (m == "4n") gan_down = false; //杆下方传感器为false
    
    }
    
     
    
    void main()    //主函数
    
    {
    
        state = "down";    //默认杆放下
    
        string sensor;
    
        cout << "wait for car coming in..." << endl;
    
        cout << "current state is      " << "down" << endl;
    
        while (1) {    
    
            action();
    
            ncr();
    
            cout << "please input the signal" << endl;
    
            cin >> sensor;
    
            read(sensor);
    
            change_state();
    
            cout << "current state is      " << state << endl;
    
     
    
        }
    
    }

    结果显示图

     

    c++测试结果分析

    本c++代码程序是为了测试验证逻辑,所以一些信号是手动给出。首先默认当前状态为杆放下,即down状态,当有car_in信号输入时,即1y,状态变为down2up,其他信号发生改变时,状态不变。同理其他三个状态相似。测试结果符合预期要求。

  • 相关阅读:
    ROSBAG的使用以及TF_OLD_DATA问题
    cmake 编译安装库到指定目录
    QT 文件夹内文件查询与删除
    数组直接写入vector向量的方法与问题
    github上下载开源项目
    组件
    对象(二)
    对象(一)
    事件
    rem 、em
  • 原文地址:https://www.cnblogs.com/HUST-JingwuYang/p/6139095.html
Copyright © 2011-2022 走看看