From 688908ca8074031954a78b7f8d2d3172c1684e5d Mon Sep 17 00:00:00 2001 From: Gijs <schoonderbeek@astron.nl> Date: Thu, 9 Feb 2023 14:46:22 +0100 Subject: [PATCH] First version, have to double check on HW. --- boards/uniboard2c/lattice_jtag/Strategy1.sty | 205 +++++++++++++++ .../lattice_jtag/UNB2_JTAG_SCANBRIDGE.ldf | 23 ++ .../lattice_jtag/UNB2_JTAG_SCANBRIDGE.lpf | 2 + .../UNB2_JTAG_SCANBRIDGE/JTAG.lpf | 114 +++++++++ .../UNB2_JTAG_SCANBRIDGE/UNB2_JTAG.ddt | 18 ++ .../UNB2_JTAG_SCANBRIDGE.xcf | 48 ++++ .../UNB2_JTAG_SCANBRIDGE/JTAG.lpf | 114 +++++++++ .../source/.jtag_top(str).vhd.swp | Bin 0 -> 16384 bytes .../source/bscan2_8port_top.vhd | 134 ++++++++++ .../source/jtag_top - Copy.vhd | 28 ++ .../source/jtag_top(str) - Copy.vhd | 242 ++++++++++++++++++ .../source/jtag_top(str).vhd | 154 +++++++++++ .../UNB2_JTAG_SCANBRIDGE/source/jtag_top.vhd | 28 ++ .../UNB2_JTAG_SCANBRIDGE/top_linker.ngo | Bin 0 -> 69022 bytes .../source/.jtag_top(str).vhd.swp | Bin 0 -> 16384 bytes .../source/bscan2_8port_top.vhd | 134 ++++++++++ .../source/jtag_top - Copy.vhd | 28 ++ .../source/jtag_top(str) - Copy.vhd | 242 ++++++++++++++++++ .../source/jtag_top(str).vhd | 154 +++++++++++ .../UNB2_JTAG_SCANBRIDGE/source/jtag_top.vhd | 28 ++ .../UNB2_JTAG_SCANBRIDGE/top_linker.ngo | Bin 0 -> 69022 bytes boards/uniboard2c/lattice_jtag/readme.txt | 44 ++++ boards/uniboard2c/lettuce_jtag/readme.txt | 1 - 23 files changed, 1740 insertions(+), 1 deletion(-) create mode 100644 boards/uniboard2c/lattice_jtag/Strategy1.sty create mode 100644 boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE.ldf create mode 100644 boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE.lpf create mode 100644 boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/JTAG.lpf create mode 100644 boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG.ddt create mode 100644 boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE.xcf create mode 100644 boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/JTAG.lpf create mode 100644 boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/source/.jtag_top(str).vhd.swp create mode 100644 boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/source/bscan2_8port_top.vhd create mode 100644 boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/source/jtag_top - Copy.vhd create mode 100644 boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/source/jtag_top(str) - Copy.vhd create mode 100644 boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/source/jtag_top(str).vhd create mode 100644 boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/source/jtag_top.vhd create mode 100644 boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/top_linker.ngo create mode 100644 boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/source/.jtag_top(str).vhd.swp create mode 100644 boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/source/bscan2_8port_top.vhd create mode 100644 boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/source/jtag_top - Copy.vhd create mode 100644 boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/source/jtag_top(str) - Copy.vhd create mode 100644 boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/source/jtag_top(str).vhd create mode 100644 boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/source/jtag_top.vhd create mode 100644 boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/top_linker.ngo create mode 100644 boards/uniboard2c/lattice_jtag/readme.txt delete mode 100644 boards/uniboard2c/lettuce_jtag/readme.txt diff --git a/boards/uniboard2c/lattice_jtag/Strategy1.sty b/boards/uniboard2c/lattice_jtag/Strategy1.sty new file mode 100644 index 0000000000..feec63c1a5 --- /dev/null +++ b/boards/uniboard2c/lattice_jtag/Strategy1.sty @@ -0,0 +1,205 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE strategy> +<Strategy version="1.0" predefined="0" description="" label="Strategy1"> + <Property name="PROP_BD_CmdLineArgs" value="" time="0"/> + <Property name="PROP_BD_EdfHardtimer" value="Enable" time="0"/> + <Property name="PROP_BD_EdfInBusNameConv" value="None" time="0"/> + <Property name="PROP_BD_EdfInLibPath" value="" time="0"/> + <Property name="PROP_BD_EdfInRemLoc" value="Off" time="0"/> + <Property name="PROP_BD_EdfMemPath" value="" time="0"/> + <Property name="PROP_BD_ParSearchPath" value="" time="0"/> + <Property name="PROP_BIT_AddressBitGen" value="Increment" time="0"/> + <Property name="PROP_BIT_AllowReadBitGen" value="Disable" time="0"/> + <Property name="PROP_BIT_ByteWideBitMirror" value="Disable" time="0"/> + <Property name="PROP_BIT_CapReadBitGen" value="Disable" time="0"/> + <Property name="PROP_BIT_ConModBitGen" value="Disable" time="0"/> + <Property name="PROP_BIT_CreateBitFile" value="True" time="0"/> + <Property name="PROP_BIT_DisRAMResBitGen" value="True" time="0"/> + <Property name="PROP_BIT_DisableUESBitgen" value="False" time="0"/> + <Property name="PROP_BIT_DonePinBitGen" value="Pullup" time="0"/> + <Property name="PROP_BIT_DoneSigBitGen" value="4" time="0"/> + <Property name="PROP_BIT_EnIOBitGen" value="TriStateDuringReConfig" time="0"/> + <Property name="PROP_BIT_EnIntOscBitGen" value="Disable" time="0"/> + <Property name="PROP_BIT_ExtClockBitGen" value="False" time="0"/> + <Property name="PROP_BIT_GSREnableBitGen" value="True" time="0"/> + <Property name="PROP_BIT_GSRRelOnBitGen" value="DoneIn" time="0"/> + <Property name="PROP_BIT_GranTimBitGen" value="0" time="0"/> + <Property name="PROP_BIT_IOTriRelBitGen" value="Cycle 2" time="0"/> + <Property name="PROP_BIT_JTAGEnableBitGen" value="False" time="0"/> + <Property name="PROP_BIT_LenBitsBitGen" value="24" time="0"/> + <Property name="PROP_BIT_MIFFileBitGen" value="" time="0"/> + <Property name="PROP_BIT_NoHeader" value="False" time="0"/> + <Property name="PROP_BIT_OutFormatBitGen" value="Bit File (Binary)" time="0"/> + <Property name="PROP_BIT_OutFormatBitGen_REF" value="" time="0"/> + <Property name="PROP_BIT_OutFormatPromGen" value="Intel Hex 32-bit" time="0"/> + <Property name="PROP_BIT_ParityCheckBitGen" value="True" time="0"/> + <Property name="PROP_BIT_ReadBackBitGen" value="Flash" time="0"/> + <Property name="PROP_BIT_ReadCaptureBitGen" value="Disable" time="0"/> + <Property name="PROP_BIT_RemZeroFramesBitGen" value="False" time="0"/> + <Property name="PROP_BIT_RunDRCBitGen" value="True" time="0"/> + <Property name="PROP_BIT_SearchPthBitGen" value="" time="0"/> + <Property name="PROP_BIT_StartUpClkBitGen" value="Cclk" time="0"/> + <Property name="PROP_BIT_SynchIOBitGen" value="True" time="0"/> + <Property name="PROP_BIT_SysClockConBitGen" value="Reset" time="0"/> + <Property name="PROP_BIT_SysConBitGen" value="Reset" time="0"/> + <Property name="PROP_BIT_WaitStTimBitGen" value="5" time="0"/> + <Property name="PROP_IOTIMING_AllSpeed" value="False" time="0"/> + <Property name="PROP_LST_AllowDUPMod" value="False" time="0"/> + <Property name="PROP_LST_CarryChain" value="True" time="0"/> + <Property name="PROP_LST_CarryChainLength" value="0" time="0"/> + <Property name="PROP_LST_CmdLineArgs" value="" time="0"/> + <Property name="PROP_LST_DSPStyle" value="DSP" time="0"/> + <Property name="PROP_LST_DSPUtil" value="100" time="0"/> + <Property name="PROP_LST_DecodeUnreachableStates" value="False" time="0"/> + <Property name="PROP_LST_DisableDistRam" value="False" time="0"/> + <Property name="PROP_LST_EBRUtil" value="100" time="0"/> + <Property name="PROP_LST_EdfFrequency" value="200" time="0"/> + <Property name="PROP_LST_EdfHardtimer" value="Enable" time="0"/> + <Property name="PROP_LST_EdfInLibPath" value="" time="0"/> + <Property name="PROP_LST_EdfInRemLoc" value="Off" time="0"/> + <Property name="PROP_LST_EdfMemPath" value="" time="0"/> + <Property name="PROP_LST_FIXGATEDCLKS" value="True" time="0"/> + <Property name="PROP_LST_FSMEncodeStyle" value="Auto" time="0"/> + <Property name="PROP_LST_ForceGSRInfer" value="Auto" time="0"/> + <Property name="PROP_LST_IOInsertion" value="True" time="0"/> + <Property name="PROP_LST_InterFileDump" value="False" time="0"/> + <Property name="PROP_LST_LoopLimit" value="1950" time="0"/> + <Property name="PROP_LST_MaxFanout" value="1000" time="0"/> + <Property name="PROP_LST_MuxStyle" value="Auto" time="0"/> + <Property name="PROP_LST_NumCriticalPaths" value="3" time="0"/> + <Property name="PROP_LST_OptimizeGoal" value="Balanced" time="0"/> + <Property name="PROP_LST_PropagatConst" value="True" time="0"/> + <Property name="PROP_LST_RAMStyle" value="Auto" time="0"/> + <Property name="PROP_LST_ROMStyle" value="Auto" time="0"/> + <Property name="PROP_LST_RemoveDupRegs" value="True" time="0"/> + <Property name="PROP_LST_ResolvedMixedDrivers" value="False" time="0"/> + <Property name="PROP_LST_ResourceShare" value="True" time="0"/> + <Property name="PROP_LST_UseIOReg" value="Auto" time="0"/> + <Property name="PROP_LST_UseLPF" value="True" time="0"/> + <Property name="PROP_LST_VHDL2008" value="False" time="0"/> + <Property name="PROP_MAPSTA_AnalysisOption" value="Standard Setup and Hold Analysis" time="0"/> + <Property name="PROP_MAPSTA_AutoTiming" value="True" time="0"/> + <Property name="PROP_MAPSTA_CheckUnconstrainedConns" value="False" time="0"/> + <Property name="PROP_MAPSTA_CheckUnconstrainedPaths" value="False" time="0"/> + <Property name="PROP_MAPSTA_FullName" value="False" time="0"/> + <Property name="PROP_MAPSTA_NumUnconstrainedPaths" value="0" time="0"/> + <Property name="PROP_MAPSTA_ReportStyle" value="Verbose Timing Report" time="0"/> + <Property name="PROP_MAPSTA_RouteEstAlogtithm" value="0" time="0"/> + <Property name="PROP_MAPSTA_RptAsynTimLoop" value="False" time="0"/> + <Property name="PROP_MAPSTA_WordCasePaths" value="1" time="0"/> + <Property name="PROP_MAP_IgnorePreErr" value="True" time="0"/> + <Property name="PROP_MAP_MAPIORegister" value="Auto" time="0"/> + <Property name="PROP_MAP_MAPInferGSR" value="True" time="0"/> + <Property name="PROP_MAP_MapModArgs" value="" time="0"/> + <Property name="PROP_MAP_OvermapDevice" value="False" time="0"/> + <Property name="PROP_MAP_PackLogMapDes" value="0" time="0"/> + <Property name="PROP_MAP_RegRetiming" value="False" time="0"/> + <Property name="PROP_MAP_SigCrossRef" value="False" time="0"/> + <Property name="PROP_MAP_SymCrossRef" value="False" time="0"/> + <Property name="PROP_MAP_TimingDriven" value="False" time="0"/> + <Property name="PROP_MAP_TimingDrivenNodeRep" value="False" time="0"/> + <Property name="PROP_MAP_TimingDrivenPack" value="False" time="0"/> + <Property name="PROP_PARSTA_AnalysisOption" value="Standard Setup and Hold Analysis" time="0"/> + <Property name="PROP_PARSTA_AutoTiming" value="True" time="0"/> + <Property name="PROP_PARSTA_CheckUnconstrainedConns" value="False" time="0"/> + <Property name="PROP_PARSTA_CheckUnconstrainedPaths" value="False" time="0"/> + <Property name="PROP_PARSTA_FullName" value="False" time="0"/> + <Property name="PROP_PARSTA_NumUnconstrainedPaths" value="0" time="0"/> + <Property name="PROP_PARSTA_ReportStyle" value="Verbose Timing Report" time="0"/> + <Property name="PROP_PARSTA_RptAsynTimLoop" value="False" time="0"/> + <Property name="PROP_PARSTA_SpeedForHoldAnalysis" value="m" time="0"/> + <Property name="PROP_PARSTA_SpeedForSetupAnalysis" value="default" time="0"/> + <Property name="PROP_PARSTA_WordCasePaths" value="10" time="0"/> + <Property name="PROP_PAR_CrDlyStFileParDes" value="False" time="0"/> + <Property name="PROP_PAR_DisableTDParDes" value="False" time="0"/> + <Property name="PROP_PAR_EffortParDes" value="5" time="0"/> + <Property name="PROP_PAR_MultiSeedSortMode" value="Worst Slack" time="0"/> + <Property name="PROP_PAR_NewRouteParDes" value="NBR" time="0"/> + <Property name="PROP_PAR_PARClockSkew" value="Off" time="0"/> + <Property name="PROP_PAR_PARModArgs" value="" time="0"/> + <Property name="PROP_PAR_ParMultiNodeList" value="" time="0"/> + <Property name="PROP_PAR_ParRunPlaceOnly" value="False" time="0"/> + <Property name="PROP_PAR_PlcIterParDes" value="1" time="0"/> + <Property name="PROP_PAR_PlcStCostTblParDes" value="1" time="0"/> + <Property name="PROP_PAR_PrefErrorOut" value="True" time="0"/> + <Property name="PROP_PAR_RemoveDir" value="True" time="0"/> + <Property name="PROP_PAR_RouteDlyRedParDes" value="0" time="0"/> + <Property name="PROP_PAR_RoutePassParDes" value="6" time="0"/> + <Property name="PROP_PAR_RouteResOptParDes" value="0" time="0"/> + <Property name="PROP_PAR_RoutingCDP" value="0" time="0"/> + <Property name="PROP_PAR_RoutingCDR" value="0" time="0"/> + <Property name="PROP_PAR_RunParWithTrce" value="False" time="0"/> + <Property name="PROP_PAR_RunTimeReduction" value="True" time="0"/> + <Property name="PROP_PAR_SaveBestRsltParDes" value="1" time="0"/> + <Property name="PROP_PAR_StopZero" value="False" time="0"/> + <Property name="PROP_PAR_parHold" value="On" time="0"/> + <Property name="PROP_PAR_parPathBased" value="Off" time="0"/> + <Property name="PROP_PRE_CmdLineArgs" value="" time="0"/> + <Property name="PROP_PRE_EdfArrayBoundsCase" value="False" time="0"/> + <Property name="PROP_PRE_EdfAutoResOfRam" value="False" time="0"/> + <Property name="PROP_PRE_EdfClockDomainCross" value="False" time="0"/> + <Property name="PROP_PRE_EdfDSPAcrossHie" value="False" time="0"/> + <Property name="PROP_PRE_EdfFullCase" value="False" time="0"/> + <Property name="PROP_PRE_EdfIgnoreRamRWCol" value="False" time="0"/> + <Property name="PROP_PRE_EdfMissConstraint" value="False" time="0"/> + <Property name="PROP_PRE_EdfNetFanout" value="True" time="0"/> + <Property name="PROP_PRE_EdfParaCase" value="False" time="0"/> + <Property name="PROP_PRE_EdfReencodeFSM" value="True" time="0"/> + <Property name="PROP_PRE_EdfResSharing" value="True" time="0"/> + <Property name="PROP_PRE_EdfTimingViolation" value="True" time="0"/> + <Property name="PROP_PRE_EdfUseSafeFSM" value="False" time="0"/> + <Property name="PROP_PRE_EdfVlog2001" value="True" time="0"/> + <Property name="PROP_PRE_VSynComArea" value="True" time="0"/> + <Property name="PROP_PRE_VSynCritcal" value="3" time="0"/> + <Property name="PROP_PRE_VSynFSM" value="Auto" time="0"/> + <Property name="PROP_PRE_VSynFreq" value="200" time="0"/> + <Property name="PROP_PRE_VSynGSR" value="False" time="0"/> + <Property name="PROP_PRE_VSynGatedClk" value="False" time="0"/> + <Property name="PROP_PRE_VSynIOPad" value="False" time="0"/> + <Property name="PROP_PRE_VSynOutNetForm" value="None" time="0"/> + <Property name="PROP_PRE_VSynOutPref" value="True" time="0"/> + <Property name="PROP_PRE_VSynRepClkFreq" value="True" time="0"/> + <Property name="PROP_PRE_VSynRetime" value="True" time="0"/> + <Property name="PROP_PRE_VSynTimSum" value="10" time="0"/> + <Property name="PROP_PRE_VSynTransform" value="True" time="0"/> + <Property name="PROP_PRE_VSyninpd" value="0" time="0"/> + <Property name="PROP_PRE_VSynoutd" value="0" time="0"/> + <Property name="PROP_SYN_ClockConversion" value="True" time="0"/> + <Property name="PROP_SYN_CmdLineArgs" value="" time="0"/> + <Property name="PROP_SYN_DisableRegisterRep" value="False" time="0"/> + <Property name="PROP_SYN_EdfAllowDUPMod" value="False" time="0"/> + <Property name="PROP_SYN_EdfArea" value="False" time="0"/> + <Property name="PROP_SYN_EdfArrangeVHDLFiles" value="True" time="0"/> + <Property name="PROP_SYN_EdfDefEnumEncode" value="Default" time="0"/> + <Property name="PROP_SYN_EdfFanout" value="1000" time="0"/> + <Property name="PROP_SYN_EdfFrequency" value="100" time="0"/> + <Property name="PROP_SYN_EdfGSR" value="False" time="0"/> + <Property name="PROP_SYN_EdfInsertIO" value="False" time="0"/> + <Property name="PROP_SYN_EdfNumCritPath" value="" time="0"/> + <Property name="PROP_SYN_EdfNumStartEnd" value="" time="0"/> + <Property name="PROP_SYN_EdfOutNetForm" value="None" time="0"/> + <Property name="PROP_SYN_EdfPushTirstates" value="True" time="0"/> + <Property name="PROP_SYN_EdfResSharing" value="True" time="0"/> + <Property name="PROP_SYN_EdfRunRetiming" value="Pipelining Only" time="0"/> + <Property name="PROP_SYN_EdfSymFSM" value="True" time="0"/> + <Property name="PROP_SYN_EdfUnconsClk" value="False" time="0"/> + <Property name="PROP_SYN_EdfVerilogInput" value="Verilog 2001" time="0"/> + <Property name="PROP_SYN_ExportSetting" value="No" time="0"/> + <Property name="PROP_SYN_LibPath" value="" time="0"/> + <Property name="PROP_SYN_ResolvedMixedDrivers" value="False" time="0"/> + <Property name="PROP_SYN_UpdateCompilePtTimData" value="False" time="0"/> + <Property name="PROP_SYN_UseLPF" value="True" time="0"/> + <Property name="PROP_SYN_VHDL2008" value="False" time="0"/> + <Property name="PROP_THERMAL_DefaultFreq" value="0" time="0"/> + <Property name="PROP_TIM_MaxDelSimDes" value="" time="0"/> + <Property name="PROP_TIM_MinSpeedGrade" value="False" time="0"/> + <Property name="PROP_TIM_ModPreSimDes" value="" time="0"/> + <Property name="PROP_TIM_NegStupHldTim" value="True" time="0"/> + <Property name="PROP_TIM_TimSimGenPUR" value="True" time="0"/> + <Property name="PROP_TIM_TimSimGenX" value="False" time="0"/> + <Property name="PROP_TIM_TimSimHierSep" value="" time="0"/> + <Property name="PROP_TIM_TransportModeOfPathDelay" value="False" time="0"/> + <Property name="PROP_TIM_TrgtSpeedGrade" value="" time="0"/> + <Property name="PROP_TIM_WriteVerboseNetlist" value="False" time="0"/> + <Property name="PROP_TMCHK_EnableCheck" value="True" time="0"/> +</Strategy> diff --git a/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE.ldf b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE.ldf new file mode 100644 index 0000000000..2209c754d8 --- /dev/null +++ b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE.ldf @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<BaliProject version="3.2" title="UNB2_JTAG_SCANBRIDGE" device="LCMXO2-640HC-5TG100C" default_implementation="UNB2_JTAG_SCANBRIDGE"> + <Options/> + <Implementation title="UNB2_JTAG_SCANBRIDGE" dir="UNB2_JTAG_SCANBRIDGE" description="UNB2_JTAG_SCANBRIDGE" synthesis="synplify" default_strategy="Strategy1"> + <Options def_top="jtag_top"/> + <Source name="UNB2_JTAG_SCANBRIDGE/source/bscan2_8port_top.vhd" type="VHDL" type_short="VHDL"> + <Options/> + </Source> + <Source name="UNB2_JTAG_SCANBRIDGE/source/jtag_top(str).vhd" type="VHDL" type_short="VHDL"> + <Options/> + </Source> + <Source name="UNB2_JTAG_SCANBRIDGE/source/jtag_top.vhd" type="VHDL" type_short="VHDL"> + <Options top_module="jtag_top"/> + </Source> + <Source name="UNB2_JTAG_SCANBRIDGE/JTAG.lpf" type="Logic Preference" type_short="LPF"> + <Options/> + </Source> + <Source name="UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE.xcf" type="Programming Project File" type_short="Programming"> + <Options/> + </Source> + </Implementation> + <Strategy name="Strategy1" file="Strategy1.sty"/> +</BaliProject> diff --git a/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE.lpf b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE.lpf new file mode 100644 index 0000000000..325063a977 --- /dev/null +++ b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE.lpf @@ -0,0 +1,2 @@ +BLOCK RESETPATHS; +BLOCK ASYNCPATHS; diff --git a/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/JTAG.lpf b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/JTAG.lpf new file mode 100644 index 0000000000..6a7b606cfb --- /dev/null +++ b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/JTAG.lpf @@ -0,0 +1,114 @@ +LOCATE COMP "CTRL_0" SITE "10" ; +LOCATE COMP "CTRL_1" SITE "9" ; +LOCATE COMP "ENABLE_MSP" SITE "8" ; +LOCATE COMP "IDN_0" SITE "99" ; +LOCATE COMP "IDN_1" SITE "98" ; +LOCATE COMP "IDN_2" SITE "97" ; +LOCATE COMP "IDN_3" SITE "96" ; +LOCATE COMP "LPSEL_0" SITE "18" ; +LOCATE COMP "LPSEL_1" SITE "17" ; +LOCATE COMP "LPSEL_2" SITE "16" ; +LOCATE COMP "LPSEL_3" SITE "15" ; +LOCATE COMP "LPSEL_4" SITE "14" ; +LOCATE COMP "MSPTCK_0" SITE "75" ; +LOCATE COMP "MSPTCK_1" SITE "68" ; +LOCATE COMP "MSPTCK_2" SITE "63" ; +LOCATE COMP "MSPTCK_3" SITE "57" ; +LOCATE COMP "MSPTCK_4" SITE "48" ; +LOCATE COMP "MSPTDI_0" SITE "74" ; +LOCATE COMP "MSPTDI_1" SITE "67" ; +LOCATE COMP "MSPTDI_2" SITE "62" ; +LOCATE COMP "MSPTDI_3" SITE "54" ; +LOCATE COMP "MSPTDI_4" SITE "47" ; +LOCATE COMP "MSPTDO_0" SITE "71" ; +LOCATE COMP "MSPTDO_1" SITE "66" ; +LOCATE COMP "MSPTDO_2" SITE "60" ; +LOCATE COMP "MSPTDO_3" SITE "53" ; +LOCATE COMP "MSPTDO_4" SITE "45" ; +LOCATE COMP "MSPTMS_0" SITE "70" ; +LOCATE COMP "MSPTMS_1" SITE "65" ; +LOCATE COMP "MSPTMS_2" SITE "59" ; +LOCATE COMP "MSPTMS_3" SITE "52" ; +LOCATE COMP "MSPTMS_4" SITE "43" ; +LOCATE COMP "MSPTRST_0" SITE "69" ; +LOCATE COMP "MSPTRST_1" SITE "64" ; +LOCATE COMP "MSPTRST_2" SITE "58" ; +LOCATE COMP "MSPTRST_3" SITE "51" ; +LOCATE COMP "MSPTRST_4" SITE "42" ; +LOCATE COMP "TCK" SITE "85" ; +LOCATE COMP "TDI" SITE "84" ; +LOCATE COMP "TDO" SITE "83" ; +LOCATE COMP "TMS" SITE "82" ; +LOCATE COMP "TRST" SITE "78" ; +LOCATE COMP "CTRL_0" SITE "10" ; +LOCATE COMP "CTRL_1" SITE "9" ; +LOCATE COMP "IDN_0" SITE "99" ; +LOCATE COMP "IDN_1" SITE "98" ; +LOCATE COMP "IDN_2" SITE "97" ; +LOCATE COMP "IDN_3" SITE "96" ; +LOCATE COMP "LPSEL_0" SITE "18" ; +LOCATE COMP "LPSEL_1" SITE "17" ; +LOCATE COMP "LPSEL_2" SITE "16" ; +LOCATE COMP "LPSEL_3" SITE "15" ; +LOCATE COMP "LPSEL_4" SITE "14" ; +LOCATE COMP "MSPTCK_0" SITE "75" ; +LOCATE COMP "MSPTCK_1" SITE "68" ; +LOCATE COMP "MSPTCK_2" SITE "63" ; +LOCATE COMP "MSPTCK_3" SITE "57" ; +LOCATE COMP "MSPTCK_4" SITE "48" ; +LOCATE COMP "MSPTDI_0" SITE "74" ; +LOCATE COMP "MSPTDI_1" SITE "67" ; +LOCATE COMP "MSPTDI_2" SITE "62" ; +LOCATE COMP "MSPTDI_3" SITE "54" ; +LOCATE COMP "MSPTDI_4" SITE "47" ; +LOCATE COMP "MSPTDO_0" SITE "71" ; +LOCATE COMP "MSPTDO_1" SITE "66" ; +LOCATE COMP "MSPTDO_2" SITE "60" ; +LOCATE COMP "MSPTDO_3" SITE "53" ; +LOCATE COMP "MSPTDO_4" SITE "45" ; +LOCATE COMP "MSPTMS_0" SITE "70" ; +LOCATE COMP "MSPTMS_1" SITE "65" ; +LOCATE COMP "MSPTMS_2" SITE "59" ; +LOCATE COMP "MSPTMS_3" SITE "52" ; +LOCATE COMP "MSPTMS_4" SITE "43" ; +LOCATE COMP "MSPTRST_0" SITE "69" ; +LOCATE COMP "MSPTRST_1" SITE "64" ; +LOCATE COMP "MSPTRST_2" SITE "58" ; +LOCATE COMP "MSPTRST_3" SITE "51" ; +LOCATE COMP "MSPTRST_4" SITE "42" ; +LOCATE COMP "CTRL_0" SITE "10" ; +LOCATE COMP "CTRL_1" SITE "9" ; +LOCATE COMP "IDN_0" SITE "99" ; +LOCATE COMP "IDN_1" SITE "98" ; +LOCATE COMP "IDN_2" SITE "97" ; +LOCATE COMP "IDN_3" SITE "96" ; +LOCATE COMP "LPSEL_0" SITE "18" ; +LOCATE COMP "LPSEL_1" SITE "17" ; +LOCATE COMP "LPSEL_2" SITE "16" ; +LOCATE COMP "LPSEL_3" SITE "15" ; +LOCATE COMP "LPSEL_4" SITE "14" ; +LOCATE COMP "MSPTCK_0" SITE "75" ; +LOCATE COMP "MSPTCK_1" SITE "68" ; +LOCATE COMP "MSPTCK_2" SITE "63" ; +LOCATE COMP "MSPTCK_3" SITE "57" ; +LOCATE COMP "MSPTCK_4" SITE "48" ; +LOCATE COMP "MSPTDI_0" SITE "74" ; +LOCATE COMP "MSPTDI_1" SITE "67" ; +LOCATE COMP "MSPTDI_2" SITE "62" ; +LOCATE COMP "MSPTDI_3" SITE "54" ; +LOCATE COMP "MSPTDI_4" SITE "47" ; +LOCATE COMP "MSPTDO_0" SITE "71" ; +LOCATE COMP "MSPTDO_1" SITE "66" ; +LOCATE COMP "MSPTDO_2" SITE "60" ; +LOCATE COMP "MSPTDO_3" SITE "53" ; +LOCATE COMP "MSPTDO_4" SITE "45" ; +LOCATE COMP "MSPTMS_0" SITE "70" ; +LOCATE COMP "MSPTMS_1" SITE "65" ; +LOCATE COMP "MSPTMS_2" SITE "59" ; +LOCATE COMP "MSPTMS_3" SITE "52" ; +LOCATE COMP "MSPTMS_4" SITE "43" ; +LOCATE COMP "MSPTRST_0" SITE "69" ; +LOCATE COMP "MSPTRST_1" SITE "64" ; +LOCATE COMP "MSPTRST_2" SITE "58" ; +LOCATE COMP "MSPTRST_3" SITE "51" ; +LOCATE COMP "MSPTRST_4" SITE "42" ; diff --git a/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG.ddt b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG.ddt new file mode 100644 index 0000000000..b61b461069 --- /dev/null +++ b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG.ddt @@ -0,0 +1,18 @@ +[Deployment Project] +version=Lattice Diamond 3.3.0.109 +EncryptionVer=1.0 +functionIdx=0 +typeIdx=1 +isRequiredXCFFile=0 +xcfFileName= +optionList=Convert Bi-directional I/O's to Input and Output +valueList=On + +[Input File Info] +inputFileList=M:/VIEWlogic/Projects/Quinten/UniBoard2/rev1/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE_UNB2_JTAG_SCANBRIDGE.jed;M:/VIEWlogic/Projects/Quinten/UniBoard2/rev1/JTAG/BSDL/bsdllcmxo2-640hctqfp100.BSM +familyList=MachXO2;MachXO2 +deviceList=LCMXO2-640HC;LCMXO2-640HC +outputFileList=M:/VIEWlogic/Projects/Quinten/UniBoard2/rev1/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE.bsm + +[Command Line] +Command="C:/lscc/diamond/3.3/bin/nt/ddtcmd" -oft -bsm -ifd "M:/VIEWlogic/Projects/Quinten/UniBoard2/rev1/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE_UNB2_JTAG_SCANBRIDGE.jed" -ifb "M:/VIEWlogic/Projects/Quinten/UniBoard2/rev1/JTAG/BSDL/bsdllcmxo2-640hctqfp100.BSM" -dev LCMXO2-640HC -convertbidi -of "M:/VIEWlogic/Projects/Quinten/UniBoard2/rev1/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE.bsm" diff --git a/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE.xcf b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE.xcf new file mode 100644 index 0000000000..8297100801 --- /dev/null +++ b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE.xcf @@ -0,0 +1,48 @@ +<?xml version='1.0' encoding='utf-8' ?> +<!DOCTYPE ispXCF SYSTEM "IspXCF.dtd" > +<ispXCF version="3.3.0"> + <Comment></Comment> + <Chain> + <Comm>JTAG</Comm> + <Device> + <SelectedProg value="TRUE"/> + <Pos>1</Pos> + <Vendor>Lattice</Vendor> + <Family>MachXO2</Family> + <Name>LCMXO2-640HC</Name> + <IDCode>0x012b9043</IDCode> + <Package>All</Package> + <PON>LCMXO2-640HC</PON> + <Bypass> + <InstrLen>8</InstrLen> + <InstrVal>11111111</InstrVal> + <BScanLen>1</BScanLen> + <BScanVal>0</BScanVal> + </Bypass> + <File>M:/VIEWlogic/Projects/Quinten/UniBoard2/rev1/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE_UNB2_JTAG_SCANBRIDGE.jed</File> + <FileTime>01/05/15 09:22:49</FileTime> + <JedecChecksum>0xDEF5</JedecChecksum> + <Operation>FLASH Erase,Program,Verify</Operation> + <Option> + <SVFVendor>JTAG STANDARD</SVFVendor> + <IOState>HighZ</IOState> + <PreloadLength>152</PreloadLength> + <IOVectorData>0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF</IOVectorData> + <Usercode>0x00000000</Usercode> + <AccessMode>FLASH</AccessMode> + </Option> + </Device> + </Chain> + <ProjectOptions> + <Program>SEQUENTIAL</Program> + <Process>ENTIRED CHAIN</Process> + <OperationOverride>No Override</OperationOverride> + <StartTAP>TLR</StartTAP> + <EndTAP>TLR</EndTAP> + <VerifyUsercode value="FALSE"/> + </ProjectOptions> + <CableOptions> + <CableName>USB</CableName> + <PortAdd>EzUSB-0</PortAdd> + </CableOptions> +</ispXCF> diff --git a/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/JTAG.lpf b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/JTAG.lpf new file mode 100644 index 0000000000..6a7b606cfb --- /dev/null +++ b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/JTAG.lpf @@ -0,0 +1,114 @@ +LOCATE COMP "CTRL_0" SITE "10" ; +LOCATE COMP "CTRL_1" SITE "9" ; +LOCATE COMP "ENABLE_MSP" SITE "8" ; +LOCATE COMP "IDN_0" SITE "99" ; +LOCATE COMP "IDN_1" SITE "98" ; +LOCATE COMP "IDN_2" SITE "97" ; +LOCATE COMP "IDN_3" SITE "96" ; +LOCATE COMP "LPSEL_0" SITE "18" ; +LOCATE COMP "LPSEL_1" SITE "17" ; +LOCATE COMP "LPSEL_2" SITE "16" ; +LOCATE COMP "LPSEL_3" SITE "15" ; +LOCATE COMP "LPSEL_4" SITE "14" ; +LOCATE COMP "MSPTCK_0" SITE "75" ; +LOCATE COMP "MSPTCK_1" SITE "68" ; +LOCATE COMP "MSPTCK_2" SITE "63" ; +LOCATE COMP "MSPTCK_3" SITE "57" ; +LOCATE COMP "MSPTCK_4" SITE "48" ; +LOCATE COMP "MSPTDI_0" SITE "74" ; +LOCATE COMP "MSPTDI_1" SITE "67" ; +LOCATE COMP "MSPTDI_2" SITE "62" ; +LOCATE COMP "MSPTDI_3" SITE "54" ; +LOCATE COMP "MSPTDI_4" SITE "47" ; +LOCATE COMP "MSPTDO_0" SITE "71" ; +LOCATE COMP "MSPTDO_1" SITE "66" ; +LOCATE COMP "MSPTDO_2" SITE "60" ; +LOCATE COMP "MSPTDO_3" SITE "53" ; +LOCATE COMP "MSPTDO_4" SITE "45" ; +LOCATE COMP "MSPTMS_0" SITE "70" ; +LOCATE COMP "MSPTMS_1" SITE "65" ; +LOCATE COMP "MSPTMS_2" SITE "59" ; +LOCATE COMP "MSPTMS_3" SITE "52" ; +LOCATE COMP "MSPTMS_4" SITE "43" ; +LOCATE COMP "MSPTRST_0" SITE "69" ; +LOCATE COMP "MSPTRST_1" SITE "64" ; +LOCATE COMP "MSPTRST_2" SITE "58" ; +LOCATE COMP "MSPTRST_3" SITE "51" ; +LOCATE COMP "MSPTRST_4" SITE "42" ; +LOCATE COMP "TCK" SITE "85" ; +LOCATE COMP "TDI" SITE "84" ; +LOCATE COMP "TDO" SITE "83" ; +LOCATE COMP "TMS" SITE "82" ; +LOCATE COMP "TRST" SITE "78" ; +LOCATE COMP "CTRL_0" SITE "10" ; +LOCATE COMP "CTRL_1" SITE "9" ; +LOCATE COMP "IDN_0" SITE "99" ; +LOCATE COMP "IDN_1" SITE "98" ; +LOCATE COMP "IDN_2" SITE "97" ; +LOCATE COMP "IDN_3" SITE "96" ; +LOCATE COMP "LPSEL_0" SITE "18" ; +LOCATE COMP "LPSEL_1" SITE "17" ; +LOCATE COMP "LPSEL_2" SITE "16" ; +LOCATE COMP "LPSEL_3" SITE "15" ; +LOCATE COMP "LPSEL_4" SITE "14" ; +LOCATE COMP "MSPTCK_0" SITE "75" ; +LOCATE COMP "MSPTCK_1" SITE "68" ; +LOCATE COMP "MSPTCK_2" SITE "63" ; +LOCATE COMP "MSPTCK_3" SITE "57" ; +LOCATE COMP "MSPTCK_4" SITE "48" ; +LOCATE COMP "MSPTDI_0" SITE "74" ; +LOCATE COMP "MSPTDI_1" SITE "67" ; +LOCATE COMP "MSPTDI_2" SITE "62" ; +LOCATE COMP "MSPTDI_3" SITE "54" ; +LOCATE COMP "MSPTDI_4" SITE "47" ; +LOCATE COMP "MSPTDO_0" SITE "71" ; +LOCATE COMP "MSPTDO_1" SITE "66" ; +LOCATE COMP "MSPTDO_2" SITE "60" ; +LOCATE COMP "MSPTDO_3" SITE "53" ; +LOCATE COMP "MSPTDO_4" SITE "45" ; +LOCATE COMP "MSPTMS_0" SITE "70" ; +LOCATE COMP "MSPTMS_1" SITE "65" ; +LOCATE COMP "MSPTMS_2" SITE "59" ; +LOCATE COMP "MSPTMS_3" SITE "52" ; +LOCATE COMP "MSPTMS_4" SITE "43" ; +LOCATE COMP "MSPTRST_0" SITE "69" ; +LOCATE COMP "MSPTRST_1" SITE "64" ; +LOCATE COMP "MSPTRST_2" SITE "58" ; +LOCATE COMP "MSPTRST_3" SITE "51" ; +LOCATE COMP "MSPTRST_4" SITE "42" ; +LOCATE COMP "CTRL_0" SITE "10" ; +LOCATE COMP "CTRL_1" SITE "9" ; +LOCATE COMP "IDN_0" SITE "99" ; +LOCATE COMP "IDN_1" SITE "98" ; +LOCATE COMP "IDN_2" SITE "97" ; +LOCATE COMP "IDN_3" SITE "96" ; +LOCATE COMP "LPSEL_0" SITE "18" ; +LOCATE COMP "LPSEL_1" SITE "17" ; +LOCATE COMP "LPSEL_2" SITE "16" ; +LOCATE COMP "LPSEL_3" SITE "15" ; +LOCATE COMP "LPSEL_4" SITE "14" ; +LOCATE COMP "MSPTCK_0" SITE "75" ; +LOCATE COMP "MSPTCK_1" SITE "68" ; +LOCATE COMP "MSPTCK_2" SITE "63" ; +LOCATE COMP "MSPTCK_3" SITE "57" ; +LOCATE COMP "MSPTCK_4" SITE "48" ; +LOCATE COMP "MSPTDI_0" SITE "74" ; +LOCATE COMP "MSPTDI_1" SITE "67" ; +LOCATE COMP "MSPTDI_2" SITE "62" ; +LOCATE COMP "MSPTDI_3" SITE "54" ; +LOCATE COMP "MSPTDI_4" SITE "47" ; +LOCATE COMP "MSPTDO_0" SITE "71" ; +LOCATE COMP "MSPTDO_1" SITE "66" ; +LOCATE COMP "MSPTDO_2" SITE "60" ; +LOCATE COMP "MSPTDO_3" SITE "53" ; +LOCATE COMP "MSPTDO_4" SITE "45" ; +LOCATE COMP "MSPTMS_0" SITE "70" ; +LOCATE COMP "MSPTMS_1" SITE "65" ; +LOCATE COMP "MSPTMS_2" SITE "59" ; +LOCATE COMP "MSPTMS_3" SITE "52" ; +LOCATE COMP "MSPTMS_4" SITE "43" ; +LOCATE COMP "MSPTRST_0" SITE "69" ; +LOCATE COMP "MSPTRST_1" SITE "64" ; +LOCATE COMP "MSPTRST_2" SITE "58" ; +LOCATE COMP "MSPTRST_3" SITE "51" ; +LOCATE COMP "MSPTRST_4" SITE "42" ; diff --git a/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/source/.jtag_top(str).vhd.swp b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/source/.jtag_top(str).vhd.swp new file mode 100644 index 0000000000000000000000000000000000000000..9c5478a7319920d309819ce95ca9d797b1c0ae95 GIT binary patch literal 16384 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 Tvp!LbXY}To%<|qJ?acoIbF=mS literal 0 HcmV?d00001 diff --git a/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/source/bscan2_8port_top.vhd b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/source/bscan2_8port_top.vhd new file mode 100644 index 0000000000..262b7dcb68 --- /dev/null +++ b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/source/bscan2_8port_top.vhd @@ -0,0 +1,134 @@ +-- -------------------------------------------------------------------- +-- >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<< +-- -------------------------------------------------------------------- +-- Copyright (c) 2001 - 2008 by Lattice Semiconductor Corporation +-- -------------------------------------------------------------------- +-- +-- Permission: +-- +-- Lattice Semiconductor grants permission to use this code for use +-- in synthesis for any Lattice programmable logic product. Other +-- use of this code, including the selling or duplication of any +-- portion is strictly prohibited. +-- +-- Disclaimer: +-- +-- This VHDL or Verilog source code is intended as a design reference +-- which illustrates how these types of functions can be implemented. +-- It is the user's responsibility to verify their design for +-- consistency and functionality through the use of formal +-- verification methods. Lattice Semiconductor provides no warranty +-- regarding the use or functionality of this code. +-- +-- -------------------------------------------------------------------- +-- +-- Lattice Semiconductor Corporation +-- 5555 NE Moore Court +-- Hillsboro, OR 97214 +-- U.S.A +-- +-- TEL: 1-800-Lattice (USA and Canada) +-- 503-268-8001 (other locations) +-- +-- web: http://www.latticesemi.com/ +-- email: techsupport@latticesemi.com +-- +-- -------------------------------------------------------------------- +-- Code Revision History : +-- -------------------------------------------------------------------- +-- Ver: | Author |Mod. Date |Changes Made: +-- V1.0 | J.O. |11/10/08 |Initial Version +-- -------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; + +entity bscan2 is + -- enter the number of BSCAN2 blocks to create. This is the only place that + -- needs to be modified to control the number of local scan ports created. + generic ( bscan_ports : positive := 2 ); + PORT( TDI, TCK, TMS : in std_logic; + TRST : in std_logic; + -- Turn on slow slew in fitter for output signals + TDO : out std_logic; + -- OE control for MSP ports (Active high) + ENABLE_MSP : in std_logic; + MSPTCK : out std_logic_vector(4*bscan_ports-1 downto 0); + MSPTDI : in std_logic_vector(4*bscan_ports-1 downto 0); + MSPTDO : out std_logic_vector(4*bscan_ports-1 downto 0); + MSPTMS : out std_logic_vector(4*bscan_ports-1 downto 0); + MSPTRST : out std_logic_vector(4*bscan_ports-1 downto 0); + -- one set of addresses to check for device + IDN : in std_logic_vector(3 downto 0) + ); +end; + +architecture behave of bscan2 is + + component top_linker is + -- do not use the generic map to prevent the synthesis tool from + -- appending the number of ports to the components name. + port(TDI, TCK, TMS : in std_logic; + TRST : in std_logic; + -- enable logic for TDO pins. + TDO_enable : out std_logic; + TDO : out std_logic; + MSPCLK : out std_logic_vector(4*bscan_ports downto 1); + MSPTDI : in std_logic_vector(4*bscan_ports downto 1); + MSPTDO : out std_logic_vector(4*bscan_ports downto 1); + MSPTMS : out std_logic_vector(4*bscan_ports downto 1); + MSPTRST : out std_logic_vector(4*bscan_ports downto 1); + -- one set of addresses to check for device + IDN : in std_logic_vector(4 downto 1) + ); +end component top_linker; +-- synthesis FILE="top_linker.ngo" + +-- logic to enable TDO pins +signal ENABLE_TDO : std_logic; +-- signal from tap controler that enables all TDOs. +signal tdoENABLE : std_logic; +-- logic to generate tdo_sp and tdo_hdr +signal LSPTMS : std_logic_vector(4*bscan_ports-1 downto 0); +signal LSPTCK : std_logic_vector(4*bscan_ports-1 downto 0); +signal LSPTDO : std_logic_vector(4*bscan_ports-1 downto 0); +signal LSPTRST : std_logic_vector(4*bscan_ports-1 downto 0); +-- output of Port Mux +signal TDO_int : std_logic; + +begin + -- Wire up all of the tri-state controlled lines automatically + tri_state_lines : for lvar1 in 0 to (4*bscan_ports-1) generate + MSPTCK(lvar1) <= LSPTCK(lvar1) when ENABLE_MSP = '1' else 'Z'; + MSPTMS(lvar1) <= LSPTMS(lvar1) when ENABLE_MSP = '1' else 'Z'; + MSPTRST(lvar1) <= LSPTRST(lvar1) when ENABLE_MSP = '1' else 'Z'; + -- enable MSPTDOs for 1149.1 + MSPTDO(lvar1) <= LSPTDO(lvar1) when ENABLE_TDO = '1' else 'Z'; + end generate tri_state_lines; + + -- MSP Port enable controls + -- enable logic for all TDO pins + ENABLE_TDO <= ENABLE_MSP and tdoENABLE; + + TDO <= TDO_int when tdoENABLE = '1' else 'Z'; + + TopLinkerModule : component top_linker + port map( + TDO => TDO_int, + TMS => TMS, + TCK => TCK, + TRST => TRST, + TDI => TDI, + TDO_enable => tdoENABLE, + MSPTDI => MSPTDI, + MSPTDO => LSPTDO, + MSPTMS => LSPTMS, + MSPCLK => LSPTCK, + MSPTRST => LSPTRST, + IDN => IDN + ); + +end behave; + +--------------------------------- E O F -------------------------------------- diff --git a/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/source/jtag_top - Copy.vhd b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/source/jtag_top - Copy.vhd new file mode 100644 index 0000000000..55f1991e7d --- /dev/null +++ b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/source/jtag_top - Copy.vhd @@ -0,0 +1,28 @@ +--------------------------------------------------------------------------------- +-- +-- Vhdl file created by I/O Designer +-- Fri Feb 28 17:51:25 2014 +-- +--------------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.all; + +entity jtag_top is + port ( + CTRL : in std_logic_vector (1 downto 0); + ENABLE_MSP : in std_logic; + IDN : in std_logic_vector (3 downto 0); + LPSEL : in std_logic_vector (4 downto 0); + MSPTCK : out std_logic_vector (4 downto 0); + MSPTDI : in std_logic_vector (4 downto 0); + MSPTDO : out std_logic_vector (4 downto 0); + MSPTMS : out std_logic_vector (4 downto 0); + MSPTRST : out std_logic_vector (4 downto 0); + TCK : in std_logic; + TDI : in std_logic; + TDO : out std_logic; + TMS : in std_logic; + TRST : in std_logic + ); +end jtag_top; diff --git a/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/source/jtag_top(str) - Copy.vhd b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/source/jtag_top(str) - Copy.vhd new file mode 100644 index 0000000000..e0280135d7 --- /dev/null +++ b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/source/jtag_top(str) - Copy.vhd @@ -0,0 +1,242 @@ +------------------------------------------------------------------------------- +-- +-- Copyright (C) 2009 +-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +-- JIVE (Joint Institute for VLBI in Europe) <http://www.jive.nl/> +-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +------------------------------------------------------------------------------- + +LIBRARY ieee; +USE ieee.std_logic_1164.ALL; +USE ieee.std_logic_unsigned.ALL; + + +ARCHITECTURE str OF jtag_top IS + + COMPONENT bscan2 IS + -- enter the number of BSCAN2 blocks to create. This is the only place that + -- needs to be modified to control the number of local scan ports created. + GENERIC ( + bscan_ports : POSITIVE := 2 + + ); + PORT ( + TDI, TCK, TMS : IN STD_LOGIC; + TRST : IN STD_LOGIC; + -- Turn on slow slew in fitter for output signals + TDO : OUT STD_LOGIC; + -- OE control for MSP ports (Active high) + ENABLE_MSP : IN STD_LOGIC; + MSPTCK : OUT STD_LOGIC_VECTOR(4*bscan_ports-1 DOWNTO 0); + MSPTDI : IN STD_LOGIC_VECTOR(4*bscan_ports-1 DOWNTO 0); + MSPTDO : OUT STD_LOGIC_VECTOR(4*bscan_ports-1 DOWNTO 0); + MSPTMS : OUT STD_LOGIC_VECTOR(4*bscan_ports-1 DOWNTO 0); + MSPTRST : OUT STD_LOGIC_VECTOR(4*bscan_ports-1 DOWNTO 0); + -- one set of addresses to check for device + IDN : IN STD_LOGIC_VECTOR(3 DOWNTO 0) + ); + END COMPONENT bscan2; + +-- internal enable signal for tri-stating the scanbridge + CONSTANT jtag_chains : NATURAL := 5; + SIGNAL ENABLE_SB : STD_LOGIC; + SIGNAL TDO_BSCAN : STD_LOGIC; + SIGNAL TDA : STD_LOGIC; + SIGNAL TDB : STD_LOGIC; + SIGNAL TDC : STD_LOGIC; + SIGNAL MSPTDO_BSCAN : STD_LOGIC_VECTOR(jtag_chains-1 DOWNTO 0); + SIGNAL MSPTCK_BSCAN : STD_LOGIC_VECTOR(jtag_chains-1 DOWNTO 0); + SIGNAL MSPTMS_BSCAN : STD_LOGIC_VECTOR(jtag_chains-1 DOWNTO 0); + SIGNAL MSPTRST_BSCAN : STD_LOGIC_VECTOR(jtag_chains-1 DOWNTO 0); + + BEGIN + bscan : COMPONENT bscan2 + PORT MAP ( + TDI => TDI, + TCK => TCK, + TMS => TMS, + TRST => TRST, + TDO => TDO_BSCAN, + ENABLE_MSP => ENABLE_SB, + MSPTCK(jtag_chains-1 DOWNTO 0) => MSPTCK_BSCAN, + MSPTDI(jtag_chains-1 DOWNTO 0) => MSPTDI, + MSPTDO(jtag_chains-1 DOWNTO 0) => MSPTDO_BSCAN, + MSPTMS(jtag_chains-1 DOWNTO 0) => MSPTMS_BSCAN, + MSPTRST(jtag_chains-1 DOWNTO 0) => MSPTRST_BSCAN, + IDN => IDN + ); + + + p_jtagselect: PROCESS(TDI,MSPTDI(jtag_chains-1 DOWNTO 0),TCK,TMS,TRST) + BEGIN + ENABLE_SB <= '0'; + MSPTDO(jtag_chains-1 DOWNTO 0) <= "ZZZZZ"; + MSPTCK(jtag_chains-1 DOWNTO 0) <= "ZZZZZ"; + MSPTMS(jtag_chains-1 DOWNTO 0) <= "ZZZZZ"; + MSPTRST(jtag_chains-1 DOWNTO 0) <= "ZZZZZ"; + + IF LPSEL(4) = '0' THEN + ENABLE_SB <= ENABLE_MSP; + MSPTDO <= MSPTDO_BSCAN; + TDO <= TDO_BSCAN; + MSPTCK <= MSPTCK_BSCAN; + MSPTMS <= MSPTMS_BSCAN; + MSPTRST <= MSPTRST_BSCAN; + else + IF LPSEL(0) = '0' THEN + MSPTDO(0) <= TDI; + TDA <= MSPTDI(0); + MSPTCK(0) <= TCK; + MSPTMS(0) <= TMS; + MSPTRST(0) <= TRST; + ELSE + TDA <= TDI; + END IF; + + IF LPSEL(1) = '0' THEN + MSPTDO(1) <= TDA; + TDB <= MSPTDI(1); + MSPTCK(1) <= TCK; + MSPTMS(1) <= TMS; + MSPTRST(1) <= TRST; + ELSE + TDB <= TDA; + END IF; + + IF LPSEL(2) = '0' THEN + MSPTDO(2) <= TDB; + TDC <= MSPTDI(2); + MSPTCK(2) <= TCK; + MSPTMS(2) <= TMS; + MSPTRST(2) <= TRST; + ELSE + TDC <= TDB; + END IF; + + IF LPSEL(3) = '0' THEN + MSPTDO(3) <= TDC; + TDO <= MSPTDI(3); + MSPTCK(3) <= TCK; + MSPTMS(3) <= TMS; + MSPTRST(3) <= TRST; + ELSE + TDO <= TDC; + END IF; + END IF; + +-- old +-- CASE LPSEL IS +-- WHEN "00000" => +-- ENABLE_SB <= '0'; +-- MSPTDO(0) <= TDI; +-- MSPTDO(jtag_chains-1 DOWNTO 1) <= "ZZZZ"; +-- TDO <= MSPTDI(0); +-- MSPTCK(0) <= TCK; +-- MSPTCK(jtag_chains-1 DOWNTO 1) <= "ZZZZ"; +-- MSPTMS(0) <= TMS; +-- MSPTMS(jtag_chains-1 DOWNTO 1) <= "ZZZZ"; +-- MSPTRST(0) <= TRST; +-- MSPTRST(jtag_chains-1 DOWNTO 1) <= "ZZZZ"; +-- WHEN "00001" => +-- ENABLE_SB <= '0'; +-- MSPTDO(1) <= TDI; +-- MSPTDO(jtag_chains-1 DOWNTO 2) <= "ZZZ"; +-- MSPTDO(0) <= 'Z'; +-- TDO <= MSPTDI(1); +-- MSPTCK(1) <= TCK; +-- MSPTCK(jtag_chains-1 DOWNTO 2) <= "ZZZ"; +-- MSPTMS(1) <= TMS; +-- MSPTMS(jtag_chains-1 DOWNTO 2) <= "ZZZ"; +-- MSPTRST(1) <= TRST; +-- MSPTRST(jtag_chains-1 DOWNTO 2) <= "ZZZ"; +-- WHEN "00010" => +-- ENABLE_SB <= '0'; +-- MSPTDO(2) <= TDI; +-- MSPTDO(jtag_chains-1 DOWNTO 3) <= "ZZ"; +-- MSPTDO(1 DOWNTO 0) <= "ZZ"; +-- TDO <= MSPTDI(2); +-- MSPTCK(2) <= TCK; +-- MSPTCK(jtag_chains-1 DOWNTO 3) <= "ZZ"; +-- MSPTMS(2) <= TMS; +-- MSPTMS(jtag_chains-1 DOWNTO 3) <= "ZZ"; +-- MSPTRST(2) <= TRST; +-- MSPTRST(jtag_chains-1 DOWNTO 3) <= "ZZ"; +-- WHEN "00011" => +-- ENABLE_SB <= '0'; +-- MSPTDO(3) <= TDI; +-- MSPTDO(4) <= 'Z'; +-- MSPTDO(2 DOWNTO 0) <= "ZZZ"; +-- TDO <= MSPTDI(3); +-- MSPTCK(3) <= TCK; +-- MSPTCK(2 DOWNTO 0) <= "ZZZ"; +-- MSPTMS(3) <= TMS; +-- MSPTMS(2 DOWNTO 0) <= "ZZZ"; +-- MSPTRST(3) <= TRST; +-- MSPTRST(2 DOWNTO 0) <= "ZZZ"; +-- WHEN "00100" => +-- ENABLE_SB <= '0'; +-- MSPTDO(4) <= TDI; +-- MSPTDO(3 DOWNTO 0) <= "ZZZZ"; +-- TDO <= MSPTDI(4); +-- MSPTCK(4) <= TCK; +-- MSPTCK(3 DOWNTO 0) <= "ZZZZ"; +-- MSPTMS(4) <= TMS; +-- MSPTMS(3 DOWNTO 0) <= "ZZZZ"; +-- MSPTRST(4) <= TRST; +-- MSPTRST(3 DOWNTO 0) <= "ZZZZ"; +-- WHEN "00101" => +-- ENABLE_SB <= '0'; +-- MSPTDO(0) <= TDI; +-- MSPTDO(1) <= MSPTDI(0); +-- MSPTDO(2) <= MSPTDI(1); +-- MSPTDO(3) <= MSPTDI(2); +-- TDO <= MSPTDI(3); +-- MSPTDO(jtag_chains-1 DOWNTO 4) <= "Z"; +-- MSPTCK(0) <= TCK; +-- MSPTCK(1) <= TCK; +-- MSPTCK(2) <= TCK; +-- MSPTCK(3) <= TCK; +-- MSPTCK(jtag_chains-1 DOWNTO 4) <= "Z"; +-- MSPTMS(0) <= TMS; +-- MSPTMS(1) <= TMS; +-- MSPTMS(2) <= TMS; +-- MSPTMS(3) <= TMS; +-- MSPTMS(jtag_chains-1 DOWNTO 4) <= "Z"; +-- MSPTRST(0) <= TRST; +-- MSPTRST(1) <= TRST; +-- MSPTRST(2) <= TRST; +-- MSPTRST(3) <= TRST; +-- MSPTRST(jtag_chains-1 DOWNTO 4) <= "Z"; +-- WHEN "00111" => +-- ENABLE_SB <= 'Z'; +-- MSPTDO(4 DOWNTO 0) <= "ZZZZZ"; +-- TDO <= 'Z'; +-- MSPTCK(4 DOWNTO 0) <= "ZZZZZ"; +-- MSPTMS(4 DOWNTO 0) <= "ZZZZZ"; +-- MSPTRST(4 DOWNTO 0) <= "ZZZZZ"; +-- WHEN OTHERS => +-- ENABLE_SB <= ENABLE_MSP; +-- MSPTDO <= MSPTDO_BSCAN; +-- TDO <= TDO_BSCAN; +-- MSPTCK <= MSPTCK_BSCAN; +-- MSPTMS <= MSPTMS_BSCAN; +-- MSPTRST <= MSPTRST_BSCAN; +-- END CASE; + + END PROCESS; +END str; + diff --git a/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/source/jtag_top(str).vhd b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/source/jtag_top(str).vhd new file mode 100644 index 0000000000..91f0933040 --- /dev/null +++ b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/source/jtag_top(str).vhd @@ -0,0 +1,154 @@ +------------------------------------------------------------------------------- +-- +-- Copyright (C) 2009 +-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +-- JIVE (Joint Institute for VLBI in Europe) <http://www.jive.nl/> +-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +------------------------------------------------------------------------------- + +LIBRARY ieee; +USE ieee.std_logic_1164.ALL; +USE ieee.std_logic_unsigned.ALL; + + +ARCHITECTURE str OF jtag_top IS + + COMPONENT bscan2 IS + -- enter the number of BSCAN2 blocks to create. This is the only place that + -- needs to be modified to control the number of local scan ports created. + GENERIC ( + bscan_ports : POSITIVE := 2 + + ); + PORT ( + TDI, TCK, TMS : IN STD_LOGIC; + TRST : IN STD_LOGIC; + -- Turn on slow slew in fitter for output signals + TDO : OUT STD_LOGIC; + -- OE control for MSP ports (Active high) + ENABLE_MSP : IN STD_LOGIC; + MSPTCK : OUT STD_LOGIC_VECTOR(4*bscan_ports-1 DOWNTO 0); + MSPTDI : IN STD_LOGIC_VECTOR(4*bscan_ports-1 DOWNTO 0); + MSPTDO : OUT STD_LOGIC_VECTOR(4*bscan_ports-1 DOWNTO 0); + MSPTMS : OUT STD_LOGIC_VECTOR(4*bscan_ports-1 DOWNTO 0); + MSPTRST : OUT STD_LOGIC_VECTOR(4*bscan_ports-1 DOWNTO 0); + -- one set of addresses to check for device + IDN : IN STD_LOGIC_VECTOR(3 DOWNTO 0) + ); + END COMPONENT bscan2; + +-- internal enable signal for tri-stating the scanbridge + CONSTANT jtag_chains : NATURAL := 5; + SIGNAL ENABLE_SB : STD_LOGIC; + SIGNAL TDO_BSCAN : STD_LOGIC; + SIGNAL TDA : STD_LOGIC; + SIGNAL TDB : STD_LOGIC; + SIGNAL TDC : STD_LOGIC; + SIGNAL TDD : STD_LOGIC; + SIGNAL MSPTDO_BSCAN : STD_LOGIC_VECTOR(jtag_chains-1 DOWNTO 0); + SIGNAL MSPTCK_BSCAN : STD_LOGIC_VECTOR(jtag_chains-1 DOWNTO 0); + SIGNAL MSPTMS_BSCAN : STD_LOGIC_VECTOR(jtag_chains-1 DOWNTO 0); + SIGNAL MSPTRST_BSCAN : STD_LOGIC_VECTOR(jtag_chains-1 DOWNTO 0); + + BEGIN + bscan : COMPONENT bscan2 + PORT MAP ( + TDI => TDI, + TCK => TCK, + TMS => TMS, + TRST => TRST, + TDO => TDO_BSCAN, + ENABLE_MSP => ENABLE_SB, + MSPTCK(jtag_chains-1 DOWNTO 0) => MSPTCK_BSCAN, + MSPTDI(jtag_chains-1 DOWNTO 0) => MSPTDI, + MSPTDO(jtag_chains-1 DOWNTO 0) => MSPTDO_BSCAN, + MSPTMS(jtag_chains-1 DOWNTO 0) => MSPTMS_BSCAN, + MSPTRST(jtag_chains-1 DOWNTO 0) => MSPTRST_BSCAN, + IDN => "0000" + ); + + + p_jtagselect: PROCESS(TDI,MSPTDI(jtag_chains-1 DOWNTO 0),TCK,TMS,TRST) + BEGIN + ENABLE_SB <= '0'; + MSPTDO(jtag_chains-1 DOWNTO 0) <= "ZZZZZ"; + MSPTCK(jtag_chains-1 DOWNTO 0) <= "ZZZZZ"; + MSPTMS(jtag_chains-1 DOWNTO 0) <= "ZZZZZ"; + MSPTRST(jtag_chains-1 DOWNTO 0) <= "ZZZZZ"; + + IF CTRL(1) = '1' THEN + ENABLE_SB <= '1'; + MSPTDO <= MSPTDO_BSCAN; + TDO <= TDO_BSCAN; + MSPTCK <= MSPTCK_BSCAN; + MSPTMS <= MSPTMS_BSCAN; + MSPTRST <= MSPTRST_BSCAN; + ELSE + IF LPSEL(0) = '0' THEN + MSPTDO(0) <= TDI; + TDA <= MSPTDI(0); + MSPTCK(0) <= TCK; + MSPTMS(0) <= TMS; + MSPTRST(0) <= TRST; + ELSE + TDA <= TDI; + END IF; + + IF LPSEL(1) = '0' THEN + MSPTDO(1) <= TDA; + TDB <= MSPTDI(1); + MSPTCK(1) <= TCK; + MSPTMS(1) <= TMS; + MSPTRST(1) <= TRST; + ELSE + TDB <= TDA; + END IF; + + IF LPSEL(2) = '0' THEN + MSPTDO(2) <= TDB; + TDC <= MSPTDI(2); + MSPTCK(2) <= TCK; + MSPTMS(2) <= TMS; + MSPTRST(2) <= TRST; + ELSE + TDC <= TDB; + END IF; + + IF LPSEL(3) = '0' THEN + MSPTDO(3) <= TDC; + TDD <= MSPTDI(3); + MSPTCK(3) <= TCK; + MSPTMS(3) <= TMS; + MSPTRST(3) <= TRST; + ELSE + TDD <= TDC; + END IF; + + IF LPSEL(4) = '0' THEN + MSPTDO(4) <= TDD; + TDO <= MSPTDI(4); + MSPTCK(4) <= TCK; + MSPTMS(4) <= TMS; + MSPTRST(4) <= TRST; + ELSE + TDO <= TDD; + END IF; + END IF; + + END PROCESS; +END str; + diff --git a/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/source/jtag_top.vhd b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/source/jtag_top.vhd new file mode 100644 index 0000000000..55f1991e7d --- /dev/null +++ b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/source/jtag_top.vhd @@ -0,0 +1,28 @@ +--------------------------------------------------------------------------------- +-- +-- Vhdl file created by I/O Designer +-- Fri Feb 28 17:51:25 2014 +-- +--------------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.all; + +entity jtag_top is + port ( + CTRL : in std_logic_vector (1 downto 0); + ENABLE_MSP : in std_logic; + IDN : in std_logic_vector (3 downto 0); + LPSEL : in std_logic_vector (4 downto 0); + MSPTCK : out std_logic_vector (4 downto 0); + MSPTDI : in std_logic_vector (4 downto 0); + MSPTDO : out std_logic_vector (4 downto 0); + MSPTMS : out std_logic_vector (4 downto 0); + MSPTRST : out std_logic_vector (4 downto 0); + TCK : in std_logic; + TDI : in std_logic; + TDO : out std_logic; + TMS : in std_logic; + TRST : in std_logic + ); +end jtag_top; diff --git a/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/top_linker.ngo b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE/top_linker.ngo new file mode 100644 index 0000000000000000000000000000000000000000..d06e4838db9f85b95da806848950a2adf8036425 GIT binary patch literal 69022 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%0Au<=h(`!qcMi!IL3Sc?1RAe@gajQxMC9^q!%nSoL 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 literal 0 HcmV?d00001 diff --git a/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/source/.jtag_top(str).vhd.swp b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/source/.jtag_top(str).vhd.swp new file mode 100644 index 0000000000000000000000000000000000000000..9c5478a7319920d309819ce95ca9d797b1c0ae95 GIT binary patch literal 16384 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 Tvp!LbXY}To%<|qJ?acoIbF=mS literal 0 HcmV?d00001 diff --git a/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/source/bscan2_8port_top.vhd b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/source/bscan2_8port_top.vhd new file mode 100644 index 0000000000..262b7dcb68 --- /dev/null +++ b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/source/bscan2_8port_top.vhd @@ -0,0 +1,134 @@ +-- -------------------------------------------------------------------- +-- >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<< +-- -------------------------------------------------------------------- +-- Copyright (c) 2001 - 2008 by Lattice Semiconductor Corporation +-- -------------------------------------------------------------------- +-- +-- Permission: +-- +-- Lattice Semiconductor grants permission to use this code for use +-- in synthesis for any Lattice programmable logic product. Other +-- use of this code, including the selling or duplication of any +-- portion is strictly prohibited. +-- +-- Disclaimer: +-- +-- This VHDL or Verilog source code is intended as a design reference +-- which illustrates how these types of functions can be implemented. +-- It is the user's responsibility to verify their design for +-- consistency and functionality through the use of formal +-- verification methods. Lattice Semiconductor provides no warranty +-- regarding the use or functionality of this code. +-- +-- -------------------------------------------------------------------- +-- +-- Lattice Semiconductor Corporation +-- 5555 NE Moore Court +-- Hillsboro, OR 97214 +-- U.S.A +-- +-- TEL: 1-800-Lattice (USA and Canada) +-- 503-268-8001 (other locations) +-- +-- web: http://www.latticesemi.com/ +-- email: techsupport@latticesemi.com +-- +-- -------------------------------------------------------------------- +-- Code Revision History : +-- -------------------------------------------------------------------- +-- Ver: | Author |Mod. Date |Changes Made: +-- V1.0 | J.O. |11/10/08 |Initial Version +-- -------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; + +entity bscan2 is + -- enter the number of BSCAN2 blocks to create. This is the only place that + -- needs to be modified to control the number of local scan ports created. + generic ( bscan_ports : positive := 2 ); + PORT( TDI, TCK, TMS : in std_logic; + TRST : in std_logic; + -- Turn on slow slew in fitter for output signals + TDO : out std_logic; + -- OE control for MSP ports (Active high) + ENABLE_MSP : in std_logic; + MSPTCK : out std_logic_vector(4*bscan_ports-1 downto 0); + MSPTDI : in std_logic_vector(4*bscan_ports-1 downto 0); + MSPTDO : out std_logic_vector(4*bscan_ports-1 downto 0); + MSPTMS : out std_logic_vector(4*bscan_ports-1 downto 0); + MSPTRST : out std_logic_vector(4*bscan_ports-1 downto 0); + -- one set of addresses to check for device + IDN : in std_logic_vector(3 downto 0) + ); +end; + +architecture behave of bscan2 is + + component top_linker is + -- do not use the generic map to prevent the synthesis tool from + -- appending the number of ports to the components name. + port(TDI, TCK, TMS : in std_logic; + TRST : in std_logic; + -- enable logic for TDO pins. + TDO_enable : out std_logic; + TDO : out std_logic; + MSPCLK : out std_logic_vector(4*bscan_ports downto 1); + MSPTDI : in std_logic_vector(4*bscan_ports downto 1); + MSPTDO : out std_logic_vector(4*bscan_ports downto 1); + MSPTMS : out std_logic_vector(4*bscan_ports downto 1); + MSPTRST : out std_logic_vector(4*bscan_ports downto 1); + -- one set of addresses to check for device + IDN : in std_logic_vector(4 downto 1) + ); +end component top_linker; +-- synthesis FILE="top_linker.ngo" + +-- logic to enable TDO pins +signal ENABLE_TDO : std_logic; +-- signal from tap controler that enables all TDOs. +signal tdoENABLE : std_logic; +-- logic to generate tdo_sp and tdo_hdr +signal LSPTMS : std_logic_vector(4*bscan_ports-1 downto 0); +signal LSPTCK : std_logic_vector(4*bscan_ports-1 downto 0); +signal LSPTDO : std_logic_vector(4*bscan_ports-1 downto 0); +signal LSPTRST : std_logic_vector(4*bscan_ports-1 downto 0); +-- output of Port Mux +signal TDO_int : std_logic; + +begin + -- Wire up all of the tri-state controlled lines automatically + tri_state_lines : for lvar1 in 0 to (4*bscan_ports-1) generate + MSPTCK(lvar1) <= LSPTCK(lvar1) when ENABLE_MSP = '1' else 'Z'; + MSPTMS(lvar1) <= LSPTMS(lvar1) when ENABLE_MSP = '1' else 'Z'; + MSPTRST(lvar1) <= LSPTRST(lvar1) when ENABLE_MSP = '1' else 'Z'; + -- enable MSPTDOs for 1149.1 + MSPTDO(lvar1) <= LSPTDO(lvar1) when ENABLE_TDO = '1' else 'Z'; + end generate tri_state_lines; + + -- MSP Port enable controls + -- enable logic for all TDO pins + ENABLE_TDO <= ENABLE_MSP and tdoENABLE; + + TDO <= TDO_int when tdoENABLE = '1' else 'Z'; + + TopLinkerModule : component top_linker + port map( + TDO => TDO_int, + TMS => TMS, + TCK => TCK, + TRST => TRST, + TDI => TDI, + TDO_enable => tdoENABLE, + MSPTDI => MSPTDI, + MSPTDO => LSPTDO, + MSPTMS => LSPTMS, + MSPCLK => LSPTCK, + MSPTRST => LSPTRST, + IDN => IDN + ); + +end behave; + +--------------------------------- E O F -------------------------------------- diff --git a/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/source/jtag_top - Copy.vhd b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/source/jtag_top - Copy.vhd new file mode 100644 index 0000000000..55f1991e7d --- /dev/null +++ b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/source/jtag_top - Copy.vhd @@ -0,0 +1,28 @@ +--------------------------------------------------------------------------------- +-- +-- Vhdl file created by I/O Designer +-- Fri Feb 28 17:51:25 2014 +-- +--------------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.all; + +entity jtag_top is + port ( + CTRL : in std_logic_vector (1 downto 0); + ENABLE_MSP : in std_logic; + IDN : in std_logic_vector (3 downto 0); + LPSEL : in std_logic_vector (4 downto 0); + MSPTCK : out std_logic_vector (4 downto 0); + MSPTDI : in std_logic_vector (4 downto 0); + MSPTDO : out std_logic_vector (4 downto 0); + MSPTMS : out std_logic_vector (4 downto 0); + MSPTRST : out std_logic_vector (4 downto 0); + TCK : in std_logic; + TDI : in std_logic; + TDO : out std_logic; + TMS : in std_logic; + TRST : in std_logic + ); +end jtag_top; diff --git a/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/source/jtag_top(str) - Copy.vhd b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/source/jtag_top(str) - Copy.vhd new file mode 100644 index 0000000000..e0280135d7 --- /dev/null +++ b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/source/jtag_top(str) - Copy.vhd @@ -0,0 +1,242 @@ +------------------------------------------------------------------------------- +-- +-- Copyright (C) 2009 +-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +-- JIVE (Joint Institute for VLBI in Europe) <http://www.jive.nl/> +-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +------------------------------------------------------------------------------- + +LIBRARY ieee; +USE ieee.std_logic_1164.ALL; +USE ieee.std_logic_unsigned.ALL; + + +ARCHITECTURE str OF jtag_top IS + + COMPONENT bscan2 IS + -- enter the number of BSCAN2 blocks to create. This is the only place that + -- needs to be modified to control the number of local scan ports created. + GENERIC ( + bscan_ports : POSITIVE := 2 + + ); + PORT ( + TDI, TCK, TMS : IN STD_LOGIC; + TRST : IN STD_LOGIC; + -- Turn on slow slew in fitter for output signals + TDO : OUT STD_LOGIC; + -- OE control for MSP ports (Active high) + ENABLE_MSP : IN STD_LOGIC; + MSPTCK : OUT STD_LOGIC_VECTOR(4*bscan_ports-1 DOWNTO 0); + MSPTDI : IN STD_LOGIC_VECTOR(4*bscan_ports-1 DOWNTO 0); + MSPTDO : OUT STD_LOGIC_VECTOR(4*bscan_ports-1 DOWNTO 0); + MSPTMS : OUT STD_LOGIC_VECTOR(4*bscan_ports-1 DOWNTO 0); + MSPTRST : OUT STD_LOGIC_VECTOR(4*bscan_ports-1 DOWNTO 0); + -- one set of addresses to check for device + IDN : IN STD_LOGIC_VECTOR(3 DOWNTO 0) + ); + END COMPONENT bscan2; + +-- internal enable signal for tri-stating the scanbridge + CONSTANT jtag_chains : NATURAL := 5; + SIGNAL ENABLE_SB : STD_LOGIC; + SIGNAL TDO_BSCAN : STD_LOGIC; + SIGNAL TDA : STD_LOGIC; + SIGNAL TDB : STD_LOGIC; + SIGNAL TDC : STD_LOGIC; + SIGNAL MSPTDO_BSCAN : STD_LOGIC_VECTOR(jtag_chains-1 DOWNTO 0); + SIGNAL MSPTCK_BSCAN : STD_LOGIC_VECTOR(jtag_chains-1 DOWNTO 0); + SIGNAL MSPTMS_BSCAN : STD_LOGIC_VECTOR(jtag_chains-1 DOWNTO 0); + SIGNAL MSPTRST_BSCAN : STD_LOGIC_VECTOR(jtag_chains-1 DOWNTO 0); + + BEGIN + bscan : COMPONENT bscan2 + PORT MAP ( + TDI => TDI, + TCK => TCK, + TMS => TMS, + TRST => TRST, + TDO => TDO_BSCAN, + ENABLE_MSP => ENABLE_SB, + MSPTCK(jtag_chains-1 DOWNTO 0) => MSPTCK_BSCAN, + MSPTDI(jtag_chains-1 DOWNTO 0) => MSPTDI, + MSPTDO(jtag_chains-1 DOWNTO 0) => MSPTDO_BSCAN, + MSPTMS(jtag_chains-1 DOWNTO 0) => MSPTMS_BSCAN, + MSPTRST(jtag_chains-1 DOWNTO 0) => MSPTRST_BSCAN, + IDN => IDN + ); + + + p_jtagselect: PROCESS(TDI,MSPTDI(jtag_chains-1 DOWNTO 0),TCK,TMS,TRST) + BEGIN + ENABLE_SB <= '0'; + MSPTDO(jtag_chains-1 DOWNTO 0) <= "ZZZZZ"; + MSPTCK(jtag_chains-1 DOWNTO 0) <= "ZZZZZ"; + MSPTMS(jtag_chains-1 DOWNTO 0) <= "ZZZZZ"; + MSPTRST(jtag_chains-1 DOWNTO 0) <= "ZZZZZ"; + + IF LPSEL(4) = '0' THEN + ENABLE_SB <= ENABLE_MSP; + MSPTDO <= MSPTDO_BSCAN; + TDO <= TDO_BSCAN; + MSPTCK <= MSPTCK_BSCAN; + MSPTMS <= MSPTMS_BSCAN; + MSPTRST <= MSPTRST_BSCAN; + else + IF LPSEL(0) = '0' THEN + MSPTDO(0) <= TDI; + TDA <= MSPTDI(0); + MSPTCK(0) <= TCK; + MSPTMS(0) <= TMS; + MSPTRST(0) <= TRST; + ELSE + TDA <= TDI; + END IF; + + IF LPSEL(1) = '0' THEN + MSPTDO(1) <= TDA; + TDB <= MSPTDI(1); + MSPTCK(1) <= TCK; + MSPTMS(1) <= TMS; + MSPTRST(1) <= TRST; + ELSE + TDB <= TDA; + END IF; + + IF LPSEL(2) = '0' THEN + MSPTDO(2) <= TDB; + TDC <= MSPTDI(2); + MSPTCK(2) <= TCK; + MSPTMS(2) <= TMS; + MSPTRST(2) <= TRST; + ELSE + TDC <= TDB; + END IF; + + IF LPSEL(3) = '0' THEN + MSPTDO(3) <= TDC; + TDO <= MSPTDI(3); + MSPTCK(3) <= TCK; + MSPTMS(3) <= TMS; + MSPTRST(3) <= TRST; + ELSE + TDO <= TDC; + END IF; + END IF; + +-- old +-- CASE LPSEL IS +-- WHEN "00000" => +-- ENABLE_SB <= '0'; +-- MSPTDO(0) <= TDI; +-- MSPTDO(jtag_chains-1 DOWNTO 1) <= "ZZZZ"; +-- TDO <= MSPTDI(0); +-- MSPTCK(0) <= TCK; +-- MSPTCK(jtag_chains-1 DOWNTO 1) <= "ZZZZ"; +-- MSPTMS(0) <= TMS; +-- MSPTMS(jtag_chains-1 DOWNTO 1) <= "ZZZZ"; +-- MSPTRST(0) <= TRST; +-- MSPTRST(jtag_chains-1 DOWNTO 1) <= "ZZZZ"; +-- WHEN "00001" => +-- ENABLE_SB <= '0'; +-- MSPTDO(1) <= TDI; +-- MSPTDO(jtag_chains-1 DOWNTO 2) <= "ZZZ"; +-- MSPTDO(0) <= 'Z'; +-- TDO <= MSPTDI(1); +-- MSPTCK(1) <= TCK; +-- MSPTCK(jtag_chains-1 DOWNTO 2) <= "ZZZ"; +-- MSPTMS(1) <= TMS; +-- MSPTMS(jtag_chains-1 DOWNTO 2) <= "ZZZ"; +-- MSPTRST(1) <= TRST; +-- MSPTRST(jtag_chains-1 DOWNTO 2) <= "ZZZ"; +-- WHEN "00010" => +-- ENABLE_SB <= '0'; +-- MSPTDO(2) <= TDI; +-- MSPTDO(jtag_chains-1 DOWNTO 3) <= "ZZ"; +-- MSPTDO(1 DOWNTO 0) <= "ZZ"; +-- TDO <= MSPTDI(2); +-- MSPTCK(2) <= TCK; +-- MSPTCK(jtag_chains-1 DOWNTO 3) <= "ZZ"; +-- MSPTMS(2) <= TMS; +-- MSPTMS(jtag_chains-1 DOWNTO 3) <= "ZZ"; +-- MSPTRST(2) <= TRST; +-- MSPTRST(jtag_chains-1 DOWNTO 3) <= "ZZ"; +-- WHEN "00011" => +-- ENABLE_SB <= '0'; +-- MSPTDO(3) <= TDI; +-- MSPTDO(4) <= 'Z'; +-- MSPTDO(2 DOWNTO 0) <= "ZZZ"; +-- TDO <= MSPTDI(3); +-- MSPTCK(3) <= TCK; +-- MSPTCK(2 DOWNTO 0) <= "ZZZ"; +-- MSPTMS(3) <= TMS; +-- MSPTMS(2 DOWNTO 0) <= "ZZZ"; +-- MSPTRST(3) <= TRST; +-- MSPTRST(2 DOWNTO 0) <= "ZZZ"; +-- WHEN "00100" => +-- ENABLE_SB <= '0'; +-- MSPTDO(4) <= TDI; +-- MSPTDO(3 DOWNTO 0) <= "ZZZZ"; +-- TDO <= MSPTDI(4); +-- MSPTCK(4) <= TCK; +-- MSPTCK(3 DOWNTO 0) <= "ZZZZ"; +-- MSPTMS(4) <= TMS; +-- MSPTMS(3 DOWNTO 0) <= "ZZZZ"; +-- MSPTRST(4) <= TRST; +-- MSPTRST(3 DOWNTO 0) <= "ZZZZ"; +-- WHEN "00101" => +-- ENABLE_SB <= '0'; +-- MSPTDO(0) <= TDI; +-- MSPTDO(1) <= MSPTDI(0); +-- MSPTDO(2) <= MSPTDI(1); +-- MSPTDO(3) <= MSPTDI(2); +-- TDO <= MSPTDI(3); +-- MSPTDO(jtag_chains-1 DOWNTO 4) <= "Z"; +-- MSPTCK(0) <= TCK; +-- MSPTCK(1) <= TCK; +-- MSPTCK(2) <= TCK; +-- MSPTCK(3) <= TCK; +-- MSPTCK(jtag_chains-1 DOWNTO 4) <= "Z"; +-- MSPTMS(0) <= TMS; +-- MSPTMS(1) <= TMS; +-- MSPTMS(2) <= TMS; +-- MSPTMS(3) <= TMS; +-- MSPTMS(jtag_chains-1 DOWNTO 4) <= "Z"; +-- MSPTRST(0) <= TRST; +-- MSPTRST(1) <= TRST; +-- MSPTRST(2) <= TRST; +-- MSPTRST(3) <= TRST; +-- MSPTRST(jtag_chains-1 DOWNTO 4) <= "Z"; +-- WHEN "00111" => +-- ENABLE_SB <= 'Z'; +-- MSPTDO(4 DOWNTO 0) <= "ZZZZZ"; +-- TDO <= 'Z'; +-- MSPTCK(4 DOWNTO 0) <= "ZZZZZ"; +-- MSPTMS(4 DOWNTO 0) <= "ZZZZZ"; +-- MSPTRST(4 DOWNTO 0) <= "ZZZZZ"; +-- WHEN OTHERS => +-- ENABLE_SB <= ENABLE_MSP; +-- MSPTDO <= MSPTDO_BSCAN; +-- TDO <= TDO_BSCAN; +-- MSPTCK <= MSPTCK_BSCAN; +-- MSPTMS <= MSPTMS_BSCAN; +-- MSPTRST <= MSPTRST_BSCAN; +-- END CASE; + + END PROCESS; +END str; + diff --git a/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/source/jtag_top(str).vhd b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/source/jtag_top(str).vhd new file mode 100644 index 0000000000..91f0933040 --- /dev/null +++ b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/source/jtag_top(str).vhd @@ -0,0 +1,154 @@ +------------------------------------------------------------------------------- +-- +-- Copyright (C) 2009 +-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +-- JIVE (Joint Institute for VLBI in Europe) <http://www.jive.nl/> +-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +------------------------------------------------------------------------------- + +LIBRARY ieee; +USE ieee.std_logic_1164.ALL; +USE ieee.std_logic_unsigned.ALL; + + +ARCHITECTURE str OF jtag_top IS + + COMPONENT bscan2 IS + -- enter the number of BSCAN2 blocks to create. This is the only place that + -- needs to be modified to control the number of local scan ports created. + GENERIC ( + bscan_ports : POSITIVE := 2 + + ); + PORT ( + TDI, TCK, TMS : IN STD_LOGIC; + TRST : IN STD_LOGIC; + -- Turn on slow slew in fitter for output signals + TDO : OUT STD_LOGIC; + -- OE control for MSP ports (Active high) + ENABLE_MSP : IN STD_LOGIC; + MSPTCK : OUT STD_LOGIC_VECTOR(4*bscan_ports-1 DOWNTO 0); + MSPTDI : IN STD_LOGIC_VECTOR(4*bscan_ports-1 DOWNTO 0); + MSPTDO : OUT STD_LOGIC_VECTOR(4*bscan_ports-1 DOWNTO 0); + MSPTMS : OUT STD_LOGIC_VECTOR(4*bscan_ports-1 DOWNTO 0); + MSPTRST : OUT STD_LOGIC_VECTOR(4*bscan_ports-1 DOWNTO 0); + -- one set of addresses to check for device + IDN : IN STD_LOGIC_VECTOR(3 DOWNTO 0) + ); + END COMPONENT bscan2; + +-- internal enable signal for tri-stating the scanbridge + CONSTANT jtag_chains : NATURAL := 5; + SIGNAL ENABLE_SB : STD_LOGIC; + SIGNAL TDO_BSCAN : STD_LOGIC; + SIGNAL TDA : STD_LOGIC; + SIGNAL TDB : STD_LOGIC; + SIGNAL TDC : STD_LOGIC; + SIGNAL TDD : STD_LOGIC; + SIGNAL MSPTDO_BSCAN : STD_LOGIC_VECTOR(jtag_chains-1 DOWNTO 0); + SIGNAL MSPTCK_BSCAN : STD_LOGIC_VECTOR(jtag_chains-1 DOWNTO 0); + SIGNAL MSPTMS_BSCAN : STD_LOGIC_VECTOR(jtag_chains-1 DOWNTO 0); + SIGNAL MSPTRST_BSCAN : STD_LOGIC_VECTOR(jtag_chains-1 DOWNTO 0); + + BEGIN + bscan : COMPONENT bscan2 + PORT MAP ( + TDI => TDI, + TCK => TCK, + TMS => TMS, + TRST => TRST, + TDO => TDO_BSCAN, + ENABLE_MSP => ENABLE_SB, + MSPTCK(jtag_chains-1 DOWNTO 0) => MSPTCK_BSCAN, + MSPTDI(jtag_chains-1 DOWNTO 0) => MSPTDI, + MSPTDO(jtag_chains-1 DOWNTO 0) => MSPTDO_BSCAN, + MSPTMS(jtag_chains-1 DOWNTO 0) => MSPTMS_BSCAN, + MSPTRST(jtag_chains-1 DOWNTO 0) => MSPTRST_BSCAN, + IDN => "0000" + ); + + + p_jtagselect: PROCESS(TDI,MSPTDI(jtag_chains-1 DOWNTO 0),TCK,TMS,TRST) + BEGIN + ENABLE_SB <= '0'; + MSPTDO(jtag_chains-1 DOWNTO 0) <= "ZZZZZ"; + MSPTCK(jtag_chains-1 DOWNTO 0) <= "ZZZZZ"; + MSPTMS(jtag_chains-1 DOWNTO 0) <= "ZZZZZ"; + MSPTRST(jtag_chains-1 DOWNTO 0) <= "ZZZZZ"; + + IF CTRL(1) = '1' THEN + ENABLE_SB <= '1'; + MSPTDO <= MSPTDO_BSCAN; + TDO <= TDO_BSCAN; + MSPTCK <= MSPTCK_BSCAN; + MSPTMS <= MSPTMS_BSCAN; + MSPTRST <= MSPTRST_BSCAN; + ELSE + IF LPSEL(0) = '0' THEN + MSPTDO(0) <= TDI; + TDA <= MSPTDI(0); + MSPTCK(0) <= TCK; + MSPTMS(0) <= TMS; + MSPTRST(0) <= TRST; + ELSE + TDA <= TDI; + END IF; + + IF LPSEL(1) = '0' THEN + MSPTDO(1) <= TDA; + TDB <= MSPTDI(1); + MSPTCK(1) <= TCK; + MSPTMS(1) <= TMS; + MSPTRST(1) <= TRST; + ELSE + TDB <= TDA; + END IF; + + IF LPSEL(2) = '0' THEN + MSPTDO(2) <= TDB; + TDC <= MSPTDI(2); + MSPTCK(2) <= TCK; + MSPTMS(2) <= TMS; + MSPTRST(2) <= TRST; + ELSE + TDC <= TDB; + END IF; + + IF LPSEL(3) = '0' THEN + MSPTDO(3) <= TDC; + TDD <= MSPTDI(3); + MSPTCK(3) <= TCK; + MSPTMS(3) <= TMS; + MSPTRST(3) <= TRST; + ELSE + TDD <= TDC; + END IF; + + IF LPSEL(4) = '0' THEN + MSPTDO(4) <= TDD; + TDO <= MSPTDI(4); + MSPTCK(4) <= TCK; + MSPTMS(4) <= TMS; + MSPTRST(4) <= TRST; + ELSE + TDO <= TDD; + END IF; + END IF; + + END PROCESS; +END str; + diff --git a/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/source/jtag_top.vhd b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/source/jtag_top.vhd new file mode 100644 index 0000000000..55f1991e7d --- /dev/null +++ b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/source/jtag_top.vhd @@ -0,0 +1,28 @@ +--------------------------------------------------------------------------------- +-- +-- Vhdl file created by I/O Designer +-- Fri Feb 28 17:51:25 2014 +-- +--------------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.all; + +entity jtag_top is + port ( + CTRL : in std_logic_vector (1 downto 0); + ENABLE_MSP : in std_logic; + IDN : in std_logic_vector (3 downto 0); + LPSEL : in std_logic_vector (4 downto 0); + MSPTCK : out std_logic_vector (4 downto 0); + MSPTDI : in std_logic_vector (4 downto 0); + MSPTDO : out std_logic_vector (4 downto 0); + MSPTMS : out std_logic_vector (4 downto 0); + MSPTRST : out std_logic_vector (4 downto 0); + TCK : in std_logic; + TDI : in std_logic; + TDO : out std_logic; + TMS : in std_logic; + TRST : in std_logic + ); +end jtag_top; diff --git a/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/top_linker.ngo b/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/top_linker.ngo new file mode 100644 index 0000000000000000000000000000000000000000..d06e4838db9f85b95da806848950a2adf8036425 GIT binary patch literal 69022 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%0Au<=h(`!qcMi!IL3Sc?1RAe@gajQxMC9^q!%nSoL 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 literal 0 HcmV?d00001 diff --git a/boards/uniboard2c/lattice_jtag/readme.txt b/boards/uniboard2c/lattice_jtag/readme.txt new file mode 100644 index 0000000000..6470067819 --- /dev/null +++ b/boards/uniboard2c/lattice_jtag/readme.txt @@ -0,0 +1,44 @@ +--------------------------------------------------------------------------- +Background +--------------------------------------------------------------------------- +The Lattice ECP3 FPGA is used to implement a JTAG scanbrid, the interface between the JTAG Test Access Point on UNB2c and the FPGA's and Ethernet PHY. With dipswitches the bridge can be set in mode: +- Bridge mode, all FPGA's and Ethernet phy can be accessed using JTAG boundary scan software +- stitch mode, a selection of parts (like all 4 FPGA) can be stitched in one JTAG chain. This is used for most of our applications + +FPGA: LCMXO2-640HC-5TG100C + +--------------------------------------------------------------------------- +Tools needed to build JTAG Scanbridge image +--------------------------------------------------------------------------- +- Diamond Diamond 3.12 + https://www.latticesemi.com/latticediamond#windows +- A license is needed. This license is free for 1 year + https://www.latticesemi.com/Support/Licensing/DiamondAndiCEcube2SoftwareLicensing/DiamondFree + +--------------------------------------------------------------------------- +How to build an Lattice JTAG image +--------------------------------------------------------------------------- +- Open UNB2_JTAG_SCANBRIDGE.ldf project file with Lattice Diamond. +- In Process tab, tick "JEDEC File" to make bit file +- Double click "Export Files" + +--------------------------------------------------------------------------- +Make SVF file (used in JTAG Provision to configure the FPGA) +--------------------------------------------------------------------------- +- Start Programmer +- Design -> Utilities -> Deployment Tool +- Function: Files Conversion, Output File Type IEEE 1532 ISC Data File --> OK +- Click on "SVF" button +- Add the jed file (hdl/boards/uniboard2c/lattice_jtag/UNB2_JTAG_SCANBRIDGE/UNB2_JTAG_SCANBRIDGE_UNB2_JTAG_SCANBRIDGE.jed) +- Click Next +- Set: + - Flash Erase, Program, Verify + - Write Header and Comments +- Click Next +- Click Generate + + + + + + diff --git a/boards/uniboard2c/lettuce_jtag/readme.txt b/boards/uniboard2c/lettuce_jtag/readme.txt deleted file mode 100644 index 0db68d75ec..0000000000 --- a/boards/uniboard2c/lettuce_jtag/readme.txt +++ /dev/null @@ -1 +0,0 @@ -Todo -- GitLab