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

Subversion Repositories tinyvliw8

[/] [tinyvliw8/] [trunk/] [src/] [vhdl/] [proc/] [instDecoder.vhd] - Blame information for rev 9

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 9 steckol
-------------------------------------------------------------------------------
2
--
3
-- Design:  tinyVLIW8 soft-core processor
4 2 steckol
-- Author:  Oliver Stecklina <stecklina@ihp-microelectronics.com>
5
-- Date:    03.02.2014 
6
-- File:    instDecoder.vhd
7 9 steckol
--
8
-------------------------------------------------------------------------------
9
--
10
-- Description : This unit is the instruction set decoder of the
11 2 steckol
--               embedded 8-bit VLIW processor.
12 9 steckol
--
13
-------------------------------------------------------------------------------
14
--
15
--    Copyright (C) 2015 IHP GmbH, Frankfurt (Oder), Germany
16
--
17
-- This code is free software. It is licensed under the EUPL, Version 1.1
18
-- or - as soon they will be approved by the European Commission - subsequent
19
-- versions of the EUPL (the "License").
20
-- You may redistribute this code and/or modify it under the terms of this
21
-- License.
22
-- You may not use this work except in compliance with the License.
23
-- You may obtain a copy of the License at:
24
--
25
-- http://joinup.ec.europa.eu/software/page/eupl/licence-eupl
26
--
27
-- Unless required by applicable law or agreed to in writing, software
28
-- distributed under the License is distributed on an "AS IS" basis,
29
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
30
-- See the License for the specific language governing permissions and
31
-- limitations under the License.
32
--
33
-------------------------------------------------------------------------------
34 2 steckol
 
35 9 steckol
library ieee;
36
 
37 2 steckol
use ieee.std_logic_1164.all;
38
use ieee.std_logic_arith.all;
39
 
40
entity vliwProc_instDecoder is
41 9 steckol
        port (
42
                clk        : in std_logic;
43 2 steckol
 
44 9 steckol
                instData   : in  std_logic_vector(31 downto 0);
45
 
46
                ldstOpCode : out std_logic;
47
                ldstAs     : out std_logic_vector(1 downto 0);
48
                ldstDstReg : out std_logic_vector(2 downto 0);
49
                ldstSrc    : out std_logic_vector(7 downto 0);
50
                ldstEn_n   : out std_logic;
51
 
52
                aluOpCode  : out std_logic_vector(2 downto 0);
53
                aluAs      : out std_logic_vector(1 downto 0);
54
                aluDstReg  : out std_logic_vector(2 downto 0);
55
                aluSrc     : out std_logic_vector(7 downto 0);
56
                aluEn_n    : out std_logic;
57
 
58
                jmpAs      : out std_logic_vector(1 downto 0);
59
                jmpDstReg  : out std_logic_vector(10 downto 0);
60
                jmpEn_n    : out std_logic;
61
 
62
                esb        : out std_logic_vector(3 downto 0);
63
 
64
                stalled_n  : out std_logic;
65
                stall_n    : in std_logic;
66
 
67
                rst_n      : in std_logic
68 2 steckol
        );
69
end vliwProc_instDecoder;
70
 
71 9 steckol
architecture behavior of vliwProc_instDecoder is
72
 
73 2 steckol
component gendelay
74
        generic (n: integer := 1);
75
        port (
76
                a_in    : in    std_logic;
77
                a_out   : out   std_logic
78
        );
79
end component;
80 9 steckol
 
81
        signal instWord0_s  : std_logic_vector(15 downto 0);
82
        signal instWord1_s  : std_logic_vector(15 downto 0);
83
 
84
        signal clk_s          : std_logic;
85
 
86
        signal esb_s           : std_logic_vector(3 downto 0);
87
 
88
        signal untSel0_n_s : std_logic_vector(2 downto 0);
89
        signal untSel1_n_s : std_logic_vector(2 downto 0);
90
 
91
        signal stalled_n_s : std_logic;
92
 
93
        signal ldstEn_n_s  : std_logic;
94
        signal aluEn_n_s   : std_logic;
95
        signal jmpEn_n_s   : std_logic;
96
 
97 2 steckol
        signal cnt_s      : std_logic_vector(1 downto 0);
98 9 steckol
begin
99
 
100
        clk_s     <= clk;
101 2 steckol
        stalled_n <= stalled_n_s;
102 9 steckol
 
103 2 steckol
        -- Note! use cnt_s instead of esb to be faster than esb
104
        --    otherwise we get a glitch on esb(0) in case of stall
105
        sync_Stall: process(rst_n, cnt_s(0))
106 9 steckol
        begin
107
                if (rst_n = '0') then
108
                        stalled_n_s <= '1';
109 2 steckol
                else
