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

Subversion Repositories wrimm

[/] [wrimm/] [trunk/] [Wrimm.vhd] - Diff between revs 3 and 4

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

Rev 3 Rev 4
Line 7... Line 7...
        use ieee.std_logic_1164.all;
        use ieee.std_logic_1164.all;
        use ieee.numeric_std.all;
        use ieee.numeric_std.all;
library wrimm;
library wrimm;
        use wrimm.WrimmPackage.all;
        use wrimm.WrimmPackage.all;
 
 
 
entity Wrimm is
entity Wb2MasterIntercon is
  --generic (
        generic (
  --  MasterParams      : WbMasterDefType;
                MasterCount                             : integer := 1;
  --  SlaveParams       : WbSlaveDefType;
                StatusParams                    : StatusFieldDefType;
  --  StatusParams      : StatusFieldDefType;
                SettingParams           : SettingFieldDefType;
  --  SettingParams     : SettingFieldDefType;
                TriggerParams                   : TriggerFieldDefType);
  --  TriggerParams     : TriggerFieldDefType);
        port (
        port (
                WbClk                                                   : in    std_logic;
                WbClk                                                   : in    std_logic;
                WbRst                                                   : out   std_logic;
                WbRst                                                   : out   std_logic;
 
 
                WbMasterIn                              : in    WbMasterOutArray(0 to MasterCount-1);    --Signals from Masters
    WbMasterIn        : in  WbMasterOutArray; --Signals from Masters
                WbMasterOut                             : out   WbSlaveOutArray(0 to MasterCount-1);     --Signals to Masters
    WbMasterOut       : out WbSlaveOutArray;  --Signals to Masters
 
 
                WbSlaveIn                               : out   WbMasterOutArray(0 to SlaveCount-1);
    --WbSlaveIn         : out WbMasterOutArray;
                WbSlaveOut                              : in    WbSlaveOutArray(0 to SlaveCount-1)
    --WbSlaveOut        : in  WbSlaveOutArray;
 
 
                StatusRegs                              :       in      StatusArrayType;
                StatusRegs                              :       in      StatusArrayType;
 
 
                SettingRegs                             :       out     SettingArrayType;
                SettingRegs                             :       out     SettingArrayType;
                SettingRsts                             : in    SettingArrayBitType;
                SettingRsts                             : in    SettingArrayBitType;
 
 
                Triggers                                        : out   TriggerArrayType;
                Triggers                                        : out   TriggerArrayType;
                TriggerClr                              : in    TriggerArrayType;
                TriggerClr                              : in    TriggerArrayType;
 
 
                rstZ                                                    : in    std_logic);                                                                                                     --Asynchronous reset
                rstZ                                                    : in    std_logic);                                                                                                     --Asynchronous reset
end entity Wb2MasterIntercon;
end entity Wrimm;
 
 
architecture behavior of Wb2MasterIntercon is
architecture behavior of Wrimm is
        signal  wbStrobe                                                                : std_logic;
  signal  wbStrobe                : std_logic;    --Internal Wishbone signals
        signal  validAddress                                            : std_logic;
        signal  validAddress                                            : std_logic;
        signal  wbAddr                                                                  : WbAddrType;
        signal  wbAddr                                                                  : WbAddrType;
        signal  wbSData,wbMData                                 : WbDataType;
        signal  wbSData,wbMData                                 : WbDataType;
        signal  wbWrEn,wbCyc                                            : std_logic;
        signal  wbWrEn,wbCyc                                            : std_logic;
        signal  wbAck,wbRty,wbErr                               : std_logic;
        signal  wbAck,wbRty,wbErr                               : std_logic;
        signal  wbMDataTag                                                      : std_logic_vector(0 to 1);
  --signal  wbMDataTag              : std_logic_vector(0 to 1);
        signal  wbCycType                                                               : std_logic_vector(0 to 2);
  --signal  wbCycType               : std_logic_vector(0 to 2);
 
 
        signal  iSettingRegs                                            : SettingArrayType;
        signal  iSettingRegs                                            : SettingArrayType;
        signal  iTriggers                                                               : TriggerArrayType;
        signal  iTriggers                                                               : TriggerArrayType;
        signal  statusEnable                                            : StatusArrayBitType;
        signal  statusEnable                                            : StatusArrayBitType;
        signal  settingEnable                                           : SettingArrayBitType;
        signal  settingEnable                                           : SettingArrayBitType;
        signal  triggerEnable                                           : TriggerArrayType;
        signal  triggerEnable                                           : TriggerArrayType;
        signal  testEnable,testClr                      : std_logic;
  signal  grant                   : WbMasterGrantType;
        signal  testNibble                                                      : std_logic_vector(0 to 3);
 
        signal  grant                                                                           : std_logic_vector(0 to MasterCount-1);
 
 
 
