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

Subversion Repositories ion

[/] [ion/] [trunk/] [vhdl/] [mips_cpu.vhdl] - Diff between revs 28 and 30

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 28 Rev 30
Line 2... Line 2...
-- ion_cpu.vhdl -- MIPS-I(tm) compatible CPU core
-- ion_cpu.vhdl -- MIPS-I(tm) compatible CPU core
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- project:       ION (http://www.opencores.org/project,ion_cpu)
-- project:       ION (http://www.opencores.org/project,ion_cpu)
-- author:        Jose A. Ruiz (ja_rd@hotmail.com)
-- author:        Jose A. Ruiz (ja_rd@hotmail.com)
-- created:       Jan/11/2011
-- created:       Jan/11/2011
-- last modified: Jan/25/2011 (ja_rd@hotmail.com)
-- last modified: Jan/31/2011 (ja_rd@hotmail.com)
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Software placed into the public domain by the author. Use under the terms of
-- Software placed into the public domain by the author. Use under the terms of
-- the GPL.
-- the GPL.
-- Software 'as is' without warranty.  Author liable for nothing.
-- Software 'as is' without warranty.  Author liable for nothing.
--
--
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--### MIPS-I things not implemented
--### MIPS-I things not implemented
--  # Invalid instruction trapping:
--  # Invalid instruction trapping:
--      * invalid opcodes do trap but side affects not prevented yet
--      * invalid opcodes do trap but the logic that prevents bad opcodes from
 
--        having side affects has not been tested yet.
--  # Kernel/user status
--  # Kernel/user status
--  # RTE instruction
--  # RTE instruction (or ERET)
--  # Most of the CP0 registers and of course all of the CP1
--  # Most of the CP0 registers and of course all of the CP1
--  # External interrupts
--  # External interrupts
--
--
--### Things implemented but not tested
--### Things implemented but not tested
--  # Memory pause input
--  # Memory pause input
Line 27... Line 28...
-- 1.- Load interlocks: the pipeline is stalled for every load instruction, even
-- 1.- Load interlocks: the pipeline is stalled for every load instruction, even
--     if the target register is not used in the following instruction. So that
--     if the target register is not used in the following instruction. So that
--     every load takes two cycles.
--     every load takes two cycles.
--     The interlock logic should check register indices.
--     The interlock logic should check register indices.
--
--
-- 2.- Invalid instructions trigger trap cause 10 but their side affects are NOT
 
--     prevented.
 
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
 
 
library ieee;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_arith.all;
Line 96... Line 95...
-- IMPORTANT: This attribute is used by Xilinx tools to select how to implement
-- IMPORTANT: This attribute is used by Xilinx tools to select how to implement
-- the register bank. If we don't use it, by default XST would infer 2 BRAMs for
-- the register bank. If we don't use it, by default XST would infer 2 BRAMs for
-- the 1024-bit 3-port reg bank, which you probably don't want.
-- the 1024-bit 3-port reg bank, which you probably don't want.
-- This can take the values {distributed|block}.
-- This can take the values {distributed|block}.
attribute ram_style :       string;
attribute ram_style :       string;
attribute ram_style of p1_rbank : signal is "distributed";
attribute ram_style of p1_rbank : signal is XILINX_REGBANK;
 
 
signal p1_rs, p1_rt :       t_word;
signal p1_rs, p1_rt :       t_word;
signal p1_rs_rbank :        t_word;
signal p1_rs_rbank :        t_word;
signal p1_rt_rbank :        t_word;
signal p1_rt_rbank :        t_word;
signal p1_rbank_forward :   t_word;
signal p1_rbank_forward :   t_word;
Line 554... Line 553...
 
 
p1_do_reg_jump <= '1' when p1_op_special='1' and p1_ir_fn(5 downto 1)="00100" else '0';
p1_do_reg_jump <= '1' when p1_op_special='1' and p1_ir_fn(5 downto 1)="00100" else '0';
p1_do_zero_ext_imm <= '1' when (p1_ir_op(31 downto 28)="0011") else '0';
p1_do_zero_ext_imm <= '1' when (p1_ir_op(31 downto 28)="0011") else '0';
 
 
-- Decode input data mux control (LW, LH, LB, LBU, LHU) and load enable
-- Decode input data mux control (LW, LH, LB, LBU, LHU) and load enable
p1_do_load <= '1' when p1_ir_op(31 downto 29)="100" and
p1_do_load <= '1' when
                       p2_exception='0'
    p1_ir_op(31 downto 29)="100" and
 
    p1_ir_op(28 downto 26)/="010" and -- LWL
 
    p1_ir_op(28 downto 26)/="110" and -- LWR
 
    p1_ir_op(28 downto 26)/="111" and -- LWR
 
    p2_exception='0'  -- abort load if previous instruction triggered trap
              else '0';
              else '0';
 
 
p1_load_alu_set0 <= '1'
p1_load_alu_set0 <= '1'
    when p1_op_special='1' and
    when p1_op_special='1' and
        ((p1_ir_op(31 downto 29)="000" and p1_ir_op(27 downto 26)="00") or
        ((p1_ir_op(31 downto 29)="000" and p1_ir_op(27 downto 26)="00") or
Line 604... Line 607...
 
 
-- ALU input-2 final selection
-- ALU input-2 final selection
p1_alu_op2_sel <= p1_alu_op2_sel_set0 or p1_alu_op2_sel_set1;
p1_alu_op2_sel <= p1_alu_op2_sel_set0 or p1_alu_op2_sel_set1;
 
 
-- Decode store operations
-- Decode store operations
p1_do_store <=
p1_do_store <= '1' when
    '1' when p1_ir_op(31 downto 29)="101" and
    p1_ir_op(31 downto 29)="101" and
 
    (p1_ir_op(28 downto 26)="000" or -- SB
 
     p1_ir_op(28 downto 26)="001" or -- SH
 
     p1_ir_op(28 downto 26)="011") and -- SWH
    p2_exception='0'    -- abort when previous instruction triggered exception
    p2_exception='0'    -- abort when previous instruction triggered exception
    else '0';
    else '0';
p1_store_size <= p1_ir_op(27 downto 26);
p1_store_size <= p1_ir_op(27 downto 26);
 
 
 
 

powered by: WebSVN 2.1.0

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