-- Example of how to use the RGB LED hardware blocks in the Lattice iCE40 Ultra
-- sjm Sept 2017

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity led is
	port (
		clk : in std_logic;
		red : out std_logic;
		green : out std_logic;
		blue : out std_logic
	);
end entity led;

architecture rtl of led is

component SB_RGB_DRV is
	generic (
		RGB0_CURRENT: string:="0b000000"; 
		RGB1_CURRENT: string:="0b000000";
		RGB2_CURRENT: string:="0b000000"
	);
	port (	
		RGBPU : in std_logic;
		RGBLEDEN : in std_logic;
		RGB0PWM : in std_logic;
		RGB1PWM : in std_logic;
		RGB2PWM : in std_logic;
		RGB0 : out std_logic;
		RGB1 : out std_logic;
		RGB2 : out std_logic
	);
end component;

component SB_LED_DRV_CUR is
	port (	
		EN : in std_logic;
		LEDPU : out std_logic
	);
end component;

component SB_RGB_IP is
	port (	
		CLK : in std_logic;
		RST : in std_logic;
		PARAMSOK : in std_logic;
		RGBCOLOR : in std_logic_vector(3 downto 0);
		BRIGHTNESS : in std_logic_vector(3 downto 0);
		BREATHRAMP : in std_logic_vector(3 downto 0);
		BLINKRATE : in std_logic_vector(3 downto 0);
		REDPWM : out std_logic;
		GREENPWM : out std_logic;
		BLUEPWM : out std_logic
	);
end component;

signal led_power : std_logic := '0';
signal red_pwm_sig : std_logic := '0';
signal green_pwm_sig : std_logic := '0';
signal blue_pwm_sig : std_logic := '0';

begin -- arch

mycur : SB_LED_DRV_CUR
	port map( 
		EN => '1',
		LEDPU => led_power
	);

-- RGBx_CURRENT:
-- 000000 = 0mA
-- 000001 = 4mA
-- 000011 = 8mA
-- 000111 = 12mA
-- 001111 = 16mA
-- 011111 = 20mA
-- 111111 = 24mA

myrgb : SB_RGB_DRV
	GENERIC MAP (
		RGB0_CURRENT => "0b000001",
		RGB1_CURRENT => "0b000001",
		RGB2_CURRENT => "0b000001"
	)
	PORT MAP (
		RGBPU => led_power,
		RGBLEDEN => '1',
		RGB0PWM => red_pwm_sig,
		RGB1PWM => green_pwm_sig,
		RGB2PWM => blue_pwm_sig,
		RGB0 => red,
		RGB1 => green,
		RGB2 => blue
	);

-- BREATHRAMP/BLINKRATE:
-- 0000 = 0s
-- 0001 = 1/16s
-- 0010 = 1/8s
-- 0011 = 1/4s
-- 0100 = 1/2s
-- 0101 = 1s
-- 0110 = 2s
-- 0111 = 4s
-- others = 4s

-- RGBCOLOR:
-- 0000 = red
-- 0001 = red/green
-- 0010 = red/green
-- 0011 = red/green
-- 0100 = green
-- 0101 = green/blue
-- 0110 = green/blue
-- 0111 = green/blue
-- 1000 = blue
-- 1001 = blue/red
-- 1010 = blue/red
-- 1011 = blue/red
-- 1100 = off
-- 1101 = off
-- 1110 = off
-- 1111 = white? (blue/red)

mypwm : 	SB_RGB_IP
	PORT MAP (
		CLK => clk,
		RST => '0',
		PARAMSOK => '1',
		RGBCOLOR => "0000",
		BRIGHTNESS => "0001",
		BREATHRAMP => "0110",
		BLINKRATE => "0110",
		REDPWM => red_pwm_sig,
		GREENPWM => green_pwm_sig,
		BLUEPWM => blue_pwm_sig
	);

	process
	begin
		wait until rising_edge(clk);
	end process;

end rtl;
