the_king_orange_summer 0 20 декабря, 2012 Опубликовано 20 декабря, 2012 (изменено) · Жалоба Всем доброго времени суток. Прошу помощи в решении следующей проблемы. Тереюсь в догадках. Исходные данные: Имеется схемка с восемью АЦП+ПЛИС. АЦП (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 В ПЛИС зашит конечный авотмат. Код прилагаю `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: СУТЬ ПРОБЛЕМЫ Подключаюсь щупом осциллографа к точкам "SCLK_ADC", "DOUT_ADC" - опрос прекращается. Такое чувство, что схема "зависает". Прошу помощи. Может у кого было что-то похожее? Или есть соображения, почему такое может происходить? И вообще, что же это такое происходит с ПЛИС? Куда копать? Теряюсь в догадках.. Изменено 20 декабря, 2012 пользователем the_king_orange_summer Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dima_spb 0 20 декабря, 2012 Опубликовано 20 декабря, 2012 · Жалоба СУТЬ ПРОБЛЕМЫ Подключаюсь щупом осциллографа к точкам "SCLK_ADC", "DOUT_ADC" - опрос прекращается. Такое чувство, что схема "зависает". Прошу помощи. Может у кого было что-то похожее? Или есть соображения, почему такое может происходить? И вообще, что же это такое происходит с ПЛИС? Куда копать? Теряюсь в догадках.. Вы напишите настройки осциллографа, а точнее шупа измерительного!!!!!!! Или может быть Вы имели в виду логический анализатор?!.. Опишите чем тыкайтесь, что аж Такое чувство, что схема "зависает" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serhiy_UA 1 20 декабря, 2012 Опубликовано 20 декабря, 2012 · Жалоба input DOUT, ..... Прошу помощи. Входной сигнал DOUT не должен путаться в функциях перехода FSM (конечного автомата). Его сначала надо запомнить в D-триггере по клоку этой же FSM, а уже потом с выхода D-триггера применять в этих переходах. Там еще пара аналогичных подножек для FSM, этим создаются условия для гонок и, как следствие, зависаний. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 20 декабря, 2012 Опубликовано 20 декабря, 2012 · Жалоба Нужно продублировать измеряемые сигналы на свободные выводы CPLD и смотреть там. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
the_king_orange_summer 0 20 декабря, 2012 Опубликовано 20 декабря, 2012 (изменено) · Жалоба Вы напишите настройки осциллографа, а точнее шупа измерительного!!!! Обычный щуп от осциллографа. Ползунок делителя на х10. Генератор частоты для ПЛИС стоит на 8 МГц. Частота работы представленного модуля 1 МГц. Для ТаймКвеста данная информация пишется в sdc-файлик, анализ времянки проходит без каких либо возражений. Входной сигнал DOUT не должен путаться в функциях перехода FSM (конечного автомата). Его сначала надо запомнить в D-триггере по клоку этой же FSM, а уже потом с выхода D-триггера применять в этих переходах. Там еще пара аналогичных подножек для FSM, этим создаются условия для гонок и, как следствие, зависаний. Спасибо! Посмотрел. С DOUT-ом понятно. А остальные сигналы по клоку меняются - вроде же всё хорошо должно быть. Разве нет? Нужно продублировать измеряемые сигналы на свободные выводы CPLD и смотреть там. Выводил на свободные ножки состояния автомата+счетчик WDT. И при этом "зависаний" не наблюдалось. Аналогично, когда я включил PCI по входному сигналу DOUT (который вообще за микросхемой преобразования в 3.3В), "зависать" стало реже. Такое чувство, что какая-то злая помеха пробирается внутрь ПЛИС Изменено 20 декабря, 2012 пользователем the_king_orange_summer Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 20 декабря, 2012 Опубликовано 20 декабря, 2012 · Жалоба Всем доброго времени суток. Прошу помощи в решении следующей проблемы. Тереюсь в догадках. Прошу помощи. Может у кого было что-то похожее? Или есть соображения, почему такое может происходить? И вообще, что же это такое происходит с ПЛИС? Куда копать? Теряюсь в догадках.. А вот это - #DELAY, как у Вас попадает в ПЛИС? У меня на сайте, в статьях, "Краткий Курс", глава о параметрах и пр.... Удачи! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 20 декабря, 2012 Опубликовано 20 декабря, 2012 · Жалоба Такое чувство, что какая-то злая помеха пробирается внутрь ПЛИС Я на MAX II много измерительных вещей сделал, входа чувствительные к дребезгу (входные счетчики, регистры и т.п.) нужно фильтровать, т.е. в программе нужно прописывать для исключения ложного срабатывания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 20 декабря, 2012 Опубликовано 20 декабря, 2012 · Жалоба А вот это - #DELAY, как у Вас попадает в ПЛИС? А в ПЛИС оно никак попасть не может, ибо не синтезируемо. Выводил на свободные ножки состояния автомата+счетчик WDT. И при этом "зависаний" не наблюдалось. Это явный признак каких-то логических гонок, что от вывода на пины меняется работа. Либо есть необконстрейненные пути, либо некорректно обконстрейненные, ну либо сам клок грязный. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
acvarif 0 20 декабря, 2012 Опубликовано 20 декабря, 2012 · Жалоба Нужно продублировать измеряемые сигналы на свободные выводы CPLD и смотреть там. Именно так. 1. Можно попроовать щуп без общего провода (один провод). Общий по стенду. 2. Пропадание любго сигнала (или его искажение) при нагрзке на осциллятор - явный признак гонок по фронтам в автомате в какой-то его части. Полезно автомат просмотреть на симуляторе (любом). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 20 декабря, 2012 Опубликовано 20 декабря, 2012 · Жалоба А в ПЛИС оно никак попасть не может, ибо не синтезируемо. Ну так и я об этом же. Уберите все #DELAY из файла, который будет проектом для ПЛИС и проведите симуляцию... Оставить можно их только в тестбенче, в той его части, которая поставляет данные в ПЛИС... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Renom 0 20 декабря, 2012 Опубликовано 20 декабря, 2012 · Жалоба Копайте в сторону допустимой нагрузки на пин :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
the_king_orange_summer 0 21 декабря, 2012 Опубликовано 21 декабря, 2012 · Жалоба Это явный признак каких-то логических гонок, что от вывода на пины меняется работа. Либо есть необконстрейненные пути, либо некорректно обконстрейненные, ну либо сам клок грязный. Вот мой SDC-файлик. 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. Там, вроде, ничего такого не говорилось. Заранее, благодарю. 2. Пропадание любго сигнала (или его искажение) при нагрзке на осциллятор - явный признак гонок по фронтам в автомате в какой-то его части. Полезно автомат просмотреть на симуляторе (любом). Вы имеете ввиду временнОе моделирование? К сожалению, никак не могу подружить квартус12 и моделсим в плане симуляции на gate-уровне.. А разве он покажет что-то нехорошее, если таймквет говорит, что всё окнорм? По возможности буду копать в этом направлении. Спасибо! Копайте в сторону допустимой нагрузки на пин :) Тож есть вероятность. Пока руки до этого варианта не дошли. А у вас была подобная ситуация? У меня на сайте, в статьях, "Краткий Курс", глава о параметрах и пр.... Уберите все #DELAY из файла, который будет проектом для ПЛИС и проведите симуляцию... Оставить можно их только в тестбенче, в той его части, которая поставляет данные в ПЛИС... Тут не оч понятно, зачем. В данном варианте на функциональной симуляции хоть задержки видно, так сказать, для понимания что по какому клоку произошло. Я на MAX II много измерительных вещей сделал, входа чувствительные к дребезгу (входные счетчики, регистры и т.п.) нужно фильтровать, т.е. в программе нужно прописывать для исключения ложного срабатывания. Не очень понятно, что вы имеете ввиду? Что куда прописать в конфигурации? Приходит на ум лишь фильтр на основе счетчика, опять же. Вы это имеете ввиду? Заранее благодарю за ответ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 21 декабря, 2012 Опубликовано 21 декабря, 2012 · Жалоба Приходит на ум лишь фильтр на основе счетчика, опять же. Вы это имеете ввиду? Заранее благодарю за ответ Да, программно, на основе сдвигового регистра, но в одном проекте мне и это не помогло, помогло схема защелки которая "отпиралась" через некоторое заданное время. Я незнаю как это к вашему коду относится, но я хотел сказать, что это имеет место быть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
the_king_orange_summer 0 21 декабря, 2012 Опубликовано 21 декабря, 2012 · Жалоба Да, программно, на основе сдвигового регистра, но в одном проекте мне и это не помогло, помогло схема защелки которая "отпиралась" через некоторое заданное время. Я незнаю как это к вашему коду относится, но я хотел сказать, что это имеет место быть. Имеет место быть, но проблема, по всей видимости, не в этом: если б пробиралась помеха по входу - автомат "шел" бы дальше, а он останавливается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 21 декабря, 2012 Опубликовано 21 декабря, 2012 · Жалоба Собсно, в нем задан клок, задан деленный клок.Весь проект синхронный, по фронтам. Разве еще что-то нужно накручивать для таймквеста, чтобы всё было хорошо? Ну, как минимум, надо указать времянки "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 напомнить (я вот правда не помню, поддерживает ли он это) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться