hostmot2.vhd

来自「CNC 的开放码,EMC2 V2.2.8版」· VHDL 代码 · 共 1,538 行 · 第 1/4 页

VHD
1,538
字号
				end if;				end loop;				else			result := (others => '0');		end if;		return result;	end OneOfNDecode;					function bitreverse(v: in std_logic_vector) -- Thanks: J. Bromley	return std_logic_vector is	variable result: std_logic_vector(v'RANGE);	alias tv: std_logic_vector(v'REVERSE_RANGE) is v;	begin		for i in tv'RANGE loop			result(i) := tv(i);		end loop;		return result;	end;		begin	ahosmotid : entity hostmotid		generic map ( 			buswidth => BusWidth,			cookie => Cookie,			namelow => HostMotNameLow ,			namehigh => HostMotNameHigh,			idromoffset => IDROMOffset			)					port map ( 			readid => ReadID,			addr => A(3 downto 2),			obus => obus			);	makeoports: for i in 0 to IOPorts -1 generate		oportx: entity WordPR 		generic map (			size => PortWidth,			buswidth => BusWidth			)				port map (			clear => WDBite,			clk => clklow,			ibus => ibus,			obus => obus,			loadport => LoadPortCmd(i),			loadddr => LoadDDRCmd(i),			loadaltdatasrc => LoadAltDataSrcCmd(i),			loadopendrainmode => LoadOpenDrainModeCmd(i),			loadinvert => LoadOutputInvCmd(i),			readddr => ReadDDRCmd(i),			portdata => IOBits((((i+1)*PortWidth) -1) downto (i*PortWidth)), 			altdata => Altdata((((i+1)*PortWidth) -1) downto (i*PortWidth))			);		end generate;	makeiports: for i in 0 to IOPorts -1 generate		iportx: entity WordRB 		  		generic map (size => PortWidth,						 buswidth => BusWidth)		port map (		obus => obus,		readport => ReadPortCmd(i),		portdata => IOBits((((i+1)*PortWidth) -1) downto (i*PortWidth)) 		);		end generate;	makewatchdog: if UseWatchDog generate  		wdogabittus: entity watchdog		generic map ( buswidth => BusWidth)				port map (			clk => clklow,			ibus => ibus,			obus => obus,			loadtime => LoadWDTime, 			readtime => ReadWDTime,			loadstatus=> LoadWDStatus,			readstatus=> ReadWDStatus,			cookie => WDCookie,			wdbite => WDBite,			wdlatchedbite => WDLatchedBite			);		end generate;	makeirqlogic: if UseIRQlogic generate		somoldirqlogic: entity irqlogic    		generic map( 			buswidth =>  BusWidth,			dividerwidth => 16				)			port map ( 			clk => clklow,			ibus => ibus,         obus =>  obus,         loaddiv => LoadIRQDiv,         readdiv => ReadIRQDiv,         loadstatus => LoadIRQStatus,         readstatus => ReadIrqStatus,         clear =>  ClearIRQ,         ratesource => RefCountBus(PWMRefWidth-1 downto PWMRefWidth-8), -- from toggle bit all the way to 8X PWM rate         int => INT);	end generate;		makestepgens: if StepGens >0 generate			makeStepGenPreScaler:  if UseStepGenPreScaler generate			StepRategen : entity RateGen port map(				ibus => ibus,				obus => obus,				loadbasicrate => LoadStepGenBasicRate,				readbasicrate => ReadStepGenBasicRate,				hold => '0',				basicrate => StepGenBasicRate,				clk => clklow);			end generate;		generatestepgens: for i in 0 to StepGens-1 generate			usg: if UseStepGenPreScaler generate			stepgenx: entity stepgen			generic map (				buswidth => BusWidth,				timersize => 14,			-- = ~480 usec at 33 MHz, ~320 at 50 Mhz 				tablewidth => StepGenTableWidth,				asize => 48,				rsize => 32 				)			port map (				clk => clklow,				ibus => ibus,				obus 	=>	 obus,				loadsteprate => LoadStepGenRate(i),				loadaccum => LoadStepGenAccum(i),				loadstepmode => LoadStepGenMode(i),				loaddirsetuptime => LoadStepGenDSUTime(i),				loaddirholdtime => LoadStepGenDHLDTime(i),				loadpulseactivetime => LoadStepGenPulseATime(i),				loadpulseidletime => LoadStepGenPulseITime(i),				loadtable => LoadStepGenTable(i),				loadtablemax => LoadStepGenTableMax(i),				readsteprate => ReadStepGenRate(i),				readaccum => ReadStepGenAccum(i),				readstepmode => ReadStepGenMode(i),				readdirsetuptime => ReadStepGenDSUTime(i),				readdirholdtime => ReadStepGenDHLDTime(i),				readpulseactivetime => ReadStepGenPulseATime(i),				readpulseidletime => ReadStepGenPulseITime(i),				readtable => ReadStepGenTable(i),				readtablemax => ReadStepGenTableMax(i),				basicrate => StepGenBasicRate,				hold => '0',				stout => StepGenOut(i)				);			end generate usg;					nusg: if not UseStepGenPreScaler generate			stepgenx: entity stepgen			generic map (					buswidth => BusWidth,				timersize => 14,			-- = ~480 usec at 33 MHz, ~320 at 50 Mhz 				tablewidth => StepGenTableWidth,				asize => 48,				rsize => 32 							)			port map (				clk => clklow,				ibus => ibus,				obus 	=>	 obus,				loadsteprate => LoadStepGenRate(i),				loadaccum => LoadStepGenAccum(i),				loadstepmode => LoadStepGenMode(i),				loaddirsetuptime => LoadStepGenDSUTime(i),				loaddirholdtime => LoadStepGenDHLDTime(i),				loadpulseactivetime => LoadStepGenPulseATime(i),				loadpulseidletime => LoadStepGenPulseITime(i),				loadtable => LoadStepGenTable(i),				loadtablemax => LoadStepGenTableMax(i),				readsteprate => ReadStepGenRate(i),				readaccum => ReadStepGenAccum(i),				readstepmode => ReadStepGenMode(i),				readdirsetuptime => ReadStepGenDSUTime(i),				readdirholdtime => ReadStepGenDHLDTime(i),				readpulseactivetime => ReadStepGenPulseATime(i),				readpulseidletime => ReadStepGenPulseITime(i),				readtable => ReadStepGenTable(i),				readtablemax => ReadStepGenTableMax(i),				basicrate => '1',				hold => '0',				stout => StepGenOut(i)  -- densely packed starting with I/O bit 0				);			end generate nusg;		end generate generatestepgens;	end generate makestepgens;		makequadcounters: for i in 0 to QCounters-1 generate		qcounterx: entity qcounter 		generic map (			buswidth => BusWidth		)		port map (			obus => obus,			ibus => ibus,			quada => QuadA(i),			quadb => QuadB(i),			index => Index(i),			loadccr => LoadQcounterCCR(i),			readccr => ReadQcounterCCR(i),			readcount => ReadQcounter(i),			countclear => LoadQcounter(i),			timestamp => TimeStampBus,			indexmask => IndexMask(i),			filterrate => QCountFilterRate,			clk =>	clklow		);	end generate makequadcounters;			makemuxedquadcounters: for i in 0 to MuxedQCounters-1 generate		qcounterx: entity qcounter 		generic map (			buswidth => BusWidth		)		port map (			obus => obus,			ibus => ibus,			quada => DemuxedQuadA(i),			quadb => DemuxedQuadB(i),			index => DemuxedIndex(i),			loadccr => LoadMuxedQcounterCCR(i),			readccr => ReadMuxedQcounterCCR(i),			readcount => ReadMuxedQcounter(i),			countclear => LoadMuxedQcounter(i),			timestamp => MuxedTimeStampBus,			indexmask => DeMuxedIndexMask(i),			filterrate => MuxedQCountFilterRate,			clk =>	clklow		);	end generate makemuxedquadcounters;	makeqcounterglobals:  if (QCounters >0) generate		timestampx: entity timestamp 			port map( 				ibus => ibus(15 downto 0),				obus => obus(15 downto 0),				loadtsdiv => LoadTSDiv ,				readts => ReadTS,				readtsdiv =>ReadTSDiv,				tscount => TimeStampBus,				clk => clklow			);							qcountratex: entity qcounterate 			generic map (defaultrate => x"800") -- default is clklow divided by 1 for normal counters			port map( 				ibus => ibus(11 downto 0),				loadRate => LoadQCountRate,				rateout => QcountFilterRate,				clk => clklow			);	end generate;		makemuxedqcounterglobals:  if (MuxedQCounters >0) generate		timestampx: entity timestamp 			port map( 				ibus => ibus(15 downto 0),				obus => obus(15 downto 0),				loadtsdiv => LoadTSDiv ,				readts => ReadMuxedTS,				readtsdiv =>ReadMuxedTSDiv,				tscount => MuxedTimeStampBus,				clk => clklow			);							qcountratex: entity qcounterate 			generic map (defaultrate => x"002") -- default is clklow divided by 4 (N+2) for muxed counters			port map( 													ibus => ibus(11 downto 0),				loadRate => LoadMuxedQCountRate,				rateout => MuxedQcountFilterRate,				clk => clklow			);				end generate;						makepwmref:  if ((PWMGens > 0) or UseIRQLogic) generate		pwmref : entity pwmrefh		generic map ( 			buswidth => 16,			refwidth => PWMRefWidth			-- Normally 13	for 12,11,10, and 9 bit PWM resolutions = 25KHz,50KHz,100KHz,200KHz max. Freq			)		port map (			clk => clklow,			hclk => clkhigh,			refcount	=> RefCountBus,			ibus => ibus(15 downto 0),			pdmrate => PDMRate,			pwmrateload => LoadPWMRate,			pdmrateload => LoadPDMRate			);		end generate;		makepwmgens : for i in 0 to PWMGens-1 generate		pwmgenx: entity pwmpdmgenh		generic map ( 			buswidth => BusWidth,			refwidth => PWMRefWidth			-- Normally 13 for 12,11,10, and 9 bit PWM resolutions = 25KHz,50KHz,100KHz,200KHz max. Freq			)		port map (			clk => clklow,			hclk => clkhigh,			refcount	=> RefCountBus,			ibus => ibus,			loadpwmval => LoadPWMVal(i),			pcrloadcmd => LoadPWMCR(i),			pdmrate => PDMRate,			pwmouta => PWMGenOutA(i),			pwmoutb => PWMGenOutB(i)		 	);	end generate;	makePWMEna:  if (PWMGens >0) generate		PWMEnaReg : entity boutreg 			generic map (				size => PWMGens,				buswidth => BusWidth,				invert => false				)			port map (				clk  => clklow,				ibus => ibus,				obus => obus,				load => LoadPWMEnas,				read => ReadPWMEnas,				clear => '0',				dout => PWMGenOutC		); 		 			end generate;		makeSPIs: for i in 0 to SPIs -1 generate		aspi: entity SimpleSPI		generic map (			buswidth => BusWidth)				port map (			clk  => clklow,			ibus => ibus,			obus => obus,			loadbitcount => LoadSPIBitCount(i),			loadbitrate => LoadSPIBitRate(i),			loaddata => LoadSPIData(i),			readdata => ReadSPIData(i),           			readbitcount => ReadSPIBitCOunt(i),			readbitrate => ReadSPIBitRate(i),			spiclk => SPIClk(i),			spiin => SPIIn(i),			spiout => SPIOut(i),			spiframe => SPIFrame(i),			davout => SPIDAV(i)			);	end generate;				makeBSPIs: for i in 0 to BSPIs -1 generate		bspi: entity BufferedSPI		generic map (			cswidth => BSPICSWidth)				port map (			clk  => clklow,			ibus => ibus,			obus => obus,			addr => A(5 downto 2),			hostpush => LoadBSPIData(i),			hostpop => ReadBSPIData(i),			loaddesc => LoadBSPIDescriptor(i),
			loadasend => '0',			clear => ClearBSPIFIFO(i),			readcount => ReadBSPIFIFOCount(i),			spiclk => BSPIClk(i),			spiin => BSPIIn(i),			spiout => BSPIOut(i),

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?