OpenCores
URL https://opencores.org/ocsvn/rs232_interface/rs232_interface/trunk

Subversion Repositories rs232_interface

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /rs232_interface
    from Rev 2 to Rev 3
    Reverse comparison

Rev 2 → Rev 3

/trunk/uart.vhd
0,0 → 1,165
----------------------------------------------------------------------------------
-- Create Date: 21:12:48 05/06/2010
-- Module Name: UART - Behavioral
-- Used TAB of 4 Spaces
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
entity uart is
generic (
CLK_FREQ : integer := 50; -- Main frequency (MHz)
SER_FREQ : integer := 9600 -- Baud rate (bps)
);
port (
-- Control
clk : in std_logic;
rst : in std_logic;
-- External Interface
rx : in std_logic;
tx : out std_logic;
-- uPC Interface
tx_req : in std_logic;
tx_end : out std_logic;
tx_data : in std_logic_vector(7 downto 0);
rx_ready : out std_logic;
rx_data : out std_logic_vector(7 downto 0)
);
end uart;
 
architecture Behavioral of uart is
 
-- Constants
constant uart_idle : std_logic := '1';
constant uart_start : std_logic := '0';
 
-- Types
type state is (idle,data,stop1,stop2);
 
-- Signals
signal rx_fsm : state;
signal tx_fsm : state;
signal clock_en : std_logic;
 
-- Data Temp
signal data_cnt_tx : std_logic_vector(2 downto 0) := "000";
signal data_cnt_rx : std_logic_vector(2 downto 0) := "000";
signal rx_data_tmp : std_logic_vector(7 downto 0);
signal tx_data_tmp : std_logic_vector(7 downto 0);
 
begin
 
clock_manager:process(clk)
variable counter : integer range 0 to conv_integer((CLK_FREQ*1_000_000)/SER_FREQ-1);
begin
if clk'event and clk = '1' then
-- Normal Operation
if counter = (CLK_FREQ*1_000_000)/SER_FREQ-1 then
clock_en <= '1';
counter := 0;
else
clock_en <= '0';
counter := counter + 1;
end if;
-- Reset condition
if rst = '1' then
counter := 0;
end if;
end if;
end process;
 
tx_proc:process(clk)
variable data_cnt : std_logic_vector(2 downto 0);
begin
if clk'event and clk = '1' then
if clock_en = '1' then
-- Default values
tx_end <= '0';
tx <= uart_idle;
-- FSM description
case tx_fsm is
-- Wait to transfer data
when idle =>
-- Send Init Bit
if tx_req = '1' then
tx <= uart_start;
tx_data_tmp <= tx_data;
tx_fsm <= data;
data_cnt_tx <= (others=>'1');
end if;
-- Data receive
when data =>
tx <= tx_data_tmp(0);
if data_cnt_tx = 0 then
tx_fsm <= stop1;
data_cnt_tx <= (others=>'1');
else
tx_data_tmp <= '0' & tx_data_tmp(7 downto 1);
data_cnt_tx <= data_cnt_tx - 1;
end if;
-- End of communication
when stop1 =>
-- Send Stop Bit
tx <= uart_idle;
tx_fsm <= stop2;
when stop2 =>
-- Send Stop Bit
tx_end <= '1';
tx <= uart_idle;
tx_fsm <= idle;
-- Invalid States
when others => null;
end case;
-- Reset condition
if rst = '1' then
tx_fsm <= idle;
tx_data_tmp <= (others=>'0');
end if;
end if;
end if;
end process;
 
rx_proc:process(clk)
begin
if clk'event and clk = '1' then
if clock_en = '1' then
-- Default values
rx_ready <= '0';
-- FSM description
case rx_fsm is
-- Wait to transfer data
when idle =>
if rx = uart_start then
rx_fsm <= data;
end if;
data_cnt_rx <= (others=>'0');
-- Data receive
when data =>
if data_cnt_rx = 7 then
rx_fsm <= idle;
rx_ready <= '1';
rx_data(7) <= rx;
for i in 0 to 6 loop
rx_data(i) <= rx_data_tmp(6-i);
end loop;
else
rx_data_tmp <= rx_data_tmp(6 downto 0) & rx;
data_cnt_rx <= data_cnt_rx + 1;
end if;
when others => null;
end case;
-- Reset condition
if rst = '1' then
rx_fsm <= idle;
rx_ready <= '0';
rx_data <= (others=>'0');
data_cnt_rx <= (others=>'0');
end if;
end if;
end if;
end process;
 
end Behavioral;
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.