library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; LIBRARY lpm; USE lpm.lpm_components.ALL; --this file does the actual displaying of ascii letters and numbers on the LCD --display entity projectlcdcontroller is generic(lcdcontroller: positive := 8; PaceMODULUS : STRING := "32"; Pacewidth: positive:= 6; Sequencewidth: positive:= 6; Seqmodulus: string:= "38"; FF_Width: positive := 1 ); port ( clock: in std_logic; reset: in std_logic; windfirstdir: in std_logic_vector(lcdcontroller-1 downto 0); windseconddir: in std_logic_vector(lcdcontroller-1 downto 0); windthirddir: in std_logic_vector(lcdcontroller-1 downto 0); polarityoutascii: in std_logic_vector(lcdcontroller-1 downto 0); number5: in std_logic_vector(lcdcontroller-1 downto 0); number4: in std_logic_vector(lcdcontroller-1 downto 0); number3: in std_logic_vector(lcdcontroller-1 downto 0); number2: in std_logic_vector(lcdcontroller-1 downto 0); number1: in std_logic_vector(lcdcontroller-1 downto 0); windq1: in std_logic_vector(lcdcontroller-1 downto 0); windtq10: in std_logic_vector(lcdcontroller-1 downto 0); windhq100: in std_logic_vector(lcdcontroller-1 downto 0); rs: out std_logic; e: buffer std_logic; LCDdataout: buffer std_logic_vector(lcdcontroller-1 downto 0)); end projectlcdcontroller; architecture behaviour of projectlcdcontroller is --constants which are used for setting up the LCD controller --constants for the modes constant functionset: std_logic_vector(lcdcontroller-1 downto 0):= "00111000"; constant displayonoff: std_logic_vector(lcdcontroller-1 downto 0):= "00001110"; constant entrymodeset: std_logic_vector(lcdcontroller-1 downto 0):= "00000110"; constant displaycursorhome :std_logic_vector(lcdcontroller-1 downto 0):= "00000010"; --constants used for comparisions, since the Altera chip goes at 25 MHz and --the display only works at less than 1 MHz, all values being displayed on the --the display had to be slowed down, the following constants were used for the --slowing down of the LCD controller --constants for the q, goes up by increments of 32 constant q1a: std_logic_vector(lcdcontroller-3 downto 0):= "000001"; constant q2a: std_logic_vector(lcdcontroller-3 downto 0):= "000010"; constant q3a: std_logic_vector(lcdcontroller-3 downto 0):= "000011"; constant q4a: std_logic_vector(lcdcontroller-3 downto 0):= "000100"; constant q5a: std_logic_vector(lcdcontroller-3 downto 0):= "000101"; constant q6a: std_logic_vector(lcdcontroller-3 downto 0):= "000110"; constant q7a: std_logic_vector(lcdcontroller-3 downto 0):= "000111"; constant q8a: std_logic_vector(lcdcontroller-3 downto 0):= "001000"; constant q9a: std_logic_vector(lcdcontroller-3 downto 0):= "001001"; constant q10: std_logic_vector(lcdcontroller-3 downto 0):= "001010"; constant q11: std_logic_vector(lcdcontroller-3 downto 0):= "001011"; constant q12: std_logic_vector(lcdcontroller-3 downto 0):= "001100"; constant q13: std_logic_vector(lcdcontroller-3 downto 0):= "001101"; constant q14: std_logic_vector(lcdcontroller-3 downto 0):= "001110"; constant q15: std_logic_vector(lcdcontroller-3 downto 0):= "001111"; constant q16: std_logic_vector(lcdcontroller-3 downto 0):= "010000"; constant q17: std_logic_vector(lcdcontroller-3 downto 0):= "010001"; constant q18: std_logic_vector(lcdcontroller-3 downto 0):= "010010"; constant q19: std_logic_vector(lcdcontroller-3 downto 0):= "010011"; constant q20: std_logic_vector(lcdcontroller-3 downto 0):= "010100"; constant q21: std_logic_vector(lcdcontroller-3 downto 0):= "010101"; constant q22: std_logic_vector(lcdcontroller-3 downto 0):= "010110"; constant q23: std_logic_vector(lcdcontroller-3 downto 0):= "010111"; constant q24: std_logic_vector(lcdcontroller-3 downto 0):= "011000"; constant q25: std_logic_vector(lcdcontroller-3 downto 0):= "011001"; constant q26: std_logic_vector(lcdcontroller-3 downto 0):= "011010"; constant q27: std_logic_vector(lcdcontroller-3 downto 0):= "011011"; constant q28: std_logic_vector(lcdcontroller-3 downto 0):= "011100"; constant q29: std_logic_vector(lcdcontroller-3 downto 0):= "011101"; constant q30: std_logic_vector(lcdcontroller-3 downto 0):= "011110"; constant q31 :std_logic_vector(lcdcontroller-3 downto 0):= "011111"; constant q32: std_logic_vector(lcdcontroller-3 downto 0):= "100000"; constant q33: std_logic_vector(lcdcontroller-3 downto 0):= "100001"; constant q34: std_logic_vector(lcdcontroller-3 downto 0):= "100010"; constant q35: std_logic_vector(lcdcontroller-3 downto 0):= "100011"; constant q36: std_logic_vector(lcdcontroller-3 downto 0):= "100100"; constant q37 :std_logic_vector(lcdcontroller-3 downto 0):= "100101"; constant q38: std_logic_vector(lcdcontroller-3 downto 0):= "100110"; constant q39 :std_logic_vector(lcdcontroller-3 downto 0):= "100111"; constant q40: std_logic_vector(lcdcontroller-3 downto 0):= "101000"; constant qzer: std_logic_vector(lcdcontroller-3 downto 0):= "000000"; --constants for the letters that are printed on the LCD controller constant letterw: std_logic_vector(lcdcontroller-1 downto 0) := "01010111"; constant letters: std_logic_vector(lcdcontroller-1 downto 0) := "01010011"; constant letterd: std_logic_vector(lcdcontroller-1 downto 0) := "01000100"; constant space: std_logic_vector(lcdcontroller-1 downto 0):= "00100000"; constant secondline: std_logic_vector(lcdcontroller-1 downto 0):= "11000000"; constant lettert: std_logic_vector(lcdcontroller-1 downto 0):= "01010100"; constant lettere: std_logic_vector(lcdcontroller-1 downto 0):= "01000101"; constant letterm: std_logic_vector(lcdcontroller-1 downto 0):= "01001101"; constant letterp: std_logic_vector(lcdcontroller-1 downto 0):= "01010000"; constant letterr: std_logic_vector(lcdcontroller-1 downto 0):= "01010010"; constant lettera: std_logic_vector(lcdcontroller-1 downto 0):= "01000001"; constant letteri: std_logic_vector(lcdcontroller-1 downto 0):= "01001001"; constant lettern: std_logic_vector(lcdcontroller-1 downto 0):= "01001110"; constant period: std_logic_vector(lcdcontroller-1 downto 0):= "00101110"; constant Degree: std_logic_vector(lcdcontroller-1 downto 0):= "11011111"; constant letterC: std_logic_vector(lcdcontroller-1 downto 0):= "01000011"; --declarations of signals signal qLO: std_logic_vector(lcdcontroller-3 downto 0); signal qHI: std_logic_vector(lcdcontroller-3 downto 0); signal values: std_logic_vector(15 downto 0); signal values1: std_logic_vector(15 downto 0); signal values2: std_logic_vector(15 downto 0); signal q: std_logic_vector(Sequencewidth-1 downto 0); signal ev: std_logic_vector(FF_Width - 1 downto 0); signal ChangSeq: std_logic; signal CountEn2: std_logic; begin --the following are lpm_counters. These counters were used to slow down the --clock before the values could be printed to the display. The counters --work in sequence, meaning first one counter counts to 32, then the second counter --increments its value. The last counter increments when the second counter has --incremented to 32. The counters "roll over" when they reach 32. Pacecounter : lpm_counter GENERIC MAP (LPM_WIDTH => PaceWidth, LPM_TYPE => L_COUNTER, LPM_MODULUS => PaceMODULUS) PORT MAP ( clock=> clock, sclr=> reset, eq=> values2); Pacecounter1 : lpm_counter GENERIC MAP (LPM_WIDTH => PaceWidth, LPM_TYPE => L_COUNTER, -- , LPM_MODULUS => PaceMODULUS) PORT MAP ( clock=> clock, sclr=> reset, cnt_en => values2(1), eq=> values1); Pacecounter2 : lpm_counter GENERIC MAP (LPM_WIDTH => PaceWidth, LPM_TYPE => L_COUNTER, -- , LPM_MODULUS => PaceMODULUS) PORT MAP ( clock=> clock, sclr=> reset, cnt_en => CountEn2, eq=> values); Sequencecounter : lpm_counter GENERIC MAP (LPM_WIDTH => Sequencewidth, LPM_TYPE => L_COUNTER, LPM_MODULUS => SeqMODULUS) PORT MAP ( clock=> clock, sclr=> reset, cnt_en => ChangSeq, q => q); --used flip flops to latch values LCD_Clock : lpm_ff GENERIC MAP ( LPM_WIDTH => FF_Width, LPM_FFTYPE=> "DFF" -- LPM_TYPE: STRING := L_FF ) PORT MAP ( clock=> clock, data => ev, sclr=> values(0), sset => values(15), q => ev); combinational_logic: process(clock, q) begin CountEn2 <= values2(1) and values1(1); ChangSeq <= values2(1) and values1(1) and values(1); e <= ev(0); --the following if/elsif statements are the sequence of values and functions --that are sent to the LCD controller if (q = q1a) then rs <= '0'; LCDdataout <= functionset; --display on/off elsif (q = q2a) then LCDdataout <= displayonoff; --entry mode set, set to increment the address counter and shift the cursor to the right -- the display does not shift elsif (q = q3a) then LCDdataout <=entrymodeset; -- write letters ws in the DD Ram, cursor shifts to right elsif (q = q4a) then rs <= '1'; LCDdataout <= letterw; elsif (q = q5a) then rs <= '1'; LCDdataout <=letters; elsif (q = q6a) then rs <= '1'; LCDdataout <= space; --write the numbers from the wind speed module elsif (q = q7a) then rs <= '1'; LCDdataout <= windhq100; elsif (q = q8a) then rs <= '1'; LCDdataout <= windtq10; elsif (q = q9a) then rs <= '1'; LCDdataout <= windq1; --write the letters space, wd elsif (q = q10) then rs <= '1'; LCDdataout <= space; elsif (q = q11) then rs <= '1'; LCDdataout <= letterw; elsif (q = q12) then rs <= '1'; LCDdataout <= letterd; elsif (q = q13) then rs <= '1'; LCDdataout <= space; --write letters here from the wind direction elsif (q = q14) then rs <= '1'; LCDdataout <= windfirstdir; elsif (q = q15) then rs <= '1'; LCDdataout <= windseconddir; elsif (q = q16) then rs <= '1'; LCDdataout <= windthirddir; elsif (q = q17) then rs <= '1'; LCDdataout <= space; elsif (q = q18) then rs <= '1'; LCDdataout <= space; elsif (q = q19) then rs <= '1'; LCDdataout <= space; elsif (q = q20) then rs <= '0'; LCDdataout <=secondline; --start writing the words temp with a space following it elsif (q = q21) then rs <= '1'; LCDdataout <= lettert; elsif (q = q22) then rs <= '1'; LCDdataout <= lettere; elsif (q = q23) then rs <= '1'; LCDdataout <= letterm; elsif (q = q24) then rs <= '1'; LCDdataout <= letterp; elsif (q = q25) then rs <= '1'; LCDdataout <= space; --insert numbers for temp here elsif (q = q26) then rs <= '1'; LCDdataout <= polarityoutascii; elsif (q = q27) then rs <= '1'; LCDdataout <= number5; --LCDdataout <= space; elsif (q = q28) then rs <= '1'; LCDdataout <= number4; elsif (q = q29) then rs <= '1'; LCDdataout <= number3; elsif (q = q30) then rs <= '1'; LCDdataout <= period; elsif (q = q31) then rs <= '1'; LCDdataout <= number2; elsif (q = q32) then rs <= '1'; LCDdataout <= number1; elsif (q = q33) then rs <= '1'; LCDdataout <= space; elsif (q = q34) then rs <= '1'; LCDdataout <= space; elsif (q = q35) then rs <= '1'; LCDdataout <= space; elsif (q = q36) then rs <= '1'; LCDdataout <= space; --restore the display and cursor to the initial positions else rs <= '0'; LCDdataout <= displaycursorhome; end if; end process combinational_logic; end behaviour;