uart: rxd drin
authorManfred <xzarion@l0725898.(none)>
Fri, 17 Dec 2010 09:34:45 +0000 (10:34 +0100)
committerManfred <xzarion@l0725898.(none)>
Fri, 17 Dec 2010 09:34:45 +0000 (10:34 +0100)
cpu/sim/testcore1.do
cpu/src/extension_uart.vhd
cpu/src/extension_uart_b.vhd
cpu/src/extension_uart_pkg.vhd
cpu/src/rs232_rx.vhd [new file with mode: 0755]
cpu/src/rs232_rx_arc.vhd [new file with mode: 0755]

index 4df36d1678f724cfacb9e16c264f43fec810ea23..a4baa8d9ea33637cf5f6aac8453e7a9927f322cb 100644 (file)
@@ -40,6 +40,8 @@ vcom -work work ../src/extension_b.vhd
 vcom -work work ../src/extension_uart_pkg.vhd
 vcom -work work ../src/rs232_tx.vhd
 vcom -work work ../src/rs232_tx_arc.vhd
+vcom -work work ../src/rs232_rx.vhd
+vcom -work work ../src/rs232_rx_arc.vhd
 vcom -work work ../src/extension_uart.vhd
 vcom -work work ../src/extension_uart_b.vhd
 
index 368f2180a906d4810184915b512e3b7994a21eb0..e928ad0c165910c80bb1a906370c9e9005989384 100644 (file)
@@ -21,7 +21,7 @@ entity extension_uart is
                        ext_reg  : in extmod_rec;
                        data_out : out gp_register_t;
                -- Input
-
+                       bus_rx : in std_logic;
                -- Ouput
                        bus_tx : out std_logic
                );
index bf29728f6ee4024a393425f44deec36084a9a56a..7dc28927b912a62294be61d7eac0eeac8d920a9f 100644 (file)
@@ -38,6 +38,23 @@ port map(
        w1_st_co(0)
 );
 
+rs232_rx_inst : rs232_rx
+generic        map(
+               RESET_VALUE
+               )
+port map(
+       --System inputs
+       clk,
+       reset,
+
+       --Bus
+       bus_rx,
+
+       --From/to sendlogic
+       w1_st_co(17),
+       w4_uart_receive(byte_t'range)
+       
+);
 
 
 
index c9892bdf1bab2e47beb339f35109297f8380fd9b..80df4b27627ac3298b7589e30114246cddd14c4b 100644 (file)
@@ -38,7 +38,7 @@ constant CLK_PER_BAUD : integer := 16330000;
                        ext_reg  : in extmod_rec;
                        data_out : out gp_register_t;
                -- Input
-
+                       bus_rx : in std_logic;
                -- Ouput
                        bus_tx : out std_logic
                );
@@ -67,4 +67,26 @@ component rs232_tx is
 );
 end component rs232_tx;
 
+component rs232_rx is
+       generic (
+               -- active reset value
+               RESET_VALUE : std_logic
+               );
+
+       port(
+               --System inputs
+               sys_clk : in std_logic;
+               sys_res_n : in std_logic;
+
+               --Bus
+               bus_rx : in std_logic;
+
+               --To sendlogic
+               new_rx_data : out std_logic;
+               rx_data : out uart_data
+       );
+end component rs232_rx;
+
+
+
 end package extension_uart_pkg;
