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

Subversion Repositories wrimm

[/] [wrimm/] [trunk/] [Wrimm.vhd] - Blame information for rev 3

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

Line No. Rev Author Line
1 3 barryw
--Latest version of all project files available at http://opencores.org/project,wrimm
2
--See License.txt for license details
3
--See WrimmManual.pdf for the Wishbone Datasheet and implementation details.
4
--See wrimm subversion project for version history
5
 
6
library ieee;
7
        use ieee.std_logic_1164.all;
8
        use ieee.numeric_std.all;
9
library wrimm;
10
        use wrimm.WrimmPackage.all;
11
 
12
 
13
entity Wb2MasterIntercon is
14
        generic (
15
                MasterCount                             : integer := 1;
16
                StatusParams                    : StatusFieldDefType;
17
                SettingParams           : SettingFieldDefType;
18
                TriggerParams                   : TriggerFieldDefType);
19
        port (
20
                WbClk                                                   : in    std_logic;
21
                WbRst                                                   : out   std_logic;
22
 
23
                WbMasterIn                              : in    WbMasterOutArray(0 to MasterCount-1);    --Signals from Masters
24
                WbMasterOut                             : out   WbSlaveOutArray(0 to MasterCount-1);     --Signals to Masters
25
 
26
                WbSlaveIn                               : out   WbMasterOutArray(0 to SlaveCount-1);
27
                WbSlaveOut                              : in    WbSlaveOutArray(0 to SlaveCount-1)
28
 
29
                StatusRegs                              :       in      StatusArrayType;
30
                SettingRegs                             :       out     SettingArrayType;
31
                SettingRsts                             : in    SettingArrayBitType;
32
                Triggers                                        : out   TriggerArrayType;
33
                TriggerClr                              : in    TriggerArrayType;
34
 
35
                rstZ                                                    : in    std_logic);                                                                                                     --Asynchronous reset
36
end entity Wb2MasterIntercon;
37
 
38
architecture behavior of Wb2MasterIntercon is
39
        signal  wbStrobe                                                                : std_logic;
40
        signal  validAddress                                            : std_logic;
41
        signal  wbAddr                                                                  : WbAddrType;
42
        signal  wbSData,wbMData                                 : WbDataType;
43
        signal  wbWrEn,wbCyc                                            : std_logic;
44
        signal  wbAck,wbRty,wbErr                               : std_logic;
45
        signal  wbMDataTag                                                      : std_logic_vector(0 to 1);
46
        signal  wbCycType                                                               : std_logic_vector(0 to 2);
47
        signal  iSettingRegs                                            : SettingArrayType;
48
        signal  iTriggers                                                               : TriggerArrayType;
49
        signal  statusEnable                                            : StatusArrayBitType;
50
        signal  settingEnable                                           : SettingArrayBitType;
51
        signal  triggerEnable                                           : TriggerArrayType;
52
        signal  testEnable,testClr                      : std_logic;
53
        signal  testNibble                                                      : std_logic_vector(0 to 3);
54
        signal  grant                                                                           : std_logic_vector(0 to MasterCount-1);
55
 
56
begin
57
        SettingRegs     <= iSettingRegs;
58
        Triggers                <= iTriggers;
59
 
60
--=============================================================================
61
-------------------------------------------------------------------------------
62
--      Master Round Robin Arbitration
63
-------------------------------------------------------------------------------
64
        procArb: process(WbClk,rstZ) is --Round robin arbitration (descending)
65
                variable vGrant : std_logic_vector(0 to MasterCount-1);
66
        begin
67
                if (rstZ='0') then
68
                        grant(0) <= '1';
69
                        grant(1 to MasterCount-1) <= (Others=>'0');
70
                elsif rising_edge(WbClk) then
71
                        loopGrant: for i in 0 to (MasterCount-1) loop
72
                                if vGrant(i)='1' and WbMasterIn(i).Cyc='0' then  --else maintain grant
