Forth
http://fforum.winglion.ru/

UART на VHDL
http://fforum.winglion.ru/viewtopic.php?f=3&t=2802
Страница 1 из 1

Автор:  Hishnik [ Ср янв 25, 2012 00:40 ]
Заголовок сообщения:  UART на VHDL

Вот, для процессоров. Интерфейс надо адаптировать к конкретному решению, конечно, но тут видно, в какой момент и откуда забирать данные и куда их подавать.

Код:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;

-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity uart is
   generic ( FCORE : integer := 100000000;
             UART_BAUDRATE : integer := 115200
           );
    Port ( clk : in  STD_LOGIC;
           rx : in  STD_LOGIC;
           tx : out  STD_LOGIC;
           txe : in  STD_LOGIC; -- start transmit
           received : out  STD_LOGIC_VECTOR (7 downto 0);
           transmit : in  STD_LOGIC_VECTOR (7 downto 0));
end uart;

architecture Behavioral of uart is

signal rxstate, txstate : integer range 0 to (FCORE * 12) / UART_BAUDRATE := 0;

begin

process(clk)
begin
  if clk'event and clk = '1' then
    case rxstate is
      when 0 to FCORE / 2 / UART_BAUDRATE => if rx = '0' then rxstate <= rxstate + 1; end if;
      when 3 * FCORE / 2 / UART_BAUDRATE => received(0) <= rx; rxstate <= rxstate + 1;
      when 5 * FCORE / 2 / UART_BAUDRATE => received(1) <= rx; rxstate <= rxstate + 1;
      when 7 * FCORE / 2 / UART_BAUDRATE => received(2) <= rx; rxstate <= rxstate + 1;
      when 9 * FCORE / 2 / UART_BAUDRATE => received(3) <= rx; rxstate <= rxstate + 1;
      when 11 * FCORE / 2 / UART_BAUDRATE => received(4) <= rx; rxstate <= rxstate + 1;
      when 13 * FCORE / 2 / UART_BAUDRATE => received(5) <= rx; rxstate <= rxstate + 1;
      when 15 * FCORE / 2 / UART_BAUDRATE => received(6) <= rx; rxstate <= rxstate + 1;
      when 17 * FCORE / 2 / UART_BAUDRATE => received(7) <= rx; rxstate <= rxstate + 1;
      when 19 * FCORE / 2 / UART_BAUDRATE => rxstate <= 0; -- rxcounter <= rxcounter + 1;
      when others => rxstate <= rxstate + 1;
    end case;
  end if;
end process;

process(clk)
begin
  if clk'event and clk = '1' then
    case txstate is
      when 0 => tx <= '1';
                if txe = '1' then txstate <= 1; end if;
      when 1 => tx <= '0'; txstate <= txstate + 1;
      when FCORE / UART_BAUDRATE => tx <= transmit(0); txstate <= txstate + 1;
      when 2 * FCORE / UART_BAUDRATE => tx <= transmit(1); txstate <= txstate + 1;
      when 3 * FCORE / UART_BAUDRATE => tx <= transmit(2); txstate <= txstate + 1;
      when 4 * FCORE / UART_BAUDRATE => tx <= transmit(3); txstate <= txstate + 1;
      when 5 * FCORE / UART_BAUDRATE => tx <= transmit(4); txstate <= txstate + 1;
      when 6 * FCORE / UART_BAUDRATE => tx <= transmit(5); txstate <= txstate + 1;
      when 7 * FCORE / UART_BAUDRATE => tx <= transmit(6); txstate <= txstate + 1;
      when 8 * FCORE / UART_BAUDRATE => tx <= transmit(7); txstate <= txstate + 1;
      when 9 * FCORE / UART_BAUDRATE => tx <= '1'; txstate <= txstate + 1;
      when 11 * FCORE / UART_BAUDRATE => txstate <= 0;
      when others => txstate <= txstate + 1;
    end case;
  end if;
end process;


end Behavioral;

Страница 1 из 1 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/