Page 1110 - 3-2
P. 1110

//  수신 OK
             module uart_rx1 ( clk,   rst,rxd, rx_data);

             // 수신 모듈

             input clk, rst,  rxd;
             output [7:0] rx_data;
             parameter baud_rate = 5208; // = 54MHz / 9600bps
             parameter CLOCKS_WAIT_FOR_RECEIVE = 5208 / 2;

             reg [7:0]       rx_data;  // 수신데이터 저장하는 레지스터
             reg [7:0]    rx_data_buffer; //rxd 에서 수신된 데이터를 임시로 저장하기 위한 레지스터
             reg [3:0]       rx_bit_cnt;  // 수신데이터 비트 카운터 변수
             reg [15:0]      rx_clk_cnt;  //  수신시 통신 속도를 카운터하기              위한 변수
             reg [15:0]    rx_start_cnt; //start bit check 를 위한 카운터 변수
             reg state_rx; // state_rx = 0  휴지상태 , state_rx=1  수신 상태


             always @(posedge clk, negedge rst)
             if(rst == 0)
              begin
                     rx_clk_cnt  <= 0;
                     rx_bit_cnt  <= 0;
                     rx_start_cnt  <= 0;
                     state_rx  <= 0; //  수신회선      휴지 상태
              end
             else
                     begin
                     if(state_rx  == 0 && rxd == 0) // if not   receive mode and start bit is detected
                     begin
                           if(rx_start_cnt >= CLOCKS_WAIT_FOR_RECEIVE -1)
                           begin
                             rx_start_cnt  <= 0;
                        state_rx <= 1'b1;        //enter receive mode
                         end
                     else
                              begin
                             rx_start_cnt  <= rx_start_cnt +1'b1 ;
                     state_rx  <= 1'b0;
                     end
                     end
                     else    rx_start_cnt <=0;


                     if(state_rx  == 1)   // if receive mode
                     begin
                             if(rx_clk_cnt  >= baud_rate) // 컴퓨터의 통신속도로 시스템클럭 분주
                          begin
                                     rx_clk_cnt  <= 0;

                     if(rx_bit_cnt  >= 8) rx_bit_cnt <= 0; //  수신데이터 bit count
                     else   rx_bit_cnt <= rx_bit_cnt +1'b1;
                     end
                     else rx_clk_cnt <= rx_clk_cnt + 1'b1;

                     if  ( rx_bit_cnt < 8 && rx_clk_cnt == baud_rate) // receive data
                     begin
                             rx_data_buffer[rx_bit_cnt] <=  rxd;
                     state_rx  <= 1;
                     end
                     else   if (rx_bit_cnt == 8&& rx_clk_cnt == baud_rate && rxd == 1)//  stop receiving
                     begin
                     state_rx  <= 0;
                     rx_data   <= rx_data_buffer; // data  출력
                     end
                     //  if stop bit is not received, clear the received data


                                                        - 1110 -
   1105   1106   1107   1108   1109   1110   1111   1112   1113   1114   1115