73
                                        loopNewGrantA: for j in i to (MasterCount-1) loop --last master with cyc=1 will be selected
74
                                                if WbMasterIn(j).Cyc='1' then
75
                                                        vGrant          := (Others=>'0');
76
                                                        vGrant(j)       := '1';
77
                                                end if;
78
                                        end loop loopNewGrantA;
79
                                        if i/=0 then
80
                                                loopNewGrantB: for j in 0 to (i-1) loop
81
                                                        if WbMasterIn(j).Cyc='0' then
82
                                                                vGrant          := (Others=>'1');
83
                                                                vGrant(j) := '1';
84
                                                        end if;
85
                                                end loop loopNewGrantB;         --grant only moves after new requester
86
                                        end if;
87
                                end if;
88
                        end loop loopGrant;
89
                        grant   <= vGrant;
90
                end if; --Clk
91
        end process procArb;
92
--=============================================================================
93
-------------------------------------------------------------------------------
94
--      Master Mux
95
-------------------------------------------------------------------------------
96
        procWbIn: process(grant,WbMasterIn,wbSData,wbAck,wbErr,wbRty) is
97
                variable grantId                : integer;
98
        begin
99
                loopGrantMux: for i in 0 to (MasterCount-1) loop
100
                        --if grant(i)='1' then
101
                        --      grantId := i;
102
                        --end if;
103
                        grantID <= grantID + ((2**i)*to_integer(unsigned(grant(i)),1));
104
                        WbMasterOut(i).Ack      <= grant(i) and wbAck;
105
                        WbMasterOut(i).Err      <= grant(i) and wbErr;
106
                        WbMasterOut(i).Rty      <= grant(i) and wbRty;
107
                        WbMasterOut(i).Data     <= wbSData;     --Data out can always be active.
108
                end loop loopGrantMux;
109
                wbStrobe                <= WbMasterIn(grantId).Strobe;
110
                wbWrEn                  <= WbMasterIn(grantId).WrEn;
111
                wbAddr                  <= WbMasterIn(grantId).Addr;
112
                wbMData                 <= WbMasterIn(grantId).Data;
113
                wbMDataTag      <= WbMasterIn(grantId).DataTag;
114
                wbCyc                           <= WbMasterIn(grantId).Cyc;
115
                wbCycType               <= WbMasterIn(grantId).CycType;
116
        end process procWbIn;
117
 
118
        wbAck   <= wbStrobe and validAddress;
119
        wbErr   <= wbStrobe and not(validAddress);
120
        wbRty   <= '0';
121
        WbRst   <= '0';
122
--=============================================================================
123
-------------------------------------------------------------------------------
124
--      Address Decode, Asynchronous
125
-------------------------------------------------------------------------------
126
        procAddrDecode: process(wbAddr) is
127
                variable vValidAddress : std_logic;
128
        begin
129
                        vValidAddress   := '0';
130
                        loopStatusEn: for f in StatusFieldType loop
131
                                if StatusParams(f).Address=wbAddr then
132
                                        statusEnable(f) <= '1';
133
                                        vValidAddress := '1';
134
                                else
135
                                        statusEnable(f) <= '0';
136
                                end if;
137
                        end loop loopStatusEn;
138
                        loopSettingEn: for f in SettingFieldType loop
139
                                if SettingParams(f).Address=wbAddr then
140
                                        settingEnable(f)        <= '1';
141
                                        vValidAddress := '1';
142
                                else
143
                                        settingEnable(f)        <= '0';
144
                                end if;
145
                        end loop loopSettingEn;
146
                        loopTriggerEn: for f in TriggerFieldType loop
147
                                if TriggerParams(f).Address=wbAddr then
148
                                        triggerEnable(f)        <= '1';
149
                                        vValidAddress := '1';
150
                                else
151
                                        triggerEnable(f)        <= '0';
152
                                end if;
153
                        end loop loopTriggerEn;
154
                        validAddress    <= vValidAddress;
