-- Qusetion
-- How to initialize the FPGA data lines, do we neeed to set them to 1
-- for exmaple in the case of communicating with the 8051  

package CL_DXPX is
   subtype bit8  is bit_vector(7 downto 0);
   subtype bit16 is bit_vector(15 downto 0);
   subtype bit32 is bit_vector(31 downto 0);
   
   type CL_SEND_M_D8P2 is
      record 
         dummy : bit;
      end record;
   
   type CL_REC_S_D8P2 is
      record 
         dummy   : bit;
   end record;

   type CL_REC_M_D8P2 is
      record 
         dummy  : bit;
      end record;

   type CL_SEND_S_D8P2 is
      record 
         dummy  : bit;
      end record;

   type CL_SEND_M_D8P2_A is
      record 
         dummy : bit;
      end record;
   
   type CL_REC_S_D8P2_A is
      record 
         addr   : bit8;
   end record;

   type CL_REC_M_D8P2_A is
      record 
         dummy  : bit;
      end record;

   type CL_SEND_S_D8P2_A is
      record 
         addr   : bit8;
      end record;

   -- Channel Initializations   
   procedure CL_InitSendMstD8P2(
            variable chan              : CL_SEND_M_D8P2;
            signal   data_p            : out tristate_bit8;
            signal   data_req_p        : out tristate_bit;
            signal   clk_p             : in bit);

   procedure CL_InitRecSrvD8P2(
            variable chan              : CL_REC_S_D8P2);
   
   procedure CL_InitRecMstD8P2(
            variable chan              : CL_REC_M_D8P2;
            signal   data_p            : out tristate_bit8; 
            signal   data_req_p        : out trisate_bit;
            signal   clk_p             : in bit);

   procedure CL_InitSendSrvD8P2(
            variable chan              : CL_SEND_S_D8P2;
            signal   data_p            : out tristate_bit8;
            signal   data_req_p        : out tristate bit;  
            signal   clk_p             : in bit);

   procedure CL_InitSendMstD8P2_A(
            variable chan              : CL_SEND_M_D8P2_A;
            signal   addr_data_p       : out bit8; 
            signal   addr_req_p        : out bit;
            signal   data_req_p        : out bit;
            signal   clk_p             : in bit);

   procedure CL_InitRecSrvD8P2_A(
            variable chan              : CL_REC_S_D8P2_A;
            variable addr              : in bit8;
            signal   addr_data_p       : out bit8;    
            signal   clk_p             : in bit);

   procedure CL_InitRecMstD8P2_A(
            variable chan              : CL_REC_M_D8P2_A;
            signal   addr_data_p       : out bit8; 
            signal   addr_req_p        : out bit;
            signal   data_req_p        : out bit;
            signal   clk_p             : in bit);

   procedure CL_InitSendSrvD8P2_A(
            variable chan              : CL_SEND_S_D8P2_A;
            variable addr              : in bit8;
            signal   addr_data_p       : out bit8;    
            signal   clk_p             : in bit);

   -- Data transfers
   procedure CL_SendMstD8P2(
            variable chan              : CL_SEND_M_D8P2;
            constant send_byte         : in bit8;   
            signal   addr_data_p       : out bit8;
            signal   data_req_p        : out bit;
            signal   clk_p             : in bit);
   
   procedure CL_RecSrvD8P2(
            variable chan              : CL_REC_S_D8P2;
            variable recd_byte         : out bit8;   
            signal   addr_data_p       : in bit8;
            signal   data_req_p        : in bit;
            signal   clk_p             : in bit);
   
   procedure CL_RecMstD8P2(
            variable chan              : CL_REC_M_D8P2;
            variable recd_byte         : out bit8;   
            signal   addr_data_p       : inout bit8;
            signal   data_req_p        : out bit;
            signal   clk_p             : in bit);

   procedure CL_SendSrvD8P2(
            variable chan              : CL_SEND_S_D8P2;
            constant send_byte         : in bit8;   
            signal   addr_data_p       : inout bit8;
            signal   data_req_p        : in bit;
            signal   clk_p             : in bit);

   procedure CL_SendMstD8P2_A(
            variable chan              : CL_SEND_M_D8P2_A;
            constant send_byte         : in bit8;   
            signal   addr_data_p       : out bit8;
            signal   addr_req_p        : out bit;
            signal   data_req_p        : out bit;
            signal   clk_p             : in bit);
   
   procedure CL_RecSrvD8P2_A(
            variable chan              : CL_REC_S_D8P2_A;
            variable recd_byte         : out bit8;   
            signal   addr_data_p       : in bit8;
            signal   addr_req_p        : in bit;
            signal   data_req_p        : in bit;
            signal   clk_p             : in bit);

   procedure CL_SendSrvD8P2_A(
            variable chan              : CL_SEND_S_D8P2_A;
            constant send_byte         : in bit8;   
            signal   addr_data_p       : inout bit8;
            signal   addr_req_p        : in bit;
            signal   data_req_p        : in bit;
            signal   clk_p             : in bit);
   
   procedure CL_RecMstD8P2_A(
            variable chan              : CL_REC_M_D8P2_A;
            variable recd_byte         : out bit8;   
            signal   addr_data_p       : inout bit8;
            signal   addr_req_p        : out bit;
            signal   data_req_p        : out bit;
            signal   clk_p             : in bit);

