----------------------------------------------------------
-- PWM_top
-- Robert Hood
-- Maps the PWM core to the input and output pads
----------------------------------------------------------

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY sorting_network_top IS
  port (
        padcsi_myclock_clk,csi_myclock_reset, avs_pwm_write_navs_pwm_chipselect : IN  STD_LOGIC;
        padavs_pwm_address     : IN  STD_LOGIC_VECTOR(1 downto 0);
	padavs_pwm_readdata    : IN STD_LOGIC_VECTOR(15 downto 0);
	padavs_pwm_writedata   : OUT STD_LOGIC_VECTOR(15 downto 0);
	padcoe_pwm_output_export: OUT STD_LOGIC
	);
END sorting_network_top;

ARCHITECTURE Structure of sorting_network_top IS 

component pwm is

port(
     
     csi_myclock_clk 	   : in std_logic; --clk is standard for both PWM and Avalon memory slave   

     csi_myclock_reset	   : in std_logic; --clk reset 
     avs_pwm_write_n 	   : in std_logic; --write
     avs_pwm_chipselect	   : in std_logic; -- chip select

     avs_pwm_address 	   : in std_logic_vector(1 downto 0); --address

     avs_pwm_readdata 	   : out std_logic_vector(15 downto 0); --Needed for the Avalon interface

     avs_pwm_writedata 	   : in std_logic_vector(15 downto 0); -- Data to be input represents the duty cycle
     coe_pwm_output_export : out std_logic-- Ouput either 1 (high) or 0 (low)	
		
);
end component;

component PDO12CDG 
  port(A     : in  std_logic;
       PAD   : out std_logic);
end component;

component PDUDGZ 
  port(Y     : out  std_logic;
       PAD   : in   std_logic);
end component;

signal  clk,reset,write_n,chipselect,output  : STD_LOGIC;
signal  address                              :STD_LOGIC_VECTOR(1 downto 0); 
signal  readdata,writedata                   : STD_LOGIC_VECTOR(15 downto 0);


--for all : PDUDGZ use entity Work.PDUDGZ(inpad_arc);
--for all : PDO12CDG use entity Work.PDO12CDG(outpad_arc);

begin

-- Input clk pad mapping
  padcsi_myclock_clkGen: for i in 0 downto 0 generate
    begin
        inpclk: PDUDGZ port map (Y => clk(i), PAD => padclk(i));
    
  end generate;

-- Input reset pad mapping
  padcsi_myclock_resetGen: for i in 0 downto 0 generate
    begin
        inpreset: PDUDGZ port map (Y => reset(i), PAD => padreset(i));

  end generate;
-- Input write_n pad mapping
  padavs_pwm_write_nGen: for i in 0 downto 0 generate
    begin
        inpwrite_n: PDUDGZ port map (Y => write_n(i), PAD => padwrite_n(i));
    
  end generate;

-- Input chipselect pad mapping
  padDGen: for i in 0 downto 0 generate
    begin
        inpchipselect: PDUDGZ port map (Y => chipselect(i), PAD => padchipselect(i));
    
  end generate;
  
-- Input Adress pad mapping
  padDGen: for i in 1 downto 0 generate
    begin
        inpaddress: PDUDGZ port map (Y => address(i), PAD => padaddress(i));
    
  end generate;
-- Input writedata pad mapping
  padDGen: for i in 15 downto 0 generate
    begin
        inpwritedata: PDUDGZ port map (Y => writedata(i), PAD => padwritedata(i));
    
  end generate;

-- Output output pad mapping
  padP1Gen: for i in 0 downto 0 generate
    begin
       opoutput: PDO12CDG port map (PAD => padoutput(i), A => output(i));
    
  end generate;

-- Output readdata pad mapping
  padP2Gen: for i in 15 downto 0 generate
    begin
        opreaddata: PDO12CDG port map (PAD => padreaddata(i), A => readdata(i));
    
  end generate;

-- Misc pad mapping
  padClkG: 	PDUDGZ port map (Y => Clk, PAD => padClk);
  coreG:        sorting_network port map (Clk => csi_myclock_clk, write_n => avs_pwm_write_n , reset =>  csi_myclock_reset, chipselect => avs_pwm_chipselect, 
					address => avs_pwm_address,readdata => avs_pwm_readdata, writedata => avs_pwm_writedata, output => coe_pwm_output_export);
END Structure;
