2 use ieee.std_logic_1164.all;
3 use ieee.numeric_std.all;
9 sys_clk : in std_logic;
10 sys_res_n : in std_logic;
12 new_data : in std_logic;
13 data : in std_logic_vector(7 downto 0);
16 s_take : out std_logic;
17 s_done : in std_logic;
18 s_backspace : out std_logic;
20 do_it : out std_logic;
21 finished : in std_logic;
23 tx_data : out std_logic_vector(7 downto 0);
24 tx_new : out std_logic;
26 rx_data : in std_logic_vector(7 downto 0);
31 architecture beh of scanner is
32 type SCANNER_STATE is (SIDLE, SIGNORE_NEXT, SREAD_NEXT, STAKE, SDEL, SENTER,
34 signal state_int, state_next : SCANNER_STATE;
35 signal s_char_int, s_char_next : hbyte;
36 signal s_take_int, s_take_next : std_logic;
37 signal s_backspace_int, s_backspace_next : std_logic;
38 signal do_it_int, do_it_next : std_logic;
39 signal tx_data_int, tx_data_next : std_logic_vector(7 downto 0);
40 signal tx_new_int, tx_new_next : std_logic;
44 s_backspace <= s_backspace_int;
47 tx_data <= tx_data_int;
49 process(sys_clk, sys_res_n)
51 if sys_res_n = '0' then
55 s_char_int <= (others => '0');
57 s_backspace_int <= '0';
60 tx_data_int <= (others => '0');
61 elsif rising_edge(sys_clk) then
63 state_int <= state_next;
65 s_char_int <= s_char_next;
66 s_take_int <= s_take_next;
67 s_backspace_int <= s_backspace_next;
68 do_it_int <= do_it_next;
69 tx_new_int <= tx_new_next;
70 tx_data_int <= tx_data_next;
75 process(state_int, new_data, data, finished, s_done, tx_data_int)
77 state_next <= state_int;
79 tx_data_next <= tx_data_int;
83 if new_data = '1' then
86 state_next <= SIGNORE_NEXT;
88 state_next <= SREAD_NEXT;
93 when SC_KP_0 | SC_KP_1 | SC_KP_2 |
94 SC_KP_3 | SC_KP_4 | SC_KP_5 | SC_KP_6 |
95 SC_KP_7 | SC_KP_8 | SC_KP_9 |
96 SC_0 | SC_1 | SC_2 | SC_3 | SC_4 |
97 SC_5 | SC_6 | SC_7 | SC_8 | SC_9 |
98 SC_PLUS | SC_KP_PLUS |
99 SC_KP_MINUS | SC_KP_MUL | SC_SPACE =>
101 when others => state_next <= SIDLE;
105 state_next <= STAKE_RS232;
108 if new_data = '1' then
112 if new_data = '1' then
115 state_next <= SIGNORE_NEXT;
117 state_next <= SENTER;
120 when others => state_next <= SIDLE;
123 when STAKE | SDEL | STAKE_RS232=>
128 if finished = '1' then
130 tx_data_next <= x"42";
137 process(state_int, data, s_char_int, new_data, rx_data)
138 function sc2ascii (x : hbyte) return hbyte is
142 when SC_KP_0 | SC_0 => y := x"30";
143 when SC_KP_1 | SC_1 => y := x"31";
144 when SC_KP_2 | SC_2 => y := x"32";
145 when SC_KP_3 | SC_3 => y := x"33";
146 when SC_KP_4 | SC_4 => y := x"34";
147 when SC_KP_5 | SC_5 => y := x"35";
148 when SC_KP_6 | SC_6 => y := x"36";
149 when SC_KP_7 | SC_7 => y := x"37";
150 when SC_KP_8 | SC_8 => y := x"38";
151 when SC_KP_9 | SC_9 => y := x"39";
152 when SC_KP_PLUS | SC_PLUS => y := x"2b";
153 when SC_KP_MINUS => y := x"2d";
154 when SC_KP_MUL => y := x"2a";
155 when SC_KP_DIV => y := x"2f";
156 when SC_SPACE => y := x"20";
157 when others => y := x"41";
162 s_char_next <= s_char_int;
164 s_backspace_next <= '0';
169 when SIGNORE_NEXT => null;
170 when SREAD_NEXT => null;
173 s_char_next <= sc2ascii(hbyte(data));
176 if rx_data >= x"30" and rx_data <= x"39" then
177 s_char_next <= hbyte(rx_data);
179 s_char_next <= x"41";
183 s_backspace_next <= '1';
188 end architecture beh;