-- -- VHDL Architecture Morse.charToMorseController.fsm -- -- Created: -- by - axel.amand.UNKNOWN (WE7860) -- at - 14:50:02 28.04.2023 -- -- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5) -- LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.numeric_std.all; ARCHITECTURE fsm OF charToMorseController IS TYPE STATE_TYPE IS ( waitForChar, storeChar, sendDotStart, sendDotWait, sendDotSpacerStart, sendDotSpacerWait, sendDotDotStart, sendDotDotWait, sendDotDashStart, sendDotDashWait, sendDashStart, sendDashWait, sendDahsSpacerStart, sendDashSpacerWait, sendDashDotStart, sendDashDashStart, sendDashDotWait, sendDashDashWait, popChar, popChar1 ); -- Declare current and next state signals SIGNAL current_state : STATE_TYPE; SIGNAL next_state : STATE_TYPE; BEGIN ----------------------------------------------------------------- clocked_proc : PROCESS ( clock, reset ) ----------------------------------------------------------------- BEGIN IF (reset = '1') THEN current_state <= waitForChar; ELSIF (clock'EVENT AND clock = '1') THEN current_state <= next_state; END IF; END PROCESS clocked_proc; ----------------------------------------------------------------- nextstate_proc : PROCESS ( char, charNotReady, counterDone, current_state ) ----------------------------------------------------------------- BEGIN CASE current_state IS WHEN waitForChar => IF (charNotReady = '0') THEN next_state <= storeChar; ELSE next_state <= waitForChar; END IF; WHEN storeChar => IF (character'val(to_integer(unsigned(char))) = 'e' or character'val(to_integer(unsigned(char))) = 'i' or character'val(to_integer(unsigned(char))) = 'a') THEN next_state <= sendDotStart; ELSIF (character'val(to_integer(unsigned(char))) = 't' or character'val(to_integer(unsigned(char))) = 'n' or character'val(to_integer(unsigned(char))) = 'm') THEN next_state <= sendDashStart; ELSE next_state <= popChar1; END IF; WHEN sendDotStart => next_state <= sendDotWait; WHEN sendDotWait => IF (counterDone = '0') THEN next_state <= sendDotWait; ELSIF (character'val(to_integer(unsigned(char))) = 'e') THEN next_state <= popChar1; ELSE next_state <= sendDotSpacerStart; END IF; WHEN sendDotSpacerStart => next_state <= sendDotSpacerWait; WHEN sendDotSpacerWait => IF (counterDone = '0') THEN next_state <= sendDotSpacerWait; ELSIF (character'val(to_integer(unsigned(char))) = 'i') THEN next_state <= sendDotDotStart; ELSE next_state <= sendDotDashStart; END IF; WHEN sendDotDotStart => next_state <= sendDotDotWait; WHEN sendDotDotWait => IF (counterDone = '0') THEN next_state <= sendDotDotWait; ELSE next_state <= popChar1; END IF; WHEN sendDotDashStart => next_state <= sendDotDashWait; WHEN sendDotDashWait => IF (counterDone = '0') THEN next_state <= sendDotDashWait; ELSE next_state <= popChar1; END IF; WHEN sendDashStart => next_state <= sendDashWait; WHEN sendDashWait => IF (counterDone = '0') THEN next_state <= sendDashWait; ELSIF (character'val(to_integer(unsigned(char))) = 't') THEN next_state <= popChar1; ELSE next_state <= sendDahsSpacerStart; END IF; WHEN sendDahsSpacerStart => next_state <= sendDashSpacerWait; WHEN sendDashSpacerWait => IF (counterDone = '0') THEN next_state <= sendDashSpacerWait; ELSIF (character'val(to_integer(unsigned(char))) = 'i') THEN next_state <= sendDashDotStart; ELSE next_state <= sendDashDashStart; END IF; WHEN sendDashDotStart => next_state <= sendDashDotWait; WHEN sendDashDashStart => next_state <= sendDashDashWait; WHEN sendDashDotWait => IF (counterDone = '0') THEN next_state <= sendDashDotWait; ELSE next_state <= popChar1; END IF; WHEN sendDashDashWait => IF (counterDone = '0') THEN next_state <= sendDashDashWait; ELSE next_state <= popChar1; END IF; WHEN popChar => IF (counterDone = '1') THEN next_state <= waitForChar; ELSE next_state <= popChar; END IF; WHEN popChar1 => next_state <= popChar; WHEN OTHERS => next_state <= waitForChar; END CASE; END PROCESS nextstate_proc; ----------------------------------------------------------------- output_proc : PROCESS ( current_state ) ----------------------------------------------------------------- BEGIN -- Default Assignment morseOut <= '0'; startCounter <= '0'; unitNb <= (others => '0'); readChar <= '0'; -- Combined Actions CASE current_state IS WHEN sendDotStart => startCounter <= '1'; WHEN sendDotWait => unitNb <= to_unsigned(1, unitNb'length); morseOut <= '1'; WHEN sendDotSpacerStart => startCounter <= '1'; WHEN sendDotSpacerWait => unitNb <= to_unsigned(1, unitNb'length); WHEN sendDotDotStart => startCounter <= '1'; WHEN sendDotDotWait => unitNb <= to_unsigned(1, unitNb'length); morseOut <= '1'; WHEN sendDotDashStart => startCounter <= '1'; WHEN sendDotDashWait => unitNb <= to_unsigned(3, unitNb'length); morseOut <= '1'; WHEN sendDashStart => startCounter <= '1'; WHEN sendDashWait => unitNb <= to_unsigned(3, unitNb'length); morseOut <= '1'; WHEN sendDahsSpacerStart => startCounter <= '1'; WHEN sendDashSpacerWait => unitNb <= to_unsigned(1, unitNb'length); WHEN sendDashDotStart => startCounter <= '1'; WHEN sendDashDashStart => startCounter <= '1'; WHEN sendDashDotWait => unitNb <= to_unsigned(1, unitNb'length); morseOut <= '1'; WHEN sendDashDashWait => unitNb <= to_unsigned(3, unitNb'length); morseOut <= '1'; WHEN popChar => unitNb <= to_unsigned(3, unitNb'length); WHEN popChar1 => readChar <= '1'; startCounter <= '1'; WHEN OTHERS => NULL; END CASE; END PROCESS output_proc; END fsm;