----------------------------------------------------------------------------------
-- Company:        ETH Zurich, Institute for Particle Physics
-- Engineer:       P. Vogler, Q. Weitzel
-- 
-- Create Date:    08/07/2010 
-- Design Name:    
-- Module Name:    FTU_test4 - Behavioral 
-- Project Name: 
-- Target Devices: 
-- Tool versions: 
-- Description:    Test firmware for FTU board, enable tx and put 50kHz clock signal					
--
-- Dependencies: 
--
-- Revision: 
-- Revision 0.01 - File Created
-- Additional Comments: 
--
----------------------------------------------------------------------------------

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity FTU_test4 is
  port(
    -- global control 
    ext_clk   : IN  STD_LOGIC;                      -- external clock from FTU board
    --reset     : in  STD_LOGIC;                      -- reset
    brd_add   : IN  STD_LOGIC_VECTOR(5 downto 0);   -- geographic board/slot address
    brd_id    : IN  STD_LOGIC_VECTOR(7 downto 0);   -- local solder-programmable board ID
    
    -- rate counters LVDS inputs
    -- use IBUFDS differential input buffer
    patch_A_p     : IN  STD_LOGIC;                  -- logic signal from first trigger patch
    patch_A_n     : IN  STD_LOGIC;           
    patch_B_p     : IN  STD_LOGIC;                  -- logic signal from second trigger patch
    patch_B_n     : IN  STD_LOGIC;
    patch_C_p     : IN  STD_LOGIC;                  -- logic signal from third trigger patch
    patch_C_n     : IN  STD_LOGIC;
    patch_D_p     : IN  STD_LOGIC;                  -- logic signal from fourth trigger patch
    patch_D_n     : IN  STD_LOGIC;
    trig_prim_p   : IN  STD_LOGIC;                  -- logic signal from n-out-of-4 circuit
    trig_prim_n   : IN  STD_LOGIC;
    
    -- DAC interface
    -- miso          : IN  STD_LOGIC;                  -- master-in-slave-out
    sck           : OUT STD_LOGIC;                  -- serial clock to DAC
    mosi          : OUT STD_LOGIC;                  -- serial data to DAC, master-out-slave-in
    clr           : OUT STD_LOGIC;                  -- clear signal to DAC
    cs_ld         : OUT STD_LOGIC;                  -- chip select or load to DAC
    
    -- RS-485 interface to FTM
    rx            : IN  STD_LOGIC;                  -- serial data from FTM
    tx            : OUT STD_LOGIC;                  -- serial data to FTM
    rx_en         : OUT STD_LOGIC;                  -- enable RS-485 receiver
    tx_en         : OUT STD_LOGIC;                  -- enable RS-485 transmitter

    -- analog buffer enable
    enables_A   : OUT STD_LOGIC_VECTOR(8 downto 0);  -- individual enables for analog inputs
    enables_B   : OUT STD_LOGIC_VECTOR(8 downto 0);  -- individual enables for analog inputs
    enables_C   : OUT STD_LOGIC_VECTOR(8 downto 0);  -- individual enables for analog inputs
    enables_D   : OUT STD_LOGIC_VECTOR(8 downto 0);  -- individual enables for analog inputs

    -- testpoints
    TP_A       : out STD_LOGIC_VECTOR(11 downto 0)   -- testpoints    
  );
end FTU_test4;

architecture Behavioral of FTU_test4 is

  component FTU_test4_dcm
    port(
      CLKIN_IN        : IN  STD_LOGIC;
      CLKFX_OUT       : OUT STD_LOGIC;
      CLKIN_IBUFG_OUT : OUT STD_LOGIC
    );
  end component;

  component Clock_Divider
    port(
      clock_in  : IN  STD_LOGIC;
      clock_out : OUT STD_LOGIC
    );
  end component;
  
  signal clk_5M_sig  : STD_LOGIC;
  signal clk_50k_sig : STD_LOGIC;
  
begin

  Inst_FTU_test4_dcm : FTU_test4_dcm
    port map(
      CLKIN_IN => ext_clk,
      CLKFX_OUT => clk_5M_sig,
      CLKIN_IBUFG_OUT => open
    );

  Inst_Clock_Divider : Clock_Divider
    port map (
      clock_in  => clk_5M_sig,
      clock_out => clk_50k_sig
    );

  tx_en <= '1';
  tx    <= clk_50k_sig;
  
end Behavioral;


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Clock_Divider is
  port(
    clock_in  : in  std_logic;
    clock_out : out std_logic
    );
end entity Clock_Divider;

architecture RTL of Clock_Divider is
  
  constant max_count   : integer := 5000000/50000;   -- for implementation
  
begin

  process(clock_in)
    variable count  : integer range 0 to max_count;
  begin
    if rising_edge(clock_in) then      
      if count < max_count/2 then          
        clock_out <= '0';
        count := count + 1;
      elsif count < max_count then
        clock_out <= '1';
        count := count + 1;
      else
        count := 0;
        clock_out <= '0';
      end if; 
    end if;
  end process;
  
end architecture RTL;
