상세 컨텐츠

본문 제목

PROJECT - UART protocol을 이용한 구현

PROJECT

by 썽심 2024. 4. 10. 18:02

본문

728x90

기간

2023.07.24 ~ 23.08.23

 

 

사용 Tool

laguage: Verilog Ver.2001

Synthesis: Intel(Altera) 사의 Quartus prime 18.1

Simulation: Intel(Altera) 사의 ModelSim 10.5b

Board: Intel(Altera) 사의 DE1_SoC (FPGA와 HPS가 결합된 SoC)

FPGA(device): Intel(Altera)_Cyclone V(5CSEMA5F31c6)

                        MAX10(5CSEMA5F31C6)_simulation check

 

HPS(Hard Processor System): ARM 사의 Coretex-A9

PC terminal: TeraTerm 4.106

USB to TTL: FT232B

 

*HPS : FPGA(Field-Programmable Gate Array) 디바이스에 내장된 프로세서 시스템을 의미합니다. HPS는 일반적으로 ARM Cortex-A 시리즈와 같은 프로세서 코어를 포함하며, 다양한 주변 장치와 통합된 메모리 컨트롤러 등을 함께 제공된다.

 

PPT

 

 

 

 

UART

Uart(Universal Asychronous Receiver / Transmitter) : 범용 비동기 송수신기

- UART Board Rate : 115200bps (1bit time – 8680ns) / 공장과 같은 noise가 많은 곳에서는 9600bps를 사용

- Full-duplex : 양방향 이중 통신 tx와 rx로 data 송신, 수신 동시에 수행

 

 

UART Protocol 특징

clk을 직접 사용하지 않으므로 board rate를 직접 추가해주어 clk을 맞춰 통신을 하도록 해야함

양방향 이중 통신으로 tx / rx 설계 필요

 

start Bit(1bit), Data bit(8bit), Parity bit, Stop bit(1 to 2 bit)

크게 4가지 비트가 있다

- 이번 프로젝트에서는 Parity bit 를 제외한 나머지 bit를 사용하여 구현했다.

>?이유?

Parity bit는 data 전송에서 오류 검출용도로 사용하기에, 직접 test 및 debuging을 하기 때문에

이번 프로젝트에서 제외 또한 추가적인 data 소모를 없애기 위해 사용하지 않음

 

 

Tx / Rx Transmit

ASCII Code 'O'

 

 

설계 목표

1. slide sw와 tact sw를 사용하여 PC terminal에 data를 출력 되도록 할 것

2. keboard를 사용하여 FND에 ASCII Code 'O' 의 hex data가 출력 되도록 할 것

 

설계 중요 포인트

1. 동작 속도를 높이도록 reset을 active low 설계할 것

2. FSM(유한 상태 기계)를 사용하여 tx와 rx를 제어할 것

3. Matastable 구성을 피할 것

4. rx설계 시 Falling Edge Dector를 활용할 것

5. tact SW 사용시 One Shot 회로를 사용할 것

 

 

완성 시_Block Diagram

tx에서 data를 입력 받은 후, pc terminel을 통해 data 전송, Rx에 data를 입력 받도록 한 뒤 Rx에서 FND에 HEX DATA가 출력 되도록 설계했다.

 

완성 시 _ Tx / Rx RTL View

Tx)

Rx)

 

 

 

SIMPLE_UART_TX

tx와 rx중 tx부터 설계 및 구현했다.

tx는 FSM을 통해 구현했다.

FSM은 Moore와 mealy Machine중 Moore Machine으로 설계 했다.

 

tx의 FSM을 간단히 설명하면 RESET_n이 0이 되면 idle 상태가 되고, idle 상태에서 key가 눌리고 뗄떼 다음 상태인 start bit로 넘어 간뒤 count를 434번 한 뒤 다음 상태로 넘어갈 수 있도록 했다.

 

* count를 434번 한 이유 1tick count를 맞추기 위해 434번 count를 했다. 그 이상 그 이하도 안됨.

그러면 않는다면 오류값이 나오게 된다. 

 

Block diagram / FSM

 

modelsim _ simulation 결과

simulation 결과  11110010 signal이 나온다.

이는 uart 통신 특성상 lsb부터 출력 되기 때문에

ASCII Code 'O'의 2진값인 01001111이 아닌 11110010이 출력된다.

 

MSB / LSB

 

Tx_bit_clear_Simulation

tx의 fsm을 modelsim을 통해 simulation한 결과 0-433 count한 뒤 clear가 되는 모습을 검증했다.

 

 

 

tera turm

tera turm을 통해 sirial 통신으로 data 전송 후 출력 되도록 구현했다.

tact sw를 눌렀을 때 ASCII Code 'O'가 연속적으로 출력됨을 검증했다.

 

* 여기서 문제 발생 

signal 연속 발생할 시, 회로가 무한 roof에 빠질 수 있고, 다량의 signal로 인해 전력소모에도 영향을 끼친다.

따라서 1clk당 1개의 signal을 보낼 수 있도록 debug했다.

 

Button Debouncing Debug

원샷 회로를 통해 button Debounching을 debug 했다. 이는 Rx 구현시에도 사용 되었으므로, Rx 구현 시 설명하겠다.

 

 

SIMPLE_UART_Rx

block diagram과 Fsm이다.

block diagram과 FSM을 설계 한 뒤 이에 맞게 구현을 진행했다.

FSM은 Tx와 동일하게 Moore machine으로 설계 및 구현 했다.

또한 FSM을 설명 하면 Reset_n이 0이되면 idle 상태로 넘어가고, idle 상태에서 Falling Edge detect가 발생하여 signal을 capture 하면 그다음 상태인 Start bit 상태가 된다. 여기서 matastable 구성을 피하기 위해 434의 절반에서 data capture하여 넘어가게 된다.  이후 mid상태로 넘어간 뒤, 434번 count하여 D0상태로 넘어간다. 여기서 data sampling을 통해 직렬형태 구성을 병렬 형태 구성으로 바꾸어 준다. 그 뒤 count에 따라 상태를 변환 시켜 idle 상태까지 도달하게 한다.

 

* 434/2_count?

matastable 구성을 피하기 위해 절반에서 capture를 진행

이렇게 할 경우 안정적으로 data를 입력받을 수 있다.

 

 

Simple_Rx_simulation

modelsim Simulation결과 ASCII Code Data 01001111 Data가 정상적으로 출력되는것을 검증했다.

 

 

One Shot Circuit / Falling Edge detactor

Synchronizer와 and gate, notgate를 엮어 Falling Edge Detector를 만들어 사용했다.

CDC와 metastability에 사용되며 이구성을 one shot 회로에도 적용했다.

one Shot 회로 구성 시 디바운싱에 필요한 버퍼는 보드 내부에 있어서 따로 장착하진 않았다.

 

검증 결과

보드출력과 pc화면 출력을 통해 동작검증을 완료한 모습이다.

보드 검증은 keboad 'O'를 눌렀을 때 ASCII Code 'O'의 HEX값인 4F가 정상적으로 FND에 출력되는것을 볼 수 있었고,

PC화면에서도 정상적으로 'O'가 출력됨을 검증했다.

 

728x90

'PROJECT' 카테고리의 다른 글

PROJECT - 16 bit RISC simple CPU  (1) 2024.01.04

관련글 더보기