본문 바로가기

Contact English

【논리설계】 9강. 프로토콜

 

9강. 프로토콜(protocol)

 

추천글 : 【논리설계】 논리설계 목차


1. 프로토콜 [본문]

2. Keyboard [본문]

3. KeyboardDecode [본문]

4. Sender [본문]

5. Receiver [본문]

6. DisplayControl [본문]

7. Display [본문]


 

1. 프로토콜 [목차]

⑴ 예 : RS-232 serial line protocol, RS-485

① (참고) RS-485는 8 bit 단위이며 RS-232의 상위 호환 버전

⑵ 공중 전화 교환망(PSTN)을 통한 단말장치(DTE)/모뎀(DCE) 접속 규격이다. V.24, V.28, ISO2110을 사용하는 접속 규격과 기능적으로 호환성을 가지며, 현재 가장 많이 사용된다.

⑶ 25핀으로 구성된 커넥터로, 전송 거리는 15m 이하이다.

⑷ 데이터 신호 속도는 최고 20Kbps이다.

⑸ 전이중/반이중, 동기/비동기 모두에 대응한다.

⑹ 주요 핀의 기능

 

 핀 번호 핀 이름 기능
1 FG(Frame Ground)
GND(Ground)
보호용 접지 회로
2 TXD(Transmitted Data) 송신 데이터. 데이터를 송신하는 기능
3 RXD(Receivered Data) 수신 데이터. 데이터를 수신하는 기능
4 RTS(Return To Send) 송신 요청. DTE에서 DCE한테 송신을 요청하는 기능
5 CTS(Clear To Send) 송신 준비 완료. DCE에서 DTE한테 송신 준비 완료를 알리는 기능
6 DSR(Data Set Ready) DCE  정상 상태. DCE의 동작 상태를 알리는 기능
(ON: 동작, OFF: 동작 안 함)
7 SG(Signal Ground) 신호 접지. 모든 신호의 기준 전압으로 되어 있음
8 DCD(Data Carrier Detect) 수신선 신호 감지. DCE가 선로 쪽으로부터 감지할 수 있는 신호를  수신하고 있음을 DTE에 알리는 기능
20 DTR(Data Terminal Ready) DTE 정상 상태. DTE가 정상 동작을 하고 있음을 DCE에 알리는 기능
22 RI(Ring Indicator) 링 감지 신호. 상대편으로부터 링 신호가 들어오고 있다는 것을 DTE 에 알리는 기능

 

 

 

Figure. 1. 단일 시리얼 선으로 연결된 sender/receiver에 대한 도식

 

 

2. Keyboard [목차]

 

Figure. 2. 디바운싱 회로가 포함된 Keyboard 블록의 도식

 

Figure. 3. 단일 키보드 키에 대한 도식

 

⑴ Key 누름 → 스위치 연결 → Keypad, Common(Gnd) 출력 → X, Y = 1

⑵ Key 뗌 → 스위치 개방 → Keypad, HIGH 출력 → X, Y = 0

⑶ 여러 Key에 대해 X, Y가 결정되므로, 실제로는 Keypad 출력단자에 OR gate가 존재

