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 =>
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;
when S_S_DONE =>
if s_take = '0' then
state_next <= SIDLE;
- was_bs_next <= '0';
end if;
when S_D_INIT =>
-- 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';
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
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');
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;