OpenCores
URL https://opencores.org/ocsvn/sio/sio/trunk

Subversion Repositories sio

[/] [sio/] [trunk/] [rtl/] [sio_logic.vhd] - Rev 2

Compare with Previous | Blame | View Log

-- Super-I/O Logic Istvan Nagy 2019 09 15
----------------------------------------------------------------------------------
-- A multiplexer logic block to create a super-I/O IP compatible with x86 systems.
-- A replacement for a chip like the Microchip SCH3227.
--  The LPC IP has a 32bit wishbone bus, but only lower 8bits used for SIO access, with 8bit LPC cycles.
-- Files from other projects needed:
--  - UART below this module: https://opencores.org/projects/uart16550
--     For the UART, use the 33MHz compliant version regs file: uart_regs_33m.v
--     In uart_defines.v uncomment the "`define DATA_BUS_WIDTH_8"
--  - PS2 below this module: http://www.opencores.org/projects/ps2/ 
--     In the ps2_defines, uncomment `define PS2_AUX to enble the keyboard
--  - LPC slave: https://opencores.org/projects/wb_lpc
--     Use these files: wb_lpc_periph.v, wb_lpc_defines.v, serirq_defines.v, serirq_slave.v
--     Some of the files had references, that needs rewriting to remove relative path: `include "wb_lpc_defines.v"
--     In wb_lpc_periph.v change a line: always @(posedge clk_i or negedge nrst_i) ===> always @(posedge clk_i) 
--  - Write your own device-top level file, instantiating/connecting the LPC and SIO.
-- Address range:
--  - COM1: 3F8-3FFh
--  - COM2: 2F8-2FFh
--  - COM3: 3E8-3EFh
--  - COM4: 2E8-2EFh
--  - PS2:  60h AND 64h
--  - post-code:  80h AND 81h
--  - Custom board logic registers: 200h...207h (r/w regs connect in/out outside, ro regs out NC)
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
--entity header  ----------------------------------------------------------------
entity sio_logic is
Port ( 	clk : in std_logic; --33.333MHz LPC or PCI-bus-derived clock
	reset_n  : in std_logic;
	wbm_adr_i  : in std_logic_vector(31 downto 0);
	wbm_dat_i  : in std_logic_vector(31 downto 0);
	wbm_dat_o  : out std_logic_vector(31 downto 0);
	wbm_sel_i  : in std_logic_vector(3 downto 0);
	wbm_tga_i  : in std_logic_vector(1 downto 0);
	wbm_we_i  : in std_logic;
	wbm_stb_i  : in std_logic;
	wbm_cyc_i  : in std_logic;
	wbm_ack_o  : out std_logic;
	wbm_err_o  : out std_logic;
	register_0_out   : out std_logic_vector(7 downto 0); 
	register_0_in   : in std_logic_vector(7 downto 0); 
	register_1_out   : out std_logic_vector(7 downto 0); 
	register_1_in   : in std_logic_vector(7 downto 0); 
	register_2_out   : out std_logic_vector(7 downto 0); 
	register_2_in   : in std_logic_vector(7 downto 0); 
	register_3_out   : out std_logic_vector(7 downto 0); 
	register_3_in   : in std_logic_vector(7 downto 0); 
	register_4_out   : out std_logic_vector(7 downto 0); 
	register_4_in   : in std_logic_vector(7 downto 0); 
	register_5_out   : out std_logic_vector(7 downto 0); 
	register_5_in   : in std_logic_vector(7 downto 0); 
	register_6_out   : out std_logic_vector(7 downto 0); 
	register_6_in   : in std_logic_vector(7 downto 0); 
	register_7_out   : out std_logic_vector(7 downto 0); 
	register_7_in   : in std_logic_vector(7 downto 0); 
	port80   : out std_logic_vector(7 downto 0); 
	port81   : out std_logic_vector(7 downto 0); 
	--kb_rstout: out std_logic;
	serial1_tx: out std_logic; serial1_rx: in std_logic; serial1_rts: out std_logic; serial1_cts: in std_logic; serial1_dtr: out std_logic; serial1_dsr: in std_logic; serial1_ri: in std_logic; serial1_dcd: in std_logic;
	serial2_tx: out std_logic; serial2_rx: in std_logic; serial2_rts: out std_logic; serial2_cts: in std_logic; serial2_dtr: out std_logic; serial2_dsr: in std_logic; serial2_ri: in std_logic; serial2_dcd: in std_logic;
	serial3_tx: out std_logic; serial3_rx: in std_logic; serial3_rts: out std_logic; serial3_cts: in std_logic; serial3_dtr: out std_logic; serial3_dsr: in std_logic; serial3_ri: in std_logic; serial3_dcd: in std_logic;
	serial4_tx: out std_logic; serial4_rx: in std_logic; serial4_rts: out std_logic; serial4_cts: in std_logic; serial4_dtr: out std_logic; serial4_dsr: in std_logic; serial4_ri: in std_logic; serial4_dcd: in std_logic;
	ps2_kbd_clk_pad_oe_o: out std_logic; ps2_kbd_clk_pad_o: out std_logic; ps2_kbd_data_pad_oe_o: out std_logic; ps2_kbd_data_pad_o: out std_logic; 
	ps2_aux_clk_pad_oe_o: out std_logic; ps2_aux_clk_pad_o: out std_logic; ps2_aux_data_pad_oe_o: out std_logic; ps2_aux_data_pad_o: out std_logic; 
	ps2_kbd_clk_pad_i: in std_logic; ps2_kbd_data_pad_i: in std_logic; ps2_aux_clk_pad_i : in std_logic; ps2_aux_data_pad_i: in std_logic
);
end sio_logic;
--architecture start ------------------------------------------------------------
architecture Behavioral of sio_logic is
 
