⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 controller.v

📁 elevaters used in transportation
💻 V
字号:
//setup the definitions for the design`define s0 4'd0		//reset (power on state)`define s1 4'd1		//floor one`define s2 4'd2		//floor two`define s3 4'd3		//floor three`define s4 4'd4		//floor four`define s5 4'd5		//floor five`define s6 4'd6		//floor six`define s7 4'd7		//floor seven`define s8 4'd8		//floor eight`define s9 4'd9		//floor nine`define exp_s0 2'd0		//express reset (power on state)`define exp_s1 2'd1		//express floor one`define exp_s2 2'd2		//security check`define exp_s3 2'd3		//express floor twomodule controller(main_car_destination,    //floor that main car is headed to                   express_car_destination, //floor that express car is headed to                   check_permission,        //asserted when the security code needs to be checked                  maintenance_alarm,       //alarm indicating the elevator is stuck or too hot or cold                  current_floor,           //current floor of the main elevator                  express_floor,           //current floor of the express elevator                  internal_requests,       //floor request by passenger in main elevator                  main_maintenance,        //request for maintenance in main car, to hot or cold                  express_maintenance,     //request for maintenance in express car, to hot or cold                  secure,                  //correct security code was entered to access 10th floor in express car                  reject,                  //incorrect security code was entered to access 10th floor in express car                   external_requests,       //floor request by passenger waiting for main elevator                  express_up,              //request for the express elevator to go up                  express_down,            //request for the express elevator to go down                  stuck,                   //indicated that there is a person stuck in one of the elevators                  reset,                   //reset returns the elevator to its power up state                  clk);                    //system clockoutput [3:0] main_car_destination, current_floor, express_floor;output check_permission, maintenance_alarm, express_car_destination;input [8:0] internal_requests, external_requests;input main_maintenance, express_maintenance,  secure, reject, express_up, express_down, stuck, reset, clk;reg [3:0] main_car_destination, current_floor, express_floor;reg check_permission, maintenance_alarm, express_car_destination;//internal signals for the designwire [8:0] active_requests;reg [8:0] adjusted_internal_requests, adjusted_external_requests;reg [3:0] current_state, next_state, previous_state;reg [1:0] exp_state, next_exp_state;wire maintenance_request;/*setup the main_car_destination - The main car destination is controlled by a simple state machine which cycles through the floors of the building based on the requests of the people inside and outside the elevator. This state machine also controls the current_floor output signal.*/	//define the active requests	always@(posedge clk) begin	if (reset) begin		adjusted_internal_requests = 0;		adjusted_external_requests = 0;		end	else begin		case (current_floor)			4'b0001 : begin				adjusted_internal_requests = internal_requests & 9'b111111110;				adjusted_external_requests = external_requests & 9'b111111110;				end			4'b0010 : begin				adjusted_internal_requests = internal_requests & 9'b111111101;				adjusted_external_requests = external_requests & 9'b111111101;				end			4'b0011 : begin				adjusted_internal_requests = internal_requests & 9'b111111011;				adjusted_external_requests = external_requests & 9'b111111011;				end			4'b0100 : begin				adjusted_internal_requests = internal_requests & 9'b111110111;				adjusted_external_requests = external_requests & 9'b111110111;				end			4'b0101 : begin				adjusted_internal_requests = internal_requests & 9'b111101111;				adjusted_external_requests = external_requests & 9'b111101111;				end			4'b0110 : begin				adjusted_internal_requests = internal_requests & 9'b111011111;				adjusted_external_requests = external_requests & 9'b111011111;				end			4'b0111 : begin				adjusted_internal_requests = internal_requests & 9'b110111111;				adjusted_external_requests = external_requests & 9'b110111111;				end			4'b1000 : begin				adjusted_internal_requests = internal_requests & 9'b101111111;				adjusted_external_requests = external_requests & 9'b101111111;				end			4'b1001 : begin				adjusted_internal_requests = internal_requests & 9'b011111111;				adjusted_external_requests = external_requests & 9'b011111111;				end			endcase		end	end	assign active_requests = adjusted_internal_requests | adjusted_external_requests;	//define the state memory	always @ (posedge clk) begin		previous_state = current_state;		current_state = next_state;	end	//define the next_state logic	always @ (current_state or reset or active_requests or previous_state) begin		if (reset) next_state = `s0;		else begin			case (current_state)				`s0 : next_state = `s1;				`s1 : begin					if (|active_requests[8:1]) next_state = `s2;					else next_state = `s1;					end				`s2 : begin									if ((previous_state == `s1) && (|active_requests[8:2])) next_state = `s3;								else if ((previous_state == `s1) && (~|active_requests[8:2]) && (active_requests[0])) next_state = `s1;					else if ((previous_state == `s3) && (active_requests[0])) next_state = `s1; 				    else if ((previous_state == `s3) && (~active_requests[0]) && (|active_requests[8:2])) next_state = `s3;					else if ((previous_state == `s2) && (|active_requests[8:2])) next_state = `s3;					else if ((previous_state == `s2) && (active_requests[0])) next_state = `s1;					else next_state = `s2;					end				`s3 : begin					if ((previous_state == `s2) && (|active_requests[8:3])) next_state = `s4;					else if ((previous_state == `s2) && (~|active_requests[8:3]) && (|active_requests[1:0])) next_state = `s2;					else if ((previous_state == `s4) && (|active_requests[1:0])) next_state = `s2; 				    else if ((previous_state == `s4) && (~|active_requests[1:0]) && (|active_requests[8:3])) next_state = `s4;					else if ((previous_state == `s3) && (|active_requests[8:3])) next_state = `s4;					else if ((previous_state == `s3) && (active_requests[1:0])) next_state = `s2;					else next_state = `s3;					end				`s4 : begin					if ((previous_state == `s3) && (|active_requests[8:4])) next_state = `s5;					else if ((previous_state == `s3) && (~|active_requests[8:4]) && (|active_requests[2:0])) next_state = `s3;					else if ((previous_state == `s5) && (|active_requests[2:0])) next_state = `s3; 				    else if ((previous_state == `s5) && (~|active_requests[2:0]) && (|active_requests[8:4])) next_state = `s5;					else if ((previous_state == `s4) && (|active_requests[8:4])) next_state = `s5;					else if ((previous_state == `s4) && (active_requests[2:0])) next_state = `s3;					else next_state = `s4;					end				`s5 : begin					if ((previous_state == `s4) && (|active_requests[8:5])) next_state = `s6;					else if ((previous_state == `s4) && (~|active_requests[8:5]) && (|active_requests[3:0])) next_state = `s4;					else if ((previous_state == `s6) && (|active_requests[3:0])) next_state = `s4; 				    else if ((previous_state == `s6) && (~|active_requests[3:0]) && (|active_requests[8:5])) next_state = `s6;					else if ((previous_state == `s5) && (|active_requests[8:5])) next_state = `s6;					else if ((previous_state == `s5) && (active_requests[3:0])) next_state = `s4;					else next_state = `s5;					end				`s6 : begin					if ((previous_state == `s5) && (|active_requests[8:6])) next_state = `s7;					else if ((previous_state == `s5) && (~|active_requests[8:6]) && (|active_requests[4:0])) next_state = `s5;					else if ((previous_state == `s7) && (|active_requests[4:0])) next_state = `s5; 				    else if ((previous_state == `s7) && (~|active_requests[4:0]) && (|active_requests[8:6])) next_state = `s7;					else if ((previous_state == `s6) && (|active_requests[8:6])) next_state = `s7;					else if ((previous_state == `s6) && (active_requests[4:0])) next_state = `s5;					else next_state = `s6;					end				`s7 : begin					if ((previous_state == `s6) && (|active_requests[8:7])) next_state = `s8;					else if ((previous_state == `s6) && (~|active_requests[8:7]) && (|active_requests[5:0])) next_state = `s6;					else if ((previous_state == `s8) && (|active_requests[5:0])) next_state = `s6; 				    else if ((previous_state == `s8) && (~|active_requests[5:0]) && (|active_requests[8:7])) next_state = `s8;					else if ((previous_state == `s7) && (|active_requests[8:7])) next_state = `s8;					else if ((previous_state == `s7) && (active_requests[5:0])) next_state = `s6;					else next_state = `s7;					end				`s8 : begin					if ((previous_state == `s7) && (active_requests[8])) next_state = `s9;					else if ((previous_state == `s7) && (~active_requests[8]) && (|active_requests[6:0])) next_state = `s7;					else if ((previous_state == `s9) && (|active_requests[6:0])) next_state = `s7; 				    else if ((previous_state == `s9) && (~|active_requests[6:0]) && (active_requests[8])) next_state = `s9;					else if ((previous_state == `s8) && (|active_requests[8])) next_state = `s9;					else if ((previous_state == `s8) && (active_requests[6:0])) next_state = `s7;					else next_state = `s8;					end				`s9 : begin					if (|active_requests[7:0]) next_state = `s8;					else next_state = `s9;					end				 default : next_state = `s0;			endcase		end	end		//define the output logic	always @ (current_state or previous_state) begin		main_car_destination = current_state;		current_floor = previous_state;	end/*setup the express_car_destination - The express car destination is controlled with a simple state machine and is based on the requests of the people wanting to access the tenth floor and the security code for this floor.*/	//define the state memory	always @ (posedge clk) begin		exp_state <= next_exp_state;		end	//define the next state logic	always @ (exp_state or secure or reject or express_up or express_down or reset) begin		if (reset) next_exp_state = `exp_s0;		else begin			case (exp_state)				`exp_s0 : next_exp_state = `exp_s1;				`exp_s1 : begin					if (express_up) next_exp_state = `exp_s2;					else if (express_down) next_exp_state = `exp_s3;					else next_exp_state = `exp_s1;					end				`exp_s2 : begin					if (secure) next_exp_state = `exp_s3;  //changed from exp_s1               else if (reject) next_exp_state = `exp_s1;       //changed from exp_s3					else next_exp_state = `exp_s2;					end				`exp_s3 : next_exp_state = `exp_s1;			endcase		end	end	//define the output logic	always @ (exp_state or express_down or secure or reset) begin		if (reset) begin			express_car_destination = 0;			check_permission = 0;			express_floor = 4'b0000;			end		else begin						case (exp_state)				`exp_s0 : begin					express_car_destination = 0;					check_permission = 0;					express_floor = 4'b0001;					end				`exp_s1 : begin					check_permission = 0;					express_floor = 4'b0001;					if (express_down) express_car_destination = 1;					else express_car_destination = 0;					end				`exp_s2 : begin					check_permission = 1;					express_floor = 4'b0001;					if (secure)                   express_car_destination = 1;					else express_car_destination = 0;					end				`exp_s3 : begin					express_car_destination = 1;					check_permission = 0;					express_floor = 4'b1010;  //changed from 2 to 10					end			endcase		end	end							/*setup the maintenance alarm functionality - The maintenance alarm will be activated if the temperature of the car is too high or too low.  The maintenance alarm will also be activated if the elevator is stuck between floors)*/assign maintenance_request = express_maintenance || main_maintenance;always@(posedge clk) begin	if (reset) begin		maintenance_alarm = 0;		end	else if (maintenance_request || stuck) begin		maintenance_alarm = 1;		end	else maintenance_alarm = 0;	endendmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -