-- Constant (K) Compact UART Transmitter -- -- Version : 1.10 -- Version Date : 3rd December 2003 -- Reason : '--translate' directives changed to '--synthesis translate' directives -- -- Version : 1.00 -- Version Date : 14th October 2002 -- -- Start of design entry : 2nd October 2002 -- -- Ken Chapman -- Xilinx Ltd -- Benchmark House -- 203 Brooklands Road -- Weybridge -- Surrey KT13 ORH -- United Kingdom -- -- chapman@xilinx.com -- ------------------------------------------------------------------------------------ -- -- NOTICE: -- -- Copyright Xilinx, Inc. 2002. This code may be contain portions patented by other -- third parties. By providing this core as one possible implementation of a standard, -- Xilinx is making no representation that the provided implementation of this standard -- is free from any claims of infringement by any third party. Xilinx expressly -- disclaims any warranty with respect to the adequacy of the implementation, including -- but not limited to any warranty or representation that the implementation is free -- from claims of any third party. Futhermore, Xilinx is providing this core as a -- courtesy to you and suggests that you contact all third parties to obtain the -- necessary rights to use this implementation. -- ------------------------------------------------------------------------------------ -- -- Library declarations -- -- The Unisim Library is used to define Xilinx primitives. It is also used during -- simulation. The source can be viewed at %XILINX%\vhdl\src\unisims\unisim_VCOMP.vhd -- library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; library unisim; use unisim.vcomponents.all; -- ------------------------------------------------------------------------------------ -- -- Main Entity for KCUART_TX -- entity kcuart_tx is Port ( data_in : in std_logic_vector(7 downto 0); send_character : in std_logic; en_16_x_baud : in std_logic; serial_out : out std_logic; Tx_complete : out std_logic; clk : in std_logic); end kcuart_tx; -- ------------------------------------------------------------------------------------ -- -- Start of Main Architecture for KCUART_TX -- architecture low_level_definition of kcuart_tx is -- ------------------------------------------------------------------------------------ -- ------------------------------------------------------------------------------------ -- -- Signals used in KCUART_TX -- ------------------------------------------------------------------------------------ -- signal data_01 : std_logic; signal data_23 : std_logic; signal data_45 : std_logic; signal data_67 : std_logic; signal data_0123 : std_logic; signal data_4567 : std_logic; signal data_01234567 : std_logic; signal bit_select : std_logic_vector(2 downto 0); signal next_count : std_logic_vector(2 downto 0); signal mask_count : std_logic_vector(2 downto 0); signal mask_count_carry : std_logic_vector(2 downto 0); signal count_carry : std_logic_vector(2 downto 0); signal ready_to_start : std_logic; signal decode_Tx_start : std_logic; signal Tx_start : std_logic; signal decode_Tx_run : std_logic; signal Tx_run : std_logic; signal decode_hot_state : std_logic; signal hot_state : std_logic; signal hot_delay : std_logic; signal Tx_bit : std_logic; signal decode_Tx_stop : std_logic; signal Tx_stop : std_logic; signal decode_Tx_complete : std_logic; -- -- ------------------------------------------------------------------------------------ -- -- Attributes to define LUT contents during implementation -- The information is repeated in the generic map for functional simulation-- -- ------------------------------------------------------------------------------------ -- attribute INIT : string; attribute INIT of mux1_lut : label is "E4FF"; attribute INIT of mux2_lut : label is "E4FF"; attribute INIT of mux3_lut : label is "E4FF"; attribute INIT of mux4_lut : label is "E4FF"; attribute INIT of ready_lut : label is "10"; attribute INIT of start_lut : label is "0190"; attribute INIT of run_lut : label is "1540"; attribute INIT of hot_state_lut : label is "94"; attribute INIT of delay14_srl : label is "0000"; attribute INIT of stop_lut : label is "0180"; attribute INIT of complete_lut : label is "8"; -- ------------------------------------------------------------------------------------ -- -- Start of KCUART_TX circuit description -- ------------------------------------------------------------------------------------ -- begin -- 8 to 1 multiplexer to convert parallel data to serial mux1_lut: LUT4 --synthesis translate_off generic map (INIT => X"E4FF") --synthesis translate_on port map( I0 => bit_select(0), I1 => data_in(0), I2 => data_in(1), I3 => Tx_run, O => data_01 ); mux2_lut: LUT4 --synthesis translate_off generic map (INIT => X"E4FF") --synthesis translate_on port map( I0 => bit_select(0), I1 => data_in(2), I2 => data_in(3), I3 => Tx_run, O => data_23 ); mux3_lut: LUT4 --synthesis translate_off generic map (INIT => X"E4FF") --synthesis translate_on port map( I0 => bit_select(0), I1 => data_in(4), I2 => data_in(5), I3 => Tx_run, O => data_45 ); mux4_lut: LUT4 --synthesis translate_off generic map (INIT => X"E4FF") --synthesis translate_on port map( I0 => bit_select(0), I1 => data_in(6), I2 => data_in(7), I3 => Tx_run, O => data_67 ); mux5_muxf5: MUXF5 port map( I1 => data_23, I0 => data_01, S => bit_select(1), O => data_0123 ); mux6_muxf5: MUXF5 port map( I1 => data_67, I0 => data_45, S => bit_select(1), O => data_4567 ); mux7_muxf6: MUXF6 port map( I1 => data_4567, I0 => data_0123, S => bit_select(2), O => data_01234567 ); -- Register serial output and force start and stop bits pipeline_serial: FDRS port map ( D => data_01234567, Q => serial_out, R => Tx_start, S => Tx_stop, C => clk); -- 3-bit counter -- Counter is clock enabled by en_16_x_baud -- Counter will be reset when 'Tx_start' is active -- Counter will increment when Tx_bit is active -- Tx_run must be active to count -- count_carry(2) indicates when terminal count (7) is reached and Tx_bit=1 (ie overflow) count_width_loop: for i in 0 to 2 generate -- attribute INIT : string; attribute INIT of count_lut : label is "8"; -- begin register_bit: FDRE port map ( D => next_count(i), Q => bit_select(i), CE => en_16_x_baud, R => Tx_start, C => clk); count_lut: LUT2 --synthesis translate_off generic map (INIT => X"8") --synthesis translate_on port map( I0 => bit_select(i), I1 => Tx_run, O => mask_count(i)); mask_and: MULT_AND port map( I0 => bit_select(i), I1 => Tx_run, LO => mask_count_carry(i)); lsb_count: if i=0 generate begin count_muxcy: MUXCY port map( DI => mask_count_carry(i), CI => Tx_bit, S => mask_count(i), O => count_carry(i)); count_xor: XORCY port map( LI => mask_count(i), CI => Tx_bit, O => next_count(i)); end generate lsb_count; upper_count: if i>0 generate begin count_muxcy: MUXCY port map( DI => mask_count_carry(i), CI => count_carry(i-1), S => mask_count(i), O => count_carry(i)); count_xor: XORCY port map( LI => mask_count(i), CI => count_carry(i-1), O => next_count(i)); end generate upper_count; end generate count_width_loop; -- Ready to start decode ready_lut: LUT3 --synthesis translate_off generic map (INIT => X"10") --synthesis translate_on port map( I0 => Tx_run, I1 => Tx_start, I2 => send_character, O => ready_to_start ); -- Start bit enable start_lut: LUT4 --synthesis translate_off generic map (INIT => X"0190") --synthesis translate_on port map( I0 => Tx_bit, I1 => Tx_stop, I2 => ready_to_start, I3 => Tx_start, O => decode_Tx_start ); Tx_start_reg: FDE port map ( D => decode_Tx_start, Q => Tx_start, CE => en_16_x_baud, C => clk); -- Run bit enable run_lut: LUT4 --synthesis translate_off generic map (INIT => X"1540") --synthesis translate_on port map( I0 => count_carry(2), I1 => Tx_bit, I2 => Tx_start, I3 => Tx_run, O => decode_Tx_run ); Tx_run_reg: FDE port map ( D => decode_Tx_run, Q => Tx_run, CE => en_16_x_baud, C => clk); -- Bit rate enable hot_state_lut: LUT3 --synthesis translate_off generic map (INIT => X"94") --synthesis translate_on port map( I0 => Tx_stop, I1 => ready_to_start, I2 => Tx_bit, O => decode_hot_state ); hot_state_reg: FDE port map ( D => decode_hot_state, Q => hot_state, CE => en_16_x_baud, C => clk); delay14_srl: SRL16E --synthesis translate_off generic map (INIT => X"0000") --synthesis translate_on port map( D => hot_state, CE => en_16_x_baud, CLK => clk, A0 => '1', A1 => '0', A2 => '1', A3 => '1', Q => hot_delay ); Tx_bit_reg: FDE port map ( D => hot_delay, Q => Tx_bit, CE => en_16_x_baud, C => clk); -- Stop bit enable stop_lut: LUT4 --synthesis translate_off generic map (INIT => X"0180") --synthesis translate_on port map( I0 => Tx_bit, I1 => Tx_run, I2 => count_carry(2), I3 => Tx_stop, O => decode_Tx_stop ); Tx_stop_reg: FDE port map ( D => decode_Tx_stop, Q => Tx_stop, CE => en_16_x_baud, C => clk); -- Tx_complete strobe complete_lut: LUT2 --synthesis translate_off generic map (INIT => X"8") --synthesis translate_on port map( I0 => count_carry(2), I1 => en_16_x_baud, O => decode_Tx_complete ); Tx_complete_reg: FD port map ( D => decode_Tx_complete, Q => Tx_complete, C => clk); end low_level_definition; ------------------------------------------------------------------------------------ -- -- END OF FILE KCUART_TX.VHD -- ------------------------------------------------------------------------------------