D-Luxe 0 2 марта, 2014 Опубликовано 2 марта, 2014 · Жалоба Поставлена задача реализовать UART. Вопрос в том, как принять входные данные. Один из вариантов - считать стартовый бит до 8 тактов 16 кратной частотой, после этого защелкивать данные по однократной частоте. Правильно ли эта реализация ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 2 марта, 2014 Опубликовано 2 марта, 2014 · Жалоба чуть более надежно защелкивать не данные по однократной частоте, а так и фигачить дальше по 16 точек на бит, и по приимущественному признаку считать бит 0 или 1, Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 2 марта, 2014 Опубликовано 2 марта, 2014 · Жалоба фигачить дальше по 16 точек на бит, и по приимущественному признаку считать бит 0 или 1, И трех точек будет вполне достаточно... А самая правильная - качнуть у Ксайлинкса, или с Альтеры или с открытых проектов и посмотреть, как люди делают. И только потом задавать эти вопросы... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ASN 0 2 марта, 2014 Опубликовано 2 марта, 2014 · Жалоба Golikov A А смысл? Если бороться с помехами, то лучше какой-нибудь РС-код. IMHO, для ПЛИС нет смысла усложнять реализацию. Стробирование бита от генератор скорости достаточно хорошо работает даже при рассинхронизации в 5 %. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tiro 0 2 марта, 2014 Опубликовано 2 марта, 2014 · Жалоба Поставлена задача реализовать UART. Вопрос в том, как принять входные данные. Один из вариантов - считать стартовый бит до 8 тактов 16 кратной частотой, после этого защелкивать данные по однократной частоте. Правильно ли эта реализация ? Не самая удачная, нет автоподстройки частоты на прием. Согласен с Иосифом. Лучше установить частоту опросов 4хbaud rate, выделять фронты, вести автоподстройку и по 3-м отсчетам выделять значение бита. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
eugen_pcad_ru 0 2 марта, 2014 Опубликовано 2 марта, 2014 · Жалоба Не изобретайте велосипед. Скачайте готовую реализацию от упомянутых выше производителей или с fpga4fun. Не понравится, доработаете под Ваши требования. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 2 марта, 2014 Опубликовано 2 марта, 2014 · Жалоба Поставлена задача реализовать 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, то необходимо реализовывать бодовый генератор частоты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dima_spb 0 3 марта, 2014 Опубликовано 3 марта, 2014 · Жалоба По моему мнению открытых кодов verilog и VHDL и даже схемотехнические реализации ДОСТУПНЫ в интернете. Вот один из примеров: http://portal-ed.ru/index.php/primery-veri...ealizatsii-uart Воспользуйтесь гуглом=) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 3 марта, 2014 Опубликовано 3 марта, 2014 · Жалоба По моему мнению открытых кодов verilog и VHDL и даже схемотехнические реализации ДОСТУПНЫ в интернете. Вот один из примеров: http://portal-ed.ru/index.php/primery-veri...ealizatsii-uart Воспользуйтесь гуглом=) Тема не раз обсуждалась. Давно известно, что все эти реализации в гугле - полная ерунда. Например uart от Альтеры тоже не без греха. Подход простой. Если сможете написать параметризируемый модуль ( параметры - системная частота, несущая частота) тогда имеет смысл на него посмотреть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dima_spb 0 3 марта, 2014 Опубликовано 3 марта, 2014 · Жалоба Тема не раз обсуждалась. Давно известно, что все эти реализации в гугле - полная ерунда. Например uart от Альтеры тоже не без греха. Подход простой. Если сможете написать параметризируемый модуль ( параметры - системная частота, несущая частота) тогда имеет смысл на него посмотреть. Вот так вот БЕЗ ОСНОВАНИЙ ОТВЕРГАТЬ то что лежит на просторах рунета и не только СТРАННО. Вы хоть обоснуйте чем плох код. А uart от Xilinx тоже не без греха? А какой грех у Альтеры? Об универсальном асинхронном приемо- передатчике сказано в сотнях статей очень много,там рассмотрены все вопросы. Вот на каком-то форуме люди разбирались... http://forum.cxem.net/index.php?showtopic=120453 Подход простой. Если сможете написать параметризируемый модуль ( параметры - системная частота, несущая частота) тогда имеет смысл на него посмотреть. :biggrin: :biggrin: :biggrin: :biggrin: :biggrin: :biggrin: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 3 марта, 2014 Опубликовано 3 марта, 2014 · Жалоба А самая правильная - качнуть у Ксайлинкса, или с Альтеры или с открытых проектов и посмотреть, как люди делают. И только потом задавать эти вопросы... У Ксайлинкса при установке ISE предлагаются пимеры проектов. В wave_gen есть UART, fifo парсер команд, устранение метастабильности и все что нужно с подробным описанием... И только ленивый может все это не увидеть... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kopart 0 4 марта, 2014 Опубликовано 4 марта, 2014 · Жалоба Вот тема, там многое обсуждалось. И там приведен мой первый опыт реализации по трем точкам и мажорирование для фильтрации помех. RS-232 + FPGA Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Swup 0 6 марта, 2014 Опубликовано 6 марта, 2014 · Жалоба Я использовал как-то для передачи потока байт с плис блок с fpga4fun (приемник тут тоже есть). Удобно, что скорость работы и тактовая частота задаются параметрами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
acvarif 0 11 марта, 2014 Опубликовано 11 марта, 2014 · Жалоба Пользовался этим http://dfiles.ru/files/c6ziur9wx Все управляется неплохо. Приемник работает достаточно надежно на 115200. В передатчике небольшой казус (решаемый) с буфером. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться