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

Subversion Repositories rise

[/] [rise/] [trunk/] [vhdl/] [wb_stage.vhd] - Blame information for rev 116

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 jlechner
-- File: wb_stage.vhd
2
-- Author: Jakob Lechner, Urban Stadler, Harald Trinkl, Christian Walter
3
-- Created: 2006-11-29
4
-- Last updated: 2006-11-29
5
 
6
-- Description:
7
-- Instruction decode stage
8
-------------------------------------------------------------------------------
9
 
10
library IEEE;
11
use IEEE.STD_LOGIC_1164.all;
12
use IEEE.STD_LOGIC_ARITH.all;
13
 
14
use WORK.RISE_PACK.all;
15 71 jlechner
use work.RISE_PACK_SPECIFIC.all;
16 2 jlechner
 
17
entity wb_stage is
18
 
19
  port (
20 61 cwalter
    clk   : in std_logic;
21
    reset : in std_logic;
22 2 jlechner
 
23 61 cwalter
    mem_wb_register : in MEM_WB_REGISTER_T;
24 2 jlechner
 
25 61 cwalter
    dreg_addr   : out REGISTER_ADDR_T;
26
    dreg        : out REGISTER_T;
27
    dreg_enable : out std_logic;
28 2 jlechner
 
29 61 cwalter
    lr        : out PC_REGISTER_T;
30
    lr_enable : out std_logic;
31
 
32
    sr        : out SR_REGISTER_T;
33
    sr_enable : out std_logic;
34
 
35
    clear_out : out std_logic;
36
 
37
    clear_reg_lock0 : out std_logic;
38
    lock_reg_addr0  : out REGISTER_ADDR_T;
39
    clear_reg_lock1 : out std_logic;
40
    lock_reg_addr1  : out REGISTER_ADDR_T);
41
 
42 2 jlechner
end wb_stage;
43
 
44
architecture wb_stage_rtl of wb_stage is
45 112 trinklhar
        signal address  :std_logic_vector(2 downto 0);
46
        signal wr_data  :std_logic_vector(15 downto 0);
47
        signal rd               :std_logic;
48
   signal wr            :std_logic;
49
   signal rd_data       :std_logic_vector(15 downto 0);
50
   signal rdy_cnt       :std_logic_vector(1 downto 0);
51
   signal txd           :std_logic;
52
   signal rxd           :std_logic;
53 114 trinklhar
        signal sendtouart       :std_logic;
54 112 trinklhar
 
55
    component sc_uart is
56
      generic (ADDR_BITS : integer;
57
               CLK_FREQ  : integer;
58
               BAUD_RATE : integer;
59
               TXF_DEPTH : integer;
60
               TXF_THRES : integer;
61
               RXF_DEPTH : integer;
62
               RXF_THRES : integer);
63
      port (CLK     : in  std_logic;
64
            RESET   : in  std_logic;
65
            ADDRESS : in  std_logic_vector(addr_bits-1 downto 0);
66
            WR_DATA : in  std_logic_vector(15 downto 0);
67
            RD, WR  : in  std_logic;
68
            RD_DATA : out std_logic_vector(15 downto 0);
69
            RDY_CNT : out IEEE.NUMERIC_STD.unsigned(1 downto 0);
70
            TXD     : out std_logic;
71
            RXD     : in  std_logic;
72
            NCTS    : in  std_logic;
73
            NRTS    : out std_logic);
74
    end component;
75 2 jlechner
 
76
begin  -- wb_stage_rtl
77 112 trinklhar
  -- Uart modul einbinden
78
  UART : sc_uart generic map (
79
    ADDR_BITS => 2,
80
    CLK_FREQ  => CLK_FREQ,
81
    BAUD_RATE => 115200,
82
    TXF_DEPTH => 2,
83
    TXF_THRES => 1,
84
    RXF_DEPTH => 2,
85
    RXF_THRES => 1
86
    )
87
         port map(
88
      CLK     => clk,
89
      RESET   => reset,
90
      ADDRESS => address(1 downto 0),
91
      WR_DATA => wr_data,
92
      RD      => rd,
93
      WR      => wr,
94
      RD_DATA => rd_data,
95
      RDY_CNT => rdy_cnt,
96
      TXD     => txd,
97
      RXD     => rxd,
98
      NCTS    => '0',
99
      NRTS    => open
100
      );
101
 
102
 
103 61 cwalter
  clear_out <= '0';  -- clear_out output is unused at the moment.
104 2 jlechner
 
105 113 trinklhar
 
106
 
