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 + -
显示快捷键?