--INTERNAL SIGNALS -------------------------------------------------------------
SIGNAL   serial1_wb_adr_i: std_logic_VECTOR(2 downto 0);
SIGNAL   serial1_wb_dat_i: std_logic_VECTOR(7 downto 0);
SIGNAL   serial1_wb_dat_o: std_logic_VECTOR(7 downto 0);
SIGNAL   serial1_wb_we: std_logic;
SIGNAL   serial1_wb_stb: std_logic;
SIGNAL   serial1_wb_cyc: std_logic;
SIGNAL   serial1_wb_ack_o: std_logic;
SIGNAL   serial1_wb_sel_i: std_logic_VECTOR(3 downto 0);
SIGNAL   serial1_int_o: std_logic;
SIGNAL   serial2_wb_adr_i: std_logic_VECTOR(2 downto 0);
SIGNAL   serial2_wb_dat_i: std_logic_VECTOR(7 downto 0);
SIGNAL   serial2_wb_dat_o: std_logic_VECTOR(7 downto 0);
SIGNAL   serial2_wb_we: std_logic;
SIGNAL   serial2_wb_stb: std_logic;
SIGNAL   serial2_wb_cyc: std_logic;
SIGNAL   serial2_wb_ack_o: std_logic;
SIGNAL   serial2_wb_sel_i: std_logic_VECTOR(3 downto 0);
SIGNAL   serial2_int_o: std_logic;
SIGNAL   serial3_wb_adr_i: std_logic_VECTOR(2 downto 0);
SIGNAL   serial3_wb_dat_i: std_logic_VECTOR(7 downto 0);
SIGNAL   serial3_wb_dat_o: std_logic_VECTOR(7 downto 0);
SIGNAL   serial3_wb_we: std_logic;
SIGNAL   serial3_wb_stb: std_logic;
SIGNAL   serial3_wb_cyc: std_logic;
SIGNAL   serial3_wb_ack_o: std_logic;
SIGNAL   serial3_wb_sel_i: std_logic_VECTOR(3 downto 0);
SIGNAL   serial3_int_o: std_logic;
SIGNAL   serial4_wb_adr_i: std_logic_VECTOR(2 downto 0);
SIGNAL   serial4_wb_dat_i: std_logic_VECTOR(7 downto 0);
SIGNAL   serial4_wb_dat_o: std_logic_VECTOR(7 downto 0);
SIGNAL   serial4_wb_we: std_logic;
SIGNAL   serial4_wb_stb: std_logic;
SIGNAL   serial4_wb_cyc: std_logic;
SIGNAL   serial4_wb_ack_o: std_logic;
SIGNAL   serial4_wb_sel_i: std_logic_VECTOR(3 downto 0);
SIGNAL   serial4_int_o: std_logic;
SIGNAL   ps2_wb_cyc: std_logic;
SIGNAL   ps2_wb_stb: std_logic;
SIGNAL   ps2_wb_we: std_logic;
SIGNAL   ps2_wb_sel_i: std_logic_VECTOR(3 downto 0);
SIGNAL   ps2_wb_adr_i: std_logic_VECTOR(3 downto 0);
SIGNAL   ps2_wb_dat_i: std_logic_VECTOR(31 downto 0);
SIGNAL   ps2_wb_dat_o: std_logic_VECTOR(31 downto 0);
SIGNAL   ps2_wb_ack_o : std_logic;
SIGNAL   ps2_wb_int_o: std_logic;
SIGNAL   ps2_wb_intb_o: std_logic;
SIGNAL  offset_reg  : std_logic_VECTOR(7 downto 0);
SIGNAL  device_reg  : std_logic_VECTOR(7 downto 0);
SIGNAL  reset_activehigh : std_logic;
 
 
 
