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

Subversion Repositories wrimm

[/] [wrimm/] [trunk/] [Wrimm.vhd] - Rev 3

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

--Latest version of all project files available at http://opencores.org/project,wrimm
--See License.txt for license details
--See WrimmManual.pdf for the Wishbone Datasheet and implementation details.
--See wrimm subversion project for version history
 
library ieee;
	use ieee.std_logic_1164.all;
	use ieee.numeric_std.all;
library wrimm;
	use wrimm.WrimmPackage.all;
 
 
entity Wb2MasterIntercon is
	generic (
		MasterCount				: integer := 1;
		StatusParams 			: StatusFieldDefType;
		SettingParams 		: SettingFieldDefType;
		TriggerParams			: TriggerFieldDefType);
	port (
		WbClk							: in	std_logic;
		WbRst							: out	std_logic;
 
		WbMasterIn				: in	WbMasterOutArray(0 to MasterCount-1);	--Signals from Masters
		WbMasterOut				: out	WbSlaveOutArray(0 to MasterCount-1);	--Signals to Masters
 
		WbSlaveIn				: out	WbMasterOutArray(0 to SlaveCount-1);
		WbSlaveOut				: in	WbSlaveOutArray(0 to SlaveCount-1)
 
		StatusRegs				:	in	StatusArrayType;
		SettingRegs				:	out	SettingArrayType;
		SettingRsts				: in	SettingArrayBitType;
		Triggers					: out	TriggerArrayType;
		TriggerClr				: in	TriggerArrayType;
 
		rstZ							: in	std_logic);													--Asynchronous reset
end entity Wb2MasterIntercon;
 
architecture behavior of Wb2MasterIntercon is
	signal	wbStrobe								: std_logic;
	signal	validAddress						: std_logic;
	signal	wbAddr									: WbAddrType;
	signal	wbSData,wbMData					: WbDataType;
	signal	wbWrEn,wbCyc						: std_logic;
	signal	wbAck,wbRty,wbErr				: std_logic;
	signal	wbMDataTag							: std_logic_vector(0 to 1);
	signal	wbCycType								: std_logic_vector(0 to 2);
	signal	iSettingRegs						: SettingArrayType;
	signal	iTriggers								: TriggerArrayType;
	signal	statusEnable						: StatusArrayBitType;
	signal	settingEnable						: SettingArrayBitType;
	signal	triggerEnable						: TriggerArrayType;
	signal	testEnable,testClr			: std_logic;
	signal	testNibble							: std_logic_vector(0 to 3);
	signal	grant										: std_logic_vector(0 to MasterCount-1);
 
begin
	SettingRegs	<= iSettingRegs;
	Triggers		<= iTriggers;
 
--=============================================================================
-------------------------------------------------------------------------------
--	Master Round Robin Arbitration
-------------------------------------------------------------------------------
	procArb: process(WbClk,rstZ) is	--Round robin arbitration (descending)
		variable vGrant : std_logic_vector(0 to MasterCount-1);
	begin
		if (rstZ='0') then
			grant(0) <= '1';
			grant(1 to MasterCount-1) <= (Others=>'0');
		elsif rising_edge(WbClk) then
			loopGrant: for i in 0 to (MasterCount-1) loop
				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
						if WbMasterIn(j).Cyc='1' then
							vGrant		:= (Others=>'0');
							vGrant(j)	:= '1';
						end if;
					end loop loopNewGrantA;
					if i/=0 then
						loopNewGrantB: for j in 0 to (i-1) loop
							if WbMasterIn(j).Cyc='0' then
								vGrant 		:= (Others=>'1');
								vGrant(j) := '1';
							end if;
						end loop loopNewGrantB;		--grant only moves after new requester
					end if;
				end if;
			end loop loopGrant;
			grant	<= vGrant;
		end if;	--Clk
	end process procArb;
--=============================================================================
-------------------------------------------------------------------------------
--	Master Mux
-------------------------------------------------------------------------------
	procWbIn: process(grant,WbMasterIn,wbSData,wbAck,wbErr,wbRty) is
		variable grantId		: integer;
	begin
		loopGrantMux: for i in 0 to (MasterCount-1) loop
			--if grant(i)='1' then
			--	grantId := i;
			--end if;
			grantID	<= grantID + ((2**i)*to_integer(unsigned(grant(i)),1));
			WbMasterOut(i).Ack	<= grant(i) and wbAck;
			WbMasterOut(i).Err	<= grant(i) and wbErr;
			WbMasterOut(i).Rty	<= grant(i) and wbRty;
			WbMasterOut(i).Data	<= wbSData;	--Data out can always be active.
		end loop loopGrantMux;
		wbStrobe 		<= WbMasterIn(grantId).Strobe;
		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;
	wbErr	<= wbStrobe and not(validAddress);
	wbRty	<= '0';
	WbRst	<= '0';
