|
"Зависание" ПЛИС, Прошу помощи. Зависание конечного автомата конфигурации. |
|
|
|
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 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, 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 напомнить (я вот правда не помню, поддерживает ли он это)
|
|
|
|
|
Dec 26 2012, 10:41
|

Участник

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

|
Цитата(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 ), "вырубая" из него глитч в момент отключения клока. Есть такое дело) тут я немного "схалявил" Но проблем с этим глитчем нет. Осц ее не показывает даже. Бесспорно, тут поправить необходимо. Но описанная проблема вряд ли из-за этого. Цитата(SM @ Dec 21 2012, 16:28)  и таймквесту надо бы про set_clock_gating_check напомнить (я вот правда не помню, поддерживает ли он это) SDC and TimeQuest API Reference Manual от Altera ничего об этой команде не слышал) порою и в этом направлении. СПАСИБО!
|
|
|
|
Сообщений в этой теме
the_king_orange_summer "Зависание" ПЛИС Dec 20 2012, 12:06 Dmitriyspb ЦитатаСУТЬ ПРОБЛЕМЫ
Подключаюсь щупом осциллографа... Dec 20 2012, 12:44 Serhiy_UA Цитата(the_king_orange_summer @ Dec 20 2012, ... Dec 20 2012, 12:53 Iptash Нужно продублировать измеряемые сигналы на свободн... Dec 20 2012, 12:56 the_king_orange_summer Цитата(Dmitriyspb @ Dec 20 2012, 15:44) В... Dec 20 2012, 13:07 Iptash Цитата(the_king_orange_summer @ Dec 20 2012, ... Dec 20 2012, 15:55 iosifk Цитата(the_king_orange_summer @ Dec 20 2012, ... Dec 20 2012, 14:51 SM Цитата(iosifk @ Dec 20 2012, 18:51) А вот... Dec 20 2012, 16:36  iosifk Цитата(SM @ Dec 20 2012, 20:36) А в ПЛИС ... Dec 20 2012, 18:02 Acvarif ЦитатаНужно продублировать измеряемые сигналы на с... Dec 20 2012, 17:00 Rendom Копайте в сторону допустимой нагрузки на пин Dec 20 2012, 18:47 Iptash Цитата(the_king_orange_summer @ Dec 21 2012, ... Dec 21 2012, 12:33  the_king_orange_summer Цитата(Iptash @ Dec 21 2012, 15:33) Да, п... Dec 21 2012, 12:52   SM Цитата(the_king_orange_summer @ Dec 26 2012, ... Dec 26 2012, 13:15 the_king_orange_summer Поставил преобразователь уровней (SN74LVC от TI) -... May 20 2013, 13:37 the_king_orange_summer к сожалению, проблема наблюдается вновь.
причем, н... Jan 20 2014, 13:04 SM Я вот тут совсем недавно весь мозг сломал - автома... Jan 20 2014, 19:41 the_king_orange_summer воооо. вроде ясно. проблема решилась после установ... Jan 28 2014, 07:01
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|