實時控制系統軟件設計第二週做業-停車場門禁狀態機-楊靜梧

 

做業內容

根據本週課堂內容,設計一個停車場門禁控制系統的狀態機。ios

門禁控制系統的輸入信號包括:c++

  • 起落杆位置傳感器:有兩個位置值信號(升起/落下)
  • 汽車入閘傳感器:有兩個值(True/False)
  • 汽車出閘傳感器:有兩個值(True/False)

門禁控制系統的輸出信號包括:函數

  • 起落杆電機控制信號:(上升/降低)
  • 通行燈信號:(紅燈/綠燈)

一輛汽車的經過流程爲:測試

  • 起落杆處於落下狀態,通行燈爲紅燈。
  • 汽車進入門禁系統,入閘傳感器值變爲True。
  • 控制起落杆上升,直到起落杆位置傳感器到達升起位置。
  • 通行燈爲綠燈。
  • 汽車離開門禁,觸發汽車出閘傳感器值爲True。
  • 控制起落杆降低,直到起落杆位置傳感器到達落下位置。
  • 通行燈變爲紅燈。

所描述的控制系統的狀態機包括:spa

  • 狀態機的全部狀態
  • 狀態機所接收到的外部事件
  • 狀態機所產生的動做
  • 狀態機的全部狀態躍遷:(原狀態、新狀態、觸發條件、產生動做)

狀態機分析

 

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,其餘信號發生改變時,狀態不變。同理其餘三個狀態類似。測試結果符合預期要求。設計

相關文章
相關標籤/搜索