Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Счетчик
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
moonrock
cranky.gif
Первый раз столкнулся с ПЛИС ( MAX3000 & MAXIIplus). Каким образом считать глобальные клоки везде написано. А вот каким образом подсчитывать асинхронно поступающие импульсы? И вообще каким образом ловить фронты? Помогите разобраться, пожалуйста!
Rok
Вот так к примеру:
process(clk,clr)
begin
if clr = '1' then
addr <= (others => '0');
elsif falling_edge(clk) then
addr <= addr + 1;
end if;
end process;
M_A
На счет фронтов не понял, а если просто считать, до делается обычный счетчик и на вход clk ему подается произвольная последовательность, считает в любом случае, не зависимо от длительности импульсов.

то Rok простите, это VHDL или verilog? я пока на AHDL сижу, не совсем понимаю данную конструкцию...
Alexandr
Это VHDL. Кусочек кода вполне жизнеспосбен. Счет идет асинхронно по заднему фронту импульса CLK не зависимо от его длительности. При установке clr в 1 происходит сброс счетчика и пока clr не опустится в ноль счетчик считать не будет.
moonrock
Спасибо за ответ. Вопрос возник вот откуда. Когда на AHDL делаю счетчик из триггеров типа DFF то на вход CLK триггера у меня получается подать только глобальный CLK. А если писать на Verilog то все получается.
to M_A: Я интересовался как правильно делать схему выделения фронта от какого-либо входа, если у схемы только один глобальный клок.

а пока все идет так - smile3046.gif
M_A
Цитата(moonrock @ Mar 25 2005, 16:47)
Спасибо за ответ. Вопрос возник вот откуда. Когда на AHDL делаю счетчик из триггеров типа DFF то на вход CLK триггера у меня получается подать только глобальный CLK. А если писать на Verilog то все получается.

*

Странно, такого в принципе не должно быть, ведь языки описывают одно и то же, может быть разными конструкциями. Не может же быть такого, что на одном языке что то сделать можно, а на другом нельзя, тем более в такой элементарной вещи, как счетчик. Объясните подробно, что значит получается подать только глобальный клок? А почему нельзя любой другой сигнал?

Я сейчас сам использую в проекте на AHDL счетчики, которые считают не глобальный клок, а другие сигналы, совершенно не связанные с клоком.
Вот пример восьмиразрядного счетчика/делителя на 100

--делаю массив триггеров dff

variable CTR[8..0] :dff;

--далее сам счетчик
--counter
CTRA[].clrn = !c;
CTRA[].clk = b;
CTRA[].d = CTRA[].q + 1;

--делю на 100
--division by 100
if CTRA[].q == 100
then c = VCC;
end if;

выходной сигнал подаю на clear счетчика, тот обнуляется и считает заново
global clock на счетчик вообще не подается. Считает все, что подашь на вход b

На счет фронта, может из-за своей некомпетентности, но опять ничего не понял wacko.gif
Может нарисуете временную диаграмку что приходит на вход/что желаете получить при появлении фронта/как это связано с глобал клоком, если вообще связано?
alexf
Цитата(moonrock @ Mar 25 2005, 09:47)
Я интересовался как правильно делать схему выделения фронта от какого-либо входа, если у схемы только один глобальный клок.


Элементарно, дорогой Ватсон smile.gif

reg xxx;
wire front, spad;

always @ (posedge globalclock) begin
xxx <= my_input;
end

front = my_input & ~xxx;
spad = ~my_input & xxx;
Victor®
Цитата(M_A @ Mar 26 2005, 03:46)
Цитата(moonrock @ Mar 25 2005, 16:47)
Спасибо за ответ. Вопрос возник вот откуда. Когда на AHDL делаю счетчик из триггеров типа DFF то на вход CLK триггера у меня получается подать только глобальный CLK. А если писать на Verilog то все получается.

*

Странно, такого в принципе не должно быть, ведь языки описывают одно и то же, может быть разными конструкциями. Не может же быть такого, что на одном языке что то сделать можно, а на другом нельзя, тем более в такой элементарной вещи, как счетчик. Объясните подробно, что значит получается подать только глобальный клок? А почему нельзя любой другой сигнал?

