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;
114 state_next <= S_S_INIT;
115 elsif do_it = '1' then
116 state_next <= S_S_FIN;
117 elsif d_get = '1' then
118 state_next <= S_D_INIT;
121 if s_backspace = '1' then
122 state_next <= S_S_BS;
124 state_next <= S_S_WRITE;
127 state_next <= S_S_DONE;
129 state_next <= S_S_DONE;
140 state_next <= S_D_WRITE;
149 process(state_int, s_cnt_int, d_spalte, data_out, s_char, address_int,
150 data_in_int, d_new_result_int, d_new_eingabe_int, d_new_bs_int,
152 variable addr_tmp : std_logic_vector(H_RAM_WIDTH - 1 downto 0);
155 s_cnt_next <= s_cnt_int;
156 was_bs_next <= was_bs_int;
157 d_new_result_next <= d_new_result_int;
158 d_new_eingabe_next <= d_new_eingabe_int;
159 d_new_bs_next <= '0';
161 d_char_next <= (others => '0');
162 finished_next <= '0';
164 address_next <= address_int;
165 data_in_next <= data_in_int;
170 d_new_result_next <= '0';
174 -- nur bei < 71 weiter machen
175 -- TODO: '/=' billiger als '<' ?
176 if unsigned(s_cnt_int) /= 71 then
178 address_next <= s_cnt_int;
179 data_in_next <= s_char;
180 s_cnt_next <= std_logic_vector(unsigned(s_cnt_int) + 1);
182 -- was_bs hier missbrauchen, um ein d_new_eingabe zu verhindern
186 -- ab 1 darf nicht mehr dekrementiert werden
187 if unsigned(s_cnt_int) /= 1 then
188 addr_tmp := std_logic_vector(unsigned(s_cnt_int) - 1);
189 d_new_bs_next <= '1';
191 addr_tmp := s_cnt_int;
193 s_cnt_next <= addr_tmp;
196 address_next <= addr_tmp;
197 data_in_next <= (others => '0');
200 finished_next <= '1';
201 s_cnt_next <= (0 => '1', others => '0');
202 d_new_result_next <= '1';
205 if was_bs_int = '0' then
206 d_new_eingabe_next <= '1';
213 address_next <= d_spalte;
214 d_new_eingabe_next <= '0';
215 d_new_result_next <= '0';
217 d_char_next <= data_out;
222 sp_ram_inst : entity work.sp_ram(beh)
224 ADDR_WIDTH => H_RAM_WIDTH
228 address => address_int,
229 data_out => data_out,
231 data_in => data_in_int
233 end architecture beh;