Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Чудеса с простым счетчиком
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
slash_spb
Доброе время суток.
Нужна помощь, т.к. даже бубен не помогает))) Имеется Virtex2 на который гонятся данные с АЦП(AD9430). На ЦАП подаем частоту 26МГц. Задача очень проста, забирать каждый 8-ой отчет. Вот, что имеем:
Код
always @( posedge IN_ADC_CLK )
if ( cregs_dsp_bclk2[ADCRXFIFOCR][ADCRXFIFOCR_RST] )
  sample_cnt <= 3'd0;
else
  sample_cnt <= sample_cnt + 1'd1;

always @(posedge IN_ADC_CLK)
  adc1_d0 <= ADC1_D;

always @( posedge IN_ADC_CLK )
if ( sample_cnt == 3'd2 )
  q_quadr <= adc1_d0;

IN_ADC_CLK - клок от АЦП'а выровненный с данными.

Все бы хорошо, но счетчик временами сбоит. Вот выборка сигналов из ChipScope'a(выборка производилась на той же частоте, на которой работает АЦП ):
Нажмите для просмотра прикрепленного файла

Почему счетчик так может работать??? У меня уже нет ни каких идей. Места а в fpga еще много. 26МГц небольшая частота, что бы были проблемы с времянками. Мистика cranky.gif
Sergey'F
Проблемы с времянками могут быть и на частоте 1МГц.
Откуда берется и как привязан к IN_ADC_CLK сигнал cregs_dsp_bclk2[ADCRXFIFOCR][ADCRXFIFOCR_RST]?
Shtirlits
Тактовая ChipScope откуда берется?
Я вижу не сбой счетчика, а стробоскопический эффект.
ArMouReR
Вставте код связаний с cregs_dsp_bclk2[ADCRXFIFOCR][ADCRXFIFOCR_RST] похоже проблема там...
slash_spb
Да, большое спасибо, там ошибка, сигнал сброса счетчика не синхронин c IN_ADC_CLK. Исправил.
Код
always @( posedge IN_ADC_CLK, posedge cregs_dsp_bclk2[ADCRXFIFOCR][ADCRXFIFOCR_RST] )
if ( cregs_dsp_bclk2[ADCRXFIFOCR][ADCRXFIFOCR_RST] )
  sample_cnt <= 3'd0;
else
  sample_cnt <= sample_cnt + 1'd1;

always @(posedge IN_ADC_CLK)
  adc1_d0 <= ADC1_D;

always @( posedge IN_ADC_CLK )
if ( sample_cnt == 3'd2 )
  q_quadr <= adc1_d0;


Вообще сигнал cregs_dsp_bclk2[ADCRXFIFOCR][ADCRXFIFOCR_RST] сбрасывает всю логику схемы и активен в самом начале, далее, при работе счетчика всегда равен нулю. Даже после исправления счетчик не хочет считать))). Вот (Сигнал cregs_dsp_bclk2[ADCRXFIFOCR][ADCRXFIFOCR_RST] тоже приведен):
Нажмите для просмотра прикрепленного файла

Тактовая частота chipscope одинакова с тактовой частотой идущей на ацп.
До конца не осознал что такое стробоскопический эффект, но при правильной работе счетчика мы должны видеть примерно одинаковый уровень сигнала q_quadr. Частота изменения сигнала q_quadr в 8 раз меньше тактовой частоты chipscope, но как показывает выборка, сигнал q_quadr "скачет".

Все вроде должно работать, а не работает или я ошибаюсь и все еще что-то делаю не верно?
Shtirlits
Анализатор таймингов на все это вместе с чипскопом что говорит, не ругается?

Как вариант - начать пытать схему отрезая от нее по кусочку, пока не сознается.
LordVader
В порядке бреда - проходит пичок по цепи сброса, как раз перед фронтом клока, который на ноль счётчик должен был возвратить.
ArMouReR
Shtirlits В правильную сторону клонит. Я бы еще внимательно просмотрел лог компиляции.
Можете обнаружить, что там что-то плохо попахивает...

И еще в качестве меры профилактики я бы сделал такую вещь:
Раз у вас cregs_dsp_bclk2[ADCRXFIFOCR][ADCRXFIFOCR_RST] это вроде как асинхронный reset я бы подключил его ко всем FlipLopам у вас в коде. Т.е. к adc1_d0, q_quadr и т.д....
dvladim
Цитата(slash_spb @ Aug 6 2009, 23:57) *
Вообще сигнал cregs_dsp_bclk2[ADCRXFIFOCR][ADCRXFIFOCR_RST] сбрасывает всю логику схемы и активен в самом начале, далее, при работе счетчика всегда равен нулю.

И все же приведите формирование cregs_dsp_bclk2[ADCRXFIFOCR][ADCRXFIFOCR_RST] . Что-то мне подсказывает что это не просто входной пин.
Как объявлен sample_cnt? reg [2:0] sample_cnt;?
slash_spb
Большое всем спасибо. Схема наконец созналась. Решил на 150MHz посмотреть на клок от ацп. Вот что увидел:
Нажмите для просмотра прикрепленного файла

Код
always @(posedge IN_ADC_CLK)
  adc_clk_bit <= ~adc_clk_bit;

always @(posedge ref26_MHz)
  ref26_clk_bit <= ~ref26_clk_bit;


IN_ADC_CLK - клок от АЦП.
ref26_MHz - клок на АЦП.

Блин, с таким еще не сталкивался. Видимо что-то с АЦП или со схемотехникой. Пока решил просто использовать ref26_MHz, с ним все работает хоть это и не совсем правильно.

Спасибо за помощь rolleyes.gif
Shtirlits
Цитата(slash_spb @ Aug 9 2009, 22:48) *
...Схема наконец созналась....

Хочется сказать голосом ослика из Шрека "У меня есть дракон осциллограф и я не побоюсь применить его!".
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.