rmadd95
Newbie level 3
This is my first post so i'm not sure if i'm in the right place or not, but i'm trying to take a 7 bit vector to define a character array and then display it to a 2x16 lcd screen. I think my states are screwed up but i don't know how to fix them. When I try to run it on the prototype board the screen clears as it should but then nothing shows up. Any help would be appreciated. I am also very new to VHDL so my code may not seem very refined haha.
Code:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
ENTITY lcd_disp IS
PORT (
reset, take, vend, l1, l2, clock : IN STD_LOGIC;
total : IN STD_LOGIC_VECTOR(6 DOWNTO 0);
lcd_data : OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
lcd_on, lcd_blon, lcd_en, lcd_rs, lcd_rw, led1, led2 : OUT STD_LOGIC
);
END lcd_disp;
ARCHITECTURE behave OF lcd_disp IS
TYPE state_type IS (s1, s2, s3, s4, s5, s6, s7);
SIGNAL state : state_type;
SUBTYPE char IS std_logic_vector(7 DOWNTO 0);
TYPE moneychar IS ARRAY (1 TO 8) OF char;
SIGNAL amount : moneychar;
SIGNAL count : INTEGER := 1;
SIGNAL init_count : INTEGER := 1;
CONSTANT initcodes : moneychar := (x"38", x"38", x"38", x"38", x"06", x"0E", x"01", x"FE");
BEGIN
display : PROCESS (total, reset, take, vend, clock)
BEGIN
lcd_on <= '1';
lcd_blon <= '1';
IF (total = "0000000") THEN
amount <= (x"24", x"30", x"2E", x"30", x"30", x"FE", x"FE", x"FE");
ELSIF (total = "0000101") THEN
amount <= (x"24", x"30", x"2E", x"30", x"35", x"FE", x"FE", x"FE");
ELSIF (total = "0001010") THEN
amount <= (x"24", x"30", x"2E", x"31", x"30", x"FE", x"FE", x"FE");
ELSIF (total = "0001111") THEN
amount <= (x"24", x"30", x"2E", x"31", x"35", x"FE", x"FE", x"FE");
ELSIF (total = "0010100") THEN
amount <= (x"24", x"30", x"2E", x"32", x"30", x"FE", x"FE", x"FE");
ELSIF (total = "0011001") THEN
amount <= (x"24", x"30", x"2E", x"32", x"35", x"FE", x"FE", x"FE");
ELSIF (total = "0011110") THEN
amount <= (x"24", x"30", x"2E", x"33", x"30", x"FE", x"FE", x"FE");
ELSIF (total = "0100011") THEN
amount <= (x"24", x"30", x"2E", x"33", x"35", x"FE", x"FE", x"FE");
ELSIF (total = "0101000") THEN
amount <= (x"24", x"30", x"2E", x"34", x"30", x"FE", x"FE", x"FE");
ELSIF (total = "0101101") THEN
amount <= (x"24", x"30", x"2E", x"34", x"35", x"FE", x"FE", x"FE");
ELSIF (total = "0110010") THEN
amount <= (x"24", x"30", x"2E", x"35", x"30", x"FE", x"FE", x"FE");
ELSIF (total = "0110111") THEN
amount <= (x"24", x"30", x"2E", x"35", x"35", x"FE", x"FE", x"FE");
ELSIF (total = "0111100") THEN
amount <= (x"24", x"30", x"2E", x"36", x"30", x"FE", x"FE", x"FE");
ELSIF (total = "1000001") THEN
amount <= (x"24", x"30", x"2E", x"36", x"35", x"FE", x"FE", x"FE");
ELSIF (total = "1000110") THEN
amount <= (x"24", x"30", x"2E", x"37", x"30", x"FE", x"FE", x"FE");
ELSIF (total = "1001011") THEN
amount <= (x"24", x"30", x"2E", x"37", x"35", x"FE", x"FE", x"FE");
ELSIF (total = "1010000") THEN
amount <= (x"24", x"30", x"2E", x"38", x"30", x"FE", x"FE", x"FE");
ELSIF (total = "1010101") THEN
amount <= (x"24", x"30", x"2E", x"38", x"35", x"FE", x"FE", x"FE");
ELSIF (total = "1011010") THEN
amount <= (x"24", x"30", x"2E", x"39", x"30", x"FE", x"FE", x"FE");
ELSIF (total = "1011111") THEN
amount <= (x"24", x"30", x"2E", x"39", x"35", x"FE", x"FE", x"FE");
ELSE
amount <= (x"24", x"31", x"2E", x"30", x"30", x"FE", x"FE", x"FE");
END IF;
IF (reset = '0') THEN
init_count <= 1;
count <= 1;
state <= s1;
ELSIF (clock'EVENT AND clock = '1') THEN
CASE state IS
WHEN s1 =>
lcd_data <= initcodes(init_count);
lcd_en <= '1';
lcd_rs <= '0';
lcd_rw <= '0';
state <= s2;
WHEN s2 =>
lcd_en <= '0';
init_count <= init_count + 1;
IF (count <= initcodes'length) THEN
state <= s1;
ELSE
state <= s3;
END IF;
WHEN s3 =>
lcd_data <= x"80";
lcd_en <= '1';
lcd_rs <= '0';
lcd_rw <= '0';
state <= s4;
WHEN s4 =>
lcd_en <= '0';
lcd_rs <= '1';
state <= s5;
WHEN s5 =>
lcd_data <= amount(count);
lcd_en <= '1';
lcd_rs <= '1';
lcd_rw <= '0';
state <= s6;
WHEN s6 =>
lcd_en <= '0';
state <= s7;
WHEN s7 =>
lcd_en <= '1';
count <= count + 1;
IF (count <= amount'length) THEN
state <= s3;
ELSE
state <= s1;
END IF;
led1 <= l1;
led2 <= l2;
END CASE;
END IF;
END PROCESS;
END behave;