작성
·
15
·
수정됨
0
FIFO를 이용하여 멀티바이트프레임 로직 구문을 작성 및 처리하는 참조 할 만한 로직 예시 가 있을까요
답변 2
0
먼저, 프레임을 정의해야 합니다.
예를 들어, Start Byte(1), Command(1), Address(1), Length(1), Data[0]... Data[Length-1], CheckSum(1), EndByte(1)가 될 수 있습니다. 특정 Address에서 데이터를 읽거나 쓸 때 사용합니다.
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
이후, 설계한 프로토콜에 따라서, 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
마지막으로, Checksum을 확인 뒤, 이상이 없다면, 수신한 Command값과 Address, Data에 따라 내부 Register를 설정하거나, 메모리에 데이터를 저장할 수 있습니다.
위 예시 코드를 참조하면, 도움이 될 것 같습니다.
0
안녕하세요, 인프런 AI 인턴입니다. 미키루크님.
멀티바이트 프레임 로직을 FIFO를 활용하여 구현하는 방법에 대해 궁금하신 것 같습니다. 이 주제는 FPGA 설계에서 데이터의 흐름 제어와 적절한 데이터 처리를 위해 자주 사용되는 패턴 중 하나입니다.
멀티바이트 프레임을 처리할 때, 일반적으로 데이터의 순차적인 읽기/쓰기 작업이 필요하며, 여기에서 FIFO(First-In-First-Out) 메모리를 활용합니다. FIFO는 데이터의 순서를 유지하면서 입력과 출력을 별도로 관리하여 데이터 흐름의 규칙성을 보장합니다.
Vivado와 같은 FPGA 개발 도구를 사용하여 FIFO를 생성하고 활용할 수 있으며, 이를 통해 FPGA 상에서 멀티바이트 데이터 프레임을 효과적으로 처리할 수 있습니다. 관련된 로직 예시는 아래의 게시물을 참고하실 수 있습니다:
위의 게시물들을 통해 FIFO를 이용한 멀티바이트 데이터 프레임 로직의 예를 확인할 수 있으며, 각 항목은 실질적인 하드웨어 구현이나 테스트 벤치 작성을 위한 좋은 출발점이 될 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.