s_backspace : out std_logic;
-- Parser
do_it : out std_logic;
- finished : in std_logic
+ finished : in std_logic;
+ -- test: uart-tx
+ tx_data : out std_logic_vector(7 downto 0);
+ tx_new : out std_logic;
+ -- test: uart_rx
+ rx_data : in std_logic_vector(7 downto 0);
+ rx_new : in std_logic
);
end entity scanner;
architecture beh of scanner is
- type SCANNER_STATE is (SIDLE, SIGNORE_NEXT, SREAD_NEXT, STAKE, SDEL, SENTER);
+ type SCANNER_STATE is (SIDLE, SIGNORE_NEXT, SREAD_NEXT, STAKE, SDEL, SENTER,
+ STAKE_RS232);
signal state_int, state_next : SCANNER_STATE;
signal s_char_int, s_char_next : hbyte;
signal s_take_int, s_take_next : std_logic;
signal s_backspace_int, s_backspace_next : std_logic;
signal do_it_int, do_it_next : std_logic;
+ signal tx_data_int, tx_data_next : std_logic_vector(7 downto 0);
+ signal tx_new_int, tx_new_next : std_logic;
begin
s_char <= s_char_int;
s_take <= s_take_int;
s_backspace <= s_backspace_int;
do_it <= do_it_int;
+ tx_new <= tx_new_int;
+ tx_data <= tx_data_int;
process(sys_clk, sys_res_n)
begin
s_take_int <= '0';
s_backspace_int <= '0';
do_it_int <= '0';
+ tx_new_int <= '0';
+ tx_data_int <= (others => '0');
elsif rising_edge(sys_clk) then
-- internal
state_int <= state_next;
s_take_int <= s_take_next;
s_backspace_int <= s_backspace_next;
do_it_int <= do_it_next;
+ tx_new_int <= tx_new_next;
+ tx_data_int <= tx_data_next;
end if;
end process;
-- next state
- process(state_int, new_data, data, finished, s_done)
+ process(state_int, new_data, data, finished, s_done, tx_data_int)
begin
state_next <= state_int;
+ tx_new_next <= '0';
+ tx_data_next <= tx_data_int;
case state_int is
when SIDLE =>
when others => state_next <= SIDLE;
end case;
end if;
+ if rx_new = '1' then
+ state_next <= STAKE_RS232;
+ end if;
when SIGNORE_NEXT =>
if new_data = '1' then
state_next <= SIDLE;
when others => state_next <= SIDLE;
end case;
end if;
- when STAKE | SDEL=>
+ when STAKE | SDEL | STAKE_RS232=>
if s_done = '1' then
state_next <= SIDLE;
end if;
when SENTER =>
if finished = '1' then
+ tx_new_next <= '1';
+ tx_data_next <= x"42";
state_next <= SIDLE;
end if;
end case;
end process;
-- out
- process(state_int, data, s_char_int, new_data)
+ process(state_int, data, s_char_int, new_data, rx_data)
function sc2ascii (x : hbyte) return hbyte is
variable y : hbyte;
begin
when STAKE =>
s_take_next <= '1';
s_char_next <= sc2ascii(hbyte(data));
+ when STAKE_RS232 =>
+ s_take_next <= '1';
+ if rx_data >= x"30" and rx_data <= x"39" then
+ s_char_next <= hbyte(rx_data);
+ else
+ s_char_next <= x"41";
+ end if;
when SDEL =>
s_take_next <= '1';
s_backspace_next <= '1';