IFD2303code.txt library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity LED_Driver is port ( clk: in std_logic; -- Clock input por: in std_logic; -- Power-On Reset a_bus: in std_logic_vector(3 downto 0); -- 4-Bit Address Bus d_bus: inout std_logic_vector(7 downto 0); -- 8-Bit Data Bus led_out: out std_logic); -- Output to Red LED end LED_Driver; architecture arch_LED_Driver of LED_Driver is signal Count: std_logic_vector(15 downto 0); -- Internal 16-Counter signal LedCtl: std_logic; -- LED Control signal LedMux: std_logic_vector(3 downto 0); -- Led Mode MUX Control signal LedOut: std_logic; -- Internal signal for Combitorial Logic begin counter: process (clk, por) begin if por = '0' then --If POR event Count <= "0000000000000000"; -- reset counter elsif clk='1' and clk'event then --If clk changed and is rising edge Count <= Count + 1; -- increment counter end if; end process counter; indicate_select: process (LedMux,Count,LedOut,LedCtl) begin if(LedCtl='1') then case LedMux is -- Governing equation for pulse width at 50% duty cycle -- PW = 0.5 * (2^n) * (1/f) -- Where n = Counter Bit used to drive LED, f = Clock Frequency when "0000" => led_out <= LedOut and Count(0); when "0001" => led_out <= LedOut and Count(1); when "0010" => led_out <= LedOut and Count(2); when "0011" => led_out <= LedOut and Count(3); when "0100" => led_out <= LedOut and Count(4); when "0101" => led_out <= LedOut and Count(5); when "0110" => led_out <= LedOut and Count(6); when "0111" => led_out <= LedOut and Count(7); when "1000" => led_out <= LedOut and Count(8); when "1001" => led_out <= LedOut and Count(9); when "1010" => led_out <= LedOut and Count(10); when "1011" => led_out <= LedOut and Count(11); when "1100" => led_out <= LedOut and Count(12); when "1101" => led_out <= LedOut and Count(13); when "1110" => led_out <= LedOut and Count(14); when "1111" => led_out <= LedOut and Count(15); when others => led_out <= '0'; --OFF end case; else led_out <= '0'; --OFF end if; end process indicate_select; write_bus: process(a_bus, por, d_bus) begin if (por = '0') then LedMux <= "0000"; LedOut <= '0'; LedCtl <= '0'; else case a_bus is when "0001" => LedCtl <= d_bus(5); LedOut <= d_bus(4); LedMux(3) <= d_bus(3); LedMux(2) <= d_bus(2); LedMux(1) <= d_bus(1); LedMux(0) <= d_bus(0); when others => null; end case; end if; end process write_bus; end arch_LED_Driver;