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,
37 S_D_INIT, S_D_READ, S_S_FIN_POSUP);
38 signal state_int, state_next : HISTORY_STATE;
39 signal was_bs_int, was_bs_next : std_logic;
40 signal pos_int, pos_next : std_logic_vector(H_RAM_WIDTH - 1 downto 0);
41 signal s_done_int, s_done_next : std_logic;
42 signal s_cnt_int, s_cnt_next : hspalte;
43 signal d_new_eingabe_int, d_new_eingabe_next : std_logic;
44 signal d_new_result_int, d_new_result_next : std_logic;
45 signal d_new_bs_int, d_new_bs_next: std_logic;
46 signal d_done_int, d_done_next : std_logic;
47 signal d_char_int, d_char_next : hbyte;
49 signal finished_int, finished_next : std_logic;
52 signal address_next, address_int : std_logic_vector(H_RAM_WIDTH - 1 downto 0);
53 signal data_out, data_in_next, data_in_int : hbyte;
54 signal wr_next, wr_int : std_logic;
57 d_new_eingabe <= d_new_eingabe_int;
58 d_new_result <= d_new_result_int;
59 d_new_bs <= d_new_bs_int;
63 finished <= finished_int;
65 process(sys_clk, sys_res_n)
67 if sys_res_n = '0' then
71 pos_int <= (others => '0');
74 s_cnt_int <= (0 => '1', others => '0');
75 d_new_result_int <= '0';
76 d_new_eingabe_int <= '0';
79 d_char_int <= (others => '0');
83 address_int <= (0 => '1', others => '0');
86 elsif rising_edge(sys_clk) then
88 state_int <= state_next;
89 was_bs_int <= was_bs_next;
92 s_done_int <= s_done_next;
93 s_cnt_int <= s_cnt_next;
94 d_new_result_int <= d_new_result_next;
95 d_new_eingabe_int <= d_new_eingabe_next;
96 d_new_bs_int <= d_new_bs_next;
97 d_done_int <= d_done_next;
98 d_char_int <= d_char_next;
100 finished_int <= finished_next;
102 address_int <= address_next;
103 data_in_int <= data_in_next;
109 process(state_int, d_get, do_it, s_take, s_backspace, was_bs_int)
111 state_next <= state_int;
117 state_next <= S_S_INIT;
118 elsif do_it = '1' then
119 state_next <= S_S_FIN;
120 elsif d_get = '1' then
121 state_next <= S_D_INIT;
124 if s_backspace = '1' then
125 state_next <= S_S_BS;
127 state_next <= S_S_WRITE;
130 state_next <= S_S_DONE;
132 state_next <= S_S_DONE;
135 state_next <= S_S_FIN_POSUP;
137 when S_S_FIN_POSUP =>
145 state_next <= S_D_READ;
154 process(state_int, s_cnt_int, d_spalte, d_zeile, data_out, s_char, address_int,
155 data_in_int, d_new_result_int, d_new_eingabe_int, d_new_bs_int,
156 was_bs_int, s_take, pos_int)
157 variable addr_tmp : std_logic_vector(H_RAM_WIDTH - 1 downto 0);
158 variable mul_tmp : std_logic_vector((H_RAM_WIDTH*2) -1 downto 0);
161 s_cnt_next <= s_cnt_int;
162 was_bs_next <= was_bs_int;
164 d_new_result_next <= d_new_result_int;
165 d_new_eingabe_next <= d_new_eingabe_int;
166 d_new_bs_next <= '0';
168 d_char_next <= (others => '0');
169 finished_next <= '0';
171 address_next <= address_int;
172 data_in_next <= data_in_int;
177 d_new_result_next <= '0';
181 -- nur bei < 71 weiter machen
182 -- TODO: '/=' billiger als '<' ?
183 if unsigned(s_cnt_int) /= 71 then
185 address_next <= std_logic_vector(unsigned(pos_int) + unsigned(s_cnt_int));
186 data_in_next <= s_char;
187 s_cnt_next <= std_logic_vector(unsigned(s_cnt_int) + 1);
189 -- was_bs hier missbrauchen, um ein d_new_eingabe zu verhindern
193 -- ab 1 darf nicht mehr dekrementiert werden
194 addr_tmp := (others => '0');
195 if unsigned(s_cnt_int) /= 1 then
196 addr_tmp(hspalte'length - 1 downto 0) := std_logic_vector(unsigned(s_cnt_int) - 1);
197 d_new_bs_next <= '1';
199 addr_tmp(hspalte'length - 1 downto 0) := s_cnt_int;
201 s_cnt_next <= addr_tmp(hspalte'length - 1 downto 0);
204 address_next <= std_logic_vector(unsigned(pos_int) + unsigned(addr_tmp));
205 data_in_next <= (others => '0');
208 finished_next <= '1';
209 s_cnt_next <= (0 => '1', others => '0');
210 d_new_result_next <= '1';
211 when S_S_FIN_POSUP =>
212 -- TODO: overflow nach 50 berechnungen... => wieder von vorne anfangen
213 pos_next <= std_logic_vector(unsigned(pos_int) + to_unsigned(142,H_RAM_WIDTH));
216 if was_bs_int = '0' then
217 d_new_eingabe_next <= '1';
224 addr_tmp := (others => '0');
225 addr_tmp(hzeile'length - 1 downto 0) := d_zeile;
226 mul_tmp := std_logic_vector(unsigned(addr_tmp) * to_unsigned(71,H_RAM_WIDTH));
227 addr_tmp := mul_tmp((addr_tmp'length - 1) downto 0);
228 addr_tmp := std_logic_vector(unsigned(addr_tmp) + unsigned(d_spalte));
229 address_next <= addr_tmp;
230 d_new_eingabe_next <= '0';
231 d_new_result_next <= '0';
233 d_char_next <= data_out;
238 sp_ram_inst : entity work.sp_ram(beh)
240 ADDR_WIDTH => H_RAM_WIDTH
244 address => address_int,
245 data_out => data_out,
247 data_in => data_in_int
249 end architecture beh;