--=============================================================================
-------------------------------------------------------------------------------
--	Address Decode, Asynchronous
-------------------------------------------------------------------------------
	procAddrDecode: process(wbAddr) is
		variable vValidAddress : std_logic;
	begin
			vValidAddress	:= '0';
			loopStatusEn: for f in StatusFieldType loop
				if StatusParams(f).Address=wbAddr then
					statusEnable(f)	<= '1';
					vValidAddress := '1';
				else
					statusEnable(f)	<= '0';
				end if;
			end loop loopStatusEn;
			loopSettingEn: for f in SettingFieldType loop
				if SettingParams(f).Address=wbAddr then
					settingEnable(f)	<= '1';
					vValidAddress := '1';
				else
					settingEnable(f)	<= '0';
				end if;
			end loop loopSettingEn;
			loopTriggerEn: for f in TriggerFieldType loop
				if TriggerParams(f).Address=wbAddr then
					triggerEnable(f)	<= '1';
					vValidAddress := '1';
				else
					triggerEnable(f)	<= '0';
				end if;
			end loop loopTriggerEn;
			validAddress	<= vValidAddress;
	end process procAddrDecode;
--=============================================================================
-------------------------------------------------------------------------------
--	Read
-------------------------------------------------------------------------------
	procRegRead: process(StatusRegs,iSettingRegs,iTriggers,statusEnable,settingEnable,triggerEnable) is
		variable vWbSData	: std_logic_vector(0 to 31);
	begin
		vWbSData	:= (Others=>'0');
		loopStatusRegs : for f in StatusFieldType loop
			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);
			end if;	--Address
		end loop loopStatusRegs;
		loopSettingRegs : for f in SettingFieldType loop
			if settingEnable(f)='1' then
				vWbSData(SettingParams(f).MSBLoc to (SettingParams(f).MSBLoc + SettingParams(f).BitWidth - 1)) := iSettingRegs(f)((WbDataBits-SettingParams(f).BitWidth) to WbDataBits-1);
			end if;	--Address
		end loop loopSettingRegs;
		loopTriggerRegs : for f in TriggerFieldType loop
			if triggerEnable(f)='1' then
				vWbSData(TriggerParams(f).BitLoc)	:= iTriggers(f);
			end if;	--Address
		end loop loopTriggerRegs;
		wbSData	<= vWbSData;
	end process procRegRead;
--=============================================================================
-------------------------------------------------------------------------------
--	Write
-------------------------------------------------------------------------------
	procRegWrite: process(WbClk,rstZ) is
	begin
		if (rstZ='0') then
			loopSettingRegDefault : for f in SettingFieldType loop
				iSettingRegs(f)	<= SettingParams(f).Default;
			end loop loopSettingRegDefault;
			loopTriggerRegDefault : for f in TriggerFieldType loop
				iTriggers(f)	<= '0';
			end loop loopTriggerRegDefault;
		elsif rising_edge(WbClk) then
			loopSettingRegWr : for f in SettingFieldType loop
				if settingEnable(f)='1' and wbStrobe='1' and wbWrEn='1' then
					iSettingRegs(f)((WbDataBits-SettingParams(f).BitWidth) to WbDataBits-1) <= wbMData(SettingParams(f).MSBLoc to (SettingParams(f).MSBLoc + SettingParams(f).BitWidth-1));
				end if;
			end loop loopSettingRegWr;
			loopSettingRegRst : for f in SettingFieldType loop
				if SettingRsts(f)='1' then
					iSettingRegs(f)	<= SettingParams(f).Default;
				end if;
			end loop loopSettingRegRst;
			loopTriggerRegWr : for f in TriggerFieldType loop
				if triggerEnable(f)='1' and wbStrobe='1' and wbWrEn='1' then
					iTriggers(f)																			<= wbMData(TriggerParams(f).BitLoc);
				elsif TriggerClr(f)='1' then
					iTriggers(f)																			<= '0';
				end if;	--Address or clear
			end loop loopTriggerRegWr;
		end if;	--Clk
	end process procRegWrite;
 
	testEnable	<= settingEnable(SetIntegrationQStop);
	testClr			<= settingRsts(SetIntegrationQStop);
	testNibble	<= iSettingRegs(SetIntegrationQStop)(28 to 31);
 
end architecture behavior;

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

powered by: WebSVN 2.1.0

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