Juraj's Blog

01 Sep 2020

Adventures in hardware, part 4 - LED expander

Why more LEDs?

During the process of developing a 4x4 keypad reader I realized I need more LEDs for diagnostic information. As my Elbert v2 has plenty of digital input/output pins, it should only be a matter of wiring the LEDs to the IOs.

External LEDs should be connected serially through a resistor - otherwise, if connected directly, they will draw as much current as they can and will burn (hopefully sacrificing themselves to save the development board 🙂).

Determining the resistor value

I admit upfront that I picked a 1 kΩ resistor out of laziness(and I couldn’t find any 330 Ω ones in my resistor bag).

To do it properly, one should calculate the resistor value as

Resistor value [Ω] = (Supply voltage [V] - LED forward voltage [V]) / desired LED current [A]

Forward voltage of the LEDs (measured across the illuminated ED with a voltmeter):

Color Vf
Red 1.71
Blue 2.57
Green 1.88
Orange 1.88
White 2.60

The pin voltage is 3.3V, the forward voltage of my LEDs ranges from 1.71 to 2.6 V, so according to Ohm’s law:

# red LED (dimmest) at 1.59 mA
R = V/I = (3.3V - 1.71V) / ??? A = 1000Ω
1.59V / 1.59 mA = 1000 Ω 

# white LED (brightest) at 2.6 mA
2.6V / 2.6 mA = 1000 Ω 

Connecting to the Elbert V2 board

I used the P2 Pmod header as my P1 header is already occupied by the keypad. That meant declaring the pins 3-8,10,11 (according to the datasheet) in my .ucf file as.

NET "led_ext[0]"           LOC = P10   | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;

Lighting the LEDs

A short VHDL module builds up the logic to illuminate the LEDs on a button press.

entity top_module is
    Port ( Clk : in  STD_LOGIC;
           led_ext : out  STD_LOGIC_VECTOR(7 downto 0);
           button0 : in  STD_LOGIC);
end top_module;

architecture Behavioral of top_module is
begin
	process(clk) begin
		if rising_edge(clk) then
			for i in 0 to 7 loop
				led_ext(i) <= not button0;
			end loop;
		end if;
	end process;
end Behavioral;

The result

Now I have eight more LEDs for debugging, with some space to add eight more on this breadboard if necessary!

more lights