{-| Module : Ice40.Rgb Description : Ice40 RGB hard IP primitive Copyright : (c) David Cox, 2021 License : BSD 3-Clause Maintainer : standardsemiconductor@gmail.com RGB hard IP primitive from Lattice Ice Technology Library https://github.com/standardsemiconductor/VELDT-info/blob/master/SBTICETechnologyLibrary201708.pdf -} module Ice40.Rgb where import Clash.Prelude import Clash.Annotations.Primitive import Data.String.Interpolate (i) import Data.String.Interpolate.Util (unindent) {-# ANN rgbPrim (InlinePrimitive [Verilog] $ unindent [i| [ { "BlackBox" : { "name" : "Ice40.Rgb.rgbPrim" , "kind" : "Declaration" , "type" : "rgbPrim :: String -- currentMode ARG[0] -> String -- rgb0Current ARG[1] -> String -- rgb1Current ARG[2] -> String -- rgb2Current ARG[3] -> Signal dom Bit -- curren ARG[4] -> Signal dom Bit -- rgbleden ARG[5] -> Signal dom Bit -- rgb0Pwm ARG[6] -> Signal dom Bit -- rgb1Pwm ARG[7] -> Signal dom Bit -- rgb2Pwm ARG[8] -> Signal dom ( Bit -- rgb0 , Bit -- rgb1 , Bit -- rgb2 )" , "template" : "//SB_RGBA_DRV begin wire ~GENSYM[rgb0][0]; wire ~GENSYM[rgb1][1]; wire ~GENSYM[rgb2][2]; SB_RGBA_DRV #( .CURRENT_MODE ( ~ARG[0] ), .RGB0_CURRENT ( ~ARG[1] ), .RGB1_CURRENT ( ~ARG[2] ), .RGB2_CURRENT ( ~ARG[3] ) ) ~GENSYM[rgba_drv_inst][3] ( .CURREN ( ~ARG[4] ), .RGBLEDEN ( ~ARG[5] ), .RGB0PWM ( ~ARG[6] ), .RGB1PWM ( ~ARG[7] ), .RGB2PWM ( ~ARG[8] ), .RGB0 ( ~SYM[0] ), .RGB1 ( ~SYM[1] ), .RGB2 ( ~SYM[2] ) ); assign ~RESULT = {~SYM[0], ~SYM[1], ~SYM[2]}; //SB_RGBA_DRV end" } } ] |]) #-} -- | SB_RGBA_DRV primitive is the RGB LED drive module which contains 3 -- dedicated open drain I/O pins for RGB LED outputs. Each of the RGB LED -- output is bonded out together with an SB_IO_OD primitive to -- the package pin. User can either use SB_RGB_DRV primitive or the -- SB_IO_OD primitive to drive the package pin, but not both. -- -- The primitive allows configuration of each of the 3 RGB LED -- outputs individually. When the RGBx_CURRENT parameter of RGBx output is -- set to "0b000000", then SB_IO_OD can be used to drive -- the package pin. "0b000001" = 4mA for Full Mode; 2mA for -- Half Mode. "0b000011" = 8mA for Full Mode; 4mA for Half Mode. -- "0b000111" = 12mA for Full Mode; 6mA for Half Mode. -- "0b001111" = 16mA for Full Mode; 8mA for Half Mode. -- "0b011111" = 20mA for Full Mode; 10mA for Half Mode. -- "0b111111" = 24mA for Full Mode; 12mA for Half Mode. {-# NOINLINE rgbPrim #-} rgbPrim :: String -- ^ currentMode - Parameter values: "0b0" = Full Current Mode (Default), "0b1" = Half Current Mode. -> String -- ^ rgb0Current -> String -- ^ rgb1Current -> String -- ^ rgb2Current -> Signal dom Bit -- ^ curren - enable the mixed signal control block to supply reference current to the IR drivers. When it is not enabled (CURREN=0), no current is supplied, and the IR drivers are powered down. Enabling the mixed signal control block takes 100us to reach a stable reference current value. -> Signal dom Bit -- ^ rgbleden - enable the SB_RGB_DRV primitive. Active High. -> Signal dom Bit -- ^ rgb0Pwm - input data to drive RGB0 LED pin. This input is usually driven from the SB_LEDD_IP. -> Signal dom Bit -- ^ rgb1Pwm - input data to drive RGB1 LED pin. This input is usually driven from the SB_LEDD_IP. -> Signal dom Bit -- ^ rgb2Pwm - input data to drive RGB2 LED pin. This input is usually driven from teh SB_LEDD_IP. -> Signal dom ( Bit , Bit , Bit ) -- ^ (RGB0 LED output, RGB1 LED output, RGB2 LED output) rgbPrim !_ !_ !_ !_ !_ !_ !_ !_ !_ = pure (0, 0, 0)