강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của jookd787339
jookd787339

câu hỏi đã được viết

Triển khai UART trên FPGA

Đánh giá thiết kế và điểm cải thiện

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

Đã giải quyết

Viết

·

70

·

Đã chỉnh sửa

0

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

fpgasystem-veriloguartvivado

Câu trả lời 2

0

EasyFPGA님의 프로필 이미지
EasyFPGA
Người chia sẻ kiến thức

  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를 이용한 멀티바이트 데이터 프레임 로직의 예를 확인할 수 있으며, 각 항목은 실질적인 하드웨어 구현이나 테스트 벤치 작성을 위한 좋은 출발점이 될 수 있습니다.

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

Hình ảnh hồ sơ của jookd787339
jookd787339

câu hỏi đã được viết

Đặt câu hỏi