155
        end process procAddrDecode;
156
--=============================================================================
157
-------------------------------------------------------------------------------
158
--      Read
159
-------------------------------------------------------------------------------
160
        procRegRead: process(StatusRegs,iSettingRegs,iTriggers,statusEnable,settingEnable,triggerEnable) is
161
                variable vWbSData       : std_logic_vector(0 to 31);
162
        begin
163
                vWbSData        := (Others=>'0');
164
                loopStatusRegs : for f in StatusFieldType loop
165
                        if statusEnable(f)='1' then
166
                                vWbSData(StatusParams(f).MSBLoc to (StatusParams(f).MSBLoc + StatusParams(f).BitWidth - 1))     := StatusRegs(f)((WbDataBits-StatusParams(f).BitWidth) to WbDataBits-1);
167
                        end if; --Address
168
                end loop loopStatusRegs;
169
                loopSettingRegs : for f in SettingFieldType loop
170
                        if settingEnable(f)='1' then
171
                                vWbSData(SettingParams(f).MSBLoc to (SettingParams(f).MSBLoc + SettingParams(f).BitWidth - 1)) := iSettingRegs(f)((WbDataBits-SettingParams(f).BitWidth) to WbDataBits-1);
172
                        end if; --Address
173
                end loop loopSettingRegs;
174
                loopTriggerRegs : for f in TriggerFieldType loop
175
                        if triggerEnable(f)='1' then
176
                                vWbSData(TriggerParams(f).BitLoc)       := iTriggers(f);
177
                        end if; --Address
178
                end loop loopTriggerRegs;
179
                wbSData <= vWbSData;
180
        end process procRegRead;
181
--=============================================================================
182
-------------------------------------------------------------------------------
183
--      Write
184
-------------------------------------------------------------------------------
185
        procRegWrite: process(WbClk,rstZ) is
186
        begin
187
                if (rstZ='0') then
188
                        loopSettingRegDefault : for f in SettingFieldType loop
189
                                iSettingRegs(f) <= SettingParams(f).Default;
190
                        end loop loopSettingRegDefault;
191
                        loopTriggerRegDefault : for f in TriggerFieldType loop
192
                                iTriggers(f)    <= '0';
193
                        end loop loopTriggerRegDefault;
194
                elsif rising_edge(WbClk) then
195
                        loopSettingRegWr : for f in SettingFieldType loop
196
                                if settingEnable(f)='1' and wbStrobe='1' and wbWrEn='1' then
197
                                        iSettingRegs(f)((WbDataBits-SettingParams(f).BitWidth) to WbDataBits-1) <= wbMData(SettingParams(f).MSBLoc to (SettingParams(f).MSBLoc + SettingParams(f).BitWidth-1));
198
                                end if;
199
                        end loop loopSettingRegWr;
200
                        loopSettingRegRst : for f in SettingFieldType loop
201
                                if SettingRsts(f)='1' then
202
                                        iSettingRegs(f) <= SettingParams(f).Default;
203
                                end if;
204
                        end loop loopSettingRegRst;
205
                        loopTriggerRegWr : for f in TriggerFieldType loop
206
                                if triggerEnable(f)='1' and wbStrobe='1' and wbWrEn='1' then
207
                                        iTriggers(f)                                                                                                                                                    <= wbMData(TriggerParams(f).BitLoc);
208
                                elsif TriggerClr(f)='1' then
209
                                        iTriggers(f)                                                                                                                                                    <= '0';
210
                                end if; --Address or clear
211
                        end loop loopTriggerRegWr;
212
                end if; --Clk
213
        end process procRegWrite;
214
 
215
        testEnable      <= settingEnable(SetIntegrationQStop);
216
        testClr                 <= settingRsts(SetIntegrationQStop);
217
        testNibble      <= iSettingRegs(SetIntegrationQStop)(28 to 31);
218
 
219
end architecture behavior;

powered by: WebSVN 2.1.0

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