|
"Зависание" ПЛИС, Прошу помощи. Зависание конечного автомата конфигурации. |
|
|
|
Dec 20 2012, 12:06
|

Участник

Группа: Участник
Сообщений: 70
Регистрация: 1-06-10
Из: Москва
Пользователь №: 57 688

|
Всем доброго времени суток. Прошу помощи в решении следующей проблемы. Тереюсь в догадках. Исходные данные:Имеется схемка с восемью АЦП+ПЛИС. АЦП (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. Реализован последовательный опрос всех АЦП. Если АЦП не отвечает за определенное - ситуация фиксируется, опрос продолжается далее. Состояний, в которых автомат может "зависнуть", не вижу СУТЬ ПРОБЛЕМЫПодключаюсь щупом осциллографа к точкам "SCLK_ADC", "DOUT_ADC" - опрос прекращается. Такое чувство, что схема "зависает". Прошу помощи. Может у кого было что-то похожее? Или есть соображения, почему такое может происходить? И вообще, что же это такое происходит с ПЛИС? Куда копать? Теряюсь в догадках..
Сообщение отредактировал the_king_orange_summer - Dec 20 2012, 12:07
Эскизы прикрепленных изображений
|
|
|
|
|
Dec 20 2012, 12:44
|

Местный
  
Группа: Свой
Сообщений: 397
Регистрация: 21-11-12
Из: Россия г. Санкт-Петербург
Пользователь №: 74 498

|
Цитата СУТЬ ПРОБЛЕМЫ Подключаюсь щупом осциллографа к точкам "SCLK_ADC", "DOUT_ADC" - опрос прекращается. Такое чувство, что схема "зависает". Прошу помощи. Может у кого было что-то похожее? Или есть соображения, почему такое может происходить? И вообще, что же это такое происходит с ПЛИС? Куда копать? Теряюсь в догадках.. Вы напишите настройки осциллографа, а точнее шупа измерительного!!!!!!! Или может быть Вы имели в виду логический анализатор?!.. Опишите чем тыкайтесь, что аж Цитата Такое чувство, что схема "зависает"
--------------------
Победа - это когда N раз упал и N+1 раз встал.
|
|
|
|
|
Dec 20 2012, 12:53
|
Знающий
   
Группа: Свой
Сообщений: 721
Регистрация: 23-10-08
Из: next to Odessa
Пользователь №: 41 112

|
Цитата(the_king_orange_summer @ Dec 20 2012, 16:06)  input DOUT, ..... Прошу помощи. Входной сигнал DOUT не должен путаться в функциях перехода FSM (конечного автомата). Его сначала надо запомнить в D-триггере по клоку этой же FSM, а уже потом с выхода D-триггера применять в этих переходах. Там еще пара аналогичных подножек для FSM, этим создаются условия для гонок и, как следствие, зависаний.
|
|
|
|
|
Dec 20 2012, 13:07
|

Участник

Группа: Участник
Сообщений: 70
Регистрация: 1-06-10
Из: Москва
Пользователь №: 57 688

|
Цитата(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В), "зависать" стало реже. Такое чувство, что какая-то злая помеха пробирается внутрь ПЛИС
Сообщение отредактировал the_king_orange_summer - Dec 20 2012, 13:14
|
|
|
|
|
Dec 20 2012, 14:51
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(the_king_orange_summer @ Dec 20 2012, 16:06)  Всем доброго времени суток. Прошу помощи в решении следующей проблемы. Тереюсь в догадках.
Прошу помощи. Может у кого было что-то похожее? Или есть соображения, почему такое может происходить? И вообще, что же это такое происходит с ПЛИС? Куда копать? Теряюсь в догадках.. А вот это - #DELAY, как у Вас попадает в ПЛИС? У меня на сайте, в статьях, "Краткий Курс", глава о параметрах и пр.... Удачи!
--------------------
www.iosifk.narod.ru
|
|
|
|
|
Dec 20 2012, 16:36
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(iosifk @ Dec 20 2012, 18:51)  А вот это - #DELAY, как у Вас попадает в ПЛИС? А в ПЛИС оно никак попасть не может, ибо не синтезируемо. Цитата(the_king_orange_summer) Выводил на свободные ножки состояния автомата+счетчик WDT. И при этом "зависаний" не наблюдалось. Это явный признак каких-то логических гонок, что от вывода на пины меняется работа. Либо есть необконстрейненные пути, либо некорректно обконстрейненные, ну либо сам клок грязный.
|
|
|
|
|
Dec 20 2012, 17:00
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата Нужно продублировать измеряемые сигналы на свободные выводы CPLD и смотреть там. Именно так. 1. Можно попроовать щуп без общего провода (один провод). Общий по стенду. 2. Пропадание любго сигнала (или его искажение) при нагрзке на осциллятор - явный признак гонок по фронтам в автомате в какой-то его части. Полезно автомат просмотреть на симуляторе (любом).
|
|
|
|
|
Dec 20 2012, 18:02
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(SM @ Dec 20 2012, 20:36)  А в ПЛИС оно никак попасть не может, ибо не синтезируемо. Ну так и я об этом же. Уберите все #DELAY из файла, который будет проектом для ПЛИС и проведите симуляцию... Оставить можно их только в тестбенче, в той его части, которая поставляет данные в ПЛИС...
--------------------
www.iosifk.narod.ru
|
|
|
|
|
Dec 21 2012, 09:57
|

Участник

Группа: Участник
Сообщений: 70
Регистрация: 1-06-10
Из: Москва
Пользователь №: 57 688

|
Цитата(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)  Копайте в сторону допустимой нагрузки на пин  Тож есть вероятность. Пока руки до этого варианта не дошли. А у вас была подобная ситуация? Цитата(iosifk @ Dec 20 2012, 17:51)  У меня на сайте, в статьях, "Краткий Курс", глава о параметрах и пр.... Цитата(iosifk @ Dec 20 2012, 21:02)  Уберите все #DELAY из файла, который будет проектом для ПЛИС и проведите симуляцию... Оставить можно их только в тестбенче, в той его части, которая поставляет данные в ПЛИС... Тут не оч понятно, зачем. В данном варианте на функциональной симуляции хоть задержки видно, так сказать, для понимания что по какому клоку произошло. Цитата(Iptash @ Dec 20 2012, 18:55)  Я на MAX II много измерительных вещей сделал, входа чувствительные к дребезгу (входные счетчики, регистры и т.п.) нужно фильтровать, т.е. в программе нужно прописывать для исключения ложного срабатывания. Не очень понятно, что вы имеете ввиду? Что куда прописать в конфигурации? Приходит на ум лишь фильтр на основе счетчика, опять же. Вы это имеете ввиду? Заранее благодарю за ответ
|
|
|
|
|
Dec 21 2012, 12:52
|

Участник

Группа: Участник
Сообщений: 70
Регистрация: 1-06-10
Из: Москва
Пользователь №: 57 688

|
Цитата(Iptash @ Dec 21 2012, 15:33)  Да, программно, на основе сдвигового регистра, но в одном проекте мне и это не помогло, помогло схема защелки которая "отпиралась" через некоторое заданное время. Я незнаю как это к вашему коду относится, но я хотел сказать, что это имеет место быть. Имеет место быть, но проблема, по всей видимости, не в этом: если б пробиралась помеха по входу - автомат "шел" бы дальше, а он останавливается.
|
|
|
|
|
Dec 21 2012, 13:28
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

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