Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: "Зависание" ПЛИС
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
the_king_orange_summer
Всем доброго времени суток.
Прошу помощи в решении следующей проблемы. Тереюсь в догадках.
Исходные данные:
Имеется схемка с восемью АЦП+ПЛИС. АЦП (MAX1241) - 5ти вольновое питание, для сигнала "1" (Vih) минимальный уровень 3V. ПЛИС: EPM1270T144 от Altera.
Для обмена между данными микросхемами собрана прикрепленная схемка (На схемке: D5 - ПЛИС; SCLK, CS - клок и чип-селект для АЦП-шек, соответствиенно; DOUT - сигнал данных с АЦП; микросхема D4 - преобразование уровня сигнала с 5В на 3.3В; R4-R12 - 330 Ом).
SCLK, CS - выходы с open drain и clamp-диодом (PCI). DOUT, на всякий случай, тоже как PCI с защитным диодом.
Схемка была собрана на основании документа Using MAX II Devices in Multi-Voltage Systems
В ПЛИС зашит конечный авотмат. Код прилагаю
CODE
`timescale 1ns/1ns
module ADC_send (
input clk,
input reset,
input DOUT,
input [7:0] data_send, //flag data_send
output wire [11:0] DATA_w [7:0],
output wire SCLK_w,
output wire [7:0] nCS_w,
output wire [7:0] new_data,
output wire [7:0] GOOD_ADC_w/*ADDED*/,
output wire [1:0] state_w,
output wire [3:0] N_w
);
parameter DELAY=1;
reg [7:0] new_data_r; //flag new_data
reg [3:0] N; //bit pointer
reg [2:0] S; //adress
reg [1:0] state; //state-machine
reg [7:0] nCS; //CS_ADC
reg [11:0] DATA [7:0]; //data_out
reg SCLK_en; //enable CLK_ADC
reg [3:0] WDT; //Watchdog Timer (7.5 us ADC MAX1241) Tclk*
reg [7:0] GOOD_ADC; //ADC condition

parameter S0 = 0, S1 = 1, S2 = 2, S3 = 3;
//ADDED
assign state_w = state;
assign N_w = N;
//


// Output depends only on the state
always @ (posedge clk or negedge reset) begin
if (!reset) begin
DATA[0][11:0] <= #DELAY 0; DATA[1][11:0] <= #DELAY 0; DATA[2][11:0] <= #DELAY 0; DATA[3][11:0] <= #DELAY 0;
DATA[4][11:0] <= #DELAY 0; DATA[5][11:0] <= #DELAY 0; DATA[6][11:0] <= #DELAY 0; DATA[7][11:0] <= #DELAY 0;
S <= #DELAY 3'd0;
N <= #DELAY 4'd0;
nCS <= #DELAY 8'hFF;
// new_data_r <= #DELAY 7'd0;
end
else begin
case (state)
S0: //start
begin
N <= #DELAY 4'd0;
nCS <= #DELAY 8'hFF; //>=220 ns for MAX1241
end
S1: //nCS
begin
//nCS [S] <= #DELAY 1'd0;
nCS [S] <= #DELAY 1'd0;
end
S3: //WR data
begin
N <= #DELAY N + 4'd1; //ukazatel' byte
if (WDT >= 4'h8) begin
S <= #DELAY S + 3'd1;
end
else if (N <= 12) begin
DATA [S][11-N] <= #DELAY DOUT;
end
else if (N == 13/*14*/) begin //end
new_data_r [S] <= #DELAY 1;
end
else if (N == 14/*15*/) begin //end
S <= #DELAY S + 3'd1;
end
end
endcase
end
if (!reset)
new_data_r[0] <= #DELAY 0;
else if (data_send[0])
new_data_r[0] <= #DELAY 0;
if (!reset)
new_data_r[1] <= #DELAY 0;
else if (data_send[1])
new_data_r[1] <= #DELAY 0;
if (!reset)
new_data_r[2] <= #DELAY 0;
else if (data_send[2])
new_data_r[2] <= #DELAY 0;
if (!reset)
new_data_r[3] <= #DELAY 0;
else if (data_send[3])
new_data_r[3] <= #DELAY 0;
if (!reset)
new_data_r[4] <= #DELAY 0;
else if (data_send[4])
new_data_r[4] <= #DELAY 0;
if (!reset)
new_data_r[5] <= #DELAY 0;
else if (data_send[5])
new_data_r[5] <= #DELAY 0;
if (!reset)
new_data_r[6] <= #DELAY 0;
else if (data_send[6])
new_data_r[6] <= #DELAY 0;
if (!reset)
new_data_r[7] <= #DELAY 0;
else if (data_send[7])
new_data_r[7] <= #DELAY 0;
end

// Determine the next state
always @ (posedge clk or negedge reset) begin
if (!reset) begin
state <= #DELAY S0;
SCLK_en <= #DELAY 1'd0;
GOOD_ADC <= #DELAY 8'hFF;
end
else
case (state)
S0: begin
state <= #DELAY S1;
SCLK_en <= #DELAY 1'd0;
end
S1: begin
state <= #DELAY S2;
SCLK_en <= #DELAY 1'd0;
WDT <= #DELAY 4'h0;
end
S2: begin
if (DOUT) begin //sCLK ADC, response waiting
state <= #DELAY S3; //next
SCLK_en <= #DELAY 1'd1;
GOOD_ADC[S] <= #DELAY 1'h1;
end
else if (WDT < 4'h8) begin //response waiting
state <= #DELAY S2;
SCLK_en <= #DELAY 1'd0;
WDT <= #DELAY WDT + 4'h1;
end
else if (WDT >= 4'h8) begin
state <= #DELAY S3;
GOOD_ADC[S] <= #DELAY 1'h0;
end
end
S3: begin
//else if (N != 15) //write data
//else if (N < 15) //write data
if (N < 14) //write data
state <= #DELAY S3;
//else if (N == 15)
//else if (N >= 15)
else if (N >= 14)
state <= #DELAY S0;
end
endcase
end

assign GOOD_ADC_w = GOOD_ADC;
assign SCLK_w = SCLK_en ? clk : 1'd0;
assign DATA_w = DATA;
assign nCS_w = nCS;
assign new_data = new_data_r;

endmodule

Суть: интерфейс типа SPI. Реализован последовательный опрос всех АЦП. Если АЦП не отвечает за определенное - ситуация фиксируется, опрос продолжается далее. Состояний, в которых автомат может "зависнуть", не вижу cranky.gif
СУТЬ ПРОБЛЕМЫ
Подключаюсь щупом осциллографа к точкам "SCLK_ADC", "DOUT_ADC" - опрос прекращается. Такое чувство, что схема "зависает".
Прошу помощи. Может у кого было что-то похожее? Или есть соображения, почему такое может происходить? И вообще, что же это такое происходит с ПЛИС? Куда копать? Теряюсь в догадках..
Dmitriyspb
Цитата
СУТЬ ПРОБЛЕМЫ
Подключаюсь щупом осциллографа к точкам "SCLK_ADC", "DOUT_ADC" - опрос прекращается. Такое чувство, что схема "зависает".
Прошу помощи. Может у кого было что-то похожее? Или есть соображения, почему такое может происходить? И вообще, что же это такое происходит с ПЛИС? Куда копать? Теряюсь в догадках..


Вы напишите настройки осциллографа, а точнее шупа измерительного!!!!!!! Или может быть Вы имели в виду логический анализатор?!.. Опишите чем тыкайтесь, что аж
Цитата
Такое чувство, что схема "зависает"
Serhiy_UA
Цитата(the_king_orange_summer @ Dec 20 2012, 16:06) *
input DOUT,
.....
Прошу помощи.

Входной сигнал DOUT не должен путаться в функциях перехода FSM (конечного автомата). Его сначала надо запомнить в D-триггере по клоку этой же FSM, а уже потом с выхода D-триггера применять в этих переходах.
Там еще пара аналогичных подножек для FSM, этим создаются условия для гонок и, как следствие, зависаний.
Iptash
Нужно продублировать измеряемые сигналы на свободные выводы CPLD и смотреть там.
the_king_orange_summer
Цитата(Dmitriyspb @ Dec 20 2012, 15:44) *
Вы напишите настройки осциллографа, а точнее шупа измерительного!!!!

Обычный щуп от осциллографа. Ползунок делителя на х10.

Генератор частоты для ПЛИС стоит на 8 МГц. Частота работы представленного модуля 1 МГц. Для ТаймКвеста данная информация пишется в sdc-файлик, анализ времянки проходит без каких либо возражений.


Цитата(Serhiy_UA @ Dec 20 2012, 15:53) *
Входной сигнал DOUT не должен путаться в функциях перехода FSM (конечного автомата). Его сначала надо запомнить в D-триггере по клоку этой же FSM, а уже потом с выхода D-триггера применять в этих переходах.
Там еще пара аналогичных подножек для FSM, этим создаются условия для гонок и, как следствие, зависаний.

Спасибо!
Посмотрел. С DOUT-ом понятно. А остальные сигналы по клоку меняются - вроде же всё хорошо должно быть. Разве нет?

Цитата(Iptash @ Dec 20 2012, 15:56) *
Нужно продублировать измеряемые сигналы на свободные выводы CPLD и смотреть там.

Выводил на свободные ножки состояния автомата+счетчик WDT. И при этом "зависаний" не наблюдалось.
Аналогично, когда я включил PCI по входному сигналу DOUT (который вообще за микросхемой преобразования в 3.3В), "зависать" стало реже.

Такое чувство, что какая-то злая помеха пробирается внутрь ПЛИС
iosifk
Цитата(the_king_orange_summer @ Dec 20 2012, 16:06) *
Всем доброго времени суток.
Прошу помощи в решении следующей проблемы. Тереюсь в догадках.

Прошу помощи. Может у кого было что-то похожее? Или есть соображения, почему такое может происходить? И вообще, что же это такое происходит с ПЛИС? Куда копать? Теряюсь в догадках..



А вот это - #DELAY, как у Вас попадает в ПЛИС?
У меня на сайте, в статьях, "Краткий Курс", глава о параметрах и пр....
Удачи!
Iptash
Цитата(the_king_orange_summer @ Dec 20 2012, 17:07) *
Такое чувство, что какая-то злая помеха пробирается внутрь ПЛИС

Я на MAX II много измерительных вещей сделал, входа чувствительные к дребезгу (входные счетчики, регистры и т.п.) нужно фильтровать, т.е. в программе нужно прописывать для исключения ложного срабатывания.
SM
Цитата(iosifk @ Dec 20 2012, 18:51) *
А вот это - #DELAY, как у Вас попадает в ПЛИС?

А в ПЛИС оно никак попасть не может, ибо не синтезируемо.

Цитата(the_king_orange_summer)
Выводил на свободные ножки состояния автомата+счетчик WDT. И при этом "зависаний" не наблюдалось.

Это явный признак каких-то логических гонок, что от вывода на пины меняется работа. Либо есть необконстрейненные пути, либо некорректно обконстрейненные, ну либо сам клок грязный.
Acvarif
Цитата
Нужно продублировать измеряемые сигналы на свободные выводы CPLD и смотреть там.

Именно так.
1. Можно попроовать щуп без общего провода (один провод). Общий по стенду.
2. Пропадание любго сигнала (или его искажение) при нагрзке на осциллятор - явный признак гонок по фронтам в автомате
в какой-то его части. Полезно автомат просмотреть на симуляторе (любом).
iosifk
Цитата(SM @ Dec 20 2012, 20:36) *
А в ПЛИС оно никак попасть не может, ибо не синтезируемо.

Ну так и я об этом же.
Уберите все #DELAY из файла, который будет проектом для ПЛИС и проведите симуляцию...
Оставить можно их только в тестбенче, в той его части, которая поставляет данные в ПЛИС...
Rendom
Копайте в сторону допустимой нагрузки на пин sm.gif
the_king_orange_summer
Цитата(SM @ Dec 20 2012, 19:36) *
Это явный признак каких-то логических гонок, что от вывода на пины меняется работа. Либо есть необконстрейненные пути, либо некорректно обконстрейненные, ну либо сам клок грязный.

Вот мой SDC-файлик.
CODE

derive_clock_uncertainty
create_clock -period 8MHz -name {clk} [get_ports {clk}]
create_generated_clock -name {clk_div_8} -divide_by 8 -source [get_ports {clk}] [get_registers {cnt[2]}]

set_clock_groups -exclusive -group {clk}
set_clock_groups -exclusive -group {clk_div_8}

Собсно, в нем задан клок, задан деленный клок.Весь проект синхронный, по фронтам. Разве еще что-то нужно накручивать для таймквеста, чтобы всё было хорошо? если да, то можете хоть намекнуть, что это) курил статьи товарища des00. Там, вроде, ничего такого не говорилось.
Заранее, благодарю.
Цитата(Acvarif @ Dec 20 2012, 20:00) *
2. Пропадание любго сигнала (или его искажение) при нагрзке на осциллятор - явный признак гонок по фронтам в автомате
в какой-то его части. Полезно автомат просмотреть на симуляторе (любом).

Вы имеете ввиду временнОе моделирование? К сожалению, никак не могу подружить квартус12 и моделсим в плане симуляции на gate-уровне.. А разве он покажет что-то нехорошее, если таймквет говорит, что всё окнорм? По возможности буду копать в этом направлении. Спасибо!
Цитата(Rendom @ Dec 20 2012, 21:47) *
Копайте в сторону допустимой нагрузки на пин sm.gif

Тож есть вероятность. Пока руки до этого варианта не дошли. А у вас была подобная ситуация?
Цитата(iosifk @ Dec 20 2012, 17:51) *
У меня на сайте, в статьях, "Краткий Курс", глава о параметрах и пр....

Цитата(iosifk @ Dec 20 2012, 21:02) *
Уберите все #DELAY из файла, который будет проектом для ПЛИС и проведите симуляцию...
Оставить можно их только в тестбенче, в той его части, которая поставляет данные в ПЛИС...

Тут не оч понятно, зачем. В данном варианте на функциональной симуляции хоть задержки видно, так сказать, для понимания что по какому клоку произошло.

Цитата(Iptash @ Dec 20 2012, 18:55) *
Я на MAX II много измерительных вещей сделал, входа чувствительные к дребезгу (входные счетчики, регистры и т.п.) нужно фильтровать, т.е. в программе нужно прописывать для исключения ложного срабатывания.

Не очень понятно, что вы имеете ввиду? Что куда прописать в конфигурации? Приходит на ум лишь фильтр на основе счетчика, опять же. Вы это имеете ввиду? Заранее благодарю за ответ
Iptash
Цитата(the_king_orange_summer @ Dec 21 2012, 13:57) *
Приходит на ум лишь фильтр на основе счетчика, опять же. Вы это имеете ввиду? Заранее благодарю за ответ

Да, программно, на основе сдвигового регистра, но в одном проекте мне и это не помогло, помогло схема защелки которая "отпиралась" через некоторое заданное время.
Я незнаю как это к вашему коду относится, но я хотел сказать, что это имеет место быть.
the_king_orange_summer
Цитата(Iptash @ Dec 21 2012, 15:33) *
Да, программно, на основе сдвигового регистра, но в одном проекте мне и это не помогло, помогло схема защелки которая "отпиралась" через некоторое заданное время.
Я незнаю как это к вашему коду относится, но я хотел сказать, что это имеет место быть.

Имеет место быть, но проблема, по всей видимости, не в этом: если б пробиралась помеха по входу - автомат "шел" бы дальше, а он останавливается.
SM
Цитата(the_king_orange_summer @ Dec 21 2012, 13:57) *
Собсно, в нем задан клок, задан деленный клок.Весь проект синхронный, по фронтам. Разве еще что-то нужно накручивать для таймквеста, чтобы всё было хорошо?


Ну, как минимум, надо указать времянки "DOUT" относительно выхода клока "SCLK", чтобы синтезатор соблюл все требования к Tco АЦП. Тем более, что DOUT используется для перехода по автомату. А то по факту может оказаться так, что смена уровня на DOUT внутри ПЛИС приходит аккурат к фронту клока автомата, и тыканье осцилла приводит к его небольшой задержке и он оказывается уже в другом такте. И сказать, что SCLK это именно клок, а не просто выход.

Еще следует убедиться, что SCLK_en, измененный по фронту, не приводит к глитчу на выходном клоке SCLK - "коротокому импульсу", и защититься от этого - есть схемы безглитчевых клокогейтилок, либо переписать весь автомат так, чтобы SCLK формировалось регистром (на частоте, пополамной к частоте автомата). Такой глитч может АЦП ввести в полный ступор. И в варианте пополамной частоты SCLK не надо констрейнить его и DOUT - так как можете выбирать сами, в какой фазе данные "щелкать"


UPD:

Вот быстренько так глянул на код еще раз - так у вас клокогейтилка то глитчная (причем конкретно и с гарантией).

SCLK_en появляется с некоей задержкой от фронта 0->1 на clk, а потом идет на операцию И c clk (описанной через SCLK_en?clk:0 ), "вырубая" из него глитч в момент отключения клока. переделайте SCLK_en с работы по posedge на negedge, тогда его перепад придется на ноль на clk, и этой проблемы не будет.

и таймквесту надо бы про set_clock_gating_check напомнить (я вот правда не помню, поддерживает ли он это)
the_king_orange_summer
Цитата(SM @ Dec 21 2012, 16:28) *
Ну, как минимум, надо указать времянки "DOUT" относительно выхода клока "SCLK", чтобы синтезатор соблюл все требования к Tco АЦП. Тем более, что DOUT используется для перехода по автомату. А то по факту может оказаться так, что смена уровня на DOUT внутри ПЛИС приходит аккурат к фронту клока автомата, и тыканье осцилла приводит к его небольшой задержке и он оказывается уже в другом такте. И сказать, что SCLK это именно клок, а не просто выход.

Тк SCLK - это, конечно, клок для АЦП. Но частота-то мала. 1 МГц. При этом смена данных от АЦП на шине DOUT происходит по СРЕЗУ SCLK, а я их забираю по фронту SCLK. Так что тут должно быть всё гладко в любом случае.

Цитата(SM @ Dec 21 2012, 16:28) *
Еще следует убедиться, что SCLK_en, измененный по фронту, не приводит к глитчу на выходном клоке SCLK - "коротокому импульсу", и защититься от этого - есть схемы безглитчевых клокогейтилок, либо переписать весь автомат так, чтобы SCLK формировалось регистром (на частоте, пополамной к частоте автомата). Такой глитч может АЦП ввести в полный ступор. И в варианте пополамной частоты SCLK не надо констрейнить его и DOUT - так как можете выбирать сами, в какой фазе данные "щелкать"


UPD:

Вот быстренько так глянул на код еще раз - так у вас клокогейтилка то глитчная (причем конкретно и с гарантией).

SCLK_en появляется с некоей задержкой от фронта 0->1 на clk, а потом идет на операцию И c clk (описанной через SCLK_en?clk:0 ), "вырубая" из него глитч в момент отключения клока.

Есть такое дело) тут я немного "схалявил" rolleyes.gif
Но проблем с этим глитчем нет. Осц ее не показывает даже. Бесспорно, тут поправить необходимо. Но описанная проблема вряд ли из-за этого.

Цитата(SM @ Dec 21 2012, 16:28) *
и таймквесту надо бы про set_clock_gating_check напомнить (я вот правда не помню, поддерживает ли он это)

SDC and TimeQuest API Reference Manual от Altera ничего об этой команде не слышал) порою и в этом направлении. СПАСИБО!
SM
Цитата(the_king_orange_summer @ Dec 26 2012, 14:41) *
Но проблем с этим глитчем нет. Осц ее не показывает даже. Бесспорно, тут поправить необходимо. Но описанная проблема вряд ли из-за этого.


Осц не не видит его, а ликвидирует его своей емкостью, и именно поэтому не видит. А когда очцилла нету, вот он и вылезает.
the_king_orange_summer
Поставил преобразователь уровней (SN74LVC от TI) - пока проблема не наблюдалась больше.
the_king_orange_summer
к сожалению, проблема наблюдается вновь.
причем, не только с этим модулем проекта. с временным анализом непонятно ровным счетом ничего тогда мне krapula.gif
SM
Я вот тут совсем недавно весь мозг сломал - автомат залетал в некорректное состояние, при том, что вообще никаких клокогейтилок нет, все по одному клоку, и ничего асинхронного (автомат контроллера DDR2 памяти). Оказалось - питание. ПЛИС Lattice, завели питание VCCAUX (у альтер, правда, такого вроде нет) напрямую на общее 3.3, не фильтруя дополнительно.... Вторая итерация платы позволила забыть об этих проблемах.
the_king_orange_summer
воооо. вроде ясно. проблема решилась после установки фильтров по входам. как я понял, по входу ловилась метастабильность в случайный момент времени, т.к. входной сигнал никак не синхронизирован с улицы. Куда уходил в этой ситуации автомат - неизвестно. 2+ последовательных триггеров эту проблему решили
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.