Перейти к содержанию
    

Uart Реализация

Поставлена задача реализовать UART. Вопрос в том, как принять входные данные. Один из вариантов - считать стартовый бит до 8 тактов 16 кратной частотой, после этого защелкивать данные по однократной частоте. Правильно ли эта реализация ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

чуть более надежно защелкивать не данные по однократной частоте, а так и фигачить дальше по 16 точек на бит, и по приимущественному признаку считать бит 0 или 1,

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

фигачить дальше по 16 точек на бит, и по приимущественному признаку считать бит 0 или 1,

 

И трех точек будет вполне достаточно...

А самая правильная - качнуть у Ксайлинкса, или с Альтеры или с открытых проектов и посмотреть, как люди делают. И только потом задавать эти вопросы...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Golikov A

А смысл?

Если бороться с помехами, то лучше какой-нибудь РС-код.

IMHO, для ПЛИС нет смысла усложнять реализацию. Стробирование бита от генератор скорости достаточно хорошо работает даже при рассинхронизации в 5 %.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поставлена задача реализовать UART. Вопрос в том, как принять входные данные. Один из вариантов - считать стартовый бит до 8 тактов 16 кратной частотой, после этого защелкивать данные по однократной частоте. Правильно ли эта реализация ?

Не самая удачная, нет автоподстройки частоты на прием. Согласен с Иосифом. Лучше установить частоту опросов 4хbaud rate, выделять фронты, вести автоподстройку и по 3-м отсчетам выделять значение бита.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поставлена задача реализовать UART.

Если по простому (канал передачи чистый - без помех и наводок), то можно так: описание реализовано в виде двух FSM: отдельно на прием и на передачу данных по последовательному интерфейсу. Переходы будут происходить с частотой следования внешних тактовых импульсов, и их количество (до середины младшего бита данных) определится длительностью стартового бита, и половины длительности младшего бита данных. Длительность одного бита (стартового, стопового или данных) соответствует N тактов внешнего генератора. Следовательно, через N+ N/2 тактов после начала стартового бита можно считывать младший бит данных, еще через N тактов – следующий бит и т. д. Всего до приема 8 бита данных пройдет N+7N+ N/2 тактов внешнего генератора. В приведенной программе реализуется прием и передача данных по последовательному интерфейсу, при скорости передачи 9600 бод, тактовой частоте 10 МГц. Передаются 8 бит данных, бита четности нет. Принятый байт сопровождается формированием сигнала receive (вход модуля), передача начинается после перевода сигнала transmit (вход управления) в состояние нуля из состояния единицы.

 

Описание портов:

clk – тактовая частота;

data – входные данные в параллельном виде;

transmit – запрос на передачу;

rx – принимаемые данные (в последовательном виде);

tx – передаваемые данные (в последовательном виде);

receive – сигнализирует, что байт принят (выход модуля);

out07 – выходные данные в параллельном виде;

 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity RS_XXX is
    Port ( clk : in std_logic;
           data : in std_logic_vector(7 downto 0);
           transmit : in std_logic;
           rx : in std_logic;
           tx : out std_logic;
           receive : out std_logic;
           out07 : out std_logic_vector(7 downto 0));
end RS_XXX;

architecture Behavioral of RS_XXX is

signal tstate : std_logic_vector(13 downto 0);
signal rstate : std_logic_vector(13 downto 0);

begin
process (clk)

begin
if clk'event and clk = '1' then

case CONV_INTEGER(tstate) is

when 0 => 
if transmit = '1' then
tstate <= CONV_STD_LOGIC_VECTOR (1, 14);
end if;

when 1 => tx <= '0';         
tstate <= tstate + 1;

when 1041 => tx <=data(0);
tstate <= tstate + 1;

when 2083 => tx <=data(1);
tstate <= tstate + 1;

when 3124 => tx <=data(2);
tstate <= tstate + 1;

when 4166 => tx <=data(3);
tstate <= tstate + 1;

when 5208 => tx <=data(4);
tstate <= tstate + 1;

when 6249 => tx <=data(5);
tstate <= tstate + 1;

when 7291 => tx <=data(6);
tstate <= tstate + 1;

when 8333 => tx <=data(7);
tstate <= tstate + 1;

when 9374 => tx <= '1';
tstate <= CONV_STD_LOGIC_VECTOR (0, 14);

