@@ -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
3133entity 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
5658architecture 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
6670begin
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