---------COMPONENT DECLARATIONS (introducing the IPs) ----------------------------
	COMPONENT uart_top
	PORT(
		wb_clk_i : IN std_logic;
		wb_rst_i : IN std_logic;
		wb_adr_i : IN std_logic_vector(2 downto 0);
		wb_dat_i : IN std_logic_vector(7 downto 0);
		wb_we_i : IN std_logic;
		wb_stb_i : IN std_logic;
		wb_cyc_i : IN std_logic;
		wb_sel_i : IN std_logic_vector(3 downto 0);
		srx_pad_i : IN std_logic;
		cts_pad_i : IN std_logic;
		dsr_pad_i : IN std_logic;
		ri_pad_i : IN std_logic;
		dcd_pad_i : IN std_logic;        
		wb_dat_o : OUT std_logic_vector(7 downto 0);
		wb_ack_o : OUT std_logic;
		int_o : OUT std_logic;
		stx_pad_o : OUT std_logic;
		rts_pad_o : OUT std_logic;
		dtr_pad_o : OUT std_logic
		);
	END COMPONENT;
	COMPONENT ps2_top
	PORT(
		wb_clk_i : IN std_logic;
		wb_rst_i : IN std_logic;
		wb_cyc_i : IN std_logic;
		wb_stb_i : IN std_logic;
		wb_we_i : IN std_logic;
		wb_sel_i : IN std_logic_vector(3 downto 0);
		wb_adr_i : IN std_logic_vector(3 downto 0);
		wb_dat_i : IN std_logic_vector(31 downto 0);
		ps2_kbd_clk_pad_i : IN std_logic;
		ps2_kbd_data_pad_i : IN std_logic;
		ps2_aux_clk_pad_i : IN std_logic;
		ps2_aux_data_pad_i : IN std_logic;        
		wb_dat_o : OUT std_logic_vector(31 downto 0);
		wb_ack_o : OUT std_logic;
		wb_int_o : OUT std_logic;
		--kb_rstout : OUT std_logic;
		ps2_kbd_clk_pad_o : OUT std_logic;
		ps2_kbd_data_pad_o : OUT std_logic;
		ps2_kbd_clk_pad_oe_o : OUT std_logic;
		ps2_kbd_data_pad_oe_o : OUT std_logic;
		wb_intb_o : OUT std_logic;
		ps2_aux_clk_pad_o : OUT std_logic;
		ps2_aux_data_pad_o : OUT std_logic;
		ps2_aux_clk_pad_oe_o : OUT std_logic;
		ps2_aux_data_pad_oe_o : OUT std_logic
		);
	END COMPONENT;
 
