OSDev
http://osdev.ru/

Продолжаю страдать
http://osdev.ru/viewtopic.php?f=22&t=248
Страница 1 из 2

Автор:  SII [ 31 дек 2008, 22:50 ]
Заголовок сообщения:  Продолжаю страдать

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

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

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

Автор:  SII [ 02 янв 2009, 01:08 ]
Заголовок сообщения:  Re: Продолжаю страдать

Научился управлять семисегментными индикаторами. В общем-то, ничего сложного.

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

Автор:  SII [ 02 янв 2009, 03:05 ]
Заголовок сообщения:  Re: Продолжаю страдать

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

Автор:  SII [ 08 фев 2009, 18:55 ]
Заголовок сообщения:  Re: Продолжаю страдать

Сделал ещё один вариант антидребезга, на этот раз полностью на 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;

Автор:  Himik [ 09 фев 2009, 16:11 ]
Заголовок сообщения:  Re^2: Продолжаю страдать

Думаю, можно и так: кнопку подключить на информационный вход 16-разрядного сдвигового регистра, который крутится от низкочастотного тактового генератора. К выходным разрядам регистра подключить логический элемент 16-ИЛИ, на выходе которого будет 1 пока имеется хоть одна единица на сдвиговом регистре.

Автор:  SII [ 09 фев 2009, 17:15 ]
Заголовок сообщения:  Re^3: Продолжаю страдать

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

Автор:  Himik [ 09 фев 2009, 17:31 ]
Заголовок сообщения:  Re^4: Продолжаю страдать

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

Автор:  SII [ 02 июл 2009, 17:47 ]
Заголовок сообщения:  Re^5: Продолжаю страдать

После особо долгого перерыва (чуть ли не полгода) вернулся к электронным экскрементам. Скачал новую версию 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;

Автор:  Pavia [ 02 июл 2009, 18:10 ]
Заголовок сообщения:  Re^2: Продолжаю страдать

Насчет дребизга. А если сделать не D тригер а тригер шмита он должен быть лучше.

Автор:  SII [ 02 июл 2009, 18:19 ]
Заголовок сообщения:  Re^3: Продолжаю страдать

А КАК сделать триггер Шмитта на ПЛИС? Лично я не представляю, как такое можно соорудить.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/