2 use ieee.std_logic_1164.all;
3 use ieee.numeric_std.all;
8 sys_clk : in std_logic;
9 sys_res_n : in std_logic;
14 s_take : in std_logic;
15 s_done : out std_logic;
16 s_backspace : in std_logic;
18 d_new_eingabe : out std_logic;
19 d_new_result : out std_logic;
20 d_new_bs : out std_logic;
22 d_spalte : in hspalte;
24 d_done : out std_logic;
31 finished : out std_logic
35 architecture beh of history is
36 type HISTORY_STATE is (SIDLE, S_S_INIT, S_S_WRITE, S_S_BS, S_S_DONE, S_S_FIN,
38 signal state_int, state_next : HISTORY_STATE;
39 signal was_bs_int, was_bs_next : std_logic;
40 signal s_done_int, s_done_next : std_logic;
41 signal s_cnt_int, s_cnt_next : hspalte;
42 signal d_new_eingabe_int, d_new_eingabe_next : std_logic;
43 signal d_new_result_int, d_new_result_next : std_logic;
44 signal d_new_bs_int, d_new_bs_next: std_logic;
45 signal d_done_int, d_done_next : std_logic;
46 signal d_char_int, d_char_next : hbyte;
48 signal finished_int, finished_next : std_logic;
51 signal address_next, address_int : std_logic_vector(H_RAM_WIDTH - 1 downto 0);
52 signal data_out, data_in_next, data_in_int : hbyte;
53 signal wr_next, wr_int : std_logic;
56 d_new_eingabe <= d_new_eingabe_int;
57 d_new_result <= d_new_result_int;
58 d_new_bs <= d_new_bs_int;
62 finished <= finished_int;
64 process(sys_clk, sys_res_n)
66 if sys_res_n = '0' then
72 s_cnt_int <= (0 => '1', others => '0');
73 d_new_result_int <= '0';
74 d_new_eingabe_int <= '0';
77 d_char_int <= (others => '0');
81 address_int <= (0 => '1', others => '0');
84 elsif rising_edge(sys_clk) then
86 state_int <= state_next;
87 was_bs_int <= was_bs_next;
89 s_done_int <= s_done_next;
90 s_cnt_int <= s_cnt_next;
91 d_new_result_int <= d_new_result_next;
92 d_new_eingabe_int <= d_new_eingabe_next;
93 d_new_bs_int <= d_new_bs_next;
94 d_done_int <= d_done_next;
95 d_char_int <= d_char_next;
97 finished_int <= finished_next;
99 address_int <= address_next;
100 data_in_int <= data_in_next;
106 process(state_int, d_get, do_it, s_take, s_backspace, was_bs_int)
108 state_next <= state_int;
109 was_bs_next <= was_bs_int;
115 state_next <= S_S_INIT;
116 elsif do_it = '1' then
117 state_next <= S_S_FIN;
118 elsif d_get = '1' then
119 state_next <= S_D_INIT;
122 if s_backspace = '1' then
123 state_next <= S_S_BS;
125 state_next <= S_S_WRITE;
128 state_next <= S_S_DONE;
130 state_next <= S_S_DONE;
143 state_next <= S_D_WRITE;
152 process(state_int, s_cnt_int, d_spalte, data_out, s_char, address_int,
153 data_in_int, d_new_result_int, d_new_eingabe_int, d_new_bs_int,
155 variable addr_tmp : std_logic_vector(H_RAM_WIDTH - 1 downto 0);
158 s_cnt_next <= s_cnt_int;
159 d_new_result_next <= d_new_result_int;
160 d_new_eingabe_next <= d_new_eingabe_int;
161 d_new_bs_next <= '0';
163 d_char_next <= (others => '0');
164 finished_next <= '0';
166 address_next <= address_int;
167 data_in_next <= data_in_int;
172 d_new_result_next <= '0';
177 address_next <= s_cnt_int;
178 data_in_next <= s_char;
179 s_cnt_next <= std_logic_vector(unsigned(s_cnt_int) + 1);
181 -- ab 1 darf nicht mehr dekrementiert werden
182 if unsigned(s_cnt_int) /= 1 then
183 addr_tmp := std_logic_vector(unsigned(s_cnt_int) - 1);
184 d_new_bs_next <= '1';
186 addr_tmp := s_cnt_int;
188 s_cnt_next <= addr_tmp;
191 address_next <= addr_tmp;
192 data_in_next <= (others => '0');
194 finished_next <= '1';
195 s_cnt_next <= (0 => '1', others => '0');
196 d_new_result_next <= '1';
199 if was_bs_int = '0' then
200 d_new_eingabe_next <= '1';
204 address_next <= d_spalte;
205 d_new_eingabe_next <= '0';
206 d_new_result_next <= '0';
208 d_char_next <= data_out;
213 sp_ram_inst : entity work.sp_ram(beh)
215 ADDR_WIDTH => H_RAM_WIDTH
219 address => address_int,
220 data_out => data_out,
222 data_in => data_in_int
224 end architecture beh;