Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Заливка проекта на плату DE0. некорректная работа
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Ensom ulv
Здравствуйте!
Только начал изучать ПЛИС и Quartus II.
В интернете нашел маленький проект счетчика, немного переделал его под себя (сделал его не 16-ти разрядным, а 10-разрядным). Компилируется все нормально. НО, после того, как заливаю проект на плату (к слову плата Altera DE0), светодиоды при нажатии на кнопку моргают как хотят, в совершенно произвольном порядке. Перепробовал кучу разных вариантов, но ошибку найти не удалось.

Выводы ПЛИС назначал в соответствии с документацией, уверен, что все подключено верно.
На что обратить внимание и где стоит искать ошибку?
P.s. этап из разряда "поморгать светодиодами" прошел успешно.
Код проекта в файле.
Александр77
1) счетчик у Вас с асинхронным сбросом, но на старте это наверное мелочи
2) вот сколько пытался скормить квартусу вариант от ксилых в стиле "clk'event and clk='1'"- не хочет зараза. квартусу (может только моему) нравится так "if(rising_edge(clk))then"
Ensom ulv
Сделал как Вы сказали, и на всякий случай убрал асинхронный сброс, так же в начале проинициализировал "cnt".
В общем ничего не помогло. Проверял логику в симуляторе, все работает верно.
Прикладываю измененный код.
XVR
Цитата(Ensom ulv @ Mar 3 2015, 21:30) *
светодиоды при нажатии на кнопку моргают как хотят, в совершенно произвольном порядке.
Это нормально. У кнопки есть такое физическое явление как 'дребезг контактов'. При одиночном нажатии получается пачка импульсов.
Вот - http://www.fpga4fun.com/Debouncer.html

novartis
Замените свой счетчик cnt сигналом, сейчас он у вас как variable.
Александр77
Цитата(Ensom ulv @ Mar 4 2015, 00:39) *
В общем ничего не помогло. Проверял логику в симуляторе, все работает верно.

Я правильно понимаю, тактовый сигнал частотой 50МГц Вы делите на 2в10-й?
Если да, то получаемая частота (~48.8 кГц) слишком высока для "надежного" наблюдения при помощи глаз
Ensom ulv
Цитата(Александр77 @ Mar 4 2015, 15:44) *
Я правильно понимаю, тактовый сигнал частотой 50МГц Вы делите на 2в10-й?
Если да, то получаемая частота (~48.8 кГц) слишком высока для "надежного" наблюдения при помощи глаз

CLK я вывел на кнопку, как работать с кварцем я пока не разобрался толком.
На плате стоит защита от дребезка.
Так же замена cnt с variable на signal ситуации не изменило.
Александр77
Цитата(Ensom ulv @ Mar 5 2015, 00:49) *
CLK я вывел на кнопку, как работать с кварцем я пока не разобрался толком.
На плате стоит защита от дребезка.
Так же замена cnt с variable на signal ситуации не изменило.

Кварцевый генератор начинает работать сразу же после подачи питания, все что Вам надо - посмотреть в мануале на какой вывод он заведен.
Не претендуя на истину в последней инстанции, выкладываю пример моего счетчика.
Код
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity Count16 is
port(
    clk, rst, ena,up:in std_logic;
    Dout:out std_logic_vector(15 downto 0);
    carry:out std_logic    
    );
end entity;

architecture cn of count16 is

begin
process(clk)
variable cnt_v:unsigned(16 downto 0);
variable car_v:std_logic;
constant zero:unsigned(16 downto 0):="00000000000000000";
constant step:unsigned(16 downto 0):="00000000000000001";
constant max:unsigned(16 downto 0):="10000000000000000";
variable up_v:std_logic_vector(2 downto 0);
begin
    if(rising_edge(clk))then
        up_v:=up_v(1 downto 0)&up;--shift for detect rising edge
        if(rst='1')then
            cnt_v:=zero;
            car_v:='0';
            up_v:="000";
        else
            if(ena='1')then
                if(car_v='0')then
                    if(up_v="011")then
                        cnt_v:=cnt_v+step;
                        if(cnt_v>=max)then
                            car_v:='1';
                        else
                            car_v:='0';
                        end if;
                    end if;
                end if;
            end if;
        end if;
        Dout<=std_logic_vector(cnt_v(15 downto 0));
        carry<=car_v;
    end if;
end process;

end cn;

Сигнал clk-тактирование, ena -разрешение счета, rst-сброс, up- инкремент счетчика (при rst=0 и ena =1).
Dout- выход счетчика, carry- признак достижения максимума.
DuHast
Цитата(Ensom ulv @ Mar 5 2015, 00:49) *
CLK я вывел на кнопку, как работать с кварцем я пока не разобрался толком.
На плате стоит защита от дребезка.

Код у Вас написан правильно. Попробуйте сделать защиту от дребезга внутри ПЛИС.
Правда для этого надо запустить кварц.
Ensom ulv
Все заработало! Хоть и не так, как планировалось изначально.
Можете рассказать, какие есть методы получения необходимой частоты, к примеру 1 Гц? у себя я как получил: добавил в проект PLL с частотой 50 МГц и делителем 50, после него сгенерировал счетчик 20-ти разрядный и со старшего разряда снимал необходимые мне 1 Гц. Но как-то вроде не совсем правильно, когда для тактирования одного счетчика используется другой счетчик (см. рис.))
А еще интересует, если все же мне использовать не кварц, а кнопки для тактирования счетчика, какие существуют программные методы защиты от дребезга?
DuHast
Цитата(Ensom ulv @ Mar 6 2015, 15:23) *
Но как-то вроде не совсем правильно, когда для тактирования одного счетчика используется другой счетчик.

Правильно подавать выход счетчика на Enable следующего блока, клок оставить прежним.

Цитата(Ensom ulv @ Mar 6 2015, 15:23) *
какие существуют программные методы защиты от дребезга?

По изменению уровня на входной ножке принимаете решение, что было нажатие(отжатие) , запускаете счетчик и перестаёте реагировать на изменения на входной ножке. Как счетчик досчитал до конца(допустим через четверть секунды ), останавливаем его и опять мониторим состояние входной ножки.
Как-то так.
Ensom ulv
буду разбираться!)
всем большое спасибо за помощь!
Александр77
Цитата(Ensom ulv @ Mar 6 2015, 15:23) *
А еще интересует, если все же мне использовать не кварц, а кнопки для тактирования счетчика, какие существуют программные методы защиты от дребезга?

Можно использовать сдвиговый регистр, в который записывается сигнал от кнопки/датчика, а уже по его заполненности (частичной или полной) производить инкремент/декремент счетчика.
Stewart Little
Цитата(Александр77 @ Mar 3 2015, 22:21) *
2) вот сколько пытался скормить квартусу вариант от ксилых в стиле "clk'event and clk='1'"- не хочет зараза. квартусу (может только моему) нравится так "if(rising_edge(clk))then"

Неправда Ваша...
Конструкция if(clk'event and clk='1') then совершенно стандартная, и квартусом поедается "на ура" Я ее постоянно использую, примерно вот так:

Код
ххх: process(clk, rst)
     begin
       if(rst = '0') then
         <бла-бла-бла>  -- Асинхронный сброс
       elsif(clk'event and clk = '1') then
         <тыры-пыры>    -- Собственно необходимые действия

       end if;
     end process xxx;

Если у Вас в проекте оно не воспринимается, то дело, скорее всего, в чем-то другом.
iosifk
Цитата(Ensom ulv @ Mar 7 2015, 01:19) *
буду разбираться!)
всем большое спасибо за помощь!

Хотите персональные занятия по ПЛИС?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.