[Harman 세미콘 아카데미] Day_30(Verilog)
오늘은 기존에 배웠던 TX를 활용하여 한번에 16개의 데이터를 보내는 것을 시작으로 포스팅하겠습니다.
16개를 전송하기 위한 블록도, FSM, 엣지 동작 확인도 입니다.
기존에 사용하던 TX를 기반으로, 데이터를 전송할때 High상태로 시켜놓는 TX_done을 활용할 예정입니다.
TX에서 데이터를 전송하고 START -> SEND -> STOP을 거치며, TX_done이 활성화 되어 있습니다. 데이터 전송이 끝나면, TX_done이 0으로 떨어지게됩니다. 저희는 이때를 활용하여 FSM을 생성하였습니다.
데이터를 전송하는 State인 SEND에서 데이터 전송이 끝나면 (TX_done이 0이 되면) count값을 증가시키며 다시 START state로 돌아갑니다. count의 값이 16번이 된다면 State를 IDLE로 초기화 시키며, 한번 버튼이 눌리면 16개의 데이터가 출력되는 것을 확인합니다.
아래는 코드입니다.
기존의 TX 코드에, 새로운 FSM에 대해 생성하여 한번의 버튼 입력 시, 16개의 데이터가 전송되도록 하는 코드입니다.
위에 작성한 State Machine을 참고하면 이해하기 편합니다.
결과:
시뮬레이션을 진행하였을때, btn_start 즉 버튼이 한번 눌리면 FSM의 state가 변하며 값을 출력하게 됩니다.
TX의 결과를 보게 되면, 1씩 증가함을 알 수 있고, tx_done이 0으로 떨어지는 점에 맞춰 다음 값이 연속으로 출력되는 모습을 확인할 수 있습니다. 또한, 16개의 데이터를 전송하고나면 IDLE state인 0으로 돌아가는 모습을 확인할 수 있습니다.
다음은 RX입니다. TX로 보내는 친구가 있으면 이를 받아줄 친구도 필요하겠죠?
RX도 TX와 거의 유사하다고 보시면 됩니다. 왜나하면 TX가 보내는 Data를 받는 애니깐 동작 방법이 비슷해야합니다.
그래서, TX가 데이터를 IDLE -> START -> DATA -> STOP의 방식으로 보내듯, RX도 유사하게 받습니다.
기존 IDLE state가 1을 출력하며 있다가, 데이터가 들어오게 되면 값이 0으로 떨어지며 START state로 들어가게 됩니다.
또한, Data에 관한 state로 들어가며 값들을 받아 저장하고, Stop state로 천이되며 종료하게 됩니다. 하지만, 상대방이 전달하는걸 정확히 받아야 통신이라는 것이 의미가 있겠죠?
그래서 저희는 TX때 9600 Baudarte를 16으로 보내 오차를 줄여서 보냈었습니다. 이를 활용하여, 받을때도 안전하게 받을 것 입니다. 16개의 Tick의 중간 값을 찾는 것입니다. 16 Tick에 있는 데이터 중에서, 중앙값의 개념을 확인하여 더욱 안전하고 정확하게 데이터를 찾게 되는 개념입니다!
그리하여, RX도 TX와 유사하게 코드를 구성하였습니다.
FSM을 사용하여 4개의 State를 활용하였습니다. 또한, state를 넘나들며 데이터를 안정적으로 받기 위해 16개의 Tick에서 8번째 즉, 중앙 Tick의 데이터를 찾아서 받을 것 입니다. 그래서, IDLE -> STATE의 8번째 틱 -> Data1의 8번째 틱 ---- ->Data7의 8째 틱 -> STOP ----- 24개의 틱 확인 -> IDLE 순으로 순환하게 됩니다.
마지막에선 왜 24개의 틱을 확인하나면, 기존에 우리는 Data7의 8번째 틱까지만 확인을 했습니다. 이후, Stop State를 넘어가기 위해 8개의 Tick이 필요합니다. Stop State는 기본적으로 16개의 Tick을 가지고 있기 떄문에, 전송된 데이터를 모두 저장하고 기존의 IDLE state로 넘어가기 위해서는 8+ 16 총 24개의 틱이 필요합니다.
UART RX의 경우도, TX와 다름없이 Tick과 데이터 비트수를 통해 FSM의 state를 넘나들며 데이터 값을 저장하는 역할을 하게 됩니다.
그래서 이를 검증하기 위해, loopback회로를 구성하였습니다.
결과: 1개 이상의 데이터가 들어오면 값이 한 두개 빠지는 현상이 발생합니다. 이는 추후, FIFO register를 추가하여 해결할 예정입니다.
또한, 과제로 저희가 전송하고 받는 데이터를 FPGA 의 FND를 통해 출력하였습니다. 이를 위해 FND Controller를 새로이 설계하였습니다.
이때, Loop에서 8bit data를 TX와 RX가 주고 받는데, 이를 FND Controller에 연결하여, 데이터를 7 Segment로 출력할 수 있도록 하였습니다.
아래는 실행 결과입니다. 참고하시면 좋을 것 같습니다. 감사합니다!