Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вт мар 19, 2024 07:51

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: UART на VHDL
СообщениеДобавлено: Ср янв 25, 2012 00:40 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7958
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Вот, для процессоров. Интерфейс надо адаптировать к конкретному решению, конечно, но тут видно, в какой момент и откуда забирать данные и куда их подавать.

Код:
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 сообщение ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB