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

Subversion Repositories rise

[/] [rise/] [trunk/] [vhdl/] [register_file.vhd] - Diff between revs 2 and 19

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

Rev 2 Rev 19
Line 1... Line 1...
 
 
 
 
-- File: register_file.vhd
-- File: register_file.vhd
-- Author: Jakob Lechner, Urban Stadler, Harald Trinkl, Christian Walter
-- Author: Jakob Lechner, Urban Stadler, Harald Trinkl, Christian Walter
-- Created: 2006-11-29
-- Created: 2006-11-29
-- Last updated: 2006-11-29
-- Last updated: 2006-11-29
 
 
Line 38... Line 40...
 
 
end register_file;
end register_file;
 
 
architecture register_file_rtl of register_file is
architecture register_file_rtl of register_file is
 
 
 
 
 
        signal rx_read_next     : REGISTER_T;
 
        signal ry_read_next     : REGISTER_T;
 
        signal rz_read_next     : REGISTER_T;
 
 
 
        signal sr_read_next     : SR_REGISTER_T;
 
        signal pc_read_next     : PC_REGISTER_T;
 
 
 
        signal dreg_addr_tmp            :       REGISTER_ADDR_T;
 
        signal dreg_write_tmp   :       REGISTER_T;
 
 
 
        signal sr_write_tmp     :       SR_REGISTER_T;
 
        signal lr_write_tmp     :       PC_REGISTER_T;
 
        signal pc_write_tmp     :       PC_REGISTER_T;
 
 
 
 
 
 
 
        signal regx_0, regx_1, regx_2, regx_3, regx_4                                           :       REGISTER_T;
 
        signal regx_5, regx_6, regx_7, regx_8, regx_9                                           :       REGISTER_T;
 
        signal regx_10, regx_11, regx_12, regx_13, regx_14, regx_15             :       REGISTER_T;
 
 
 
        signal regy_0, regy_1, regy_2, regy_3, regy_4                                           :       REGISTER_T;
 
        signal regy_5, regy_6, regy_7, regy_8, regy_9                                           :       REGISTER_T;
 
        signal regy_10, regy_11, regy_12, regy_13, regy_14, regy_15             :       REGISTER_T;
 
 
 
        signal regz_0, regz_1, regz_2, regz_3, regz_4                                           :       REGISTER_T;
 
        signal regz_5, regz_6, regz_7, regz_8, regz_9                                           :       REGISTER_T;
 
        signal regz_10, regz_11, regz_12, regz_13, regz_14, regz_15             :       REGISTER_T;
 
 
