X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=hwmod.git;a=blobdiff_plain;f=src%2Fdisplay.vhd;h=19c9d24caf789571c2836279793b0eaca0ab061b;hp=8b0a9cc1748b0e257f24cb6ef1b36141304a01e3;hb=9f86188ebcedaf3cc7a7106b0a8d6a96493d41bc;hpb=afdf1a8534855aeb04ab50cad89440c02e4afb63 diff --git a/src/display.vhd b/src/display.vhd index 8b0a9cc..19c9d24 100644 --- a/src/display.vhd +++ b/src/display.vhd @@ -28,8 +28,8 @@ end entity display; architecture beh of display is type DISPLAY_STATE is (SIDLE, S_NEW_BS, S_BACK, S_BLANK, S_NEW_RESULT, - S_NEW_INPUT, S_COUNTUP, S_GETCH, S_CR1, S_NL1, S_PUTCH1, S_PUTCH2, - S_WAIT, S_NOP1); + S_ZEILEUP, S_NEW_INPUT, S_COUNTUP, S_GETCH, S_CR1, S_NL1, S_PUTCH1, + S_PUTCH2, S_WAIT, S_NOP1, S_READ_RESULT); signal state_int, state_next : DISPLAY_STATE; signal d_zeile_int, d_zeile_next : hzeile; signal d_spalte_int, d_spalte_next : hspalte; @@ -89,7 +89,7 @@ begin end if; when S_NEW_RESULT => - state_next <= S_CR1; + state_next <= S_ZEILEUP; when S_NEW_INPUT => state_next <= S_COUNTUP; @@ -109,15 +109,37 @@ begin istate_next <= b"010"; -- => danach S_BACK end if; + when S_ZEILEUP => + case istate_int is + when b"011" => + state_next <= S_WAIT; + istate_next <= b"111"; + when others => state_next <= S_CR1; + end case; + when S_CR1 => if free = '0' then state_next <= S_WAIT; - istate_next <= b"000"; -- => danach S_NL1 + case istate_int is + when b"110" => istate_next <= b"101"; -- => danach S_NL1 und SIDLe + when others => istate_next <= b"000"; -- => danach S_NL1 und S_COUNTUP + end case; end if; when S_NL1 => if free = '0' then state_next <= S_WAIT; - istate_next <= b"111"; -- => wieder nach SIDLE + case istate_int is + when b"101" => istate_next <= b"011"; -- => danach S_ZEILEUP + when others => istate_next <= b"100"; -- => danach S_READ_RESULT + end case; + end if; + when S_READ_RESULT => + if unsigned(d_spalte_int) /= 70 then + state_next <= S_COUNTUP; + istate_next <= b"100"; -- => wieder nach S_READ_RESULT + else + state_next <= S_WAIT; + istate_next <= b"110"; -- => danach S_CR1 und d_spalte_next clearen und d_zeile_next inkrementieren end if; when S_COUNTUP => @@ -142,6 +164,10 @@ begin when b"000" => state_next <= S_NL1; when b"001" => state_next <= S_BLANK; when b"010" => state_next <= S_BACK; + when b"011" => state_next <= S_ZEILEUP; + when b"100" => state_next <= S_READ_RESULT; + when b"110" => state_next <= S_CR1; + when b"101" => state_next <= S_NL1; when others => state_next <= SIDLE; end case; end if; @@ -150,7 +176,7 @@ begin -- out process(state_int, d_zeile_int, d_spalte_int, d_get_int, command_int, - command_data_int, d_char) + command_data_int, d_char, istate_int) begin d_zeile_next <= d_zeile_int; d_spalte_next <= d_spalte_int; @@ -162,11 +188,6 @@ begin when SIDLE => null; when S_NEW_RESULT => - d_spalte_next <= (others => '0'); - case d_zeile_int is - when "11111" => d_zeile_next <= "00000"; - when others => d_zeile_next <= std_logic_vector(unsigned(d_zeile_int) + 1); - end case; when S_NEW_INPUT => null; @@ -181,12 +202,20 @@ begin command_next <= COMMAND_SET_CHAR; command_data_next <= x"ffffff" & x"20"; -- white space + when S_ZEILEUP => + d_spalte_next <= (others => '0'); + case d_zeile_int is + when "1111111" => d_zeile_next <= (others => '0'); + when others => d_zeile_next <= std_logic_vector(unsigned(d_zeile_int) + 1); + end case; + when S_CR1 => command_next <= COMMAND_SET_CHAR; command_data_next <= x"ffffff" & x"0d"; -- carrige return when S_NL1 => command_next <= COMMAND_SET_CHAR; command_data_next <= x"ffffff" & x"0a"; -- newline + when S_READ_RESULT => null; when S_COUNTUP => d_get_next <= '1';