begin
begin
        SettingRegs     <= iSettingRegs;
        SettingRegs     <= iSettingRegs;
        Triggers                <= iTriggers;
        Triggers                <= iTriggers;
 
 
--=============================================================================
--=============================================================================
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
--      Master Round Robin Arbitration
--      Master Round Robin Arbitration
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
        procArb: process(WbClk,rstZ) is --Round robin arbitration (descending)
        procArb: process(WbClk,rstZ) is --Round robin arbitration (descending)
                variable vGrant : std_logic_vector(0 to MasterCount-1);
    variable vGrant : WbMasterGrantType;
        begin
        begin
                if (rstZ='0') then
                if (rstZ='0') then
                        grant(0) <= '1';
      vGrant(vGrant'range) := (Others=>'0');
                        grant(1 to MasterCount-1) <= (Others=>'0');
      vGrant(vGrant'left) := '1';
                elsif rising_edge(WbClk) then
                elsif rising_edge(WbClk) then
                        loopGrant: for i in 0 to (MasterCount-1) loop
      loopGrant: for i in WbMasterType loop
                                if vGrant(i)='1' and WbMasterIn(i).Cyc='0' then  --else maintain grant
                                if vGrant(i)='1' and WbMasterIn(i).Cyc='0' then  --else maintain grant
                                        loopNewGrantA: for j in i to (MasterCount-1) loop --last master with cyc=1 will be selected
          loopNewGrantA: for j in i to WbMasterType'right loop --last master with cyc=1 will be selected
                                                if WbMasterIn(j).Cyc='1' then
                                                if WbMasterIn(j).Cyc='1' then
                                                        vGrant          := (Others=>'0');
                                                        vGrant          := (Others=>'0');
                                                        vGrant(j)       := '1';
                                                        vGrant(j)       := '1';
                                                end if;
                                                end if;
                                        end loop loopNewGrantA;
                                        end loop loopNewGrantA;
                                        if i/=0 then
          if i/=WbMasterType'left then
                                                loopNewGrantB: for j in 0 to (i-1) loop
            loopNewGrantB: for j in WbMasterType'left to WbMasterType'pred(i) loop
                                                        if WbMasterIn(j).Cyc='0' then
              if WbMasterIn(j).Cyc='1' then
                                                                vGrant          := (Others=>'1');
                vGrant    := (Others=>'0');
                                                                vGrant(j) := '1';
                                                                vGrant(j) := '1';
                                                        end if;
                                                        end if;
                                                end loop loopNewGrantB;         --grant only moves after new requester
                                                end loop loopNewGrantB;         --grant only moves after new requester
                                        end if;
                                        end if;
                                end if;
                                end if;
Line 89... Line 90...
                        grant   <= vGrant;
                        grant   <= vGrant;
                end if; --Clk
                end if; --Clk
        end process procArb;
        end process procArb;
--=============================================================================
--=============================================================================
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
--      Master Mux
--  Master Multiplexers
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
        procWbIn: process(grant,WbMasterIn,wbSData,wbAck,wbErr,wbRty) is
  procWbMasterIn: process(grant,WbMasterIn) is
                variable grantId                : integer;
    variable vSlaveOut    : WbMasterOutType;
        begin
        begin
                loopGrantMux: for i in 0 to (MasterCount-1) loop
    loopGrantInMux: for i in WbMasterType loop
                        --if grant(i)='1' then
      vSlaveOut := WbMasterIn(i);
                        --      grantId := i;
      exit when grant(i)='1';
                        --end if;
    end loop loopGrantInMux;
                        grantID <= grantID + ((2**i)*to_integer(unsigned(grant(i)),1));
    wbStrobe    <= vSlaveOut.Strobe;
 
    wbWrEn      <= vSlaveOut.WrEn;
 
    wbAddr      <= vSlaveOut.Addr;
 
    wbMData     <= vSlaveOut.Data;
 
    --wbMDataTag  <= vSlaveOut.DataTag;
 
    wbCyc       <= vSlaveOut.Cyc;
 
    --wbCycType   <= vSlaveOut.CycType;
 
  end process procWbMasterIn;
 
  procWbMasterOut: process(grant,wbSData,wbAck,wbErr,wbRty) is
 
  begin
 
    loopGrantOutMux: for i in grant'range loop
                        WbMasterOut(i).Ack      <= grant(i) and wbAck;
                        WbMasterOut(i).Ack      <= grant(i) and wbAck;
                        WbMasterOut(i).Err      <= grant(i) and wbErr;
                        WbMasterOut(i).Err      <= grant(i) and wbErr;
                        WbMasterOut(i).Rty      <= grant(i) and wbRty;
                        WbMasterOut(i).Rty      <= grant(i) and wbRty;
                        WbMasterOut(i).Data     <= wbSData;     --Data out can always be active.
                        WbMasterOut(i).Data     <= wbSData;     --Data out can always be active.
                end loop loopGrantMux;
    end loop loopGrantOutMux;
                wbStrobe                <= WbMasterIn(grantId).Strobe;
  end process procWbMasterOut;
                wbWrEn                  <= WbMasterIn(grantId).WrEn;
 
                wbAddr                  <= WbMasterIn(grantId).Addr;
 
                wbMData                 <= WbMasterIn(grantId).Data;
 
                wbMDataTag      <= WbMasterIn(grantId).DataTag;
 
                wbCyc                           <= WbMasterIn(grantId).Cyc;
 
                wbCycType               <= WbMasterIn(grantId).CycType;
 
        end process procWbIn;
 
 
 
        wbAck   <= wbStrobe and validAddress;
        wbAck   <= wbStrobe and validAddress;
        wbErr   <= wbStrobe and not(validAddress);
        wbErr   <= wbStrobe and not(validAddress);
        wbRty   <= '0';
        wbRty   <= '0';
        WbRst   <= '0';
        WbRst   <= '0';
Line 156... Line 160...
--=============================================================================
--=============================================================================
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
--      Read
--      Read
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
        procRegRead: process(StatusRegs,iSettingRegs,iTriggers,statusEnable,settingEnable,triggerEnable) is
        procRegRead: process(StatusRegs,iSettingRegs,iTriggers,statusEnable,settingEnable,triggerEnable) is
                variable vWbSData       : std_logic_vector(0 to 31);
    variable vWbSData : WbDataType;
        begin
        begin
                vWbSData        := (Others=>'0');
                vWbSData        := (Others=>'0');
                loopStatusRegs : for f in StatusFieldType loop
                loopStatusRegs : for f in StatusFieldType loop
                        if statusEnable(f)='1' then
                        if statusEnable(f)='1' then
                                vWbSData(StatusParams(f).MSBLoc to (StatusParams(f).MSBLoc + StatusParams(f).BitWidth - 1))     := StatusRegs(f)((WbDataBits-StatusParams(f).BitWidth) to WbDataBits-1);
                                vWbSData(StatusParams(f).MSBLoc to (StatusParams(f).MSBLoc + StatusParams(f).BitWidth - 1))     := StatusRegs(f)((WbDataBits-StatusParams(f).BitWidth) to WbDataBits-1);
Line 178... Line 182...
                end loop loopTriggerRegs;
                end loop loopTriggerRegs;
                wbSData <= vWbSData;
                wbSData <= vWbSData;
        end process procRegRead;
        end process procRegRead;
--=============================================================================
--=============================================================================
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
--      Write
--  Write, Reset, Clear
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
        procRegWrite: process(WbClk,rstZ) is
        procRegWrite: process(WbClk,rstZ) is
        begin
        begin
                if (rstZ='0') then
                if (rstZ='0') then
                        loopSettingRegDefault : for f in SettingFieldType loop
                        loopSettingRegDefault : for f in SettingFieldType loop
Line 210... Line 214...
                                end if; --Address or clear
                                end if; --Address or clear
                        end loop loopTriggerRegWr;
                        end loop loopTriggerRegWr;
                end if; --Clk
                end if; --Clk
        end process procRegWrite;
        end process procRegWrite;
 
 
        testEnable      <= settingEnable(SetIntegrationQStop);
 
        testClr                 <= settingRsts(SetIntegrationQStop);
 
        testNibble      <= iSettingRegs(SetIntegrationQStop)(28 to 31);
 
 
 
end architecture behavior;
end architecture behavior;
 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.