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

Subversion Repositories riscompatible

[/] [riscompatible/] [trunk/] [rtl/] [riscompatible_core.vhd] - Rev 2

Compare with Previous | Blame | View Log

-------------------------------------------------------------------------------------------------------------------
-- ____________   _____   ___________   ___________   ___________ 
-- ||||        \ ||||  | ||||        | ||||        | ||||        |
-- ||||_____   | ||||  | ||||   _____| ||||   _____| ||||   __   |
-- ______||||  | ||||  | ||||  |_____  ||||  |       ||||  ||||  |
-- ||||        / ||||  | ||||        | ||||  |       ||||  ||||  |
-- ||||  ___   \ ||||  | ||||_____   | ||||  |       ||||  ||||  |
-- ||||  ||||  | ||||  | ______||||  | ||||  |_____  ||||  ||||  |
-- ||||  ||||  | ||||  | ||||        | ||||        | ||||        |
-- ||||__||||__| ||||__| ||||________| ||||________| ||||________|mpatible Core
--
-- RISCOmpatible - Implementation Based on the Instruction Set developed in:
-- "[1] RISCO - Microprocessador RISC CMOS de 32 Bits",
--      by Alexandre Ambrozi Junqueira and Altamiro Amadeu Suzim, 1993.
--      http://hdl.handle.net/10183/21530
-- HDL code by Andre Borin Soares
--
-- Current Features: Harvard architecture, single clock phase, multicycle operation.
--
-- USE THIS CODE AT YOUR OWN RISK !
-- HDL code 'as is' without warranty.  Author liable for nothing.
-------------------------------------------------------------------------------------------------------------------
-- Suffixes and prefixes used in the code:
-- _W - Wire
-- _R - Register
-- _F - Function
-- _O - Output
-- _I - Input
-- C_ - Constant
-------------------------------------------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library work;
use work.riscompatible_package.all;
-------------------------------------------------------------------------------------------------------------------
entity riscompatible_core is
    generic
    (
        NumBitsProgramMemory : natural:=5;
        NumBitsDataMemory    : natural:=5;
        NumBitsRegBank       : natural:=5
    );
    port
    (
        Clk_I             : in std_logic;
        Reset_I           : in std_logic;
        PMem_Enable_O     : out std_logic;
        PMem_Write_O      : out std_logic;
        PMem_Address_O    : out std_logic_vector(NumBitsProgramMemory-1 downto 0);
        PMem_InputData_O  : out TRiscoWord;
        PMem_OutputData_I : in TRiscoWord;
        DMem_Enable_O     : out std_logic;
        DMem_Write_O      : out std_logic;
        DMem_Address_O    : out std_logic_vector(NumBitsDataMemory-1 downto 0);
        DMem_InputData_O  : out TRiscoWord;
        DMem_OutputData_I : in TRiscoWord;
        Int_I             : in std_logic;
        IntAck_O          : out std_logic
    );
end riscompatible_core;
-------------------------------------------------------------------------------------------------------------------
architecture behavioral of riscompatible_core is
    ---------------------------------------------
    -- Registers
    ---------------------------------------------
    signal PSW_W : TRiscoReg;    
    signal PC_W  : TRiscoReg;    
    signal RUA_W : TRiscoReg;    
    signal RUB_W : TRiscoReg;    
    signal RDA_W : TRiscoReg;    
    signal RDB_W : TRiscoReg;
    ---------------------------------------------
    -- Wires
    ---------------------------------------------
    -- Register Bank Signals ------------------------------
    signal RegBnk_Write_W           : std_logic;
    signal RegBnk_RegisterW_W       : std_logic_vector(NumBitsRegBank - 1 downto 0);
    signal RegBnk_Register1_W       : std_logic_vector(NumBitsRegBank - 1 downto 0);
    signal RegBnk_Register2_W       : std_logic_vector(NumBitsRegBank - 1 downto 0);
    signal RegBnk_InputData_W       : TRiscoWord;
    signal RegBkn_FT1_OutputDatai_W : TRiscoWord;
    signal RegBkn_FT2_OutputDatai_W : TRiscoWord;
    -- ULA Signals ----------------------------------------
    alias  ULA_Cy_I_W       : std_logic is PSW_W.Data_O(4);
    signal ULA_Cy_O_W       : std_logic;
    signal ULA_Ng_O_W       : std_logic;     
    signal ULA_Ov_O_W       : std_logic;     
    signal ULA_Zr_O_W       : std_logic;     
    signal ULA_Function_W   : std_logic_vector(4 downto 0);
    signal ULA_Output_W     : TRiscoWord;
    -- UD Signals -----------------------------------------
    alias  UD_InputData_W   : TRiscoWord is RDA_W.Data_O;
    alias  UD_ShiftAmount_W : std_logic_vector(4 downto 0) is RDB_W.Data_O(4 downto 0);
    signal UD_OutputData_W  : TRiscoWord;
    signal UD_Function_W    : std_logic_vector(4 downto 0);
    alias  UD_Cy_I_W        : std_logic is PSW_W.Data_O(4);
    signal UD_Cy_O_W        : std_logic;     
    -------------------------------------------------------
