--From/to sendlogic
new_bus_rx,
- rx_data
+ rx_data,
+ bd_rate
);
begin
if (reset = RESET_VALUE) then
w1_st_co <= (others=>'0');
- w2_uart_config <= (others=>'0');
+ w2_uart_config(31 downto 16) <= (others=>'0');
+ -- todo mit einer konstante versehen
+ w2_uart_config(15 downto 0) <= x"01B2";
w3_uart_send <= (others=>'0');
w4_uart_receive <= (others=>'0');
tx_rdy_int <= '0';
w1_st_co_nxt(16) <= '1'; -- busy flag set
w3_uart_send_nxt <= tmp_data;
when "11" =>
- w4_uart_receive_nxt <= tmp_data;
+ --w4_uart_receive_nxt <= tmp_data; sollte nur gelesen werden
when others => null;
end case;
end if;
w1_st_co_nxt(16) <= '0'; -- busy flag reset
end if;
+ if new_bus_rx = '1' then
+ w4_uart_receive_nxt(7 downto 0) <= rx_data;
+ w1_st_co_nxt(17) <= '1';
+ end if;
+
+
end process gwriten;
gread : process (clk,ext_reg,w1_st_co,w2_uart_config,w3_uart_send,w4_uart_receive)
constant BAUD_RATE_WITH : integer := 16;
subtype baud_rate_l is std_logic_vector(BAUD_RATE_WITH-1 downto 0);
--CLKs
-constant CLK_FREQ_MHZ : real := 33.33;
-constant BAUD_RATE : integer := 115200;
+--constant CLK_FREQ_MHZ : real := 33.33;
+--constant BAUD_RATE : integer := 115200;
--constant CLK_PER_BAUD : integer := integer((CLK_FREQ_MHZ * 1000000.0) / real(BAUD_RATE) - 0.5);
-constant CLK_PER_BAUD : integer := 16330000;
+constant CLK_PER_BAUD : integer := 434;
component extension_uart is
--some modules won't need all inputs/outputs
--To sendlogic
new_rx_data : out std_logic;
- rx_data : out uart_data
+ rx_data : out uart_data;
+ bd_rate : in baud_rate_l
);
end component rs232_rx;
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
+ rs232_states : process(sys_clk,state,cnt, bus_rx, bus_rx_last, baud_cnt,bus_rx_int,bd_rate)\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
-- 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
+ if (bus_rx = '0' and baud_cnt = bd_rate/2) then\r
state_next <= READ_BIT;\r
- elsif (bus_rx = '1' and baud_cnt = CLK_PER_BAUD/2) then\r
+ elsif (bus_rx = '1' and baud_cnt = bd_rate/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
+ if (cnt = 7 and baud_cnt = bd_rate) then\r
state_next <= READ_STOP;\r
else\r
state_next <= READ_BIT;\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
+ if baud_cnt = bd_rate and bus_rx = '1' then\r
state_next <= POST_STOP;\r
- elsif baud_cnt = CLK_PER_BAUD and bus_rx = '0' then\r
+ elsif baud_cnt = bd_rate 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
+ if baud_cnt = bd_rate/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
+ rs232_tx_baud : process(state, cnt, bus_rx, baud_cnt, rx_data_int, rx_data_res_int,bad_rate)\r
begin\r
-- Signale halten um Latches zu vermeiden\r
cnt_next <= cnt;\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
+ if baud_cnt = bd_rate/2 then \r
baud_cnt_next <= 0;\r
rx_data_nxt <= x"00";\r
end if;\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
+ if baud_cnt = bd_rate then \r
baud_cnt_next <= 0;\r
cnt_next <= cnt+1;\r
rx_data_nxt(cnt) <= bus_rx;\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
+ if baud_cnt = bd_rate 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
+ if baud_cnt = bd_rate/2 then \r
new_rx_data_nxt <= '1'; \r
rx_data_res_nxt <= rx_data_int;\r
baud_cnt_next <= 0;\r