110
                        if (cnt_s(0)'event and cnt_s(0) = '1') then
111
                                stalled_n_s <= stall_n;
112
                        end if;
113
                end if;
114
        end process;
115
 
116
        ldstEn_n <= ldstEn_n_s;
117
        jmpEn_n <= jmpEn_n_s;
118
        aluEn_n <= aluEn_n_s;
119 9 steckol
 
120 2 steckol
        genState_p : process(rst_n, clk_s)
121
        begin
122
                if (rst_n = '0') then
123
                        cnt_s <= "01";
124
                else
125
                        if (clk_s'event and clk_s = '0') then
126
                                cnt_s(1) <= not(cnt_s(1));
127
                        end if;
128
 
129
                        if (clk_s'event and clk_s = '1') then
130
                                cnt_s(0) <= not(cnt_s(0));
131
                        end if;
132
                end if;
133
        end process;
134 9 steckol
 
135 2 steckol
        -- execution state bus
136
        esb_s <= "0001" when rst_n = '1' and cnt_s = "01" else
137
                 "0010" when rst_n = '1' and cnt_s = "11" else
138
                 "0100" when rst_n = '1' and cnt_s = "10" else
139
                 "1000" when rst_n = '1' and cnt_s = "00" else
140
                 "0000";
141 9 steckol
 
142
        esb <= esb_s when stalled_n_s = '1' else
143
               (others => '0');
144
 
145 2 steckol
        untSel1_n_s <= "111" when instWord0_s(15 downto 13) = instWord1_s(15 downto 13) else
146
                       "110" when instWord1_s(15 downto 13) = "111" else
147
                                   "101" when instWord1_s(15 downto 13) = "000" or instWord1_s(15 downto 13) = "001" else
148
                                   "011";
149
 
150
        untSel0_n_s <= "110" when instWord0_s(15 downto 13) = "111" else
151
                                   "101" when instWord0_s(15 downto 13) = "000" or instWord0_s(15 downto 13) = "001" else
152
                                   "011";
153
 
154 9 steckol
 
155
        jmpEn_n_s  <= '0' when (untSel0_n_s(0) = '0' or untSel1_n_s(0) = '0') and cnt_s(1) = '1' else
156
                      '1';
157
        ldstEn_n_s <= '0' when (untSel0_n_s(1) = '0' or untSel1_n_s(1) = '0') and cnt_s(1) = '1' else
158
                      '1';
159
        aluEn_n_s  <= '0' when (untSel0_n_s(2) = '0' or untSel1_n_s(2) = '0') and cnt_s(1) = '1' else
160
                      '1';
161
 
162
        instWord0_s <= instData(31 downto 16);
163
        instWord1_s <= instData(15 downto 0);
164
 
165
        aluOpCode  <= instWord0_s(15 downto 13)  when untSel0_n_s(2) = '0' else
166
                      instWord1_s(15 downto 13)  when untSel1_n_s(2) = '0' else
167
                      (others => '0');
168
        aluAs      <= instWord0_s(12 downto 11) when untSel0_n_s(2) = '0' else
169
                      instWord1_s(12 downto 11) when untSel1_n_s(2) = '0' else
170
                      (others => '0');
171
        aluDstReg  <= instWord0_s(10 downto 8)  when untSel0_n_s(2) = '0' else
172
                      instWord1_s(10 downto 8)  when untSel1_n_s(2) = '0' else
173
                      (others => '0');
174
        aluSrc     <= instWord0_s(7 downto 0)   when untSel0_n_s(2) = '0' else
175
                      instWord1_s(7 downto 0)   when untSel1_n_s(2) = '0' else
176
                      (others => '0');
177
 
178
        ldstOpCode  <= instWord0_s(13)           when untSel0_n_s(1) = '0' else
179
                       instWord1_s(13)           when untSel1_n_s(1) = '0' else
180
                       '0';
181
        ldstAs      <= instWord0_s(12 downto 11) when untSel0_n_s(1) = '0' else
182
                       instWord1_s(12 downto 11) when untSel1_n_s(1) = '0' else
183
                       (others => '0');
184
        ldstDstReg  <= instWord0_s(10 downto 8)  when untSel0_n_s(1) = '0' else
185
                       instWord1_s(10 downto 8)  when untSel1_n_s(1) = '0' else
186
                       (others => '0');
187
        ldstSrc     <= instWord0_s(7 downto 0)   when untSel0_n_s(1) = '0' else
188
                       instWord1_s(7 downto 0)   when untSel1_n_s(1) = '0' else
189
                       (others => '0');
190
 
191
        jmpAs      <= instWord0_s(12 downto 11) when untSel0_n_s(0) = '0' else
192
                      instWord1_s(12 downto 11) when untSel1_n_s(0) = '0' else
193
                      (others => '0');
194
        jmpDstReg  <= instWord0_s(10 downto 0)  when untSel0_n_s(0) = '0' else
195
                      instWord1_s(10 downto 0)  when untSel1_n_s(0) = '0' else
196
                      (others => '0');
197
 
198
end behavior;

powered by: WebSVN 2.1.0

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