根據本週課堂內容,設計一個停車場門禁控制系統的狀態機。ios
門禁控制系統的輸入信號包括:c++
門禁控制系統的輸出信號包括:函數
一輛汽車的經過流程爲:測試
所描述的控制系統的狀態機包括:spa
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
#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++代碼程序是爲了測試驗證邏輯,因此一些信號是手動給出。首先默認當前狀態爲杆放下,即down狀態,當有car_in信號輸入時,即1y,狀態變爲down2up,其餘信號發生改變時,狀態不變。同理其餘三個狀態類似。測試結果符合預期要求。設計