|
|
  |
Заливка проекта на плату DE0. некорректная работа |
|
|
|
Mar 3 2015, 18:30
|
Группа: Участник
Сообщений: 11
Регистрация: 16-02-15
Пользователь №: 85 190

|
Здравствуйте! Только начал изучать ПЛИС и Quartus II. В интернете нашел маленький проект счетчика, немного переделал его под себя (сделал его не 16-ти разрядным, а 10-разрядным). Компилируется все нормально. НО, после того, как заливаю проект на плату (к слову плата Altera DE0), светодиоды при нажатии на кнопку моргают как хотят, в совершенно произвольном порядке. Перепробовал кучу разных вариантов, но ошибку найти не удалось. Выводы ПЛИС назначал в соответствии с документацией, уверен, что все подключено верно. На что обратить внимание и где стоит искать ошибку? P.s. этап из разряда "поморгать светодиодами" прошел успешно. Код проекта в файле.
|
|
|
|
|
Mar 3 2015, 21:39
|
Группа: Участник
Сообщений: 11
Регистрация: 16-02-15
Пользователь №: 85 190

|
Сделал как Вы сказали, и на всякий случай убрал асинхронный сброс, так же в начале проинициализировал "cnt". В общем ничего не помогло. Проверял логику в симуляторе, все работает верно. Прикладываю измененный код.
|
|
|
|
|
Mar 4 2015, 15:44
|
Знающий
   
Группа: Свой
Сообщений: 608
Регистрация: 10-07-09
Из: Дубна, Московская область
Пользователь №: 51 111

|
Цитата(Ensom ulv @ Mar 4 2015, 00:39)  В общем ничего не помогло. Проверял логику в симуляторе, все работает верно. Я правильно понимаю, тактовый сигнал частотой 50МГц Вы делите на 2в10-й? Если да, то получаемая частота (~48.8 кГц) слишком высока для "надежного" наблюдения при помощи глаз
|
|
|
|
|
Mar 4 2015, 21:49
|
Группа: Участник
Сообщений: 11
Регистрация: 16-02-15
Пользователь №: 85 190

|
Цитата(Александр77 @ Mar 4 2015, 15:44)  Я правильно понимаю, тактовый сигнал частотой 50МГц Вы делите на 2в10-й? Если да, то получаемая частота (~48.8 кГц) слишком высока для "надежного" наблюдения при помощи глаз CLK я вывел на кнопку, как работать с кварцем я пока не разобрался толком. На плате стоит защита от дребезка. Так же замена cnt с variable на signal ситуации не изменило.
|
|
|
|
|
Mar 5 2015, 17:31
|
Знающий
   
Группа: Свой
Сообщений: 608
Регистрация: 10-07-09
Из: Дубна, Московская область
Пользователь №: 51 111

|
Цитата(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- признак достижения максимума.
|
|
|
|
|
Mar 5 2015, 18:39
|

Местный
  
Группа: Свой
Сообщений: 314
Регистрация: 13-07-06
Из: Москва
Пользователь №: 18 797

|
Цитата(Ensom ulv @ Mar 5 2015, 00:49)  CLK я вывел на кнопку, как работать с кварцем я пока не разобрался толком. На плате стоит защита от дребезка. Код у Вас написан правильно. Попробуйте сделать защиту от дребезга внутри ПЛИС. Правда для этого надо запустить кварц.
|
|
|
|
|
Mar 6 2015, 12:23
|
Группа: Участник
Сообщений: 11
Регистрация: 16-02-15
Пользователь №: 85 190

|
Все заработало! Хоть и не так, как планировалось изначально. Можете рассказать, какие есть методы получения необходимой частоты, к примеру 1 Гц? у себя я как получил: добавил в проект PLL с частотой 50 МГц и делителем 50, после него сгенерировал счетчик 20-ти разрядный и со старшего разряда снимал необходимые мне 1 Гц. Но как-то вроде не совсем правильно, когда для тактирования одного счетчика используется другой счетчик (см. рис.)) А еще интересует, если все же мне использовать не кварц, а кнопки для тактирования счетчика, какие существуют программные методы защиты от дребезга?
Эскизы прикрепленных изображений
|
|
|
|
|
Mar 6 2015, 17:36
|

Местный
  
Группа: Свой
Сообщений: 314
Регистрация: 13-07-06
Из: Москва
Пользователь №: 18 797

|
Цитата(Ensom ulv @ Mar 6 2015, 15:23)  Но как-то вроде не совсем правильно, когда для тактирования одного счетчика используется другой счетчик. Правильно подавать выход счетчика на Enable следующего блока, клок оставить прежним. Цитата(Ensom ulv @ Mar 6 2015, 15:23)  какие существуют программные методы защиты от дребезга? По изменению уровня на входной ножке принимаете решение, что было нажатие(отжатие) , запускаете счетчик и перестаёте реагировать на изменения на входной ножке. Как счетчик досчитал до конца(допустим через четверть секунды ), останавливаем его и опять мониторим состояние входной ножки. Как-то так.
|
|
|
|
|
Mar 6 2015, 22:19
|
Группа: Участник
Сообщений: 11
Регистрация: 16-02-15
Пользователь №: 85 190

|
буду разбираться!) всем большое спасибо за помощь!
|
|
|
|
|
Mar 7 2015, 07:02
|

Лентяй
     
Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843

|
Цитата(Александр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; Если у Вас в проекте оно не воспринимается, то дело, скорее всего, в чем-то другом.
--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|