오버 샘플링을 하여서 데이터 인식의 정확성을 올린다.
보드레이트에 맞춰서 데이터를 읽는것이 아니라 보드레이트 주기보다 더 자주 데이터를 읽어들인다.
예를 들어 하나의 보드레이트 주기보다 16배 정도 더 많이 값을 읽어들여서 그중 가운데 즉 8번째 읽어 들인 값을 데이터로 생각하고 저장한다.
오버샘플링은 보통 16번 또는 8번이 가장 많다. 그중 16번이 가장 자주 쓰이는 방법이다.
각 상태를 나타내는 ASM(Algorithmic State Machine)
보기 좋게 정리하면 아래와 같다.
과제
led를 켜는 FSM 코드
`timescale 1ns / 1ps
module uartled(
input clk,
input reset,
input [7:0] data,
output [2:0]led
);
reg [2:0] led_reg , led_next;
reg [1:0] state,state_next;
assign led = led_reg;
always @(posedge clk, posedge reset) begin
if(reset) begin
led_reg <= 3'b000;
state <= 0;
end
else begin
led_reg <= led_next;
state <= state_next;
end
end
always @(*) begin
state_next = state;
led_next = led_reg;
case (state)
0: begin
led_next = 3'b000;
if(data == 8'h31)begin
state_next = 1;
end
else if(data == 8'h32)begin
state_next = 2;
end
else if(data == 8'h33)begin
state_next = 3;
end
else begin
state_next = state;
end
end
1: begin
led_next = 3'b001;
if(data == 8'h30)begin
state_next = 0;
end
else if(data == 8'h32)begin
state_next = 2;
end
else if(data == 8'h33)begin
state_next = 3;
end
else begin
state_next = state;
end
end
2: begin
led_next = 3'b011;
if(data == 8'h31)begin
state_next = 1;
end
else if(data == 8'h30)begin
state_next = 0;
end
else if(data == 8'h33)begin
state_next = 3;
end
else begin
state_next = state;
end
end
3: begin
led_next = 3'b111;
if(data == 8'h31)begin
state_next = 1;
end
else if(data == 8'h32)begin
state_next = 2;
end
else if(data == 8'h30)begin
state_next = 0;
end
else begin
state_next = state;
end
end
endcase
end
endmodule
만들어진 UART_TxRx와 led를 합친 top모듈
'Verilog > 기본모듈 및 이론' 카테고리의 다른 글
Day 10 - System Verilog(2) (0) | 2024.06.20 |
---|---|
Day 9 - Systemveril (0) | 2024.06.19 |
Day 7 - UART_Rx (0) | 2024.06.19 |
Day 6 - FSM, UART_Tx (0) | 2024.06.17 |
Day 5 - 책 이론 + FSM (0) | 2024.06.17 |