Skip to content

Commit 5141791

Browse files
committed
[FEATURE]: Added CDC flip flops on RXD input signal.
1 parent 7235180 commit 5141791

File tree

1 file changed

+34
-18
lines changed

1 file changed

+34
-18
lines changed

rtl/uart.vhd

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ use IEEE.MATH_REAL.ALL;
2727
-- Removed unnecessary resets.
2828
-- Signal BUSY replaced by DIN_RDY.
2929
-- Many other optimizations and changes.
30+
-- Version 1.2 -
31+
-- added double FF for safe CDC
3032

3133
entity UART is
3234
Generic (
@@ -51,7 +53,7 @@ entity UART is
5153
DOUT_VLD : out std_logic; -- when DOUT_VLD = 1, output data (DOUT) are valid (is assert only for one clock cycle)
5254
FRAME_ERROR : out std_logic -- when FRAME_ERROR = 1, stop bit was invalid (is assert only for one clock cycle)
5355
);
54-
end UART;
56+
end entity;
5557

5658
architecture FULL of UART is
5759

@@ -61,6 +63,8 @@ architecture FULL of UART is
6163

6264
signal uart_clk_cnt : unsigned(CLK_CNT_WIDTH-1 downto 0);
6365
signal uart_clk_en : std_logic;
66+
signal uart_rxd_meta : std_logic;
67+
signal uart_rxd_synced : std_logic;
6468
signal uart_rxd_debounced : std_logic;
6569

6670
begin
@@ -86,6 +90,18 @@ begin
8690

8791
uart_clk_en <= '1' when (uart_clk_cnt = CLK_CNT_MAX) else '0';
8892

93+
-- -------------------------------------------------------------------------
94+
-- UART RXD CROSS DOMAIN CROSSING
95+
-- -------------------------------------------------------------------------
96+
97+
uart_rxd_cdc_reg_p : process (CLK)
98+
begin
99+
if (rising_edge(CLK)) then
100+
uart_rxd_meta <= UART_RXD;
101+
uart_rxd_synced <= uart_rxd_meta;
102+
end if;
103+
end process;
104+
89105
-- -------------------------------------------------------------------------
90106
-- UART RXD DEBAUNCER
91107
-- -------------------------------------------------------------------------
@@ -97,20 +113,20 @@ begin
97113
)
98114
port map (
99115
CLK => CLK,
100-
DEB_IN => UART_RXD,
116+
DEB_IN => uart_rxd_synced,
101117
DEB_OUT => uart_rxd_debounced
102118
);
103119
end generate;
104120

105121
not_use_debouncer_g : if (USE_DEBOUNCER = False) generate
106-
uart_rxd_debounced <= UART_RXD;
122+
uart_rxd_debounced <= uart_rxd_synced;
107123
end generate;
108124

109125
-- -------------------------------------------------------------------------
110-
-- UART TRANSMITTER
126+
-- UART RECEIVER
111127
-- -------------------------------------------------------------------------
112128

113-
uart_tx_i: entity work.UART_TX
129+
uart_rx_i: entity work.UART_RX
114130
generic map (
115131
PARITY_BIT => PARITY_BIT
116132
)
@@ -119,18 +135,18 @@ begin
119135
RST => RST,
120136
-- UART INTERFACE
121137
UART_CLK_EN => uart_clk_en,
122-
UART_TXD => UART_TXD,
123-
-- USER DATA INPUT INTERFACE
124-
DIN => DIN,
125-
DIN_VLD => DIN_VLD,
126-
DIN_RDY => DIN_RDY
138+
UART_RXD => uart_rxd_debounced,
139+
-- USER DATA OUTPUT INTERFACE
140+
DOUT => DOUT,
141+
DOUT_VLD => DOUT_VLD,
142+
FRAME_ERROR => FRAME_ERROR
127143
);
128144

129145
-- -------------------------------------------------------------------------
130-
-- UART RECEIVER
146+
-- UART TRANSMITTER
131147
-- -------------------------------------------------------------------------
132148

133-
uart_rx_i: entity work.UART_RX
149+
uart_tx_i: entity work.UART_TX
134150
generic map (
135151
PARITY_BIT => PARITY_BIT
136152
)
@@ -139,11 +155,11 @@ begin
139155
RST => RST,
140156
-- UART INTERFACE
141157
UART_CLK_EN => uart_clk_en,
142-
UART_RXD => uart_rxd_debounced,
143-
-- USER DATA OUTPUT INTERFACE
144-
DOUT => DOUT,
145-
DOUT_VLD => DOUT_VLD,
146-
FRAME_ERROR => FRAME_ERROR
158+
UART_TXD => UART_TXD,
159+
-- USER DATA INPUT INTERFACE
160+
DIN => DIN,
161+
DIN_VLD => DIN_VLD,
162+
DIN_RDY => DIN_RDY
147163
);
148164

149-
end FULL;
165+
end architecture;

0 commit comments

Comments
 (0)