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 -
   175   176   177   178   179   180   181   182   183   184   185