Page 180 - 3-2
P. 180
2) 하위 모듈 (elevator)
module elevator(clk, reset, mo, mo2, lm_bot, lm_top, lm_mid, fnd_data, one, two,
three, oneu, twou, twod, threed, yellow, green, red, led, cf, rx_data,
weight_sw);
input clk, reset;
input lm_top, lm_bot, lm_mid; // 3 층, 2 층, 1 층 리밋스위치
input one, two, three; // 외부 1, 2, 3 층
input oneu, twou, twod, threed; // 내부 1, 2, 3 층
input [7:0]led;
input [7:0]rx_data; // 수신 받은 층 값
input [3:0]weight_sw;
output reg [1:0]mo,mo2; // 엘레베이터 엘레베이터 문,
output reg yellow,green; // led
output red;
assign red=(weight_sw==4'b1111)?1:0;
output reg [7:0] fnd_data; // FND 에 출력할 data
output reg [1:0]cf; // fpga 에서 안드로이드로 현재 층을 보냄
reg [50:0] cnt; // 문이 열리고 닫히는 시간 카운트
reg door_flag; // 1 이 되면 문이 열렸다 닫힘
reg one_flag=0;
reg three_flag=0; // 1 층에서 2 층과 3 층을 둘다 누르면 2 층을 거쳐 3 층까지 가야함
reg [3:0] cs;// 상태
reg [3:0] ns;
parameter
idle=4'b0000, ones=4'b0001, twos=4'b0010, threes=4'b0011,
M1F_2F=4'b0100, M2F_3F=4'b0101, M3F_2F=4'b0110, M2F_1F=4'b0111, M1F_3F=4'b1000,
M3F_1F=4'b1001,
Mtwou=4'b1010, Mtwod=4'b1011, MM2F_3F=4'b1100, MM2F_1F=4'b1101, door=4'b1110;
always @(posedge clk) // cs 값을 이용해 현재 층
begin
if(!reset) begin cf<=0; end
else begin
if (rx_data !="0") begin
if (rx_data=="1") begin cf<=2'b01; end
else if (rx_data=="2")begin cf<=2'b10; end
else if (rx_data=="3") begin cf<=2'b11; end
end
else begin
if((~bot_idle & bot_cnt_max & bot_state==1)) begin cf<=2'b01; end
else if(~mid_idle & mid_cnt_max & mid_state==1) begin cf<=2'b10; end
- 180 -