when others =>  tstate <= tstate + 1;
end case;

case CONV_INTEGER(rstate) is

when 0 to 104 => 
if rx = '0' then  rstate <= rstate + 1;
else
rstate <= CONV_STD_LOGIC_VECTOR (1, 14);
end if;  

when 1562 => out07(0)<= rx;
rstate <= rstate + 1;

when 2604 => out07(1)<= rx;
rstate <= rstate + 1;

when 3645 => out07(2)<= rx;
rstate <= rstate + 1;

when 4687 => out07(3)<= rx;
rstate <= rstate + 1;

when 5729 => out07(4)<= rx;
rstate <= rstate + 1;

when 6770 => out07(5)<= rx;
rstate <= rstate + 1;

when 7812 => out07(6)<= rx;
rstate <= rstate + 1;

when 8854 => out07(7)<= rx;
rstate <= rstate + 1;

when 9895 => receive <= '1';
rstate <= rstate + 1;

when 9896 => receive <= '0';
rstate <= CONV_STD_LOGIC_VECTOR (1, 14);

when others =>  rstate <= rstate + 1;
end case;

end if;
end process;
end Behavioral;

 

сам пользовался работает для фиксированной скорости передачи/приема UART и чистого канала передачи...

Исключения применения:

Если канал передачи с помехами, тогда нужно вести выборку данных по 3-м точкам.

Если требуется динамически менять скорость передачи/приема UART, то необходимо реализовывать бодовый генератор частоты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По моему мнению открытых кодов verilog и VHDL и даже схемотехнические реализации ДОСТУПНЫ в интернете.

Вот один из примеров: http://portal-ed.ru/index.php/primery-veri...ealizatsii-uart

Воспользуйтесь гуглом=)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По моему мнению открытых кодов verilog и VHDL и даже схемотехнические реализации ДОСТУПНЫ в интернете.

Вот один из примеров: http://portal-ed.ru/index.php/primery-veri...ealizatsii-uart

Воспользуйтесь гуглом=)

 

Тема не раз обсуждалась. Давно известно, что все эти реализации в гугле - полная ерунда.

Например uart от Альтеры тоже не без греха.

 

Подход простой. Если сможете написать параметризируемый модуль ( параметры - системная частота, несущая частота)

тогда имеет смысл на него посмотреть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тема не раз обсуждалась. Давно известно, что все эти реализации в гугле - полная ерунда.

Например uart от Альтеры тоже не без греха.

Подход простой. Если сможете написать параметризируемый модуль ( параметры - системная частота, несущая частота)

тогда имеет смысл на него посмотреть.

 

Вот так вот БЕЗ ОСНОВАНИЙ ОТВЕРГАТЬ то что лежит на просторах рунета и не только СТРАННО. Вы хоть обоснуйте чем плох код.

А uart от Xilinx тоже не без греха? А какой грех у Альтеры? Об универсальном асинхронном приемо- передатчике сказано в сотнях статей очень много,там рассмотрены все вопросы.

Вот на каком-то форуме люди разбирались...

http://forum.cxem.net/index.php?showtopic=120453

Подход простой. Если сможете написать параметризируемый модуль ( параметры - системная частота, несущая частота)

тогда имеет смысл на него посмотреть.

:biggrin: :biggrin: :biggrin: :biggrin: :biggrin: :biggrin: :biggrin: :biggrin: :biggrin: :biggrin: :biggrin: :biggrin: :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А самая правильная - качнуть у Ксайлинкса, или с Альтеры или с открытых проектов и посмотреть, как люди делают. И только потом задавать эти вопросы...

У Ксайлинкса при установке ISE предлагаются пимеры проектов. В wave_gen есть UART, fifo парсер команд, устранение метастабильности и все что нужно с подробным описанием...

И только ленивый может все это не увидеть...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот тема, там многое обсуждалось.

И там приведен мой первый опыт реализации по трем точкам и мажорирование для фильтрации помех.

RS-232 + FPGA

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я использовал как-то для передачи потока байт с плис блок с fpga4fun (приемник тут тоже есть).

Удобно, что скорость работы и тактовая частота задаются параметрами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пользовался этим http://dfiles.ru/files/c6ziur9wx Все управляется неплохо. Приемник работает достаточно надежно на 115200. В передатчике небольшой казус (решаемый) с буфером.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...