begin
 
PMem_InputData_O <= (others => '0');
 
---------------------------------------------
-- Registers
---------------------------------------------
 
-- Flags
PSW1:reg generic map (NumBits => C_NumBitsWord) port map (Clk_I => Clk_I, Clr_I => PSW_W.Clr_I, Wen_I => PSW_W.Wen_I, Data_I => PSW_W.Data_I, Data_O => PSW_W.Data_O);
 
-- PC
PC1:reg generic map (NumBits => C_NumBitsWord) port map (Clk_I => Clk_I, Clr_I => PC_W.Clr_I, Wen_I => PC_W.Wen_I, Data_I => PC_W.Data_I, Data_O => PC_W.Data_O);
 
-- Ula Inputs
RUA1:reg generic map (NumBits => C_NumBitsWord) port map (Clk_I => Clk_I, Clr_I => RUA_W.Clr_I, Wen_I => RUA_W.Wen_I, Data_I => RUA_W.Data_I, Data_O => RUA_W.Data_O);
RUB1:reg generic map (NumBits => C_NumBitsWord) port map (Clk_I => Clk_I, Clr_I => RUB_W.Clr_I, Wen_I => RUB_W.Wen_I, Data_I => RUB_W.Data_I, Data_O => RUB_W.Data_O);
 
-- UD inputs
RDA1:reg generic map (NumBits => C_NumBitsWord) port map (Clk_I => Clk_I, Clr_I => RDA_W.Clr_I, Wen_I => RDA_W.Wen_I, Data_I => RDA_W.Data_I, Data_O => RDA_W.Data_O);
RDB1:reg generic map (NumBits => C_NumBitsWord) port map (Clk_I => Clk_I, Clr_I => RDB_W.Clr_I, Wen_I => RDB_W.Wen_I, Data_I => RDB_W.Data_I, Data_O => RDB_W.Data_O);
 
 
---------------------------------------------
-- Register Bank
---------------------------------------------
RegisterBank1: RegisterBank 
    generic map
    (
        NumBitsAddr => NumBitsRegBank,
        DataWidth => 32
    )
    port map
    (
        Clk_I           => Clk_I,
        Enable_I        => '1',
        Write_I         => RegBnk_Write_W,
        RegisterW_I     => RegBnk_RegisterW_W,
        Register1_I     => RegBnk_Register1_W,
        Register2_I     => RegBnk_Register2_W,
        InputData_I     => RegBnk_InputData_W,
        FT1OutputData_O => RegBkn_FT1_OutputDatai_W,
        FT2OutputData_O => RegBkn_FT2_OutputDatai_W
    );
 
---------------------------------------------
-- ULA - Arithmetic Logic Unit
---------------------------------------------
Ula1: Ula 
    port map
    (
        Cy_I       => ULA_Cy_I_W,
        Source1_I  => RUA_W.Data_O, 
        Source2_I  => RUB_W.Data_O, 
        Function_I => ULA_Function_W,
        Output_O   => ULA_Output_W,
        Cy_O       => ULA_Cy_O_W,
        Ov_O       => ULA_Ov_O_W,
        Zr_O       => ULA_Zr_O_W,
        Ng_O       => ULA_Ng_O_W
    );
 