--architecture body start -------------------------------------------------------
begin
---------COMPONENT INSTALLATIONS (connecting the IPs to local signals) ---------
	Inst_uart1_top: uart_top PORT MAP(
		wb_clk_i => clk,
		wb_rst_i => reset_activehigh,
		wb_adr_i => serial1_wb_adr_i(2 downto 0),
		wb_dat_i => serial1_wb_dat_i,
		wb_dat_o => serial1_wb_dat_o,
		wb_we_i => serial1_wb_we,
		wb_stb_i => serial1_wb_stb,
		wb_cyc_i => serial1_wb_cyc,
		wb_ack_o => serial1_wb_ack_o,
		wb_sel_i => serial1_wb_sel_i,
		int_o => serial1_int_o,
		stx_pad_o => serial1_tx,
		srx_pad_i => serial1_rx,
		rts_pad_o => serial1_rts,
		cts_pad_i => serial1_cts,
		dtr_pad_o => serial1_dtr,
		dsr_pad_i => serial1_dsr,
		ri_pad_i => serial1_ri,
		dcd_pad_i => serial1_dcd
	);
	Inst_uart2_top: uart_top PORT MAP(
		wb_clk_i => clk,
		wb_rst_i => reset_activehigh,
		wb_adr_i => serial2_wb_adr_i(2 downto 0),
		wb_dat_i => serial2_wb_dat_i,
		wb_dat_o => serial2_wb_dat_o,
		wb_we_i => serial2_wb_we,
		wb_stb_i => serial2_wb_stb,
		wb_cyc_i => serial2_wb_cyc,
		wb_ack_o => serial2_wb_ack_o,
		wb_sel_i => serial2_wb_sel_i,
		int_o => serial2_int_o,
		stx_pad_o => serial2_tx,
		srx_pad_i => serial2_rx,
		rts_pad_o => serial2_rts,
		cts_pad_i => serial2_cts,
		dtr_pad_o => serial2_dtr,
		dsr_pad_i => serial2_dsr,
		ri_pad_i => serial2_ri,
		dcd_pad_i => serial2_dcd
	);
	Inst_uart3_top: uart_top PORT MAP(
		wb_clk_i => clk,
		wb_rst_i => reset_activehigh,
		wb_adr_i => serial3_wb_adr_i(2 downto 0),
		wb_dat_i => serial3_wb_dat_i,
		wb_dat_o => serial3_wb_dat_o,
		wb_we_i => serial3_wb_we,
		wb_stb_i => serial3_wb_stb,
		wb_cyc_i => serial3_wb_cyc,
		wb_ack_o => serial3_wb_ack_o,
		wb_sel_i => serial3_wb_sel_i,
		int_o => serial3_int_o,
		stx_pad_o => serial3_tx,
		srx_pad_i => serial3_rx,
		rts_pad_o => serial3_rts,
		cts_pad_i => serial3_cts,
		dtr_pad_o => serial3_dtr,
		dsr_pad_i => serial3_dsr,
		ri_pad_i => serial3_ri,
		dcd_pad_i => serial3_dcd
	);
	Inst_uart4_top: uart_top PORT MAP(
		wb_clk_i => clk,
		wb_rst_i => reset_activehigh,
		wb_adr_i => serial4_wb_adr_i(2 downto 0),
		wb_dat_i => serial4_wb_dat_i,
		wb_dat_o => serial4_wb_dat_o,
		wb_we_i => serial4_wb_we,
		wb_stb_i => serial4_wb_stb,
		wb_cyc_i => serial4_wb_cyc,
		wb_ack_o => serial4_wb_ack_o,
		wb_sel_i => serial4_wb_sel_i,
		int_o => serial4_int_o,
		stx_pad_o => serial4_tx,
		srx_pad_i => serial4_rx,
		rts_pad_o => serial4_rts,
		cts_pad_i => serial4_cts,
		dtr_pad_o => serial4_dtr,
		dsr_pad_i => serial4_dsr,
		ri_pad_i => serial4_ri,
		dcd_pad_i => serial4_dcd
	);
 
 
	Inst_ps2_top: ps2_top PORT MAP(
		wb_clk_i => clk,
		wb_rst_i => reset_activehigh,
	    wb_cyc_i => ps2_wb_cyc, 
	    wb_stb_i => ps2_wb_stb, 
	    wb_we_i => ps2_wb_we, 
	    wb_sel_i => ps2_wb_sel_i, 
	    wb_adr_i => ps2_wb_adr_i, 
	    wb_dat_i => ps2_wb_dat_i,
	    wb_dat_o => ps2_wb_dat_o, 
	    wb_ack_o => ps2_wb_ack_o, 
	    wb_int_o => ps2_wb_int_o, 
	    --kb_rstout => kb_rstout,
	    ps2_kbd_clk_pad_i => ps2_kbd_clk_pad_i, 
	    ps2_kbd_data_pad_i => ps2_kbd_data_pad_i, 
	    ps2_kbd_clk_pad_o => ps2_kbd_clk_pad_o, 
	    ps2_kbd_data_pad_o => ps2_kbd_data_pad_o, 
	    ps2_kbd_clk_pad_oe_o => ps2_kbd_clk_pad_oe_o, 
	    ps2_kbd_data_pad_oe_o => ps2_kbd_data_pad_oe_o,
	    wb_intb_o => ps2_wb_intb_o,
	    ps2_aux_clk_pad_i => ps2_aux_clk_pad_i, 
	    ps2_aux_data_pad_i => ps2_aux_data_pad_i, 
	    ps2_aux_clk_pad_o => ps2_aux_clk_pad_o, 
	    ps2_aux_data_pad_o => ps2_aux_data_pad_o, 
	    ps2_aux_clk_pad_oe_o => ps2_aux_clk_pad_oe_o, 
	    ps2_aux_data_pad_oe_o => ps2_aux_data_pad_oe_o
	);
 
