OSDev

для всех
Текущее время: 11 дек 2017, 22:15

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 11 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Продолжаю страдать
СообщениеДобавлено: 31 дек 2008, 22:50 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1315
Откуда: Зеленоград
В порядке освоения ПЛИС обзавёлся платкой Nexys2 производства Digilent на основе ПЛИС Spartan-3E от Xilinx. Инструментарий пришлось качать из конторы по интернету: бесплатная версия весит аж 2,2 Гб, платная (60 дней триал) -- 3,3 Гб. Самое странное, что бесплатная отказалась ставиться не только на Вислу-64 (она только 32-разрядные оси поддерживает), но и на Хрюшу-32: заявляет, что, мол, не та система. Побороть пока не поборол. Платная встала на Вислу нормально, но 64-разрядные версии программ падают сразу после запуска, работают только 32-разрядные. В чём дело, пока неясно, переставлять систему, чтоб точно чистая была, пока лень.

Ещё один недостаток заключается в том, что инструментарий Xilinx не может на эту плату заливать прошивку ПЛИС напрямую, требуется использовать программу Adept от Digilent. Судя по сайту, она должна работать на любой системе, однако в Висле-64 она не установилась (подозреваю, что они попросту забыли, что для 64-разрядных систем нужны свои драйвера). Так что проектировать ПЛИС приходится в Висле, а заливать прошивку -- в Хрюше.

Пока что сделал две очень простые задачи: сначала просто подцепил два переключателя к элементу 2И и вывел его выход на светодиод, а затем поставил кнопку на вход 4-разрядного двоичного счётчика, а выходы отправил на светодиоды. Работает, хотя обнаружился дребезг контактов (что, собственно, и ожидалось). Вот такие вот пироги :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Продолжаю страдать
СообщениеДобавлено: 02 янв 2009, 01:08 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1315
Откуда: Зеленоград
Научился управлять семисегментными индикаторами. В общем-то, ничего сложного.

Зато никак не могу решить другую задачу: побороть дребезг контактов у кнопок. Замучился уже, блин... Дребезжат, и всё тут ]:->


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Продолжаю страдать
СообщениеДобавлено: 02 янв 2009, 03:05 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1315
Откуда: Зеленоград
Победил в конце концов дребезг, но через задницу: использовал D-триггер, для которого потребовался делитель частоты (опорная 50 МГц, а делил на 2**20 с помощью включенных последовательно 4- и 16-разрядного двоичных счётчиков).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Продолжаю страдать
СообщениеДобавлено: 08 фев 2009, 18:55 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1315
Откуда: Зеленоград
Сделал ещё один вариант антидребезга, на этот раз полностью на VHDL. Суть такова: каждый такт сравнивается текущее и предыдущее значения входного сигнала. Если они совпадают, на 1 увеличивается счётчик, и когда он достигнет 15, входной сигнал запоминается в выходном триггере и появляется на выходе. Если же при сравнении окажется, что текущее и предыдущее значения различаются, счётчик сбрасывается в 0. Таким образом отфильтровываются помехи длительностью до 15 периодов частоты счёта.

Конечно, для подавления дребезга от механических контактов опорную частоту генератора, установленного на плате (50 МГц), приходится делить в ннадцать раз, но для более быстрых процессов может подойти и без деления. От кнопок дребезг полностью пропадал при делении на 65536 (с помощью 16-разрядного счётчика).

Вот исходник антидребезга на VHDL:

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


entity Debouncer is
    Port ( Input : in  std_logic;
           Output : out  std_logic;
           Clock : in  std_logic );
end Debouncer;


architecture Behavioral of Debouncer is
  signal Counter : std_logic_vector (3 downto 0);
  signal Current : std_logic;
begin
  process (Clock)
  begin
    if rising_edge(Clock) then
      if Input /= Current then
        Current <= Input;
        Counter <= (others => '0');
      elsif Counter = "1111" then
        Output <= Current;
      else
        Counter <= Counter + 1;
      end if;
    end if;
  end process;