⑷ 디바운싱 회로 : 기계적 스위치의 한 번에 붙지 않는 문제(바운싱)를 해결하는 회로 (ref

① RC 적분회로, RS_FF 등이 대표적

 

 

3. KeyboardDecode [목차]

Figure. 4. KeyboardDecode와 Sender 간의 상호작용(handshake)

 

⑴ Send : Sender로 정보를 보내겠다는 표시로 Acks 신호를 받으면 0이 된다.

⑵ CharToSend : 읽어들인 7개의 입력이 8 bits ASCII 코드로 번역된 값

⑶ AckS(acknowledge) : Sender가 성공적으로 정보를 받고 처리 시 출력하는 표시

⑷ 전체 코드

 

`timescale 1ns / 1ps

module KeyboardDecode(
    input ClkS, input ResetS,   input R1,   input R2,
    input R3,   input R4,   input C1,   input C2,
    input C3,   input AckS, output Send,    output [7:0] CharToSend
     );
     reg [7:0] CharToSend;
     reg    Send;
     wire KeyPress;
     
     assign KeyPress = (R1 || R2 || R3 || R4) && (C1 || C2 || C3);
     
     always@(posedge ClkS) begin
         if(ResetS) Send <= 0;
         else   begin
             if(AckS)   Send <= 1;
             else if(KeyPress && !AckS) begin
                 if(R1 && C1)   CharToSend <= 8'b00110001;      // '1'
                 else if(R1 && C2)  CharToSend <= 8'b00110001;  // '2'
                 else if(R1 && C3)  CharToSend <= 8'b00110001;  // '3'
                 else if(R2 && C1)  CharToSend <= 8'b00110001;  // '4'
                 else if(R2 && C2)  CharToSend <= 8'b00110001;  // '5'
                 else if(R2 && C3)  CharToSend <= 8'b00110001;  // '6'
                 else if(R3 && C1)  CharToSend <= 8'b00110001;  // '7'
                 else if(R3 && C2)  CharToSend <= 8'b00110001;  // '8'
                 else if(R3 && C3)  CharToSend <= 8'b00110001;  // '9'
                 else if(R4 && C1)  CharToSend <= 8'b00110001;  // '*'
                 else if(R4 && C2)  CharToSend <= 8'b00110001;  // '0'
                 else if(R4 && C3)  CharToSend <= 8'b00110001;  // '#'
                 Send <= 1;
             end
         end
     end
endmodule

 

 

4. Sender [목차]

 

 

Figure. 5. Sender의 데이터 경로

 

⑴ Send : KeyboardDecode로부터 데이터를 받겠다는 표시

⑵ CharToSend : KeyboardDecode로부터 받은 8 bits 데이터

⑶ AckS : Sender가 성공적으로 받은 데이터를 처리중이라는 표시로 waiting signal의 일종

⑷ TxD : 개시 비트(0) - 8 bits 데이터 - 종결 비트(1)순으로 1 bit씩 전달

① 8 bits 데이터는 MSB에서 LSB 순으로 전달

⑸ 전체 코드 

 

`timescale 1ns / 1ps

module Sender(
    input ClkS,    input ResetS,    input Send,
    input [7:0] CharToSend,
    output AckS,    output TxD
    );
     
     reg TxD;   
     reg [7:0] CharToSend;
     reg [3:0] bitCounter;  // keeps count of which bit is being sent
     reg go;
     
     always @(posedge ClkS) begin
         if(ResetS) begin   
             TxD <= 1;  go <= 0;
         end
         else begin
             if(send) begin                 // loading characters sent from KeyboardDecoder
                 CharToSend <= CharToSend;  // red CharToSend <= wire CharToSend
                 bitCounter <= 0;   go <= 1;
             end
             else   begin                   // allocating TxD with proper value with the condition "go = 1"
                 bitCounter <= bitCounter + 1;
                 if(go) begin
                     if(bitCounter == 0)        TxD <= 0;   // Start bit
                     else if(bitCounter > 0 && bitCounter <= 8) 
                         TxD <= CharToSend[8 - bitCounter];
                     else if(bitCounter > 8) begin
                         TxD <= 1;
                         go <= 0;
                     end
                 end
             end
         end
     end
     
     assign AckS = go;
     
endmodule

 

 

5. Receiver [목차]

 

Figure. 6. Receiver와 DisplayControl과의 상호작용(handshake)

 

RxD : Sender로부터 1 bit씩 정보가 전달되는 선

⑵ Rcvd : Receiver가 Sender로부터 정보를 모두 받았다는 표시

① Rcvd = 1이면(처리하지 못한 데이터가 있으면) RxD를 무시한다.

⑶ CharRcvd : Receiver가 Sender로부터 받은 8 bits 데이터

⑷ AckR : DisplayControl이 Receiver로부터 성공적으로 정보를 받고 처리 시 출력하는 표시

⑸ Receiver와 Sender 간 Ack 신호가 없어서 문제가 야기될 수 있다.

① Sender와 Receiver 간 거리가 멀어 신호도달 시간이 길다.

② race condition : Receiver가 Sender 신호를 중간부터 받는 현상

③ 해결책 : buffer를 마련해 Sender의 신호를 10개 정도 미리 저장해 둔다.

⑹ oversampling : Receiver의 clock 진동수는 Sender의 정수배(≥ 2)이다. (ref) ]

① aliasing : 원본 신호 주파수 이하의 주파수로 샘플링 될 시 고주파 영역이 손상되는 현상

○ 예 : 빠른 프로펠러가 눈으로 보기에 느리게 회전하는 것처럼 보이는 현상

○ FFT(fast Fourier transform), Nyquist theorem

 

 

Figure. 7. Receiver와 Sender의 clock 진동수가 같을 때의 문제점

 

② 정수배인 이유

 

 

 