107
 
108 61 cwalter
  process (reset, mem_wb_register)
109
  begin
110
    if reset = '0' then
111
      clear_reg_lock0 <= '0';
112 76 cwalter
      lock_reg_addr0  <= (others => 'X');
113 61 cwalter
      clear_reg_lock1 <= '0';
114 76 cwalter
      lock_reg_addr1  <= (others => 'X');
115 61 cwalter
 
116 76 cwalter
      dreg_enable <= '0';
117
      dreg_addr <= (others => 'X');
118
      dreg      <= (others => 'X');
119
      lr_enable   <= '0';
120
      lr        <= (others => 'X');
121
      sr_enable   <= '0';
122
      sr        <= (others => 'X');
123 114 trinklhar
--              uart reset
124 113 trinklhar
                rd              <= '0';
125
                wr              <= '0';
126
      wr_data        <= (others => 'X');
127
                rd_data        <= (others => '0');
128
         else
129 116 trinklhar
                if mem_wb_register.dreg_addr = '0' then
130
                        address <=x"8001";
131
                        rd <= '0';
132
                        wr <= '1';
133 114 trinklhar
                        wr_data <=      mem_wb_register.reg;
134 116 trinklhar
                else
135
                        rd <= '0';
136
                        wr <= '0';
137
                end if;
138
 
139 61 cwalter
      -- write back of register value. --
140
      dreg_addr <= mem_wb_register.dreg_addr;
141
      if mem_wb_register.aluop1(ALUOP1_WB_REG_BIT) = '1' then
142 106 cwalter
        if mem_wb_register.aluop1(ALUOP1_LD_MEM_BIT) = '1' then
143
          dreg <= mem_wb_register.mem_reg;
144
        else
145
          dreg <= mem_wb_register.reg;
146
        end if;
147 61 cwalter
        dreg_enable     <= '1';
148
        clear_reg_lock0 <= '1';
149
        lock_reg_addr0  <= mem_wb_register.dreg_addr;
150
      else
151
        dreg_enable     <= '0';
152 76 cwalter
        dreg            <= (others => 'X');
153 61 cwalter
        clear_reg_lock0 <= '0';
154 76 cwalter
        lock_reg_addr0  <= (others => 'X');
155 61 cwalter
      end if;
156
 
157
      -- we have only one lock register.
158
      assert mem_wb_register.aluop2(ALUOP2_SR_BIT) = '0' or mem_wb_register.aluop2(ALUOP2_LR_BIT) = '0';
159
 
160
      clear_reg_lock1 <= '0';
161 76 cwalter
      lock_reg_addr1  <= (others => 'X');
162 61 cwalter
      -- write back of LR --
163
      if mem_wb_register.aluop2(ALUOP2_LR_BIT) = '1' then
164
        lr              <= mem_wb_register.lr;
165
        lr_enable       <= '1';
166
        clear_reg_lock1 <= '1';
167
        lock_reg_addr1  <= LR_REGISTER_ADDR;
168 83 cwalter
      else
169
        lr              <= ( others => 'X' );
170
        lr_enable       <= '0';
171 61 cwalter
      end if;
172 91 cwalter
 
173 61 cwalter
      -- write back of SR --
174
      if mem_wb_register.aluop2(ALUOP2_SR_BIT) = '1' then
175 91 cwalter
        -- calculate SR value
176 83 cwalter
        sr              <= mem_wb_register.sr;
177 91 cwalter
        if mem_wb_register.aluop1(ALUOP1_LD_MEM_BIT) = '1' then
178 95 cwalter
           if mem_wb_register.mem_reg = CONV_STD_LOGIC_VECTOR(0, REGISTER_WIDTH) then
179
             sr( SR_REGISTER_ZERO ) <= '1';
180
           end if;
181
           if mem_wb_register.mem_reg( REGISTER_WIDTH - 1 ) = '1' then
182
             sr( SR_REGISTER_NEGATIVE ) <= '1';
183
           end if;
184 91 cwalter
        end if;
185 83 cwalter
        sr_enable       <= '1';
186 61 cwalter
        clear_reg_lock1 <= '1';
187
        lock_reg_addr1  <= SR_REGISTER_ADDR;
188 83 cwalter
      else
189
        sr              <= ( others => 'X' );
190
        sr_enable       <= '0';
191 61 cwalter
      end if;
192 91 cwalter
 
193
 
194 61 cwalter
    end if;
195
  end process;
196 2 jlechner
end wb_stage_rtl;

powered by: WebSVN 2.1.0

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