RS-232 có lẽ là một trong những bài tập rất thường gặp, và synthesize rất gọn khi sử dụng SRL16 (6 SRL16 và 15 registers).
Chúng ta sẽ sử dụng 16x clock để sample data.
Serial data input đến từ clock domain khác với 16x FPGA clock domain, nên chúng ta đưa qua 2 registers trước khi sử dụng.
Khi ở trạng thái idle và serial data input chuyển từ 1 sang 0, chúng ta bắt đầu sample data.
Sừ dụng 1 register để delay data input thêm một clock nửa.
Dùng 1 SRL16 để tạo ra start pulse (tìm falling edge của serial data input khi uart_rx_state = '0'):
Khi start pulse = '1', chuyển uart_rx_state từ '0' sang '1' (dùng 1 register cho uart_rx_state).
Chúng ta sẽ sử dụng 16x clock để sample data.
Serial data input đến từ clock domain khác với 16x FPGA clock domain, nên chúng ta đưa qua 2 registers trước khi sử dụng.
Code:
SYNCHRONIZE_DATA : process(clk)
begin
if (rising_edge(clk)) then
if (rst = '1') then
data_in_dly01 <= '1';
data_in_dly02 <= '1';
else
data_in_dly01 <= data_serial_i;
data_in_dly02 <= data_in_dly01;
end if;
end if; -- clk
end process SYNCHRONIZE_DATA;
Khi ở trạng thái idle và serial data input chuyển từ 1 sang 0, chúng ta bắt đầu sample data.
Sừ dụng 1 register để delay data input thêm một clock nửa.
Code:
DELAY_INPUT_DATA : process(clk)
begin
if (rising_edge(clk)) then
if (rst = '1') then
data_in_dly03 <= '1';
else
data_in_dly03 <= data_in_dly02;
end if;
end if; -- clk
end process DELAY_INPUT_DATA;
Code:
SRL16_start_pls_inst : SRL16E
generic map (
INIT => x"0002"
)
port map (
Q => start_pls,
A0 => data_in_dly03,
A1 => data_in_dly02,
A2 => uart_rx_state,
A3 => rst,
CLK => clk,
CE => '0',
D => '0'
);
Code:
MANAGE_UART_RX_STATE : process(clk)
begin
if (rising_edge(clk)) then
if (rst = '1') then
uart_rx_state <= '0';
else
if (start_pls = '1') then
uart_rx_state <= '1';
elsif (data_received_pls = '1') then
uart_rx_state <= '0';
end if;
end if;
end if; -- clk
end process MANAGE_UART_RX_STATE;




Comment