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

приём данных по протоколу UART

Вопрос такой: у меня есть модуль вот такой: http://www.ebay.com/itm/FT232RL-3-3V-5-5V-...t-/141724029351 и ПЛИС вот такая: http://www.terasic.com.tw/cgi-bin/page/arc...lish&No=593 (cyclone iv)

Для uart модуля я установил на комп драйвер com порта http://www.ftdichip.com/Drivers/VCP.htm. Вроде бы всё работает ( при посылке данных светодиод на плате мигает ). Использую такую вот программку для передачи данных через com порт http://compt.ru/ru/index.php

Написал вот такой приёмник для ПЛИС:

-------------------------------------------------------------------------------


library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity reciver is
     port(
         clk : in STD_LOGIC;
         ftdi_txd : in STD_LOGIC;
         led : out STD_LOGIC_VECTOR(7 downto 0)
         );
end reciver;

--}} End of automatically maintained section

architecture arch of reciver is
signal state:natural:=0;  
signal bitcnt:natural:=0;
begin
    process(clk)
    begin        
        if(rising_edge(clk)) then 
            
            if(state=0) then
                if(ftdi_txd='0') then
                    state<=1;  
                    bitcnt<=0;
                end if;
            end if;    
            
            if(state=1) then 
                if(bitcnt<8) then
                    led(bitcnt)<=ftdi_txd;
                    bitcnt<=bitcnt+1;
                else
                    if(ftdi_txd='1') then
                        state<=0;
                    end if;         
                end if;
            end if;
            
        end if;
    end process;
     -- enter your statements here --

end arch;

приёмник писал из соображений таких: 1 старт бит ( низкий уровень ), 8 битов данных, 1 стоп бит ( высокий уровень )

 

частота clk 9600 гц ( получаю так: 50 Мгц делю на 5208 ). Получаю её вот так:

library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity freq is
    generic(n:natural:=5208);
     port(
         clk : in STD_LOGIC;
         clk1 : out STD_LOGIC
         );
end freq;

--}} End of automatically maintained section

architecture arch of freq is
signal a:natural:=0;
begin    
    process(clk)
    begin        
        if(rising_edge(clk)) then
            if(a>=0 and a<n/2) then
                clk1<='1';          
            else
                if(a>=n/2 and a<n-1) then
                    clk1<='0';
                end if;
            end if;
            if(a>=n-1) then
                a<=0;
            else
                a<=a+1;
            end if;
        end if;
    end process;
     -- enter your statements here --

end arch;

 

Но в результате получаю беспорядочное мигание светодиодами ( радует только одно: мигают только при передаче, т.е. что-то правильное уже есть)

 

Подключаю так:

IMG_20160109_222009.jpg

контакт rx к ножке ПЛИС

Понимаю, что не имея перед глазами всех этих штук сложно найти ошибку, но может знает кто в чём может быть дело?

Перемычка в положении 3.3 вольта

 

Изменено пользователем enzaime

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


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

Прежде всего, общие не соеденены.

Общие это vcc и gnd? Если про них, то и так всё работает ( что-то там светится ). Обновил фотку в первом сообщении (теперь в рабочем варианте (плата и модуль питаются от компа))

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


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

Но в результате получаю беспорядочное мигание светодиодами ( радует только одно: мигают только при передаче, т.е. что-то правильное уже есть)

 

Понимаю, что не имея перед глазами всех этих штук сложно найти ошибку, но может знает кто в чём может быть дело?

1. Делаем перемычку Rx-Tx внутри ПЛИС и добиваемся устойчивой передачи и приема данных. Смотрим осциллом...

2. Переносим перемычку из ПЛИС на контакты разъема платы... и добиваемся устойчивой передачи и приема данных. Смотрим осциллом...

3. Подключаем переходник USB на UART к компьютеру. На переходнике Делаем перемычку Rx-Tx и добиваемся устойчивой передачи и приема данных со стороны компьютера..

4. Сравниваем диаграммы при передаче одинаковых кодов, например буквы U. Длительности импульсов должны быть одинаковыми...

 

На опекорес полно исходников UARTов, берем и смотрим коды.

При установке ИСЕ есть образцовые проекты - вэвйген. Там есть и UART.

 

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


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

Рекомендую рабочий вариант с объяснениями:

A serial interface is a simple way to connect an FPGA to a PC. We just need a transmitter and receiver module

 

Правда, реализация на Verilog, но мне в свое время хорошо помог.

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


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

1. Самая главная ошибка в том, что нет синхронизаторов на ftdi_txd. Этот сигнал является асинхронным для вашего приёмника. Т.е. его спад/фронт может прийти в момент считывания приёмником, а это приведёт к метастабильности всей схемы из-за несоблюдения setup/hold триггера. Изучайте CDC (Clock Domain Crossing), в сети море статей.

Например, по ссылке от shamrel в секции описания приёмника входной сигнал синхронизируется с помощью регистра RxD_sync. (правда, там на verilog, но сути не меняет).

 

2. Генерировать тактовый сигнал на логике - не самый удачный вариант. Это нужно использовать только в крайнем случае и с пониманием. А приёмник UART можно сделать и на 50мгц. Так можно будет точнее поймать перепад (1 -> 0), т.е. стартовый бит, а далее счётчиком отсчитать нужное число тактов, чтобы попасть на середину каждого информационного бита.

 

Общие это vcc и gnd? Если про них, то и так всё работает ( что-то там светится ). Обновил фотку в первом сообщении (теперь в рабочем варианте (плата и модуль питаются от компа))

3. Общая - земля. Всё и так работает видимо потому, что земля общая за счёт USB, который подключен к одному компьютеру. Но это не всегда будет работать, соединяйте землю нормально.

Изменено пользователем Inanity

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


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

стоит проверить работоспособность FTDI и драйвера. бывает свежий драйвер порет чушь в порт из-за китайского клона. лечится установкой старого драйвера FTDI.

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


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

стоит проверить работоспособность FTDI и драйвера. бывает свежий драйвер порет чушь в порт из-за китайского клона. лечится установкой старого драйвера FTDI.

Блин, я вчера так и сделал и всё заработало как часы. Как и должно быть. Причина вот: я сразу полез устанавливать скачанный драйвер, и лишь когда начал пробовать на другом компе устанавливать драйвера увидел, что при втыкании модуля он сам устанавливает нужные драйвера (видимо из своей внутренней памяти). В общем всё как всегда... Всем спасибо за участие, все свободны :biggrin:

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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