Перейти к содержанию
    

Счетчик

:cranky:

Первый раз столкнулся с ПЛИС ( MAX3000 & MAXIIplus). Каким образом считать глобальные клоки везде написано. А вот каким образом подсчитывать асинхронно поступающие импульсы? И вообще каким образом ловить фронты? Помогите разобраться, пожалуйста!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот так к примеру:

process(clk,clr)

begin

if clr = '1' then

addr <= (others => '0');

elsif falling_edge(clk) then

addr <= addr + 1;

end if;

end process;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На счет фронтов не понял, а если просто считать, до делается обычный счетчик и на вход clk ему подается произвольная последовательность, считает в любом случае, не зависимо от длительности импульсов.

 

то Rok простите, это VHDL или verilog? я пока на AHDL сижу, не совсем понимаю данную конструкцию...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это VHDL. Кусочек кода вполне жизнеспосбен. Счет идет асинхронно по заднему фронту импульса CLK не зависимо от его длительности. При установке clr в 1 происходит сброс счетчика и пока clr не опустится в ноль счетчик считать не будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответ. Вопрос возник вот откуда. Когда на AHDL делаю счетчик из триггеров типа DFF то на вход CLK триггера у меня получается подать только глобальный CLK. А если писать на Verilog то все получается.

to M_A: Я интересовался как правильно делать схему выделения фронта от какого-либо входа, если у схемы только один глобальный клок.

 

а пока все идет так - :smile3046:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответ. Вопрос возник вот откуда. Когда на 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:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я интересовался как правильно делать схему выделения фронта от какого-либо входа, если у схемы только один глобальный клок.

 

Элементарно, дорогой Ватсон :)

 

reg xxx;

wire front, spad;

 

always @ (posedge globalclock) begin

xxx <= my_input;

end

 

front = my_input & ~xxx;

spad = ~my_input & xxx;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответ. Вопрос возник вот откуда. Когда на 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:

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

 

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

...

count[].clrn = res_n;

 

IF load THEN

count[].d = GND;

ELSE

count[].d = count[].q + 1;

END IF

load = count[].q == 99

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

...

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему Вы не хотите использовать стандартные мегафункции?

Можно из вызвать и напрямую, а можно и покопаться в их коде,

который( по крайней мере в Max+Plus ) есть в виде .tdf файлов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответ. Вопрос возник вот откуда. Когда на AHDL делаю счетчик из триггеров типа DFF то на вход CLK триггера у меня получается подать только глобальный CLK. А если писать на Verilog то все получается.

 

а пока все идет так -  :smile3046:

Это надо рултиь в опциях логического синтеза в МАКСе - снять галочку с обязательного использования глобальных входов для клока, ресета и т.д.

Такой подход снижает быстродействие - но лично в моих проектах для 30..40 Мгц по барабану. В общем каждой схеме индивидуальный подход :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

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

...

 

 

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

 

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

 

а если серьезно - предложенный асинхронный пример будет сносно работать

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответ. Вопрос возник вот откуда. Когда на AHDL делаю счетчик из триггеров типа DFF то на вход CLK триггера у меня получается подать только глобальный CLK. А если писать на Verilog то все получается.

 

а пока все идет так -  :smile3046:

Это надо рултиь в опциях логического синтеза в МАКСе - снять галочку с обязательного использования глобальных входов для клока, ресета и т.д.

Такой подход снижает быстродействие - но лично в моих проектах для 30..40 Мгц по барабану. В общем каждой схеме индивидуальный подход :biggrin:

 

нет там такой опции. есть automatic global, но это совсем другое.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все дело было в настройках макса. Компилятор все время ругался так: Illegal assigment - global clock 'clk' on pin 9. Когда убрал галочку Global signal для clk все заработало. Вот только насколько это правильно делать? Если остальная схема синхронная, не будет ли ошибок при считывании из счетчика?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...