OSDev http://osdev.su/ |
|
Продолжаю страдать http://osdev.su/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/ |