history: maximal 70 zeichen eingabe
[hwmod.git] / src / history.vhd
index b1a1b0193f6f3aa9412d4c29381f1808c614b852..76c4bf70bec70ce1bda69440fa83136f5576ec86 100644 (file)
@@ -106,7 +106,6 @@ begin
        process(state_int, d_get, do_it, s_take, s_backspace, was_bs_int)
        begin
                state_next <= state_int;
-               was_bs_next <= was_bs_int;
 
                case state_int is
                        when SIDLE =>
@@ -128,7 +127,6 @@ begin
                                state_next <= S_S_DONE;
                        when S_S_BS =>
                                state_next <= S_S_DONE;
-                               was_bs_next <= '1';
                        when S_S_FIN =>
                                if do_it = '0' then
                                        state_next <= SIDLE;
@@ -136,7 +134,6 @@ begin
                        when S_S_DONE =>
                                if s_take = '0' then
                                        state_next <= SIDLE;
-                                       was_bs_next <= '0';
                                end if;
 
                        when S_D_INIT =>
@@ -151,11 +148,12 @@ begin
        -- out
        process(state_int, s_cnt_int, d_spalte, data_out, s_char, address_int,
                data_in_int, d_new_result_int, d_new_eingabe_int, d_new_bs_int,
-               was_bs_int)
+               was_bs_int, s_take)
                variable addr_tmp : std_logic_vector(H_RAM_WIDTH - 1 downto 0);
        begin
                s_done_next <= '0';
                s_cnt_next <= s_cnt_int;
+               was_bs_next <= was_bs_int;
                d_new_result_next <= d_new_result_int;
                d_new_eingabe_next <= d_new_eingabe_int;
                d_new_bs_next <= '0';
@@ -173,10 +171,17 @@ begin
                        when S_S_INIT =>
                                null;
                        when S_S_WRITE =>
-                               wr_next <= '1';
-                               address_next <= s_cnt_int;
-                               data_in_next <= s_char;
-                               s_cnt_next <= std_logic_vector(unsigned(s_cnt_int) + 1);
+                               -- nur bei < 71 weiter machen
+                               -- TODO: '/=' billiger als '<' ?
+                               if unsigned(s_cnt_int) /= 71 then
+                                       wr_next <= '1';
+                                       address_next <= s_cnt_int;
+                                       data_in_next <= s_char;
+                                       s_cnt_next <= std_logic_vector(unsigned(s_cnt_int) + 1);
+                               else
+                                       -- was_bs hier missbrauchen, um ein d_new_eingabe zu verhindern
+                                       was_bs_next <= '1';
+                               end if;
                        when S_S_BS =>
                                -- ab 1 darf nicht mehr dekrementiert werden
                                if unsigned(s_cnt_int) /= 1 then
@@ -190,6 +195,7 @@ begin
                                wr_next <= '1';
                                address_next <= addr_tmp;
                                data_in_next <= (others => '0');
+                               was_bs_next <= '1';
                        when S_S_FIN =>
                                finished_next <= '1';
                                s_cnt_next <= (0 => '1', others => '0');
@@ -199,6 +205,9 @@ begin
                                if was_bs_int = '0' then
                                        d_new_eingabe_next <= '1';
                                end if;
+                               if s_take = '0' then
+                                       was_bs_next <= '0';
+                               end if;
 
                        when S_D_INIT =>
                                address_next <= d_spalte;