kansas-lava-papilio-0.3.0: src/Hardware/KansasLava/Xilinx/DCM.hs
{-# LANGUAGE RecordWildCards #-}
module Hardware.KansasLava.Xilinx.DCM (dcm) where
import Language.Netlist.AST
-- | Interface to the Xilinx Digital Clock Manager module.
--
-- The DCM definition itself must be created separately in the Xilinx ISE as a
-- @.xaw@ file.
--
-- The following example creates a circuit running at 16 MHz with a native
-- clock signal of 32 MHz.
--
-- > kleg <- reifyFabric $ do
-- > theClk "CLK_16MHZ"
-- > fabric
-- > mod <- netlistCircuit modName kleg
-- > let mod' = dcm "dcm_32_to_16" "CLK_32MHZ" "CLK_16MHZ" mod
-- > vhdl = genVHDL mod' ["work.lava.all", "work.all"]
-- > return vhdl
dcm :: Ident -- ^ Name of the instantiated DCM module
-> Ident -- ^ @rawClock@: Name of the raw clock signal
-- (usually, connected via the UCF to some crystal)
-> Ident -- ^ @newClock@: Name of the new clock signal (the output of the DCM)
-> Module -- ^ Module using @newClock@ as its clock signal, to be wrapped
-> Module
dcm dcmName rawClock newClock Module{..} = Module name inputs outputs [] decls
where
name = module_name
inputs = (rawClock, Nothing) : filter ((/= newClock) . fst) module_inputs
outputs = module_outputs
decls = routing : dcmInst : module_decls
routing = NetDecl newClock Nothing Nothing
dcmInst = InstDecl ("work." ++ dcmName) ("inst_" ++ dcmName) []
[ ("clkin_in", ExprVar rawClock)
, ("clkin_ibufg_out", open)
]
[ ("clkfx_out", ExprVar newClock)
, ("clk0_out", open)
]
open = ExprVar "open"