-- Display
d_new_eingabe : out std_logic;
d_new_result : out std_logic;
+ d_new_bs : out std_logic;
d_zeile : in hzeile;
d_spalte : in hspalte;
d_get : in std_logic;
architecture beh of history is
type HISTORY_STATE is (SIDLE, S_S_INIT, S_S_WRITE, S_S_BS, S_S_DONE, S_S_FIN,
- S_D_INIT, S_D_WAIT, S_D_WRITE);
+ S_D_INIT, S_D_WRITE);
signal state_int, state_next : HISTORY_STATE;
+ signal was_bs_int, was_bs_next : std_logic;
signal s_done_int, s_done_next : std_logic;
signal s_cnt_int, s_cnt_next : hspalte;
signal d_new_eingabe_int, d_new_eingabe_next : std_logic;
signal d_new_result_int, d_new_result_next : std_logic;
+ signal d_new_bs_int, d_new_bs_next: std_logic;
signal d_done_int, d_done_next : std_logic;
signal d_char_int, d_char_next : hbyte;
s_done <= s_done_int;
d_new_eingabe <= d_new_eingabe_int;
d_new_result <= d_new_result_int;
+ d_new_bs <= d_new_bs_int;
d_done <= d_done_int;
d_char <= d_char_int;
if sys_res_n = '0' then
-- internal
state_int <= SIDLE;
+ was_bs_int <= '0';
-- out
s_done_int <= '0';
s_cnt_int <= (0 => '1', others => '0');
d_new_result_int <= '0';
d_new_eingabe_int <= '0';
+ d_new_bs_int <= '0';
d_done_int <= '0';
d_char_int <= (others => '0');
elsif rising_edge(sys_clk) then
-- internal
state_int <= state_next;
+ was_bs_int <= was_bs_next;
-- out
s_done_int <= s_done_next;
s_cnt_int <= s_cnt_next;
d_new_result_int <= d_new_result_next;
d_new_eingabe_int <= d_new_eingabe_next;
+ d_new_bs_int <= d_new_bs_next;
d_done_int <= d_done_next;
d_char_int <= d_char_next;
end process;
-- next state
- process(state_int, d_get, do_it, s_take, s_backspace)
+ 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 =>
-- S_S_FIN: tmp..
- if d_get = '1' then
- state_next <= S_D_INIT;
+ if s_take = '1' then
+ state_next <= S_S_INIT;
elsif do_it = '1' then
state_next <= S_S_FIN;
- elsif s_take = '1' then
- state_next <= S_S_INIT;
+ elsif d_get = '1' then
+ state_next <= S_D_INIT;
end if;
when S_S_INIT =>
if s_backspace = '1' then
else
state_next <= S_S_WRITE;
end if;
- when S_S_WRITE | S_S_BS =>
+ when S_S_WRITE =>
+ 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 =>
- state_next <= S_D_WAIT;
- when S_D_WAIT =>
state_next <= S_D_WRITE;
when S_D_WRITE =>
if d_get = '0' then
-- out
process(state_int, s_cnt_int, d_spalte, data_out, s_char, address_int,
- data_in_int)
+ data_in_int, d_new_result_int, d_new_eingabe_int, d_new_bs_int,
+ was_bs_int)
+ variable addr_tmp : std_logic_vector(H_RAM_WIDTH - 1 downto 0);
begin
s_done_next <= '0';
s_cnt_next <= s_cnt_int;
- d_new_result_next <= '0';
- d_new_eingabe_next <= '0';
+ d_new_result_next <= d_new_result_int;
+ d_new_eingabe_next <= d_new_eingabe_int;
+ d_new_bs_next <= '0';
d_done_next <= '0';
d_char_next <= (others => '0');
finished_next <= '0';
case state_int is
when SIDLE =>
- null;
+ -- TODO: tmp fix
+ d_new_result_next <= '0';
when S_S_INIT =>
null;
when S_S_WRITE =>
wr_next <= '1';
- address_next <= '0' & s_cnt_int;
+ address_next <= s_cnt_int;
data_in_next <= s_char;
s_cnt_next <= std_logic_vector(unsigned(s_cnt_int) + 1);
when S_S_BS =>
+ -- ab 1 darf nicht mehr dekrementiert werden
+ if unsigned(s_cnt_int) /= 1 then
+ addr_tmp := std_logic_vector(unsigned(s_cnt_int) - 1);
+ d_new_bs_next <= '1';
+ else
+ addr_tmp := s_cnt_int;
+ end if;
+ s_cnt_next <= addr_tmp;
+
wr_next <= '1';
- address_next <= '0' & std_logic_vector(unsigned(s_cnt_int) - 1);
+ address_next <= addr_tmp;
data_in_next <= (others => '0');
- if unsigned(s_cnt_int) /= 0 then
- s_cnt_next <= std_logic_vector(unsigned(s_cnt_int) - 1);
- end if;
when S_S_FIN =>
finished_next <= '1';
s_cnt_next <= (0 => '1', others => '0');
d_new_result_next <= '1';
when S_S_DONE =>
s_done_next <= '1';
- d_new_eingabe_next <= '1';
+ if was_bs_int = '0' then
+ d_new_eingabe_next <= '1';
+ end if;
when S_D_INIT =>
- address_next <= '0' & d_spalte;
- when S_D_WAIT =>
- null;
+ address_next <= d_spalte;
+ d_new_eingabe_next <= '0';
+ d_new_result_next <= '0';
when S_D_WRITE =>
d_char_next <= data_out;
d_done_next <= '1';