X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=cpu%2Fsrc%2Frs232_tx_arc.vhd;h=c7dc886f5e26c2230b6fa62bf7e6df31489edfc5;hb=4d230c21bb8c9c23c3dd3349f8736b84987eab0d;hp=188566a79baef5fcad03b6661f3e1789a681562b;hpb=2d98d2f7b3eaa3afc1cc264725b2596184f1e6e3;p=calu.git diff --git a/cpu/src/rs232_tx_arc.vhd b/cpu/src/rs232_tx_arc.vhd index 188566a..c7dc886 100755 --- a/cpu/src/rs232_tx_arc.vhd +++ b/cpu/src/rs232_tx_arc.vhd @@ -1,123 +1,123 @@ ---------------------------------------------------------------------------------- --- Filename : rs232_tx_arc.vhd --- ========== --- --- Beschreibung : Versand von Daten ueber die RS232 Schnittstelle --- ============== --- --- Autoren : Martin Perner, Schwarz Manfred --- ========= ----------------------------------------------------------------------------------- - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -use work.common_pkg.all; -use work.core_pkg.all; -use work.extension_uart_pkg.all; - -architecture beh of rs232_tx is - -- definierern der intern verwendeten Signale - type STATE_TYPE is (IDLE,SEND); - signal state, state_next : STATE_TYPE; - signal bus_tx_int, bus_tx_nxt : std_logic := '1'; - signal baud_cnt,baud_cnt_next : integer := CLK_PER_BAUD; - signal cnt, cnt_next : natural range 0 to 11 := 0; - signal idle_sig, idle_sig_next : std_logic := '0'; - -begin - -- syncronisierungs Prozess - rs232_tx_syn : process(sys_clk, sys_res_n) - begin - if (sys_res_n = RESET_VALUE) then - -- reset - cnt <= 0; - baud_cnt <= 0; - state <= IDLE; - idle_sig <= '0'; - bus_tx_int <= '1'; - elsif rising_edge(sys_clk) then - -- sync Zustand, uebernehmen der next-Signale - baud_cnt <= baud_cnt_next; - cnt <= cnt_next; - state <= state_next; - idle_sig <= idle_sig_next; - bus_tx_int <= bus_tx_nxt; - end if; - end process; - - bus_tx <= bus_tx_int; - - -- Zustandsmaschienen Prozess - rs232_tx_state : process(state, new_tx_data, idle_sig) - begin - state_next <= state; - case state is - when IDLE => - -- wenn neue Sendedaten anliegen wird in den Zustand SEND gewechselt - if new_tx_data = '1' then - state_next <= SEND; - end if; - when SEND => - -- wenn das Byte inklusive Start- und Stopbit versendet wurde, geht - -- der Prozess wieder in den IDLE Zustand. - if idle_sig = '1' then - state_next <= IDLE; - end if; - end case; - end process; - - -- Ausgabe Logik - rs232_tx_baud : process(sys_clk, sys_res_n, state, baud_cnt, cnt, tx_data, bus_tx_int) - begin - -- Solang idle_sig auf 0 ist wird im SEND Zustand verblieben - idle_sig_next <= '0'; - bus_tx_nxt <= bus_tx_int; - cnt_next <= cnt; - baud_cnt_next <= baud_cnt; - - case state is - when IDLE => - -- tx-Signale im idle Zustand halten - tx_rdy <= '1'; - baud_cnt_next <= CLK_PER_BAUD; - when SEND => - -- Signalisiert dass gerade ein Byte versendet wird - tx_rdy <= '0'; - -- Counter erhoehen um die Zeit einer Bitdauer abzuwarten - baud_cnt_next <= baud_cnt + 1; - if baud_cnt = CLK_PER_BAUD then - -- wenn die Bitdauer erreicht ist, Counter reseten - baud_cnt_next <= 0; - -- Counter um die einzelen Bits zu versenden - cnt_next <= cnt + 1; - case cnt is - when 0 => - -- counter = 0 => Startbit versenden - bus_tx_nxt <= '0'; - when 9 => - -- counter = 9 => Stopbit versenden - bus_tx_nxt <= '1'; - -- stop_bit 0 heißt 1 stop bit - if stop_bit = '0' then - cnt_next <= 0; - idle_sig_next <= '1'; - end if; - when 10 => - bus_tx_nxt <= '1'; - -- stop_bit 1 heißt 2 stop bits - if stop_bit = '1' then - cnt_next <= 0; - -- Signalisieren dass der Sendevorgang beendet ist - idle_sig_next <= '1'; - end if; - when others => - -- counter von 1 bis 8 => Datenbits versenden - bus_tx_nxt <= tx_data(cnt-1); - end case; - end if; - end case; - end process; - -end architecture beh; +--------------------------------------------------------------------------------- +-- Filename : rs232_tx_arc.vhd +-- ========== +-- +-- Beschreibung : Versand von Daten ueber die RS232 Schnittstelle +-- ============== +-- +-- Autoren : Martin Perner, Schwarz Manfred +-- ========= +---------------------------------------------------------------------------------- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use work.common_pkg.all; +use work.core_pkg.all; +use work.extension_uart_pkg.all; + +architecture beh of rs232_tx is + -- definierern der intern verwendeten Signale + type STATE_TYPE is (IDLE,SEND); + signal state, state_next : STATE_TYPE; + signal bus_tx_int, bus_tx_nxt : std_logic := '1'; + signal baud_cnt,baud_cnt_next : integer := CLK_PER_BAUD; + signal cnt, cnt_next : natural range 0 to 11 := 0; + signal idle_sig, idle_sig_next : std_logic := '0'; + +begin + -- syncronisierungs Prozess + rs232_tx_syn : process(sys_clk, sys_res_n) + begin + if (sys_res_n = RESET_VALUE) then + -- reset + cnt <= 0; + baud_cnt <= 0; + state <= IDLE; + idle_sig <= '0'; + bus_tx_int <= '1'; + elsif rising_edge(sys_clk) then + -- sync Zustand, uebernehmen der next-Signale + baud_cnt <= baud_cnt_next; + cnt <= cnt_next; + state <= state_next; + idle_sig <= idle_sig_next; + bus_tx_int <= bus_tx_nxt; + end if; + end process; + + bus_tx <= bus_tx_int; + + -- Zustandsmaschienen Prozess + rs232_tx_state : process(state, new_tx_data, idle_sig) + begin + state_next <= state; + case state is + when IDLE => + -- wenn neue Sendedaten anliegen wird in den Zustand SEND gewechselt + if new_tx_data = '1' then + state_next <= SEND; + end if; + when SEND => + -- wenn das Byte inklusive Start- und Stopbit versendet wurde, geht + -- der Prozess wieder in den IDLE Zustand. + if idle_sig = '1' then + state_next <= IDLE; + end if; + end case; + end process; + + -- Ausgabe Logik + rs232_tx_baud : process(sys_clk, sys_res_n, state, baud_cnt, cnt, tx_data, bus_tx_int,stop_bit) + begin + -- Solang idle_sig auf 0 ist wird im SEND Zustand verblieben + idle_sig_next <= '0'; + bus_tx_nxt <= bus_tx_int; + cnt_next <= cnt; + baud_cnt_next <= baud_cnt; + + case state is + when IDLE => + -- tx-Signale im idle Zustand halten + tx_rdy <= '1'; + baud_cnt_next <= CLK_PER_BAUD; + when SEND => + -- Signalisiert dass gerade ein Byte versendet wird + tx_rdy <= '0'; + -- Counter erhoehen um die Zeit einer Bitdauer abzuwarten + baud_cnt_next <= baud_cnt + 1; + if baud_cnt = CLK_PER_BAUD then + -- wenn die Bitdauer erreicht ist, Counter reseten + baud_cnt_next <= 0; + -- Counter um die einzelen Bits zu versenden + cnt_next <= cnt + 1; + case cnt is + when 0 => + -- counter = 0 => Startbit versenden + bus_tx_nxt <= '0'; + when 9 => + -- counter = 9 => Stopbit versenden + bus_tx_nxt <= '1'; + -- stop_bit 0 heißt 1 stop bit + if stop_bit = '0' then + cnt_next <= 0; + idle_sig_next <= '1'; + end if; + when 10 => + bus_tx_nxt <= '1'; + -- stop_bit 1 heißt 2 stop bits + if stop_bit = '1' then + cnt_next <= 0; + -- Signalisieren dass der Sendevorgang beendet ist + idle_sig_next <= '1'; + end if; + when others => + -- counter von 1 bis 8 => Datenbits versenden + bus_tx_nxt <= tx_data(cnt-1); + end case; + end if; + end case; + end process; + +end architecture beh;