Figure. 8. clock 간 동기화에 따른 샘플링 차이

 

⑺ 전체 코드 

 

`timescale 1ns / 1ps

module Receiver(
    input ClkR,    input ResetR,    input RxD,    input AckR,
    output [7:0] CharRcvd,    output Rcvd
    );
     
     reg [4:0] bitCounter;   // keep count of number of bits through RxD (0 ~ 15)
     reg [1:0] cycleCounter; // for oversampling
     reg [8:0] characterReceived;   
     reg    go;              // flag indicating a character is arriving 
     
     always @(posedge ClkR) begin
         if(ResetR) begin   go <= 0; Rcvd <= 0; end
         else begin
             if(!go && !Rcvd && !AckR && RxD);
             if(!go && !Rcvd && !AckR && !RxD)  begin
                 go <= 1;   
                 bitCounter <= 0;
                 cycleCounter <= 0;
             end
             if(go) begin
                 if(cycleCounter == 0) begin
                     characterReceived[8 - bitCounter] <= RxD;
                     if(bitCounter < 8) bitCounter <= bitCounter + 1;
                     else begin     // the entire characters have been received
                         go <= 0;
                         Rcvd <= 1;
                     end
                 end
             end
             if(AckR) Rcvd <= 0;    // DisplayControl is still not available
         end
     end
     
     assign CharRcvd[7:0] = characterReceived[7:0];

endmodule

 

 

6. DisplayControl [목차]

⑴ Rcvd : Receiver가 데이터를 보낼 준비가 됐다는 신호

⑵ CharRcvd : Receiver가 보내는 데이터

⑶ AckR : DisplayControl가 성공적으로 받은 데이터를 처리중이라는 신호로 wating signal의 일종

⑷ RS : reset의 약자

⑸ DB : data bus의 약자

⑹ E : enable의 약자

⑺ 전체 코드

 

`timescale 1ns / 1ps

module DisplayControl(
    input ClkR,    input ResetR,    input Rcvd,    input [7:0] CharRcvd,
    output AckR,    output [7:0] DB,    output RS,    output Enable
    );

     reg [7:0] databus;
     reg Enable;
     reg RS;
     reg AckR;
     
     reg initMode;           // indicates wheter the initialize sequence is in progress
     reg [4:0] initState;    // states for initialization sequence
    
     parameter start = 0;
     parameter step1 = 1;
     parameter endstep1 = 2;
     parameter step2 = 3;
     parameter endstep2 = 4;
     parameter step3 = 5;
     parameter endstep3 = 6;
     parameter step4 = 7;
     parameter endstep4 = 8;
     parameter final = 9;

     assign DB = (initMode)? databus : CharRcvD;
     
     always @(posedge ClkR) begin
         if(ResetR) begin
             initMode <= 1;
             initState <= start;
             Enable <= 0;
             AckR <= 0;
         end
         else if(initMode) begin    // do initialize
             case(initState)
                 start:   begin RS <= 0; initState <= step1; end

                 step1:       begin Enable <= 1; databus <= 8'b00000001; initState <= endstep1; end

                 endstep1: begin Enable <= 0; initState <= step2; end

                 step2:   begin Enable <= 1; databus <= 8'b00110011; initState <= endstep2; end

                 endstep2: begin Enable <= 0; initState <= step3; end

                 step3:       begin Enable <= 1; databus <= 8'b00001100; initState <= endstep3; end

                 endstep3: begin Enable <= 0; initState <= step4; end

                 step4:       begin Enable <= 1; databus <= 8'b00000110; initState <= endstep4; end

                 endstep4: begin Enable <= 0; initState <= final; end

                 final:       begin RS <= 1; initMode <= 0; initState <= final; end

             endcase
         end
         else begin
             if(Rcvd && !AckR) begin    // handshake with DisplayControl and Display
                 case(Enable)           // Enable should be HIGH to implement properly
                     0: begin Enable <= 1; end
                     1: begin Enable <= 0;  AckR <= 1; end
                 endcase
             end
             else begin                 // complete handshake lowering AckR after Rcvd is lowered
                 if(!Rcvd) AckR <= 0;
             end
         end
     end

endmodule

 

 

7. Display [목차]

 

출처: 서울대학교 논리설계(유승주) 강의

Figure. 9. LCD screen operations]

 

 

출처: 서울대학교 논리설계(유승주) 강의

Figure. 10. Timing of LCD screen interface]

 

입력: 2016.11.27 01:54