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

Subversion Repositories rise

[/] [rise/] [trunk/] [vhdl/] [if_stage.vhd] - Blame information for rev 148

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 86 cwalter
 
2 2 jlechner
-- File: if_stage.vhd
3
-- Author: Jakob Lechner, Urban Stadler, Harald Trinkl, Christian Walter
4
-- Created: 2006-11-29
5
-- Last updated: 2006-11-29
6
 
7
-- Description:
8
-- Instruction fetch stage
9
-------------------------------------------------------------------------------
10
 
11
library IEEE;
12
use IEEE.STD_LOGIC_1164.all;
13 29 cwalter
use IEEE.NUMERIC_STD.all;
14 2 jlechner
use WORK.RISE_PACK.all;
15 107 cwalter
use WORK.RISE_PACK_SPECIFIC.all;
16 2 jlechner
 
17
entity if_stage is
18
 
19
  port (
20 29 cwalter
    clk   : in std_logic;
21
    reset : in std_logic;
22 2 jlechner
 
23
    if_id_register : out IF_ID_REGISTER_T;
24
 
25 29 cwalter
    branch        : in std_logic;
26
    branch_target : in PC_REGISTER_T;
27
    clear_in      : in std_logic;
28
    stall_in      : in std_logic;
29 2 jlechner
 
30 29 cwalter
    pc      : in  PC_REGISTER_T;
31
    pc_next : out PC_REGISTER_T;
32 2 jlechner
 
33 29 cwalter
    imem_addr : out MEM_ADDR_T;
34
    imem_data : in  MEM_DATA_T);
35 2 jlechner
 
36
end if_stage;
37 86 cwalter
 
38 29 cwalter
-- This is a simple hardcoded IF unit for the  RISE processor. It does not
39 93 jlechner
-- use the memory and contains a hardcoded program.
40 29 cwalter
architecture if_state_behavioral of if_stage is
41 93 jlechner
 
42 144 cwalter
  signal if_id_register_int  : IF_ID_REGISTER_T := (others => (others => '0'));
43
  signal if_id_register_next : IF_ID_REGISTER_T := (others => (others => '0'));
44
  signal cur_pc              : PC_REGISTER_T;
45 93 jlechner
 
46 144 cwalter
  component pgrom
47
    port (
48
      clk  : in  std_logic;
49
      addr : in  std_logic_vector(15 downto 0);
50
      data : out std_logic_vector(15 downto 0)
51
      );
52
  end component;
53
 
54 29 cwalter
begin
55
  if_id_register <= if_id_register_int;
56 144 cwalter
  cur_pc         <= pc when branch = '0' else branch_target;
57 2 jlechner
 
58 33 cwalter
  process (clk, reset, clear_in)
59 29 cwalter
  begin
60 93 jlechner
    if reset = '0' then
61 29 cwalter
      if_id_register_int.pc <= PC_RESET_VECTOR;
62
      if_id_register_int.ir <= (others => '0');
63
    elsif clk'event and clk = '1' then
64
      if stall_in = '0' then
65
        if_id_register_int <= if_id_register_next;
66
      end if;
67
    end if;
68
  end process;
69
 
70 93 jlechner
  process (reset, branch, branch_target, cur_pc, stall_in)
71 29 cwalter
  begin
72 85 jlechner
    if reset = '0' then
73 29 cwalter
      if_id_register_next.pc <= PC_RESET_VECTOR;
74 86 cwalter
      pc_next                <= PC_RESET_VECTOR;
75 29 cwalter
    else
76 93 jlechner
      if_id_register_next.pc <= cur_pc;
77 144 cwalter
 
78 50 cwalter
      if stall_in = '0' then
79 93 jlechner
        pc_next <= std_logic_vector(unsigned(cur_pc) + 2);
80 29 cwalter
      else
81 93 jlechner
        pc_next <= cur_pc;
82 29 cwalter
      end if;
83
    end if;
84
  end process;
85
 
86 144 cwalter
  pgrom_ut : pgrom port map(
87
    clk  => clk,
88
    addr => cur_pc,
89
    data => if_id_register_next.ir
90
    );
91 93 jlechner
 
92 29 cwalter
end if_state_behavioral;
93 2 jlechner
 
94 29 cwalter
 

powered by: WebSVN 2.1.0

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