임베디드랜드

RS-232 transmitter module

여기에 우리가 만들려는 놈이 있다.

이놈은 다음과 같이 작동을 한다.

  • 트랜스미터는 8비트 데이터를 가지며, 그것을 직렬화한다.(TxD_start신호가 오면 시작한다)
  • 전송중에는 busy 신호를 발생하며, TxD_start 신호는 무시된다.

Seializing the data

우리는 이제껏 BaudTick 신호를 115200 으로 가정을 해왔다.
우리는 스타트비트와 데이터인 8비트, 스톱비트를 만들어 낼 필요가 있다.

fpga4fun.com 의 FPGA interface projects 섹션에 serial interface 부분이 있다. 그 RS-232 부분의 번역본이다.
이문서의 원본은 http://www.fpga4fun.com/SerialInterface3.html 에서 찾을수 있다. from 후니유.

공부를 위한 목적으로 번역을 하였기때문에 오역,맘대로의역이 있어도 내맘이다 ㅋㅋ

reg[3:0] state;

always @(posedge clk)
case(state)
  4'b0000: if(TxD_start) state <= 4'b0100;
  4'b0100: if(BaudTick) state <= 4'b1000; //start
  4'b0100: if(BaudTick) state <= 4'b1001; //bit 0
  4'b1000: if(BaudTick) state <= 4'b1010; //bit 1
  4'b1001: if(BaudTick) state <= 4'b1011; //bit 2
  4'b1010: if(BaudTick) state <= 4'b1100; //bit 3
  4'b1011: if(BaudTick) state <= 4'b1101; //bit 4
  4'b1100: if(BaudTick) state <= 4'b1110; //bit 5
  4'b1101: if(BaudTick) state <= 4'b1111; //bit 6
  4'b1110: if(BaudTick) state <= 4'b0001; //bit 7
  4'b1111: if(BaudTick) state <= 4'b0010; //stop1
  4'b0001: if(BaudTick) state <= 4'b0000; //stop2
  default: if(BaudTick) state <= 4'b000;
endcase

state machine 이 TxD_start 신호가 뜰때 시작하는 것을 확인하자.

reg muxbit;

always @(state[2:0])
case(state[2:0])
  0: muxbit <= TxD_data[0];
  1: muxbit <= TxD_data[1];
  2: muxbit <= TxD_data[2];
  3: muxbit <= TxD_data[3];
  4: muxbit <= TxD_data[4];
  5: muxbit <= TxD_data[5];
  6: muxbit <= TxD_data[6];
  7: muxbit <= TxD_data[7];
endcase

assign TxD = (state<4) | (state[3] & muxbit);

다음은 RS-232 리시버 모듈로 넘어간다. 여기를 눌러~~

Posted by suvisor