Inflearn brand logo image

인프런 커뮤니티 질문&답변

미키루크님의 프로필 이미지
미키루크

작성한 질문수

FPGA에 UART 구현하기

디자인 리뷰 및 개선 포인트

멀티바이트프레임 로직 예시

작성

·

15

·

수정됨

0

FIFO를 이용하여 멀티바이트프레임 로직 구문을 작성 및 처리하는 참조 할 만한 로직 예시 가 있을까요

답변 2

0

EasyFPGA님의 프로필 이미지
EasyFPGA
지식공유자

  1. 먼저, 프레임을 정의해야 합니다.

예를 들어, Start Byte(1), Command(1), Address(1), Length(1), Data[0]... Data[Length-1], CheckSum(1), EndByte(1)가 될 수 있습니다. 특정 Address에서 데이터를 읽거나 쓸 때 사용합니다.

  1. UART에서 수신 된 데이터에서 Start Byte를 찾습니다.

parameter START_BYTE = 8'h7B;

always @(posedge clk) begin
    case (state)
        IDLE: begin
            if (rx_data == START_BYTE)
                state <= RECEIVE;
        end
        RECEIVE: begin
            // 수신 로직
        end
    endcase
end
  1. 이후, 설계한 프로토콜에 따라서, Command, Address, Length, Data 값을 각 변수에 저장합니다.

parameter START_BYTE = 8'h7B;
parameter END_BYTE   = 8'h7D;

typedef enum logic [2:0] {
    IDLE, CMD, ADDR, LEN, DATA, CHKSUM, END
} state_t;

state_t state;
reg [7:0] length;
reg [7:0] data_index;
reg [15:0] checksum_calc;
reg [7:0] checksum_recv;

always @(posedge clk or posedge reset) begin
    if (reset) begin
        state <= IDLE;
        frame_ready <= 0;
        data_index <= 0;
        checksum_calc <= 0;
    end else if (rx_valid) begin
        case (state)
            IDLE: begin
                if (rx_data == START_BYTE) begin
                    state <= CMD;
                    checksum_calc <= 0;
                end
            end
            CMD: begin
                command <= rx_data;
                checksum_calc <= checksum_calc + rx_data;
                state <= ADDR;
            end
            ADDR: begin
                address <= rx_data;
                checksum_calc <= checksum_calc + rx_data;
                state <= LEN;
            end
            LEN: begin
                length <= rx_data;
                checksum_calc <= checksum_calc + rx_data;
                data_index <= 0;
                state <= DATA;
            end
            DATA: begin
                data_out[data_index] <= rx_data;
                checksum_calc <= checksum_calc + rx_data;
                data_index <= data_index + 1;
                if (data_index == length - 1)
                    state <= CHKSUM;
            end
            CHKSUM: begin
                checksum_recv <= rx_data;
                state <= END;
            end
            END: begin
                if (rx_data == END_BYTE) begin
                    frame_ready <= (checksum_calc[7:0] == checksum_recv);
                end
                state <= IDLE;
            end
        endcase
    end
end

endmodule

  1. 마지막으로, Checksum을 확인 뒤, 이상이 없다면, 수신한 Command값과 Address, Data에 따라 내부 Register를 설정하거나, 메모리에 데이터를 저장할 수 있습니다.

  2. 위 예시 코드를 참조하면, 도움이 될 것 같습니다.

0

안녕하세요, 인프런 AI 인턴입니다. 미키루크님.

멀티바이트 프레임 로직을 FIFO를 활용하여 구현하는 방법에 대해 궁금하신 것 같습니다. 이 주제는 FPGA 설계에서 데이터의 흐름 제어와 적절한 데이터 처리를 위해 자주 사용되는 패턴 중 하나입니다.

멀티바이트 프레임을 처리할 때, 일반적으로 데이터의 순차적인 읽기/쓰기 작업이 필요하며, 여기에서 FIFO(First-In-First-Out) 메모리를 활용합니다. FIFO는 데이터의 순서를 유지하면서 입력과 출력을 별도로 관리하여 데이터 흐름의 규칙성을 보장합니다.

Vivado와 같은 FPGA 개발 도구를 사용하여 FIFO를 생성하고 활용할 수 있으며, 이를 통해 FPGA 상에서 멀티바이트 데이터 프레임을 효과적으로 처리할 수 있습니다. 관련된 로직 예시는 아래의 게시물을 참고하실 수 있습니다:

  1. Verilog를 사용하여 FIFO 생성 및 활용 - 게시물에서는 Verilog를 사용하여 FIFO를 생성하고 이를 통해 데이터를 처리하는 방법에 대해 설명하고 있습니다.
  2. FPGA에서 UART와 FIFO를 결합한 데이터 프레임 처리 - UART 통신에서 멀티바이트 프레임을 FIFO를 이용하여 처리하는 방법을 소개합니다.

위의 게시물들을 통해 FIFO를 이용한 멀티바이트 데이터 프레임 로직의 예를 확인할 수 있으며, 각 항목은 실질적인 하드웨어 구현이나 테스트 벤치 작성을 위한 좋은 출발점이 될 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

미키루크님의 프로필 이미지
미키루크

작성한 질문수

질문하기