begin  -- register_file_rtl
begin  -- register_file_rtl
 
 
 
        SYNC: process(clk, reset)
 
        begin
 
 
 
                if reset = '0' then
 
 
 
                        rx_read <= (others => '0');
 
                        ry_read <= (others => '0');
 
                        rz_read <= (others => '0');
 
 
 
                        sr_read <=      (others => '0');
 
                        pc_read <=( others => '0');
 
 
 
                        sr_write_tmp    <=      (others => '0');
 
                        lr_write_tmp    <=      (others => '0');
 
                        pc_write_tmp    <= (others => '0');
 
 
 
                        dreg_addr_tmp   <=      (others => '0');
 
                        dreg_write_tmp  <= (others => '0');
 
 
 
                elsif clk'event and clk = '1' then
 
 
 
                        rx_read         <=      rx_read_next;
 
                        ry_read         <=      ry_read_next;
 
                        rz_read         <=      rz_read_next;
 
 
 
                        sr_read <=      sr_read_next;
 
                        pc_read <=      pc_read_next;
 
 
 
                        sr_write_tmp    <=      sr_write;
 
                        lr_write_tmp    <=      lr_write;
 
                        pc_write_tmp    <= pc_write;
 
 
 
                        dreg_addr_tmp   <=      dreg_addr;
 
                        dreg_write_tmp  <= dreg_write;
 
 
 
                end if;
 
 
 
        end process SYNC;
 
 
 
        WRITE: process(clk, reset)
 
        begin
 
 
 
                if reset = '0' then
 
 
 
                        sr_read_next    <= (others => '0');
 
                        pc_read_next    <= (others => '0');
 
 
 
                        regx_0  <= (others => '0');
 
                        regx_1  <= (others => '0');
 
                        regx_2  <= (others => '0');
 
                        regx_3  <= (others => '0');
 
                        regx_4  <= (others => '0');
 
                        regx_5  <= (others => '0');
 
                        regx_6  <= (others => '0');
 
                        regx_7  <= (others => '0');
 
                        regx_8  <= (others => '0');
 
                        regx_9  <= (others => '0');
 
                        regx_10 <= (others => '0');
 
                        regx_11 <= (others => '0');
 
                        regx_12 <= (others => '0');
 
                        regx_13 <= (others => '0');
 
                        regx_14 <= (others => '0');
 
                        regx_15 <= (others => '0');
 
 
 
                        regy_0  <= (others => '0');
 
                        regy_1  <= (others => '0');
 
                        regy_2  <= (others => '0');
 
                        regy_3  <= (others => '0');
 
                        regy_4  <= (others => '0');
 
                        regy_5  <= (others => '0');
 
                        regy_6  <= (others => '0');
 
                        regy_7  <= (others => '0');
 
                        regy_8  <= (others => '0');
 
                        regy_9  <= (others => '0');
 
                        regy_10 <= (others => '0');
 
                        regy_11 <= (others => '0');
 
                        regy_12 <= (others => '0');
 
                        regy_13 <= (others => '0');
 
                        regy_14 <= (others => '0');
 
                        regy_15 <= (others => '0');
 
 
 
                        regz_0  <= (others => '0');
 
                        regz_1  <= (others => '0');
 
                        regz_2  <= (others => '0');
 
                        regz_3  <= (others => '0');
 
                        regz_4  <= (others => '0');
 
                        regz_5  <= (others => '0');
 
                        regz_6  <= (others => '0');
 
                        regz_7  <= (others => '0');
 
                        regz_8  <= (others => '0');
 
                        regz_9  <= (others => '0');
 
                        regz_10 <= (others => '0');
 
                        regz_11 <= (others => '0');
 
                        regz_12 <= (others => '0');
 
                        regz_13 <= (others => '0');
 
                        regz_14 <= (others => '0');
 
                        regz_15 <= (others => '0');
 
 
 
                elsif clk'event and clk = '0' then
 
 
 
                        sr_read_next    <= sr_write_tmp;
 
                        --lr_write_next <= lr_write_tmp;
 
                        pc_read_next    <= pc_write_tmp;
 
 
 
 
 
                        if dreg_addr_tmp = "0000" then
 
 
 
                                regx_0 <= dreg_write_tmp;
 
                                regy_0 <= dreg_write_tmp;
 
                                regz_0 <= dreg_write_tmp;
 
 
 
                        elsif   dreg_addr_tmp = "0001" then
 
 
 
                                regx_1  <= dreg_write_tmp;
 
                                regy_1  <= dreg_write_tmp;
 
                                regz_1  <= dreg_write_tmp;
 
 
 
                        elsif   dreg_addr_tmp = "0010" then
 
 
 
                                regx_2  <= dreg_write_tmp;
 
                                regy_2  <= dreg_write_tmp;
 
                                regz_2  <= dreg_write_tmp;
 
 
 
                        elsif   dreg_addr_tmp = "0011" then
 
 
 
                                regx_3  <= dreg_write_tmp;
 
                                regy_3  <= dreg_write_tmp;
 
                                regz_3  <= dreg_write_tmp;
 
 
 
                        elsif   dreg_addr_tmp = "0100" then
 
 
 
                                regx_4  <= dreg_write_tmp;
 
                                regy_4  <= dreg_write_tmp;
 
                                regz_4  <= dreg_write_tmp;
 
 
 
                        elsif   dreg_addr_tmp = "0101" then
 
 
 
                                regx_5  <= dreg_write_tmp;
 
                                regy_5  <= dreg_write_tmp;
 
                                regz_5  <= dreg_write_tmp;
 
 
 
                        elsif   dreg_addr_tmp = "0110" then
 
 
 
                                regx_6  <= dreg_write_tmp;
 
                                regy_6  <= dreg_write_tmp;
 
                                regz_6  <= dreg_write_tmp;
 
 
 
                        elsif   dreg_addr_tmp = "0111" then
 
 
 
                                regx_7  <= dreg_write_tmp;
 
                                regy_7  <= dreg_write_tmp;
 
                                regz_7  <= dreg_write_tmp;
 
 
 
                        elsif   dreg_addr_tmp = "1000" then
 
 
 
                                regx_8  <= dreg_write_tmp;
 
                                regy_8  <= dreg_write_tmp;
 
                                regz_8  <= dreg_write_tmp;
 
                        elsif   dreg_addr_tmp = "1001" then
 
 
 
                                regx_9  <= dreg_write_tmp;
 
                                regy_9  <= dreg_write_tmp;
 
                                regz_9  <= dreg_write_tmp;
 
 
 
                        elsif   dreg_addr_tmp = "1010" then
 
 
 
                                regx_10 <= dreg_write_tmp;
 
                                regy_10         <= dreg_write_tmp;
 
                                regz_10         <= dreg_write_tmp;
 
 
 
                        elsif   dreg_addr_tmp = "1011" then
 
 
 
                                regx_11 <= dreg_write_tmp;
 
                                regy_11         <= dreg_write_tmp;
 
                                regz_11         <= dreg_write_tmp;
 
 
 
                        elsif   dreg_addr_tmp = "1100" then
 
 
 
                                regx_12 <= dreg_write_tmp;
 
                                regy_12         <= dreg_write_tmp;
 
                                regz_12         <= dreg_write_tmp;
 
 
 
                        elsif   dreg_addr_tmp = "1101" then
 
 
 
                                regx_13 <= dreg_write_tmp;
 
                                regy_13         <= dreg_write_tmp;
 
                                regz_13         <= dreg_write_tmp;
 
 
 
                        elsif   dreg_addr_tmp = "1110" then
 
 
 
                                regx_14 <= dreg_write_tmp;
 
                                regy_14         <= dreg_write_tmp;
 
                                regz_14         <= dreg_write_tmp;
 
 
 
                        elsif   dreg_addr_tmp = "1111" then
 
 
 
                                regx_15 <= dreg_write_tmp;
 
                                regy_15         <= dreg_write_tmp;
 
                                regz_15         <= dreg_write_tmp;
 
 
 
                        end if;
 
 
 
                end if;
 
 
 
        end process WRITE;
 
 
 
 
 
        RX_READ_PROC: process(reset, rx_addr,
 
                                                regx_0,  regx_1, regx_2, regx_3, regx_4, regx_5, regx_6, regx_7,
 
                                                regx_8, regx_9, regx_10, regx_11, regx_12, regx_13, regx_14, regx_15)
 
        begin
 
 
 
        if reset = '0' then
 
 
 
                rx_read_next <= (others => '0');
 
        else
 
 
 
                CASE rx_addr IS
 
                        WHEN "0000" => rx_read_next <= regx_0;
 
                        WHEN "0001" => rx_read_next <= regx_1;
 
                        WHEN "0010" => rx_read_next <= regx_2;
 
                        WHEN "0011" => rx_read_next <= regx_3;
 
                        WHEN "0100" => rx_read_next <= regx_4;
 
                        WHEN "0101" => rx_read_next <= regx_5;
 
                        WHEN "0110" => rx_read_next <= regx_6;
 
                        WHEN "0111" => rx_read_next <= regx_7;
 
                        WHEN "1000" => rx_read_next <= regx_8;
 
                        WHEN "1001" => rx_read_next <= regx_9;
 
                        WHEN "1010" => rx_read_next <= regx_10;
 
                        WHEN "1011" => rx_read_next <= regx_11;
 
                        WHEN "1100" => rx_read_next <= regx_12;
 
                        WHEN "1101" => rx_read_next <= regx_13;
 
                        WHEN "1110" => rx_read_next <= regx_14;
 
                        WHEN "1111" => rx_read_next <= regx_15;
 
                        WHEN OTHERS => rx_read_next <= "XXXXXXXXXXXXXXXX";
 
                END CASE;
 
 
 
        end if;
 
 
 
        end process RX_READ_PROC;
 
 
 
 
 
 
 
        RY_READ_PROC: process(reset, ry_addr,
 
                                                regy_0,  regy_1, regy_2, regy_3, regy_4, regy_5, regy_6, regy_7,
 
                                                regy_8, regy_9, regy_10, regy_11, regy_12, regy_13, regy_14, regy_15)
 
        begin
 
 
 
        if reset = '0' then
 
 
 
                ry_read_next <= (others => '0');
 
        else
 
 
 
                CASE ry_addr IS
 
                        WHEN "0000" => ry_read_next <= regy_0;
 
                        WHEN "0001" => ry_read_next <= regy_1;
 
                        WHEN "0010" => ry_read_next <= regy_2;
 
                        WHEN "0011" => ry_read_next <= regy_3;
 
                        WHEN "0100" => ry_read_next <= regy_4;
 
                        WHEN "0101" => ry_read_next <= regy_5;
 
                        WHEN "0110" => ry_read_next <= regy_6;
 
                        WHEN "0111" => ry_read_next <= regy_7;
 
                        WHEN "1000" => ry_read_next <= regy_8;
 
                        WHEN "1001" => ry_read_next <= regy_9;
 
                        WHEN "1010" => ry_read_next <= regy_10;
 
                        WHEN "1011" => ry_read_next <= regy_11;
 
                        WHEN "1100" => ry_read_next <= regy_12;
 
                        WHEN "1101" => ry_read_next <= regy_13;
 
                        WHEN "1110" => ry_read_next <= regy_14;
 
                        WHEN "1111" => ry_read_next <= regy_15;
 
                        WHEN OTHERS => ry_read_next <= "XXXXXXXXXXXXXXXX";
 
                END CASE;
 
 
 
        end if;
 
 
 
        end process RY_READ_PROC;
 
 
 
 
 
 
 
        RZ_READ_PROC: process(reset, rz_addr,
 
                                                regz_0,  regz_1, regz_2, regz_3, regz_4, regz_5, regz_6, regz_7,
 
                                                regz_8, regz_9, regz_10, regz_11, regz_12, regz_13, regz_14, regz_15)
 
        begin
 
 
 
        if reset = '0' then
 
 
 
                rz_read_next <= (others => '0');
 
        else
 
 
 
                CASE rz_addr IS
 
                        WHEN "0000" => rz_read_next <= regz_0;
 
                        WHEN "0001" => rz_read_next <= regz_1;
 
                        WHEN "0010" => rz_read_next <= regz_2;
 
                        WHEN "0011" => rz_read_next <= regz_3;
 
                        WHEN "0100" => rz_read_next <= regz_4;
 
                        WHEN "0101" => rz_read_next <= regz_5;
 
                        WHEN "0110" => rz_read_next <= regz_6;
 
                        WHEN "0111" => rz_read_next <= regz_7;
 
                        WHEN "1000" => rz_read_next <= regz_8;
 
                        WHEN "1001" => rz_read_next <= regz_9;
 
                        WHEN "1010" => rz_read_next <= regz_10;
 
                        WHEN "1011" => rz_read_next <= regz_11;
 
                        WHEN "1100" => rz_read_next <= regz_12;
 
                        WHEN "1101" => rz_read_next <= regz_13;
 
                        WHEN "1110" => rz_read_next <= regz_14;
 
                        WHEN "1111" => rz_read_next <= regz_15;
 
                        WHEN OTHERS => rz_read_next <= "XXXXXXXXXXXXXXXX";
 
                END CASE;
 
 
 
        end if;
 
 
 
        end process RZ_READ_PROC;
 
 
 
 
 
 
end register_file_rtl;
end register_file_rtl;
 
 
 No newline at end of file
 No newline at end of file
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

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