end CL_DXPX;  

package body CL_DXPX is

procedure CL_InitSendMstD8P2(
            variable chan              : CL_SEND_M_D8P2; 
            signal   data_req_p        : out bit;
            signal   clk_p             : in bit) is
begin
   addr_data_p <= "11111111";
   data_p       



procedure CL_InitRecSrvISA(
         variable chan           : out CL_REC_S_ISA;
         constant addr           : in  bit16) is
begin
   chan.addr := addr;   
end CL_InitRecSrvISA;

procedure CL_InitSendSrvISA(
         variable chan           : out CL_SEND_S_ISA;
         constant addr           : in  bit16) is
begin
   chan.addr := addr;   
end CL_InitSendSrvISA;

procedure CL_SendSrvISA(
         variable chan           : in CL_SEND_S_ISA;
         constant char_to_send   : in bit8;
         signal addr_p           : in bit16;
         signal dataout_p        : out bit8;
         signal aen_p            : in bit;
         signal rst_p            : in bit;
         signal ior_p            : in bit;
         signal clk_p            : in bit) is
begin
   wait until (clk_p'event and clk_p='1' and aen_p='0' and rst_p='0' and  
                                            ior_p='0' and addr_p=chan.addr);
   dataout_p <= char_to_send;
   wait until clk_p'event and clk_p='1' and ior_p='1'; 
end CL_SendSrvISA;

procedure CL_RecSrvISA(
         variable chan           : in CL_REC_S_ISA;
         variable char_received  : out bit8;
         signal addr_p           : in bit16;
         signal datain_p         : in bit8;
         signal aen_p            : in bit;
         signal rst_p            : in bit;
         signal iow_p            : in bit;
         signal clk_p            : in bit) is
begin
   wait until (clk_p'event and clk_p='1' and aen_p='0' and rst_p='0' and  
                                            iow_p='0' and addr_p=chan.addr);
   char_received := datain_p;
   wait until clk_p'event and clk_p='1' and iow_p='1'; 
end CL_RecSrvISA;


procedure CL_ReadySrvISA(
         variable chan         : in CL_REC_S_ISA;
         variable ready        : out bit;
         signal addr_p         : in bit16;
         signal aen_p          : in bit;
         signal rst_p          : in bit;
	 signal ior_p          : in bit;   	
         signal iow_p          : in bit;
         signal ioch_rdy_p     : out bit;
         signal clk_p          : in bit) is  
begin
   wait until clk_p'event and clk_p='1';
   if (aen_p='0' and rst_p='0' and (ior_p='0' or iow_p='0') and 
                                                      addr_p=chan.addr) then
      ioch_rdy_p <= '0';    -- request an extension of the I/O cycle     
      ready      := '1';   
   else
      ready      := '0';
   end if;   
end CL_ReadySrvISA;

procedure CL_GetDataSrvISA(
         variable chan         : in CL_REC_S_ISA;
         variable char_received: out bit8;
         signal datain_p       : in bit8;
         signal iow_p          : in bit;
         signal clk_p          : in bit) is
begin
   char_received := datain_p;
   wait until clk_p'event and clk_p='1' and iow_p='1';
end CL_GetDataSrvISA;

procedure CL_PutDataSrvISA  (
         variable chan         : in CL_REC_S_ISA;
         constant char_to_send : in bit8;
         signal dataout_p      : out bit8;
	 signal ior_p          : in bit;   	
         signal clk_p          : in bit) is
begin
   dataout_p <= char_to_send;
   wait until clk_p'event and clk_p='1' and ior_p='1';
end CL_PutDataSrvISA;

end CL_DXPX;











