Line 74... |
Line 74... |
library work;
|
library work;
|
use work.sdlc_serial_pkg.all;
|
use work.sdlc_serial_pkg.all;
|
|
|
entity o8_sdlc_if is
|
entity o8_sdlc_if is
|
generic(
|
generic(
|
Monitor_Enable : boolean := true;
|
Monitor_Enable : boolean := false;
|
Attach_Monitor_to_CPU_Side : boolean := false;
|
Attach_Monitor_to_CPU_Side : boolean := false;
|
Poly_Init : std_logic_vector(15 downto 0) := x"0000";
|
Poly_Init : std_logic_vector(15 downto 0) := x"0000";
|
Set_As_Master : boolean := true;
|
Set_As_Master : boolean := true;
|
Clock_Offset : integer := 6;
|
Clock_Offset : integer := 6;
|
BitClock_Freq : real := 500000.0;
|
BitClock_Freq : real := 500000.0;
|
Line 127... |
Line 127... |
signal Reg_Sel : std_logic := '0';
|
signal Reg_Sel : std_logic := '0';
|
signal Reg_Wr_En : std_logic := '0';
|
signal Reg_Wr_En : std_logic := '0';
|
signal Reg_Clk_Sel : std_logic := '0';
|
signal Reg_Clk_Sel : std_logic := '0';
|
signal Reg_TxS_Sel : std_logic := '0';
|
signal Reg_TxS_Sel : std_logic := '0';
|
|
|
-- Connect the serial engine to the dual-port memory
|
|
signal DP_Addr : std_logic_vector(8 downto 0) := (others => '0');
|
signal DP_Addr : std_logic_vector(8 downto 0) := (others => '0');
|
signal DP_Wr_Data : DATA_IN_TYPE := x"00";
|
signal DP_Wr_Data : DATA_IN_TYPE := x"00";
|
signal DP_Wr_En : std_logic := '0';
|
signal DP_Wr_En : std_logic := '0';
|
signal DP_Rd_Data : DATA_IN_TYPE := x"00";
|
signal DP_Rd_Data : DATA_IN_TYPE := x"00";
|
|
|
|
signal DP_Port0_Addr : DATA_IN_TYPE := x"00";
|
|
signal DP_Port0_RWn : std_logic := '0';
|
|
signal DP_Port0_WrData : DATA_IN_TYPE := x"00";
|
|
signal DP_Port0_RdData : DATA_IN_TYPE := x"00";
|
|
signal DP_Port0_Req : std_logic := '0';
|
|
signal DP_Port0_Ack : std_logic := '0';
|
|
|
|
signal DP_Port1_Addr : DATA_IN_TYPE := x"00";
|
|
signal DP_Port1_RWn : std_logic := '0';
|
|
signal DP_Port1_WrData : DATA_IN_TYPE := x"00";
|
|
signal DP_Port1_RdData : DATA_IN_TYPE := x"00";
|
|
signal DP_Port1_Req : std_logic := '0';
|
|
signal DP_Port1_Ack : std_logic := '0';
|
|
|
signal BClk_RE : std_logic := '0';
|
signal BClk_RE : std_logic := '0';
|
signal BClk_FE : std_logic := '0';
|
signal BClk_FE : std_logic := '0';
|
|
signal BClk_Okay : std_logic := '0';
|
|
|
signal TX_Wr_En : std_logic := '0';
|
signal TX_Wr_En : std_logic := '0';
|
signal TX_Wr_Flag : std_logic := '0';
|
signal TX_Wr_Flag : std_logic := '0';
|
signal TX_Wr_Data : DATA_IN_TYPE := x"00";
|
signal TX_Wr_Data : DATA_IN_TYPE := x"00";
|
signal TX_Req_Next : std_logic := '0';
|
signal TX_Req_Next : std_logic := '0';
|
|
|
signal TX_CRC_Clr : std_logic := '0';
|
signal TX_CRC_Clr : std_logic := '0';
|
signal TX_CRC_En : std_logic := '0';
|
signal TX_CRC_En : std_logic := '0';
|
signal TX_CRC_Data : CRC_OUT_TYPE := x"0000";
|
signal TX_CRC_Data : CRC_OUT_TYPE := x"0000";
|
alias TX_CRC_Data_LB is TX_CRC_Data(7 downto 0);
|
|
alias TX_CRC_Data_UB is TX_CRC_Data(15 downto 8);
|
|
signal TX_CRC_Valid : std_logic := '0';
|
signal TX_CRC_Valid : std_logic := '0';
|
|
|
|
signal TX_Interrupt : std_logic := '0';
|
|
|
signal RX_Valid : std_logic := '0';
|
signal RX_Valid : std_logic := '0';
|
signal RX_Flag : std_logic := '0';
|
signal RX_Flag : std_logic := '0';
|
signal RX_Data : DATA_IN_TYPE := x"00";
|
signal RX_Data : DATA_IN_TYPE;
|
signal RX_Idle : std_logic := '0';
|
signal RX_Idle : std_logic := '0';
|
|
|
signal RX_CRC_Clr : std_logic := '0';
|
signal RX_Frame_Start : std_logic := '0';
|
signal RX_CRC_En : std_logic := '0';
|
signal RX_Frame_Stop : std_logic := '0';
|
signal RX_CRC_Data : CRC_OUT_TYPE := x"0000";
|
signal RX_Frame_Valid : std_logic := '0';
|
|
signal RX_Frame_Data : DATA_IN_TYPE := x"00";
|
|
|
signal RX_CRC_Valid : std_logic := '0';
|
signal RX_CRC_Valid : std_logic := '0';
|
|
signal RX_CRC_Data : CRC_OUT_TYPE := x"0000";
|
|
|
signal BClk_Okay : std_logic := '0';
|
signal RX_Interrupt : std_logic := '0';
|
|
|
begin
|
begin
|
|
|
|
-- ***************************************************************************
|
|
-- * Open8 Bus Interface and Control Register Detection *
|
|
-- ***************************************************************************
|
|
|
-- This decode needs to happen immediately, to give the RAM a chance to
|
-- This decode needs to happen immediately, to give the RAM a chance to
|
-- do the lookup before we have to set Rd_Data
|
-- do the lookup before we have to set Rd_Data
|
RAM_Addr_Match <= '1' when Base_Addr = RAM_Upper_Addr else '0';
|
RAM_Addr_Match <= '1' when Base_Addr = RAM_Upper_Addr else '0';
|
RAM_Wr_En <= RAM_Addr_Match and Wr_Enable;
|
RAM_Wr_En <= RAM_Addr_Match and Wr_Enable;
|
|
|
Line 196... |
Line 217... |
Rd_Data <= Rd_Data_i;
|
Rd_Data <= Rd_Data_i;
|
end if;
|
end if;
|
end if;
|
end if;
|
end process;
|
end process;
|
|
|
|
-- ***************************************************************************
|
|
-- * Shared Dual-Port Memory *
|
|
-- ***************************************************************************
|
|
|
U_RAM : entity work.sdlc_dp512b_ram
|
U_RAM : entity work.sdlc_dp512b_ram
|
port map(
|
port map(
|
clock => Clock,
|
clock => Clock,
|
address_a => RAM_Lower_Addr,
|
address_a => RAM_Lower_Addr,
|
address_b => DP_Addr,
|
address_b => DP_Addr,
|
Line 234... |
Line 259... |
q => open
|
q => open
|
);
|
);
|
|
|
end generate;
|
end generate;
|
|
|
|
-- ***************************************************************************
|
|
-- * Memory Arbitration *
|
|
-- ***************************************************************************
|
|
|
|
U_ARB : entity work.sdlc_serial_arbfsm
|
|
generic map(
|
|
Reset_Level => Reset_Level
|
|
)
|
|
port map(
|
|
Clock => Clock,
|
|
Reset => Reset,
|
|
--
|
|
DP_Port0_Addr => DP_Port0_Addr,
|
|
DP_Port0_RWn => DP_Port0_RWn,
|
|
DP_Port0_WrData => DP_Port0_WrData,
|
|
DP_Port0_RdData => DP_Port0_RdData,
|
|
DP_Port0_Req => DP_Port0_Req,
|
|
DP_Port0_Ack => DP_Port0_Ack,
|
|
--
|
|
DP_Port1_Addr => DP_Port1_Addr,
|
|
DP_Port1_RWn => DP_Port1_RWn,
|
|
DP_Port1_WrData => DP_Port1_WrData,
|
|
DP_Port1_RdData => DP_Port1_RdData,
|
|
DP_Port1_Req => DP_Port1_Req,
|
|
DP_Port1_Ack => DP_Port1_Ack,
|
|
--
|
|
DP_Addr => DP_Addr,
|
|
DP_Wr_Data => DP_Wr_Data,
|
|
DP_Wr_En => DP_Wr_En,
|
|
DP_Rd_Data => DP_Rd_Data
|
|
);
|
|
|
|
-- ***************************************************************************
|
|
-- * Serial BitClock *
|
|
-- ***************************************************************************
|
|
|
U_BCLK : entity work.sdlc_serial_clk
|
U_BCLK : entity work.sdlc_serial_clk
|
generic map(
|
generic map(
|
Set_As_Master => Set_As_Master,
|
Set_As_Master => Set_As_Master,
|
BitClock_Freq => BitClock_Freq,
|
BitClock_Freq => BitClock_Freq,
|
Reset_Level => Reset_Level,
|
Reset_Level => Reset_Level,
|
Line 252... |
Line 313... |
BClk_FE => BClk_FE,
|
BClk_FE => BClk_FE,
|
BClk_RE => BClk_RE,
|
BClk_RE => BClk_RE,
|
BClk_Okay => BClk_Okay
|
BClk_Okay => BClk_Okay
|
);
|
);
|
|
|
U_CTRL : entity work.sdlc_serial_ctrl
|
-- ***************************************************************************
|
|
-- * Serial Transmit Path *
|
|
-- ***************************************************************************
|
|
|
|
U_TXFSM: entity work.sdlc_serial_txfsm
|
generic map(
|
generic map(
|
Reset_Level => Reset_Level
|
Reset_Level => Reset_Level
|
)
|
)
|
port map(
|
port map(
|
Clock => Clock,
|
Clock => Clock,
|
Line 265... |
Line 330... |
BClk_Okay => BClk_Okay,
|
BClk_Okay => BClk_Okay,
|
--
|
--
|
Reg_Clk_Sel => Reg_Clk_Sel,
|
Reg_Clk_Sel => Reg_Clk_Sel,
|
Reg_TxS_Sel => Reg_TxS_Sel,
|
Reg_TxS_Sel => Reg_TxS_Sel,
|
--
|
--
|
DP_Addr => DP_Addr,
|
DP_Port0_Addr => DP_Port0_Addr,
|
DP_Wr_Data => DP_Wr_Data,
|
DP_Port0_RWn => DP_Port0_RWn,
|
DP_Wr_En => DP_Wr_En,
|
DP_Port0_WrData => DP_Port0_WrData,
|
DP_Rd_Data => DP_Rd_Data,
|
DP_Port0_RdData => DP_Port0_RdData,
|
|
DP_Port0_Req => DP_Port0_Req,
|
|
DP_Port0_Ack => DP_Port0_Ack,
|
--
|
--
|
TX_Wr_En => TX_Wr_En,
|
TX_Wr_En => TX_Wr_En,
|
TX_Wr_Flag => TX_Wr_Flag,
|
TX_Wr_Flag => TX_Wr_Flag,
|
TX_Wr_Data => TX_Wr_Data,
|
TX_Wr_Data => TX_Wr_Data,
|
TX_Req_Next => TX_Req_Next,
|
TX_Req_Next => TX_Req_Next,
|
Line 280... |
Line 347... |
TX_CRC_Clr => TX_CRC_Clr,
|
TX_CRC_Clr => TX_CRC_Clr,
|
TX_CRC_En => TX_CRC_En,
|
TX_CRC_En => TX_CRC_En,
|
TX_CRC_Data => TX_CRC_Data,
|
TX_CRC_Data => TX_CRC_Data,
|
TX_CRC_Valid => TX_CRC_Valid,
|
TX_CRC_Valid => TX_CRC_Valid,
|
--
|
--
|
RX_Valid => RX_Valid,
|
TX_Interrupt => TX_Interrupt
|
RX_Flag => RX_Flag,
|
);
|
RX_Data => RX_Data,
|
|
RX_Idle => RX_Idle,
|
U_TX_CRC : entity work.sdlc_crc16_ccitt
|
|
generic map(
|
|
Poly_Init => Poly_Init,
|
|
Reset_Level => Reset_Level
|
|
)
|
|
port map(
|
|
Clock => Clock,
|
|
Reset => Reset,
|
--
|
--
|
RX_CRC_Clr => RX_CRC_Clr,
|
Clear => TX_CRC_Clr,
|
RX_CRC_En => RX_CRC_En,
|
Wr_En => TX_CRC_En,
|
RX_CRC_Data => RX_CRC_Data,
|
Wr_Data => TX_Wr_Data,
|
RX_CRC_Valid => RX_CRC_Valid,
|
|
--
|
--
|
Interrupt => Interrupt
|
CRC16_Valid => TX_CRC_Valid,
|
|
CRC16_Out => TX_CRC_Data
|
);
|
);
|
|
|
U_TX_SER : entity work.sdlc_serial_tx
|
U_TX_SER : entity work.sdlc_serial_tx
|
generic map(
|
generic map(
|
Reset_Level => Reset_Level
|
Reset_Level => Reset_Level
|
Line 313... |
Line 387... |
TX_Req_Next => TX_Req_Next,
|
TX_Req_Next => TX_Req_Next,
|
--
|
--
|
Serial_Out => SDLC_Out
|
Serial_Out => SDLC_Out
|
);
|
);
|
|
|
U_TX_CRC : entity work.sdlc_crc16_ccitt
|
-- ***************************************************************************
|
generic map(
|
-- * Serial Receive Path *
|
Poly_Init => Poly_Init,
|
-- ***************************************************************************
|
Reset_Level => Reset_Level
|
|
)
|
|
port map(
|
|
Clock => Clock,
|
|
Reset => Reset,
|
|
--
|
|
Clear => TX_CRC_Clr,
|
|
Wr_Data => TX_Wr_Data,
|
|
Wr_En => TX_CRC_En,
|
|
--
|
|
CRC16_Out => TX_CRC_Data,
|
|
CRC16_Valid => TX_CRC_Valid
|
|
);
|
|
|
|
U_RX_SER : entity work.sdlc_serial_rx
|
U_RX_SER : entity work.sdlc_serial_rx
|
generic map(
|
generic map(
|
Set_As_Master => Set_As_Master,
|
Set_As_Master => Set_As_Master,
|
Clock_Offset => Clock_Offset,
|
Clock_Offset => Clock_Offset,
|
Line 351... |
Line 412... |
RX_Flag => RX_Flag,
|
RX_Flag => RX_Flag,
|
RX_Data => RX_Data,
|
RX_Data => RX_Data,
|
RX_Idle => RX_Idle
|
RX_Idle => RX_Idle
|
);
|
);
|
|
|
|
U_RX_PKT : entity work.sdlc_serial_frame
|
|
generic map(
|
|
Reset_Level => Reset_Level
|
|
)
|
|
port map(
|
|
Clock => Clock,
|
|
Reset => Reset,
|
|
--
|
|
RX_Valid => RX_Valid,
|
|
RX_Flag => RX_Flag,
|
|
RX_Data => RX_Data,
|
|
RX_Idle => RX_Idle,
|
|
--
|
|
RX_Frame_Start => RX_Frame_Start,
|
|
RX_Frame_Stop => RX_Frame_Stop,
|
|
RX_Frame_Valid => RX_Frame_Valid,
|
|
RX_Frame_Data => RX_Frame_Data
|
|
);
|
|
|
U_RX_CRC : entity work.sdlc_crc16_ccitt
|
U_RX_CRC : entity work.sdlc_crc16_ccitt
|
generic map(
|
generic map(
|
Poly_Init => Poly_Init,
|
Poly_Init => Poly_Init,
|
Reset_Level => Reset_Level
|
Reset_Level => Reset_Level
|
)
|
)
|
port map(
|
port map(
|
Clock => Clock,
|
Clock => Clock,
|
Reset => Reset,
|
Reset => Reset,
|
--
|
--
|
Clear => RX_CRC_Clr,
|
Clear => RX_Frame_Start,
|
Wr_Data => RX_Data,
|
Wr_En => RX_Frame_Valid,
|
Wr_En => RX_CRC_En,
|
Wr_Data => RX_Frame_Data,
|
|
--
|
|
CRC16_Valid => RX_CRC_Valid,
|
|
CRC16_Out => RX_CRC_Data
|
|
);
|
|
|
|
U_RX_FSM : entity work.sdlc_serial_rxfsm
|
|
generic map(
|
|
Reset_Level => Reset_Level
|
|
)
|
|
port map(
|
|
Clock => Clock,
|
|
Reset => Reset,
|
|
--
|
|
BClk_Okay => BClk_Okay,
|
|
--
|
|
DP_Port1_Addr => DP_Port1_Addr,
|
|
DP_Port1_RWn => DP_Port1_RWn,
|
|
DP_Port1_WrData => DP_Port1_WrData,
|
|
DP_Port1_RdData => DP_Port1_RdData,
|
|
DP_Port1_Req => DP_Port1_Req,
|
|
DP_Port1_Ack => DP_Port1_Ack,
|
|
--
|
|
RX_CRC_Valid => RX_CRC_Valid,
|
|
RX_CRC_Data => RX_CRC_Data,
|
|
--
|
|
RX_Frame_Start => RX_Frame_Start,
|
|
RX_Frame_Stop => RX_Frame_Stop,
|
|
RX_Frame_Valid => RX_Frame_Valid,
|
|
RX_Frame_Data => RX_Frame_Data,
|
--
|
--
|
CRC16_Out => RX_CRC_Data,
|
RX_Interrupt => RX_Interrupt
|
CRC16_Valid => RX_CRC_Valid
|
|
);
|
);
|
|
|
|
-- ***************************************************************************
|
|
-- * Merge Interrupts *
|
|
-- ***************************************************************************
|
|
|
|
Interrupt_merge_proc: process( Clock, Reset )
|
|
begin
|
|
if( Reset = Reset_Level )then
|
|
Interrupt <= '0';
|
|
elsif( rising_edge(Clock) )then
|
|
Interrupt <= RX_Interrupt or TX_Interrupt;
|
|
end if;
|
|
end process;
|
|
|
end architecture;
|
end architecture;
|
No newline at end of file
|
No newline at end of file
|