Created on: 18 March 2013
The VHDL case statement is used to sequence various patterns on eight LEDs. This is the final tutorial in this VHDL CPLD course.
The code listing for the VHDL case statement LED display is shown below.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity case_display_top is Generic ( CLK_BIT : INTEGER := 4); Port ( CLK : in STD_LOGIC; LED : out STD_LOGIC_VECTOR (7 downto 0)); end case_display_top; architecture Behavioral of case_display_top is signal clk_div : STD_LOGIC_VECTOR (CLK_BIT downto 0); signal count : STD_LOGIC_VECTOR (4 downto 0) := "00000"; begin -- clock divider process (CLK) begin if (CLK'Event and CLK = '1') then clk_div <= clk_div + '1'; end if; end process; -- counter process (clk_div(CLK_BIT)) begin if (clk_div(CLK_BIT)'Event and clk_div(CLK_BIT) = '1') then count <= count + '1'; end if; end process; -- LED display process (count) begin -- display different LED pattern for each count value case count is when "00000" => LED <= not "10000001"; when "00001" => LED <= not "01000010"; when "00010" => LED <= not "00100100"; when "00011" => LED <= not "00011000"; when "00100" => LED <= not "00100100"; when "00101" => LED <= not "01000010"; when "00110" => LED <= not "10000001"; when "00111" => LED <= not "11000011"; when "01000" => LED <= not "11100111"; when "01001" => LED <= not "11111111"; when "01010" => LED <= not "11100111"; when "01011" => LED <= not "11000011"; when "01100" => LED <= not "10000001"; when "01101" => LED <= not "00000000"; when "01110" => LED <= not "10000000"; when "01111" => LED <= not "01000000"; when "10000" => LED <= not "01100000"; when "10001" => LED <= not "01100000"; when "10010" => LED <= not "01110000"; when "10011" => LED <= not "01111000"; when "10100" => LED <= not "01111100"; when "10101" => LED <= not "01111110"; -- skip some numbers in count sequence when "10111" => LED <= not "10101010"; when "11000" => LED <= not "01010101"; when "11001" => LED <= not "10101010"; when "11010" => LED <= not "01010101"; when others => LED <= not "00000000"; end case; end process; end Behavioral;
A VHDL case statement is sequential, so must be put inside a process.
In the above code, the case statement checks to see if count has a value of "00000", "00001", "00011", etc. If there is a match, then the statement to the right of => will be executed.
The count register counts from 00000b to 11111b and then wraps around to 00000b again. Every count number that matches in the case statement results in a pattern being written to the LEDs.
If there is no matching number for count in the case statement, then the default pattern is displayed which is all the LEDs off as shown in this line of code:
when others => LED <= not "00000000";
Every case statement in VHDL must have a default value using the VHDL others keyword.