diff --git a/cpu/src/rs232_rx.vhd b/cpu/src/rs232_rx.vhd
new file mode 100755 (executable)
index 0000000..d363ac2
--- /dev/null
@@ -0,0 +1,40 @@
+---------------------------------------------------------------------------------
+-- Filename : rs232_rx.vhd
+-- ========== 
+-- 
+-- Beschreibung : Empfang von Daten ueber die RS232 Schnittstelle
+-- ==============
+--
+-- Autoren : Martin Perner, Schwarz Manfred
+-- =========
+----------------------------------------------------------------------------------
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_unsigned.all;
+use IEEE.std_logic_arith.all;
+
+use work.common_pkg.all;
+use work.core_pkg.all;
+use work.extension_uart_pkg.all;
+
+entity rs232_rx is
+       generic (
+               -- active reset value
+               RESET_VALUE : std_logic
+               );
+
+       port(
+               --System inputs
+               sys_clk : in std_logic;
+               sys_res_n : in std_logic;
+
+               --Bus
+               bus_rx : in std_logic;
+
+               --To sendlogic
+               new_rx_data : out std_logic;
+               rx_data : out uart_data
+       );
+
+end rs232_rx;
diff --git a/cpu/src/rs232_rx_arc.vhd b/cpu/src/rs232_rx_arc.vhd
new file mode 100755 (executable)
index 0000000..6cc9430
--- /dev/null
@@ -0,0 +1,155 @@
+---------------------------------------------------------------------------------\r
+-- Filename : rs232_rx_arc.vhd\r
+-- ========== \r
+-- \r
+-- Beschreibung : Empfang von Daten ueber die RS232 Schnittstelle\r
+-- ==============\r
+--\r
+-- Autoren : Martin Perner, Schwarz Manfred\r
+-- =========\r
+----------------------------------------------------------------------------------\r
+\r
+library IEEE;\r
+use IEEE.std_logic_1164.all;\r
+use IEEE.numeric_std.all;\r
+\r
+use work.common_pkg.all;\r
+use work.core_pkg.all;\r
+use work.extension_uart_pkg.all;\r
+\r
+architecture beh of rs232_rx is\r
+       -- definierern der intern verwendeten Signale\r
+       type STATE_TYPE is (IDLE, READ_START, READ_BIT, READ_STOP, POST_STOP);\r
+       signal state, state_next : STATE_TYPE;\r
+       signal bus_rx_last, bus_rx_int, new_rx_data_nxt : std_logic := '0';\r
+       signal cnt, cnt_next : integer := 0;\r
+       signal baud_cnt, baud_cnt_next : integer := 0;\r
+       signal rx_data_int, rx_data_nxt, rx_data_res_int, rx_data_res_nxt : uart_data;\r
+       \r
+begin\r
+       -- syncronisierungs Prozess\r
+       rs232_rx_syn : process(sys_clk, sys_res_n)\r
+       begin\r
+               if (sys_res_n = RESET_VALUE) then\r
+                       -- reset Zustand\r
+                       state <= IDLE;\r
+                       cnt <= 0;\r
+                       rx_data_res_int <= x"00";\r
+\r
+               elsif rising_edge(sys_clk) then\r
+                       -- sync Zustand, uebernehmen der next-Signale\r
+                       state <= state_next;\r
+                       cnt <= cnt_next;\r
+                       baud_cnt <= baud_cnt_next;\r
+                       bus_rx_int <= bus_rx_last;\r
+                       rx_data_int <= rx_data_nxt;\r
+                       rx_data_res_int <= rx_data_res_nxt;\r
+                       new_rx_data <= new_rx_data_nxt;\r
+\r
+               end if;\r
+       end process;\r
+\r
+       -- setzen des Ausgangsignals, Rxt-Daten\r
+       rx_data <= rx_data_res_int;\r
+\r
+       -- Zustandsmaschienen Prozess\r
+       rs232_states : process(sys_clk,state,cnt, bus_rx, bus_rx_last, baud_cnt,bus_rx_int)\r
+       begin\r
+               state_next <= state;    -- mal schauen ob des so geht\r
+               bus_rx_last <= bus_rx; -- mal schauen ob des so geht\r
+               case state is\r
+                       when IDLE =>\r
+                               -- nach einem Wechsel der rxt-Leitung von 1 auf 0 wird der einlese Vorgang\r
+                               -- getriggert mithilfe eines Zustandsuebergangs von IDLE auf READ_START\r
+                               if (bus_rx_last = '0' and bus_rx_int = '1') then\r
+                                       state_next <= READ_START;\r
+                               end if;\r
+                       when READ_START =>\r
+                               -- im READ_START Zustand wird eine halbe Bitzeit gewartet. Liegt auf der rxt-Leitung\r
+                               -- immer noch die 0 an so wird mit deim Lesebvorgang mit einem Zustandswechsel von\r
+                               -- READ_START nach READ_BIT vorgefahren, wenn eine 1 anliegt wird abgebrochen und\r
+                               -- wieder nach IDLE gewechselt\r
+                               if (bus_rx = '0' and baud_cnt = CLK_PER_BAUD/2) then\r
+                                       state_next <= READ_BIT;\r
+                               elsif (bus_rx = '1' and baud_cnt = CLK_PER_BAUD/2) then\r
+                                       state_next <= IDLE;\r
+                               end if;\r
+                       when READ_BIT =>\r
+                               -- hier werden mit Hilfe eines Countersignals 8 Datenbits im Abstand der eingestellten\r
+                               -- Bitzeit eingelesen und gespeichert.\r
+                               -- Nach beendigung wird in den Zustand READ_STOP gewechselt.\r
+                               if (cnt = 7 and  baud_cnt = CLK_PER_BAUD) then\r
+                                       state_next <= READ_STOP;\r
+                               else\r
+                                       state_next <= READ_BIT;\r
+                               end if;\r
+                       when READ_STOP =>\r
+                               -- hier wird nur noch auf das Stopbit abgewartet und gelesen um den\r
+                               -- Lesevorgang koerrekt zu beenden\r
+                               if baud_cnt = CLK_PER_BAUD and bus_rx = '1' then\r
+                                       state_next <= POST_STOP;\r
+                               elsif baud_cnt = CLK_PER_BAUD and bus_rx = '0' then\r
+                                       state_next <= IDLE;\r
+                               end if;\r
+                       when POST_STOP =>\r
+                               -- hier wird nur noch eine halbe Bitzeit gewartet\r
+                               if baud_cnt = CLK_PER_BAUD/2 then\r
+                                       state_next <= IDLE;\r
+                               end if;\r
+               end case;\r
+       end process;\r
+\r
+       -- Ausgabe Logik\r
+       rs232_tx_baud : process(state, cnt, bus_rx, baud_cnt, rx_data_int, rx_data_res_int)\r
+       begin\r
+               -- Signale halten um Latches zu vermeiden\r
+               cnt_next <= cnt;\r
+               new_rx_data_nxt <= '0';\r
+               baud_cnt_next <= baud_cnt;\r
+               rx_data_nxt <= rx_data_int;\r
+               rx_data_res_nxt <= rx_data_res_int;\r
+               -- Statewechesel wie obenbeschrieben\r
+               case state is\r
+                       when IDLE =>\r
+                               baud_cnt_next <= 0;\r
+                       when READ_START =>\r
+                               -- baut_cnt zyklenweise erhoehen bis es einer halben Bitzeit entspricht\r
+                               -- anschliessend zuruecksetzten\r
+                               baud_cnt_next <= baud_cnt + 1;\r
+                               if baud_cnt = CLK_PER_BAUD/2 then \r
+                                       baud_cnt_next <= 0;\r
+                                       rx_data_nxt <= x"00";\r
+                               end if;\r
+                       when READ_BIT =>\r
+                               -- baut_cnt zyklenweise erhoehen bis es einer Bitzeit entspricht\r
+                               -- anschliessend zuruecksetzen\r
+                               -- Zustand der rxt-Leitung im rx_data_nxt abspeichern\r
+                               baud_cnt_next <= baud_cnt + 1;\r
+                               if baud_cnt = CLK_PER_BAUD then \r
+                                       baud_cnt_next <= 0;\r
+                                       cnt_next <= cnt+1;\r
+                                       rx_data_nxt(cnt) <= bus_rx;\r
+                               end if;\r
+                       when READ_STOP =>\r
+                               -- baut_cnt zyklenweise erhoehen bis es einer Bitzeit entspricht\r
+                               -- anschliessend zuruecksetzen\r
+                               -- Counter reseten\r
+                               -- Signal fuer neue rx-Daten setzen um die send_logic zu aktivieren\r
+                               cnt_next <= 0;\r
+                               baud_cnt_next <= baud_cnt + 1;\r
+                               if baud_cnt = CLK_PER_BAUD then \r
+                                       baud_cnt_next <= 0;\r
+                               end if;\r
+                       when POST_STOP =>\r
+                               --halbe bitzeit wartenr auf counter warten\r
+                               baud_cnt_next <= baud_cnt + 1;\r
+                               if baud_cnt =  CLK_PER_BAUD/2 then \r
+                                       new_rx_data_nxt <= '1'; \r
+                                       rx_data_res_nxt <= rx_data_int;\r
+                                       baud_cnt_next <= 0;\r
+                               end if;\r
+               end case;\r
+       end process;\r
+\r
+end architecture beh;\r
+\r