LOGIN   :::   RECOVER PASS   :::   GET ACCOUNT    
Browse
  • Projects
  • Code (CVS)
  • Forums
  • News
  • Articles
  • Polls
  •  
    OpenCores
  • FAQ
  • CVS HowTo
  • Mission
  • Media
  • Tools
  • Advertise
  • Mirrors
  • Logos
  • Contact us
  • Find Resources
  • Job Opportunity
  •  
    Tools
  • Search
      
  • Download Cores (CVSGet)
  •  
    More
  • Wishbone
  • Perlilog
  • EDA tools
  • OpenTech CD
  •  
    Navigation: All forums > Cvs-checkins > Message List > Message Post

    Message

    Reply | Reply all
    Date Prev | Date Next | Thread Prev | Thread Next Date Index | Thread Index

    From: cvs at opencores.org<cvs@o...>
    Date: Sun Dec 31 23:34:29 CET 2006
    Subject: [cvs-checkins] MODIFIED: rise ...
    Top
    Date: 00/06/12 31:23:34

    Modified: rise/vhdl id_stage.vhd
    Log:
    - added support for immediate value decoding.

    - opcode extender now works correctly for load immediate. needed special

    handling for the high byte bit.

    - conditional decoder needed special handling for high byte bit.


    Revision Changes Path
    1.4 rise/vhdl/id_stage.vhd

    http://www.opencores.org/cvsweb.shtml/rise/vhdl/id_stage.vhd.diff?r1=1.3&r2=1.4

    (In the diff below, changes in quantity of whitespace are not shown.)

    Index: id_stage.vhd
    ===================================================================
    RCS file: /cvsroot/cwalter/rise/vhdl/id_stage.vhd,v
    retrieving revision 1.3
    retrieving revision 1.4
    diff -u -b -r1.3 -r1.4
    --- id_stage.vhd 13 Dec 2006 02:07:24 -0000 1.3
    +++ id_stage.vhd 31 Dec 2006 22:34:29 -0000 1.4
    @@ -61,7 +61,7 @@
    function register_is_ready( reg_addr: in REGISTER_ADDR_T ) return std_logic is
    variable index : integer range 0 to REGISTER_COUNT - 1;
    begin
    -
    + return '1';
    end;

    begin -- id_stage_rtl
    @@ -95,12 +95,19 @@
    end if;
    end process;

    + -- The opc_extender decodes the two different formats used for the opcodes
    + -- in the instruction set into a single 5-bit opcode format.
    opc_extender: process (clk, reset )
    begin
    if reset = '0' then
    id_ex_register_next.opcode <= OPCODE_NOP;
    + -- decodes: OPCODE_LD_IMM, OPCODE_LD_IMM_HB
    + elsif if_id_register.ir( 15 downto 13 ) = "100" then
    + id_ex_register_next.opcode <= if_id_register.ir( 15 downto 13 ) & if_id_register.ir( 12 ) & "0";
    + -- decodes: OPCODE_LD_DISP, OPCODE_LD_DISP_MS, OPCODE_ST_DISP
    elsif if_id_register.ir(15) = '1' then
    id_ex_register_next.opcode <= if_id_register.ir( 15 downto 13 ) & "00";
    + -- decodes: OPCODE_XXX
    else
    id_ex_register_next.opcode <= if_id_register.ir( 15 downto 11 );
    end if;
    @@ -110,8 +117,13 @@
    begin
    if reset = '0' then
    id_ex_register_next.cond <= COND_NONE;
    + -- decodes: OPCODE_LD_IMM, OPCODE_LD_IMM_HB
    + elsif if_id_register.ir( 15 downto 13 ) = "100" then
    + id_ex_register_next.cond <= COND_UNCONDITIONAL;
    + -- decodes: OPCODE_LD_DISP, OPCODE_LD_DISP_MS, OPCODE_ST_DISP
    elsif if_id_register.ir(15) = '1' then
    id_ex_register_next.cond <= if_id_register.ir( 15 downto 13 );
    + -- decodes: OPCODE_XXX
    else
    id_ex_register_next.cond <= if_id_register.ir( 10 downto 8 );
    end if;
    @@ -134,7 +146,8 @@
    if reset = '0' then
    id_ex_register_next.rX <= ( others => '0' );
    id_ex_register_next.rX_addr <= ( others => '0' );
    - elsif id_ex_register_next.opcode = OPCODE_LD_IMM then
    + elsif id_ex_register_next.opcode = OPCODE_LD_IMM or
    + id_ex_register_next.opcode = OPCODE_LD_IMM_HB then
    rx_addr <= if_id_register.ir( 11 downto 8 );
    id_ex_register_next.rX <= rx;
    id_ex_register_next.rX_addr <= if_id_register.ir( 11 downto 8 );
    @@ -180,4 +193,23 @@
    end if;
    end process;

    + -- The immediate fetch process checks for all opcodes needing constants
    + -- and decides which immediate format was present. If the instruction
    + -- does not include an immediate value the result is undefined and must
    + -- not be used.
    + imm_fetch: process (reset, if_id_register, id_ex_register_next)
    + begin
    + case id_ex_register_next.opcode is
    + -- The immediate values holds the upper 8 bits of a 16 bit value.
    + when OPCODE_LD_IMM_HB =>
    + id_ex_register_next.immediate <= if_id_register.ir( 7 downto 0 ) & x"00";
    + -- The immediate values holds the lower 8 bits of a 16 bit value.
    + when OPCODE_LD_IMM =>
    + id_ex_register_next.immediate <= x"00" & if_id_register.ir( 7 downto 0 );
    + -- Default format holds the lower 4 bits of a 16 bit value.
    + when others =>
    + id_ex_register_next.immediate <= x"000" & if_id_register.ir( 3 downto 0 );
    + end case;
    + end process; + end id_stage_rtl;

     
    Copyright (c) 1999 OPENCORES.ORG. All rights reserved.