X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=cpu%2Fsrc%2Frs232_tx_arc.vhd;fp=cpu%2Fsrc%2Frs232_tx_arc.vhd;h=cc29340d8542b566480056b7b3c7a4f24f72e824;hb=78a9fd24aa757de9e088709eae264576ad485158;hp=0000000000000000000000000000000000000000;hpb=e015478bf1add42f6c2e49652360b3fae08d94f5;p=calu.git diff --git a/cpu/src/rs232_tx_arc.vhd b/cpu/src/rs232_tx_arc.vhd new file mode 100755 index 0000000..cc29340 --- /dev/null +++ b/cpu/src/rs232_tx_arc.vhd @@ -0,0 +1,115 @@ +--------------------------------------------------------------------------------- +-- 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'; + when 10 => + bus_tx_nxt <= '1'; + cnt_next <= 0; + -- Signalisieren dass der Sendevorgang beendet ist + idle_sig_next <= '1'; + 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;