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
25 architecture beh of scanner is
26 type SCANNER_STATE is (SINIT, SIDLE, SREAD, STAKE, SDEL, SENTER);
27 signal state_int, state_next : SCANNER_STATE;
28 signal s_char_int, s_char_next : hbyte;
29 signal s_take_int, s_take_next : std_logic;
30 signal s_backspace_int, s_backspace_next : std_logic;
31 signal do_it_int, do_it_next : std_logic;
32 signal was_f0_int, was_f0_next : std_logic;
36 s_backspace <= s_backspace_int;
39 process(sys_clk, sys_res_n)
41 if sys_res_n = '0' then
46 s_char_int <= (others => '0');
48 s_backspace_int <= '0';
50 elsif rising_edge(sys_clk) then
52 state_int <= state_next;
53 was_f0_int <= was_f0_next;
55 s_char_int <= s_char_next;
56 s_take_int <= s_take_next;
57 s_backspace_int <= s_backspace_next;
58 do_it_int <= do_it_next;
63 process(state_int, new_data, data, finished, s_done, was_f0_int)
65 state_next <= state_int;
71 if new_data = '1' and was_f0_int = '1' then
76 when SC_BKSP => state_next <= SDEL;
77 when SC_ENTER => state_next <= SENTER;
78 when SC_KP_0 | SC_KP_1 | SC_KP_2 | SC_KP_3 |
79 SC_KP_4 | SC_KP_5 | SC_KP_6 | SC_KP_7 |
80 SC_KP_8 | SC_KP_9 | SC_KP_PLUS |
81 SC_KP_MINUS | SC_KP_MUL | SC_SPACE |
82 SC_KP_DIV => state_next <= STAKE;
83 when others => state_next <= SIDLE;
90 if finished = '1' then
97 process(state_int, data, s_char_int, new_data, was_f0_int)
98 function sc2ascii (x : hbyte) return hbyte is
102 when SC_KP_0 => y := x"30";
103 when SC_KP_1 => y := x"31";
104 when SC_KP_2 => y := x"32";
105 when SC_KP_3 => y := x"33";
106 when SC_KP_4 => y := x"34";
107 when SC_KP_5 => y := x"35";
108 when SC_KP_6 => y := x"36";
109 when SC_KP_7 => y := x"37";
110 when SC_KP_8 => y := x"38";
111 when SC_KP_9 => y := x"39";
112 when SC_KP_PLUS => y := x"2b";
113 when SC_KP_MINUS => y := x"2d";
114 when SC_KP_MUL => y := x"2a";
115 when SC_KP_DIV => y := x"2f";
116 when SC_SPACE => y := x"20";
117 when others => y := x"41";
122 s_char_next <= s_char_int;
124 s_backspace_next <= '0';
126 was_f0_next <= was_f0_int;
132 if new_data = '1' and data = x"f0" then
139 s_char_next <= sc2ascii(hbyte(data));
142 s_backspace_next <= '1';
147 end architecture beh;