--local Logic --------------------------------------------------------------------
reset_activehigh <= not reset_n;
 
 
process ( reset_n, clk, wbm_adr_i, serial1_wb_dat_o, serial2_wb_dat_o, serial3_wb_dat_o, serial4_wb_dat_o, ps2_wb_dat_o, ps2_wb_ack_o, serial1_wb_ack_o, serial2_wb_ack_o, serial3_wb_ack_o, serial4_wb_ack_o, wbm_cyc_i, wbm_we_i, wbm_stb_i, offset_reg, device_reg )
begin
if (reset_n='0') then
   wbm_dat_o <= (others => '0');
   offset_reg <=  (others => '0');
   device_reg <=  (others => '0');
else
 if (wbm_adr_i(9 downto 3) = "1111111") then --serial1
   wbm_dat_o(7 downto 0) <= serial1_wb_dat_o; wbm_ack_o <= serial1_wb_ack_o; 
   ps2_wb_cyc <= '0'; serial1_wb_cyc <= wbm_cyc_i; serial2_wb_cyc <= '0'; serial3_wb_cyc <= '0'; serial4_wb_cyc <= '0';
   ps2_wb_we <= '0'; serial1_wb_we <= wbm_we_i; serial2_wb_we <= '0'; serial3_wb_we <= '0'; serial4_wb_we <= '0';
   ps2_wb_stb <= '0'; serial1_wb_stb <= wbm_stb_i; serial2_wb_stb <= '0'; serial3_wb_stb <= '0'; serial4_wb_stb <= '0';
 elsif (wbm_adr_i(9 downto 3) = "1011111") then  --serial2
   wbm_dat_o(7 downto 0) <= serial2_wb_dat_o;  wbm_ack_o <= serial2_wb_ack_o; 
   ps2_wb_cyc <= '0'; serial1_wb_cyc <= '0'; serial2_wb_cyc <= wbm_cyc_i; serial3_wb_cyc <= '0'; serial4_wb_cyc <= '0';
   ps2_wb_we <= '0'; serial1_wb_we <= '0'; serial2_wb_we <= wbm_we_i; serial3_wb_we <= '0'; serial4_wb_we <= '0';
   ps2_wb_stb <= '0'; serial1_wb_stb <= '0'; serial2_wb_stb <= wbm_stb_i; serial3_wb_stb <= '0'; serial4_wb_stb <= '0';
 elsif (wbm_adr_i(9 downto 3) = "1111101") then  --serial3
   wbm_dat_o(7 downto 0) <= serial3_wb_dat_o;  wbm_ack_o <= serial3_wb_ack_o; 
   ps2_wb_cyc <= '0'; serial1_wb_cyc <= '0'; serial2_wb_cyc <= '0'; serial3_wb_cyc <= wbm_cyc_i; serial4_wb_cyc <= '0';
   ps2_wb_we <= '0'; serial1_wb_we <= '0'; serial2_wb_we <= '0'; serial3_wb_we <= wbm_we_i; serial4_wb_we <= '0';
   ps2_wb_stb <= '0'; serial1_wb_stb <= '0'; serial2_wb_stb <= '0'; serial3_wb_stb <= wbm_stb_i; serial4_wb_stb <= '0';
 elsif (wbm_adr_i(9 downto 3) = "1011101") then  --serial4
   wbm_dat_o(7 downto 0) <= serial4_wb_dat_o;  wbm_ack_o <= serial4_wb_ack_o; 
   ps2_wb_cyc <= '0'; serial1_wb_cyc <= '0'; serial2_wb_cyc <= '0'; serial3_wb_cyc <= '0'; serial4_wb_cyc <= wbm_cyc_i;
   ps2_wb_we <= '0'; serial1_wb_we <= '0'; serial2_wb_we <= '0'; serial3_wb_we <= '0'; serial4_wb_we <= wbm_we_i;
   ps2_wb_stb <= '0'; serial1_wb_stb <= '0'; serial2_wb_stb <= '0'; serial3_wb_stb <= '0'; serial4_wb_stb <= wbm_stb_i;
 elsif (wbm_adr_i(12 downto 3) = "0001100000") then --ps2
   wbm_dat_o(7 downto 0) <= ps2_wb_dat_o(31 downto 24); wbm_ack_o <= ps2_wb_ack_o; 
   ps2_wb_cyc <= wbm_cyc_i; serial1_wb_cyc <= '0'; serial2_wb_cyc <= '0'; serial3_wb_cyc <= '0'; serial4_wb_cyc <= '0';
   ps2_wb_we <= wbm_we_i; serial1_wb_we <= '0'; serial2_wb_we <= '0'; serial3_wb_we <= '0'; serial4_wb_we <= '0';
   ps2_wb_stb <= wbm_stb_i; serial1_wb_stb <= '0'; serial2_wb_stb <= '0'; serial3_wb_stb <= '0'; serial4_wb_stb <= '0';
 elsif (wbm_adr_i(12 downto 3) = "0001100100") then --p2s
   wbm_dat_o(7 downto 0) <= ps2_wb_dat_o(31 downto 24); wbm_ack_o <= ps2_wb_ack_o; 
   ps2_wb_cyc <= wbm_cyc_i; serial1_wb_cyc <= '0'; serial2_wb_cyc <= '0'; serial3_wb_cyc <= '0'; serial4_wb_cyc <= '0';
   ps2_wb_we <= wbm_we_i; serial1_wb_we <= '0'; serial2_wb_we <= '0'; serial3_wb_we <= '0'; serial4_wb_we <= '0';
   ps2_wb_stb <= wbm_stb_i; serial1_wb_stb <= '0'; serial2_wb_stb <= '0'; serial3_wb_stb <= '0'; serial4_wb_stb <= '0';
 else  --not serial or ps2 forwarding, decode locally: 
 
   ps2_wb_cyc <= '0'; serial1_wb_cyc <= '0'; serial2_wb_cyc <= '0'; serial3_wb_cyc <= '0'; serial4_wb_cyc <= '0';
   ps2_wb_we <= '0'; serial1_wb_we <= '0'; serial2_wb_we <= '0'; serial3_wb_we <= '0'; serial4_wb_we <= '0';
   ps2_wb_stb <= '0'; serial1_wb_stb <= '0'; serial2_wb_stb <= '0'; serial3_wb_stb <= '0'; serial4_wb_stb <= '0';
 
   if (clk'event and clk='1') then
 
          case ( wbm_adr_i(11 downto 0) ) is
          --registers:
          when X"200" =>          
           wbm_dat_o(7 downto 0) <= register_0_in(7 downto 0); wbm_ack_o <= '1'; 
           register_0_out <= wbm_dat_i(7 downto 0);
          when X"201" =>          
           wbm_dat_o(7 downto 0) <= register_1_in(7 downto 0); wbm_ack_o <= '1'; 
           register_1_out <= wbm_dat_i(7 downto 0);
          when X"202" =>          
           wbm_dat_o(7 downto 0) <= register_2_in(7 downto 0); wbm_ack_o <= '1'; 
           register_2_out <= wbm_dat_i(7 downto 0);
          when X"203" =>          
           wbm_dat_o(7 downto 0) <= register_3_in(7 downto 0); wbm_ack_o <= '1'; 
           register_3_out <= wbm_dat_i(7 downto 0);
          when X"204" =>          
           wbm_dat_o(7 downto 0) <= register_4_in(7 downto 0); wbm_ack_o <= '1'; 
           register_4_out <= wbm_dat_i(7 downto 0);
          when X"205" =>          
           wbm_dat_o(7 downto 0) <= register_5_in(7 downto 0); wbm_ack_o <= '1'; 
           register_5_out <= wbm_dat_i(7 downto 0);
          when X"206" =>          
           wbm_dat_o(7 downto 0) <= register_6_in(7 downto 0); wbm_ack_o <= '1'; 
           register_6_out <= wbm_dat_i(7 downto 0);
          when X"207" =>          
           wbm_dat_o(7 downto 0) <= register_7_in(7 downto 0); wbm_ack_o <= '1'; 
           register_7_out <= wbm_dat_i(7 downto 0);
          --post code PORT80:
          when X"080" =>          
           port80 <=  wbm_dat_i(7 downto 0); 
           wbm_dat_o(7 downto 0) <= offset_reg; wbm_ack_o <= '1'; 
          when X"081" =>          
           port81 <=  wbm_dat_i(7 downto 0); 
           wbm_dat_o(7 downto 0) <= offset_reg; wbm_ack_o <= '1'; 
          --sio plug and play logic, for the BIOS/OS to detect the number of ports available. ****
          when X"02E" =>          
           if (wbm_we_i='1') then  offset_reg <=  wbm_dat_i(7 downto 0);  end if;
           wbm_dat_o(7 downto 0) <= offset_reg; wbm_ack_o <= '1'; 
          when X"02F" =>          
           if (wbm_we_i='1') then  device_reg <=  wbm_dat_i(7 downto 0);  end if;
           wbm_ack_o <= '1'; 
             if (offset_reg = 7) then
               wbm_dat_o(7 downto 0) <= device_reg;
             elsif (offset_reg = X"60") then --offset LSB 
                if    (device_reg = 4) then --serial1
                  wbm_dat_o(7 downto 0) <= X"F8";
                elsif (device_reg = 3) then --serial2
                  wbm_dat_o(7 downto 0) <= X"F8";
                elsif (device_reg = 2) then --serial3
                  wbm_dat_o(7 downto 0) <= X"E8";
                elsif (device_reg = 1) then --serial4
                  wbm_dat_o(7 downto 0) <= X"E8";
                elsif (device_reg = 6) then --keyboard
                  wbm_dat_o(7 downto 0) <= X"60";
                elsif (device_reg = 5) then --mouse
                  wbm_dat_o(7 downto 0) <= X"60";
                else 
                  wbm_dat_o(7 downto 0) <= "00000000";
                end if;
             elsif (offset_reg = X"61") then --offset MSB 
                if    (device_reg = 4) then --serial1
                  wbm_dat_o(7 downto 0) <= X"03";
                elsif (device_reg = 3) then --serial2
                  wbm_dat_o(7 downto 0) <= X"02";
                elsif (device_reg = 2) then --serial3
                  wbm_dat_o(7 downto 0) <= X"03";
                elsif (device_reg = 1) then --serial4
                  wbm_dat_o(7 downto 0) <= X"02";
                elsif (device_reg = 6) then --keyboard
                  wbm_dat_o(7 downto 0) <= X"00";
                elsif (device_reg = 5) then --mouse
                  wbm_dat_o(7 downto 0) <= X"00";
                else 
                  wbm_dat_o(7 downto 0) <= "00000000";
                end if;
             elsif (offset_reg = X"70") then --interrupt info
                if    (device_reg = 4) then --serial1
                  wbm_dat_o(7 downto 0) <= X"04";
                elsif (device_reg = 3) then --serial2
                  wbm_dat_o(7 downto 0) <= X"03";
                elsif (device_reg = 2) then --serial3
                  wbm_dat_o(7 downto 0) <= X"04";
                elsif (device_reg = 1) then --serial4
                  wbm_dat_o(7 downto 0) <= X"03";
                elsif (device_reg = 6) then --keyboard
                  wbm_dat_o(7 downto 0) <= X"01";
                elsif (device_reg = 5) then --mouse
                  wbm_dat_o(7 downto 0) <= X"0C";
                else 
                  wbm_dat_o(7 downto 0) <= "00000000";
                end if;
             end if;
          when others => --error
            wbm_dat_o <= (others => '0'); wbm_ack_o <= '0'; 
            --device_reg <= device_reg; port80 <= port80; port81 <= port81; offset_reg <= offset_reg;
            --register_0_out <= register_0_out; register_1_out <= register_1_out; register_2_out <= register_2_out; register_3_out <= register_3_out; 
            --register_4_out <= register_4_out; register_5_out <= register_5_out; register_6_out <= register_6_out; register_7_out <= register_7_out; 
          end case;  
   end if;
 end if;
end if;
end process;
 
ps2_wb_dat_i(31 downto 24) <= wbm_dat_i(7 downto 0);
ps2_wb_dat_i(23 downto 16) <= wbm_dat_i(7 downto 0);
ps2_wb_dat_i(15 downto 8) <= wbm_dat_i(7 downto 0);
ps2_wb_sel_i(3) <= '1';
ps2_wb_sel_i(2 downto 0) <= "000";
ps2_wb_adr_i(3 downto 0) <= wbm_adr_i(3 downto 0);
serial1_wb_dat_i <= wbm_dat_i(7 downto 0);
serial1_wb_sel_i <= "1000"; 
serial1_wb_adr_i(2 downto 0) <= wbm_adr_i(2 downto 0);
serial2_wb_dat_i <= wbm_dat_i(7 downto 0);
serial2_wb_sel_i <= "1000"; 
serial2_wb_adr_i(2 downto 0) <= wbm_adr_i(2 downto 0);
serial3_wb_dat_i <= wbm_dat_i(7 downto 0);
serial3_wb_sel_i <= "1000"; 
serial3_wb_adr_i(2 downto 0) <= wbm_adr_i(2 downto 0);
serial4_wb_dat_i <= wbm_dat_i(7 downto 0);
serial4_wb_sel_i <= "1000"; 
serial4_wb_adr_i(2 downto 0) <= wbm_adr_i(2 downto 0);
 
--end file ----------------------------------------------------------------------
end Behavioral;
 
 
 
 
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.