end Behavioral;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re^2: Продолжаю страдать
СообщениеДобавлено: 09 фев 2009, 16:11 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1025
Откуда: Балаково
Думаю, можно и так: кнопку подключить на информационный вход 16-разрядного сдвигового регистра, который крутится от низкочастотного тактового генератора. К выходным разрядам регистра подключить логический элемент 16-ИЛИ, на выходе которого будет 1 пока имеется хоть одна единица на сдвиговом регистре.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re^3: Продолжаю страдать
СообщениеДобавлено: 09 фев 2009, 17:15 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1315
Откуда: Зеленоград
Не годится, ведь нужно равенство или неравенство всех принятых разрядов (т.е. либо все 1, либо все 0 -- иначе состояние выхода меняться не должно). Ну и затраты оборудования здесь намного выше: в моём алгоритме требуется 6 триггеров, ну а в этом только сдвиговый регистр займёт 16.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re^4: Продолжаю страдать
СообщениеДобавлено: 09 фев 2009, 17:31 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1025
Откуда: Балаково
Я честно говоря именно неравенство и задумывал, получив гиперчувствительность и отсутствие задержки (тоесть качественные изменения). Гиперчувствительность может помочь при плохих контактах, когда состояние "включено" состоит из сплошного дребезга :-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re^5: Продолжаю страдать
СообщениеДобавлено: 02 июл 2009, 17:47 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1315
Откуда: Зеленоград
После особо долгого перерыва (чуть ли не полгода) вернулся к электронным экскрементам. Скачал новую версию ISE (11.2), которая нормально ставится на Вислу-64 и даже работает нормально и в 32-, и в 64-разрядном режимах. Правда, лицензии для полной версии нет, поэтому использую WebPack. Сходу разобрался в общих чертах, как использовать ISim для симуляции схем. Правда, сия программа то ли не работает в 64-разрядном WebPack, то ли вообще есть только в 32-разрядном варианте: для симуляции надо использовать именно 32-разрядный WebPack.

Пока сделал простейший тест для простейшего же одноразрядного компаратора (выдаёт 1 на выходе, если оба входа равны). Код компаратора на VHDL:

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

entity Comparator1 is
    Port ( A : in  STD_LOGIC;
           B : in  STD_LOGIC;
           EQ : out  STD_LOGIC);
end Comparator1;

architecture Behavioral of Comparator1 is
  signal P0, P1 : STD_LOGIC;
begin
  EQ <= P0 or P1;
  P0 <= (not A) and (not B);
  P1 <= A and B;
end Behavioral;


Код тестбенча:

Код:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.all;
USE ieee.numeric_std.ALL;

LIBRARY STD;
USE STD.TEXTIO.all;
 
ENTITY TB_Comparator1 IS
END TB_Comparator1;
 
ARCHITECTURE behavior OF TB_Comparator1 IS
 
  -- Объявление объекта для теста
  COMPONENT Comparator1
    PORT(
      A : IN  std_logic;
      B : IN  std_logic;
      EQ : OUT  std_logic
    );
  END COMPONENT;

  --Inputs
  signal A : std_logic := '0';
  signal B : std_logic := '0';

  --Outputs
  signal EQ : std_logic;
 
BEGIN
 
  -- Подсоединение тестируемого объекта (UUT)
  uut: Comparator1 PORT MAP (
    A => A,
    B => B,
    EQ => EQ
  );
 
  -- Собственно процесс тестирования
  stim_proc: process
    variable Message : line;
  begin
    -- Ожидание для выполнения начального сброса схемы
    wait for 100 ns;
    -- Первый тест
    A <= '0';
    B <= '0';
    wait for 5 ns;
    if EQ = '1' then
      Write(Message, "Test 1 PASS");
    else
      Write(Message, "Test 1 FAIL");
    end if;
    WriteLine(Output, Message);
    wait for 95 ns;
    -- Второй тест
    A <= '0';
    B <= '1';
    wait for 5 ns;
    if EQ = '0' then
      Write(Message, "Test 2 PASS");
    else
      Write(Message, "Test 2 FAIL");
    end if;
    WriteLine(Output, Message);
    wait for 95 ns;
    -- Третий тест
    A <= '1';
    B <= '0';
    wait for 5 ns;
    if EQ = '0' then
      Write(Message, "Test 3 PASS");
    else
      Write(Message, "Test 3 FAIL");
    end if;
    WriteLine(Output, Message);
    wait for 95 ns;
    -- Четвёртый тест
    A <= '1';
    B <= '1';
    wait for 5 ns;
    if EQ = '1' then
      Write(Message, "Test 4 PASS");
    else
      Write(Message, "Test 4 FAIL");
    end if;
    WriteLine(Output, Message);
    wait for 95 ns;
    -- Тестирование закончено
    assert false report "Simu1ation Comp1eted" severity failure;
  end process;
END;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re^2: Продолжаю страдать
СообщениеДобавлено: 02 июл 2009, 18:10 

Зарегистрирован: 05 дек 2008, 03:58
Сообщения: 57
Насчет дребизга. А если сделать не D тригер а тригер шмита он должен быть лучше.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re^3: Продолжаю страдать
СообщениеДобавлено: 02 июл 2009, 18:19 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1315
Откуда: Зеленоград
А КАК сделать триггер Шмитта на ПЛИС? Лично я не представляю, как такое можно соорудить.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


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

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


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

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB