UART (Synthesis the FIFO module)
저번 포스팅에서 작성한 FIFO를 불러와 기존 UART 코드에 합성합니다.
uart_top.v
`timescale 1ns / 1ps
module uart_top(
input RST,
input CLK,
input RXD,
output [6:0] AN,
output CA,
output PAR_ERR,
output FRM_ERR
);
wire [7:0] rx_data;
wire rx_data_rdy, empty;
wire [7:0] dout;
uart_rx uart_rx_0 (
.RST (RST),
.CLK (CLK),
.RXD (RXD),
.RX_DATA (rx_data),
.RX_DATA_RDY (rx_data_rdy),
.FRM_ERR (FRM_ERR),
.PARITY_ERR (PAR_ERR)
);
my_fifo fifo_0(
.RST (RST),
.CLK (CLK),
.DIN (rx_data),
.WR_EN (rx_data_rdy),
.FULL (FULL),
.DOUT (dout),
.RD_EN (~empty),
.EMPTY (empty)
);
display_inf disp_0 (
.RST (RST),
.CLK (CLK), // 125 Mhz
.NUM_1S (dout [3:0]),
.NUM_10S (dout [7:4]),
.CA (CA),
.AN (AN)
);
endmodule
I/O port를 각 모듈과 연결되게 Instance하여 배치합니다.
Empty가 1이 되면 RE_EN가 꺼져야 하기 때문에 RD_EN을 ~EMPTY로 지정하였습니다.
Uart_top.v (Modified)
reg [7:0] dout_reg;
always @ (posedge CLK) begin
if (~empty)
dout_reg <= dout;
end
display_inf disp_0 (
.RST (RST),
.CLK (CLK), // 125 Mhz
.NUM_1S (dout_reg [3:0]),
.NUM_10S (dout_reg [7:4]),
.CA (CA),
.AN (AN)
);
DOUT은 ram의 addr번호에 맞는 값을 출력합니다.
지금 Uart_top은 addr_pos 와 addr_eq가 모두 1일때 Empty가 1이 되어 값을 전달합니다.
그래서 EMPTY가 1인 경우 입력하여 값을 추가할 때, EMPTY는 0이 되고 RD_EN이 1이 되어 값이 켜집니다.
하지만 RD_EN 신호가 켜질 때 주소가 +1 씩 변경되어서 0번 주소에 위치한 값을 입력하고
Assign 된 DOUT에 따라 바로 다음 Address에 있는 값을 출력하여 값이 덮어씌워지게 되어 0번 주소에 있는 값이 정확하게 전달되지 못합니다.
그렇기 때문에 수정된 부분을 참고하면 CLK마다 ~EMPTY(=RD_EN) 신호를 확인하여 DOUT을 새로운 Dout_reg에 저장합니다. 이렇게 되면 저장된 0번 주소 Dout은 MUX를 통해 들어가고 값이 비워진 ~EMPTY는 다시 0이 되어 MUX는 동작하지 않습니다. 그러면 1번 주소는 바로 전달되지 못하고 값이 MUX에 머물게 됩니다.
'Circuit Design > 🔥HDL' 카테고리의 다른 글
[Verilog] Vivado Setting [Dark Theme(Vivado 다크모드)] (0) | 2024.06.10 |
---|---|
[Verilog] 12. UART(3) TX (0) | 2024.06.10 |
[Verilog] 10. FIFO(First In First Out) (0) | 2024.06.03 |
[Verilog] 9. RAM(Random Access Memory) (0) | 2024.05.27 |
[Verilog] 8. Uart (0) | 2024.05.27 |