548 lines
18 KiB
VHDL
548 lines
18 KiB
VHDL
ARCHITECTURE studentVersion OF charToMorseController IS
|
|
|
|
signal isA, isB, isC, isD, isE, isF, isG, isH,
|
|
isI, isJ, isK, isL, isM, isN, isO, isP,
|
|
isQ, isR, isS, isT, isU, isV, isW, isX,
|
|
isY, isZ,
|
|
is0, is1, is2, is3, is4, is5, is6, is7,
|
|
is8, is9 : std_ulogic;
|
|
|
|
type T_MORSE is (SHORT, LONG, SPACE, END_WORD);
|
|
--type registers_type is array (1 to 5) of T_MORSE;
|
|
signal register1: T_MORSE;
|
|
signal register2: T_MORSE;
|
|
signal register3: T_MORSE;
|
|
signal register4: T_MORSE;
|
|
signal register5: T_MORSE;
|
|
|
|
TYPE GENERAL_STATE_TYPE IS (
|
|
waitForChar,
|
|
storeChar,
|
|
sendRegisters,
|
|
sended
|
|
);
|
|
signal general_current_state, general_next_state : GENERAL_STATE_TYPE;
|
|
|
|
TYPE SENDING_STATE_TYPE IS (
|
|
waiting,
|
|
sendR1,
|
|
waitR1,
|
|
sendR2,
|
|
waitR2,
|
|
sendR3,
|
|
waitR3,
|
|
sendR4,
|
|
waitR4,
|
|
sendR5,
|
|
waitSpace,
|
|
waitEndWord
|
|
);
|
|
signal sending_current_state, sending_next_state : SENDING_STATE_TYPE;
|
|
|
|
signal signSendRegisters, signRegistersSended: std_ulogic;
|
|
|
|
BEGIN
|
|
------------------------------------------------------------------------------
|
|
-- conditions for morse units
|
|
isA <= '1' when std_match(unsigned(char), "1-0" & x"1") else '0'; -- 1-0 0001
|
|
isB <= '1' when std_match(unsigned(char), "1-0" & x"2") else '0'; -- 1-0 0010
|
|
isC <= '1' when std_match(unsigned(char), "1-0" & x"3") else '0'; -- 1-0 0011
|
|
isD <= '1' when std_match(unsigned(char), "1-0" & x"4") else '0'; -- 1-0 0100
|
|
isE <= '1' when std_match(unsigned(char), "1-0" & x"5") else '0'; -- 1-0 0101
|
|
isF <= '1' when std_match(unsigned(char), "1-0" & x"6") else '0'; -- 1-0 0110
|
|
isG <= '1' when std_match(unsigned(char), "1-0" & x"7") else '0'; -- 1-0 0111
|
|
isH <= '1' when std_match(unsigned(char), "1-0" & x"8") else '0'; -- 1-0 1000
|
|
isI <= '1' when std_match(unsigned(char), "1-0" & x"9") else '0'; -- 1-0 1001
|
|
isJ <= '1' when std_match(unsigned(char), "1-0" & x"A") else '0'; -- 1-0 1010
|
|
isK <= '1' when std_match(unsigned(char), "1-0" & x"B") else '0'; -- 1-0 1011
|
|
isL <= '1' when std_match(unsigned(char), "1-0" & x"C") else '0'; -- 1-0 1100
|
|
isM <= '1' when std_match(unsigned(char), "1-0" & x"D") else '0'; -- 1-0 1101
|
|
isN <= '1' when std_match(unsigned(char), "1-0" & x"E") else '0'; -- 1-0 1110
|
|
isO <= '1' when std_match(unsigned(char), "1-0" & x"F") else '0'; -- 1-0 1111
|
|
isP <= '1' when std_match(unsigned(char), "1-1" & x"0") else '0'; -- 1-1 0000
|
|
isQ <= '1' when std_match(unsigned(char), "1-1" & x"1") else '0'; -- 1-1 0001
|
|
isR <= '1' when std_match(unsigned(char), "1-1" & x"2") else '0'; -- 1-1 0010
|
|
isS <= '1' when std_match(unsigned(char), "1-1" & x"3") else '0'; -- 1-1 0011
|
|
isT <= '1' when std_match(unsigned(char), "1-1" & x"4") else '0'; -- 1-1 0100
|
|
isU <= '1' when std_match(unsigned(char), "1-1" & x"5") else '0'; -- 1-1 0101
|
|
isV <= '1' when std_match(unsigned(char), "1-1" & x"6") else '0'; -- 1-1 0110
|
|
isW <= '1' when std_match(unsigned(char), "1-1" & x"7") else '0'; -- 1-1 0111
|
|
isX <= '1' when std_match(unsigned(char), "1-1" & x"8") else '0'; -- 1-1 1000
|
|
isY <= '1' when std_match(unsigned(char), "1-1" & x"9") else '0'; -- 1-1 1001
|
|
isZ <= '1' when std_match(unsigned(char), "1-1" & x"A") else '0'; -- 1-1 1010
|
|
is0 <= '1' when std_match(unsigned(char), "011" & x"0") else '0'; -- 011 0000
|
|
is1 <= '1' when std_match(unsigned(char), "011" & x"1") else '0'; -- 011 0001
|
|
is2 <= '1' when std_match(unsigned(char), "011" & x"2") else '0'; -- 011 0010
|
|
is3 <= '1' when std_match(unsigned(char), "011" & x"3") else '0'; -- 011 0011
|
|
is4 <= '1' when std_match(unsigned(char), "011" & x"4") else '0'; -- 011 0100
|
|
is5 <= '1' when std_match(unsigned(char), "011" & x"5") else '0'; -- 011 0101
|
|
is6 <= '1' when std_match(unsigned(char), "011" & x"6") else '0'; -- 011 0110
|
|
is7 <= '1' when std_match(unsigned(char), "011" & x"7") else '0'; -- 011 0111
|
|
is8 <= '1' when std_match(unsigned(char), "011" & x"8") else '0'; -- 011 1000
|
|
is9 <= '1' when std_match(unsigned(char), "011" & x"9") else '0'; -- 011 1001
|
|
------------------------------------------------------------------------------
|
|
|
|
process(reset, clock) begin
|
|
if reset = '1' then
|
|
general_current_state <= waitForChar;
|
|
sending_current_state <= waiting;
|
|
elsif rising_edge(clock) then
|
|
general_current_state <= general_next_state;
|
|
sending_current_state <= sending_next_state;
|
|
end if;
|
|
end process;
|
|
|
|
|
|
process(reset, clock) begin
|
|
if reset = '1' then
|
|
register1 <= SPACE;
|
|
register2 <= SPACE;
|
|
register3 <= SPACE;
|
|
register4 <= SPACE;
|
|
register5 <= SPACE;
|
|
signSendRegisters <= '0';
|
|
elsif rising_edge(clock) then
|
|
|
|
case general_current_state is
|
|
when waitForChar =>
|
|
--report "General current state is wait for char" severity note;
|
|
register1 <= SPACE;
|
|
register2 <= SPACE;
|
|
register3 <= SPACE;
|
|
register4 <= SPACE;
|
|
register5 <= SPACE;
|
|
signSendRegisters <= '0';
|
|
if charNotReady = '0' then
|
|
general_next_state <= storeChar;
|
|
readChar <= '1';
|
|
report "charReady" severity note;
|
|
else
|
|
general_next_state <= waitForChar;
|
|
readChar <= '0';
|
|
--report "charNotReady" severity note;
|
|
end if;
|
|
|
|
when storeChar =>
|
|
report "General current state is store char" severity note;
|
|
if isA then
|
|
register1 <= SHORT;
|
|
register2 <= LONG;
|
|
general_next_state <= sendRegisters;
|
|
report "New char: A" severity note;
|
|
elsif isB then
|
|
register1 <= LONG;
|
|
register2 <= SHORT;
|
|
register3 <= SHORT;
|
|
register4 <= SHORT;
|
|
general_next_state <= sendRegisters;
|
|
elsif isC then
|
|
register1 <= LONG;
|
|
register2 <= SHORT;
|
|
register3 <= LONG;
|
|
register4 <= SHORT;
|
|
general_next_state <= sendRegisters;
|
|
elsif isD then
|
|
register1 <= LONG;
|
|
register2 <= SHORT;
|
|
register3 <= SHORT;
|
|
general_next_state <= sendRegisters;
|
|
elsif isE then
|
|
register1 <= SHORT;
|
|
general_next_state <= sendRegisters;
|
|
report "New char: E" severity note;
|
|
elsif isF then
|
|
register1 <= SHORT;
|
|
register2 <= SHORT;
|
|
register3 <= LONG;
|
|
register4 <= SHORT;
|
|
general_next_state <= sendRegisters;
|
|
elsif isG then
|
|
register1 <= LONG;
|
|
register2 <= LONG;
|
|
register3 <= SHORT;
|
|
general_next_state <= sendRegisters;
|
|
elsif isH then
|
|
register1 <= SHORT;
|
|
register2 <= SHORT;
|
|
register3 <= SHORT;
|
|
register4 <= SHORT;
|
|
general_next_state <= sendRegisters;
|
|
elsif isI then
|
|
register1 <= SHORT;
|
|
register2 <= SHORT;
|
|
general_next_state <= sendRegisters;
|
|
report "New char: I" severity note;
|
|
elsif isJ then
|
|
register1 <= SHORT;
|
|
register2 <= LONG;
|
|
register3 <= LONG;
|
|
register4 <= LONG;
|
|
general_next_state <= sendRegisters;
|
|
elsif isK then
|
|
register1 <= LONG;
|
|
register2 <= SHORT;
|
|
register3 <= LONG;
|
|
general_next_state <= sendRegisters;
|
|
elsif isL then
|
|
register1 <= SHORT;
|
|
register2 <= LONG;
|
|
register3 <= SHORT;
|
|
register4 <= SHORT;
|
|
general_next_state <= sendRegisters;
|
|
elsif isM then
|
|
register1 <= LONG;
|
|
register2 <= LONG;
|
|
general_next_state <= sendRegisters;
|
|
report "New char: M" severity note;
|
|
elsif isN then
|
|
register1 <= LONG;
|
|
register2 <= SHORT;
|
|
general_next_state <= sendRegisters;
|
|
elsif isO then
|
|
register1 <= LONG;
|
|
register2 <= LONG;
|
|
register3 <= LONG;
|
|
general_next_state <= sendRegisters;
|
|
elsif isP then
|
|
register1 <= SHORT;
|
|
register2 <= LONG;
|
|
register3 <= LONG;
|
|
register4 <= SHORT;
|
|
general_next_state <= sendRegisters;
|
|
elsif isQ then
|
|
register1 <= LONG;
|
|
register2 <= LONG;
|
|
register3 <= SHORT;
|
|
register4 <= LONG;
|
|
general_next_state <= sendRegisters;
|
|
elsif isR then
|
|
register1 <= SHORT;
|
|
register2 <= LONG;
|
|
register3 <= SHORT;
|
|
general_next_state <= sendRegisters;
|
|
elsif isS then
|
|
register1 <= SHORT;
|
|
register2 <= SHORT;
|
|
register3 <= SHORT;
|
|
general_next_state <= sendRegisters;
|
|
elsif isT then
|
|
register1 <= LONG;
|
|
general_next_state <= sendRegisters;
|
|
report "New char: T" severity note;
|
|
elsif isU then
|
|
register1 <= SHORT;
|
|
register2 <= SHORT;
|
|
register3 <= LONG;
|
|
general_next_state <= sendRegisters;
|
|
elsif isV then
|
|
register1 <= SHORT;
|
|
register2 <= SHORT;
|
|
register3 <= SHORT;
|
|
register4 <= LONG;
|
|
general_next_state <= sendRegisters;
|
|
elsif isW then
|
|
register1 <= SHORT;
|
|
register2 <= LONG;
|
|
register3 <= LONG;
|
|
general_next_state <= sendRegisters;
|
|
elsif isX then
|
|
register1 <= LONG;
|
|
register2 <= SHORT;
|
|
register3 <= SHORT;
|
|
register4 <= LONG;
|
|
general_next_state <= sendRegisters;
|
|
elsif isY then
|
|
register1 <= LONG;
|
|
register2 <= SHORT;
|
|
register3 <= LONG;
|
|
register4 <= LONG;
|
|
general_next_state <= sendRegisters;
|
|
elsif isZ then
|
|
register1 <= LONG;
|
|
register2 <= LONG;
|
|
register3 <= SHORT;
|
|
register4 <= SHORT;
|
|
general_next_state <= sendRegisters;
|
|
elsif is0 then
|
|
register1 <= LONG;
|
|
register2 <= LONG;
|
|
register3 <= LONG;
|
|
register4 <= LONG;
|
|
register5 <= LONG;
|
|
general_next_state <= sendRegisters;
|
|
elsif is1 then
|
|
register1 <= SHORT;
|
|
register2 <= LONG;
|
|
register3 <= LONG;
|
|
register4 <= LONG;
|
|
register5 <= LONG;
|
|
general_next_state <= sendRegisters;
|
|
elsif is2 then
|
|
register1 <= SHORT;
|
|
register2 <= SHORT;
|
|
register3 <= LONG;
|
|
register4 <= LONG;
|
|
register5 <= LONG;
|
|
general_next_state <= sendRegisters;
|
|
elsif is3 then
|
|
register1 <= SHORT;
|
|
register2 <= SHORT;
|
|
register3 <= SHORT;
|
|
register4 <= LONG;
|
|
register5 <= LONG;
|
|
general_next_state <= sendRegisters;
|
|
elsif is4 then
|
|
register1 <= SHORT;
|
|
register2 <= SHORT;
|
|
register3 <= SHORT;
|
|
register4 <= SHORT;
|
|
register5 <= LONG;
|
|
general_next_state <= sendRegisters;
|
|
elsif is5 then
|
|
register1 <= SHORT;
|
|
register2 <= SHORT;
|
|
register3 <= SHORT;
|
|
register4 <= SHORT;
|
|
register5 <= SHORT;
|
|
general_next_state <= sendRegisters;
|
|
elsif is6 then
|
|
register1 <= LONG;
|
|
register2 <= SHORT;
|
|
register3 <= SHORT;
|
|
register4 <= SHORT;
|
|
register5 <= SHORT;
|
|
general_next_state <= sendRegisters;
|
|
elsif is7 then
|
|
register1 <= LONG;
|
|
register2 <= LONG;
|
|
register3 <= SHORT;
|
|
register4 <= SHORT;
|
|
register5 <= SHORT;
|
|
general_next_state <= sendRegisters;
|
|
elsif is8 then
|
|
register1 <= LONG;
|
|
register2 <= LONG;
|
|
register3 <= LONG;
|
|
register4 <= SHORT;
|
|
register5 <= SHORT;
|
|
general_next_state <= sendRegisters;
|
|
elsif is9 then
|
|
register1 <= LONG;
|
|
register2 <= LONG;
|
|
register3 <= LONG;
|
|
register4 <= LONG;
|
|
register5 <= SHORT;
|
|
general_next_state <= sendRegisters;
|
|
else
|
|
register1 <= SPACE;
|
|
register2 <= SPACE;
|
|
register3 <= SPACE;
|
|
register4 <= SPACE;
|
|
register5 <= SPACE;
|
|
general_next_state <= storeChar;
|
|
report "Char look not correct" severity warning;
|
|
end if;
|
|
signSendRegisters <= '1';
|
|
|
|
when sendRegisters =>
|
|
--report "General current state is send registers" severity note;
|
|
readChar <= '0';
|
|
signSendRegisters <= '0';
|
|
if signRegistersSended = '1' then
|
|
general_next_state <= sended;
|
|
report "Char is send" severity note;
|
|
else
|
|
general_next_state <= sendRegisters;
|
|
end if;
|
|
|
|
when sended =>
|
|
--report "General current state is sended" severity note;
|
|
general_next_state <= waitForChar;
|
|
register1 <= SPACE;
|
|
register2 <= SPACE;
|
|
register3 <= SPACE;
|
|
register4 <= SPACE;
|
|
register5 <= SPACE;
|
|
|
|
WHEN OTHERS =>
|
|
report "General current state is BROKEN" severity warning;
|
|
general_next_state <= waitForChar;
|
|
|
|
end case;
|
|
|
|
end if;
|
|
end process;
|
|
|
|
process(reset, clock) begin
|
|
if reset = '1' then
|
|
morseOut <= '0';
|
|
startCounter <= '0';
|
|
unitNb <= "000";
|
|
signRegistersSended <= '0';
|
|
elsif rising_edge(clock) then
|
|
|
|
case sending_current_state is
|
|
|
|
when waiting =>
|
|
morseOut <= '0';
|
|
startCounter <= '0';
|
|
unitNb <= "000";
|
|
signRegistersSended <= '0';
|
|
if signSendRegisters = '1' then
|
|
sending_next_state <= sendR1;
|
|
report "Start to send new char" severity note;
|
|
else
|
|
sending_next_state <= waiting;
|
|
end if;
|
|
|
|
when sendR1 =>
|
|
--report "Send register1" severity note;
|
|
startCounter <= '1';
|
|
morseOut <= '1';
|
|
case register1 is
|
|
when SHORT =>
|
|
unitNb <= "001";
|
|
when LONG =>
|
|
unitNb <= "011";
|
|
when others =>
|
|
report "Error when sending register1" severity error;
|
|
end case;
|
|
|
|
case register2 is
|
|
when SPACE =>
|
|
sending_next_state <= waitSpace;
|
|
when END_WORD =>
|
|
sending_next_state <= waitEndWord;
|
|
when others =>
|
|
sending_next_state <= waitR1;
|
|
end case;
|
|
|
|
when waitR1 =>
|
|
--report "Wait register1" severity note;
|
|
startCounter <= '0';
|
|
if counterDone = '1' then
|
|
morseOut <= '0';
|
|
sending_next_state <= sendR2;
|
|
end if;
|
|
|
|
when sendR2 =>
|
|
--report "Send register2" severity note;
|
|
startCounter <= '1';
|
|
morseOut <= '1';
|
|
case register2 is
|
|
when SHORT =>
|
|
unitNb <= "001";
|
|
when LONG =>
|
|
unitNb <= "011";
|
|
when others =>
|
|
report "Error when sending register2" severity error;
|
|
end case;
|
|
|
|
case register3 is
|
|
when SPACE =>
|
|
sending_next_state <= waitSpace;
|
|
when END_WORD =>
|
|
sending_next_state <= waitEndWord;
|
|
when others =>
|
|
sending_next_state <= waitR2;
|
|
end case;
|
|
|
|
when waitR2 =>
|
|
--report "Wait register2" severity note;
|
|
startCounter <= '0';
|
|
if counterDone = '1' then
|
|
morseOut <= '0';
|
|
sending_next_state <= sendR3;
|
|
end if;
|
|
|
|
when sendR3 =>
|
|
--report "Send register3" severity note;
|
|
startCounter <= '1';
|
|
morseOut <= '1';
|
|
case register3 is
|
|
when SHORT =>
|
|
unitNb <= "001";
|
|
when LONG =>
|
|
unitNb <= "011";
|
|
when others =>
|
|
report "Error when sending register3" severity error;
|
|
end case;
|
|
|
|
case register4 is
|
|
when SPACE =>
|
|
sending_next_state <= waitSpace;
|
|
when END_WORD =>
|
|
sending_next_state <= waitEndWord;
|
|
when others =>
|
|
sending_next_state <= waitR3;
|
|
end case;
|
|
|
|
when waitR3 =>
|
|
startCounter <= '0';
|
|
if counterDone = '1' then
|
|
morseOut <= '0';
|
|
sending_next_state <= sendR4;
|
|
end if;
|
|
|
|
when sendR4 =>
|
|
startCounter <= '1';
|
|
morseOut <= '1';
|
|
case register4 is
|
|
when SHORT =>
|
|
unitNb <= "001";
|
|
when LONG =>
|
|
unitNb <= "011";
|
|
when others =>
|
|
report "Error when sending register4" severity error;
|
|
end case;
|
|
|
|
case register5 is
|
|
when SPACE =>
|
|
sending_next_state <= waitSpace;
|
|
when END_WORD =>
|
|
sending_next_state <= waitEndWord;
|
|
when others =>
|
|
sending_next_state <= waitR4;
|
|
end case;
|
|
|
|
when waitR4 =>
|
|
startCounter <= '0';
|
|
if counterDone = '1' then
|
|
morseOut <= '0';
|
|
sending_next_state <= sendR5;
|
|
end if;
|
|
|
|
when sendR5 =>
|
|
startCounter <= '1';
|
|
morseOut <= '1';
|
|
case register5 is
|
|
when SHORT =>
|
|
unitNb <= "001";
|
|
when LONG =>
|
|
unitNb <= "011";
|
|
when others =>
|
|
report "Error when sending register5" severity error;
|
|
end case;
|
|
|
|
sending_next_state <= waitSpace;
|
|
|
|
when waitSpace =>
|
|
startCounter <= '0';
|
|
if counterDone = '1' then
|
|
morseOut <= '0';
|
|
sending_next_state <= waiting;
|
|
end if;
|
|
signRegistersSended <= '1';
|
|
|
|
when waitEndWord =>
|
|
sending_next_state <= waiting;
|
|
when others =>
|
|
sending_next_state <= waiting;
|
|
|
|
end case;
|
|
end if;
|
|
end process;
|
|
|
|
|
|
END ARCHITECTURE studentVersion;
|