---------------------------------------------
-- UD - Shift Unit
---------------------------------------------
UD1: UD
    port map
    (
        InputData_I   => UD_InputData_W,
        ShiftAmount_I => UD_ShiftAmount_W,
        OutputData_O  => UD_OutputData_W,
        Function_I    => UD_Function_W,
        Cy_I          => UD_Cy_I_W,
        Cy_O          => UD_Cy_O_W
    );
 
---------------------------------------------
-- Control and Signal Selectors
---------------------------------------------
SelectAndControl1 : select_and_control
    generic map
    (
        NumBitsProgramMemory => NumBitsProgramMemory,
        NumBitsDataMemory    => NumBitsDataMemory,
        NumBitsRegBank       => NumBitsRegBank
    )
    port map
    (
        Clk_I                   => Clk_I,
        Reset_I                 => Reset_I,
        PMem_Enable_O           => PMem_Enable_O,
        PMem_Address_O          => PMem_Address_O,
        PMem_Write_O            => PMem_Write_O,
        PMem_OutputData_I       => PMem_OutputData_I,
        DMem_Enable_O           => DMem_Enable_O,
        DMem_Write_O            => DMem_Write_O,
        DMem_Address_O          => DMem_Address_O,
        DMem_InputData_O        => DMem_InputData_O,
        DMem_OutputData_I       => DMem_OutputData_I,
        RegBnk_Register1_O      => RegBnk_Register1_W,
        RegBnk_Register2_O      => RegBnk_Register2_W,
        RegBnk_RegisterW_O      => RegBnk_RegisterW_W,
        RegBnk_Write_O          => RegBnk_Write_W,
        RegBnk_InputData_O      => RegBnk_InputData_W,
        RegBnk_FT1_OutputData_I => RegBkn_FT1_OutputDatai_W,
        RegBnk_FT2_OutputData_I => RegBkn_FT2_OutputDatai_W,
        ULA_Function_O          => ULA_Function_W,
        ULA_Output_I            => ULA_Output_W,
        ULA_Ng_O_I              => ULA_Ng_O_W,
        ULA_Cy_O_I              => ULA_Cy_O_W,
        ULA_Ov_O_I              => ULA_Ov_O_W,
        ULA_Zr_O_I              => ULA_Zr_O_W,
        UD_Function_O           => UD_Function_W,
        UD_OutputData_I         => UD_OutputData_W,
        UD_Cy_O_I               => UD_Cy_O_W,
        RUA_Clr_O               => RUA_W.Clr_I,
        RUB_Clr_O               => RUB_W.Clr_I,
        RDA_Clr_O               => RDA_W.Clr_I,
        RDB_Clr_O               => RDB_W.Clr_I,
        RUA_Wen_O               => RUA_W.Wen_I,
        RUB_Wen_O               => RUB_W.Wen_I,
        RDA_Wen_O               => RDA_W.Wen_I,
        RDB_Wen_O               => RDB_W.Wen_I,
        RUA_Data_O              => RUA_W.Data_I,
        RUB_Data_O              => RUB_W.Data_I,
        RDA_Data_O              => RDA_W.Data_I,
        RDB_Data_O              => RDB_W.Data_I,        
        PC_Clr_O                => PC_W.Clr_I,
        PC_Wen_O                => PC_W.Wen_I,
        PC_Data_I               => PC_W.Data_O,
        PC_Data_O               => PC_W.Data_I,
        PSW_Clr_O               => PSW_W.Clr_I,
        PSW_Wen_O               => PSW_W.Wen_I,
        PSW_Data_I              => PSW_W.Data_O,
        PSW_Data_O              => PSW_W.Data_I,
        Int_I                   => Int_I,
        IntAck_O                => IntAck_O
    );
 
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.