Я сейчас сам использую в проекте на AHDL счетчики, которые считают не глобальный клок, а другие сигналы, совершенно не связанные с клоком.
Вот пример восьмиразрядного счетчика/делителя на 100

--делаю массив триггеров dff

variable CTR[8..0] :dff;

--далее сам счетчик
--counter
CTRA[].clrn = !c;
CTRA[].clk = b;
CTRA[].d = CTRA[].q + 1;

--делю на 100
--division by 100
if CTRA[].q == 100
then c = VCC;
end if;

выходной сигнал подаю на clear счетчика, тот обнуляется и считает заново
global clock на счетчик вообще не подается. Считает все, что подашь на вход b

На счет фронта, может из-за своей некомпетентности, но опять ничего не понял wacko.gif
Может нарисуете временную диаграмку что приходит на вход/что желаете получить при появлении фронта/как это связано с глобал клоком, если вообще связано?
*



Что-то мне не нравится этот код. Лучше сделать с синхронной загрузкой, типа:
...
count[].clrn = res_n;

IF load THEN
count[].d = GND;
ELSE
count[].d = count[].q + 1;
END IF
load = count[].q == 99
M_A
Цитата(Victor® @ Mar 26 2005, 11:32)
Что-то мне не нравится этот код. Лучше сделать с синхронной загрузкой, типа:
...

*


Поясните пожалуйста чем не нравится и почему лучше с синхронной загрузкой? Все ведь и так работает?
bve
А почему Вы не хотите использовать стандартные мегафункции?
Можно из вызвать и напрямую, а можно и покопаться в их коде,
который( по крайней мере в Max+Plus ) есть в виде .tdf файлов.
prototype
Цитата(moonrock @ Mar 25 2005, 19:47)
Спасибо за ответ. Вопрос возник вот откуда. Когда на AHDL делаю счетчик из триггеров типа DFF то на вход CLK триггера у меня получается подать только глобальный CLK. А если писать на Verilog то все получается.

а пока все идет так -  smile3046.gif
*

Это надо рултиь в опциях логического синтеза в МАКСе - снять галочку с обязательного использования глобальных входов для клока, ресета и т.д.
Такой подход снижает быстродействие - но лично в моих проектах для 30..40 Мгц по барабану. В общем каждой схеме индивидуальный подход biggrin.gif
_LD
Цитата(M_A @ Mar 26 2005, 14:46)
Цитата(Victor® @ Mar 26 2005, 11:32)


Что-то мне не нравится этот код. Лучше сделать с синхронной загрузкой, типа:
...

*


Поясните пожалуйста чем не нравится и почему лучше с синхронной загрузкой? Все ведь и так работает?
*



всегда лучше с синхронной загрузкой. по определению smile.gif

а если серьезно - предложенный асинхронный пример будет сносно работать
на PLD (из-за архитектуры, в которой почему-то все задержки оказываются равными), а на FPGA может случиться облом sad.gif при массовом переключении выходов счетчика один из сигналов может иметь меньшую задержку, и произойдет необоснованный сброс.
_LD
Цитата(prototype @ Mar 27 2005, 07:45)
Цитата(moonrock @ Mar 25 2005, 19:47)
Спасибо за ответ. Вопрос возник вот откуда. Когда на AHDL делаю счетчик из триггеров типа DFF то на вход CLK триггера у меня получается подать только глобальный CLK. А если писать на Verilog то все получается.

а пока все идет так -  smile3046.gif
*

Это надо рултиь в опциях логического синтеза в МАКСе - снять галочку с обязательного использования глобальных входов для клока, ресета и т.д.
Такой подход снижает быстродействие - но лично в моих проектах для 30..40 Мгц по барабану. В общем каждой схеме индивидуальный подход biggrin.gif
*



нет там такой опции. есть automatic global, но это совсем другое.
moonrock
Все дело было в настройках макса. Компилятор все время ругался так: Illegal assigment - global clock 'clk' on pin 9. Когда убрал галочку Global signal для clk все заработало. Вот только насколько это правильно делать? Если остальная схема синхронная, не будет ли ошибок при считывании из счетчика?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.