реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> "Зависание" ПЛИС, Прошу помощи. Зависание конечного автомата конфигурации.
the_king_orange_...
сообщение Dec 20 2012, 12:06
Сообщение #1


Участник
*

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

Сообщение отредактировал the_king_orange_summer - Dec 20 2012, 12:07
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Dmitriyspb
сообщение Dec 20 2012, 12:44
Сообщение #2


Местный
***

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



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


Вы напишите настройки осциллографа, а точнее шупа измерительного!!!!!!! Или может быть Вы имели в виду логический анализатор?!.. Опишите чем тыкайтесь, что аж
Цитата
Такое чувство, что схема "зависает"


--------------------
Победа - это когда N раз упал и N+1 раз встал.
Go to the top of the page
 
+Quote Post
Serhiy_UA
сообщение Dec 20 2012, 12:53
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 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, этим создаются условия для гонок и, как следствие, зависаний.
Go to the top of the page
 
+Quote Post
Iptash
сообщение Dec 20 2012, 12:56
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 613
Регистрация: 2-09-08
Из: г.Набережные Челны
Пользователь №: 39 936



Нужно продублировать измеряемые сигналы на свободные выводы CPLD и смотреть там.
Go to the top of the page
 
+Quote Post
the_king_orange_...
сообщение Dec 20 2012, 13:07
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
iosifk
сообщение Dec 20 2012, 14:51
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



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

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



А вот это - #DELAY, как у Вас попадает в ПЛИС?
У меня на сайте, в статьях, "Краткий Курс", глава о параметрах и пр....
Удачи!


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Iptash
сообщение Dec 20 2012, 15:55
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 613
Регистрация: 2-09-08
Из: г.Набережные Челны
Пользователь №: 39 936



Цитата(the_king_orange_summer @ Dec 20 2012, 17:07) *
Такое чувство, что какая-то злая помеха пробирается внутрь ПЛИС

Я на MAX II много измерительных вещей сделал, входа чувствительные к дребезгу (входные счетчики, регистры и т.п.) нужно фильтровать, т.е. в программе нужно прописывать для исключения ложного срабатывания.
Go to the top of the page
 
+Quote Post
SM
сообщение Dec 20 2012, 16:36
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(iosifk @ Dec 20 2012, 18:51) *
А вот это - #DELAY, как у Вас попадает в ПЛИС?

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

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

Это явный признак каких-то логических гонок, что от вывода на пины меняется работа. Либо есть необконстрейненные пути, либо некорректно обконстрейненные, ну либо сам клок грязный.
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Dec 20 2012, 17:00
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Цитата
Нужно продублировать измеряемые сигналы на свободные выводы CPLD и смотреть там.

Именно так.
1. Можно попроовать щуп без общего провода (один провод). Общий по стенду.
2. Пропадание любго сигнала (или его искажение) при нагрзке на осциллятор - явный признак гонок по фронтам в автомате
в какой-то его части. Полезно автомат просмотреть на симуляторе (любом).
Go to the top of the page
 
+Quote Post
iosifk
сообщение Dec 20 2012, 18:02
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(SM @ Dec 20 2012, 20:36) *
А в ПЛИС оно никак попасть не может, ибо не синтезируемо.

Ну так и я об этом же.
Уберите все #DELAY из файла, который будет проектом для ПЛИС и проведите симуляцию...
Оставить можно их только в тестбенче, в той его части, которая поставляет данные в ПЛИС...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Rendom
сообщение Dec 20 2012, 18:47
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 85
Регистрация: 6-05-07
Пользователь №: 27 538



Копайте в сторону допустимой нагрузки на пин sm.gif
Go to the top of the page
 
+Quote Post
the_king_orange_...
сообщение Dec 21 2012, 09:57
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 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) *
Копайте в сторону допустимой нагрузки на пин sm.gif

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

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

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

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

Не очень понятно, что вы имеете ввиду? Что куда прописать в конфигурации? Приходит на ум лишь фильтр на основе счетчика, опять же. Вы это имеете ввиду? Заранее благодарю за ответ
Go to the top of the page
 
+Quote Post
Iptash
сообщение Dec 21 2012, 12:33
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 613
Регистрация: 2-09-08
Из: г.Набережные Челны
Пользователь №: 39 936



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

Да, программно, на основе сдвигового регистра, но в одном проекте мне и это не помогло, помогло схема защелки которая "отпиралась" через некоторое заданное время.
Я незнаю как это к вашему коду относится, но я хотел сказать, что это имеет место быть.
Go to the top of the page
 
+Quote Post
the_king_orange_...
сообщение Dec 21 2012, 12:52
Сообщение #14


Участник
*

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



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

Имеет место быть, но проблема, по всей видимости, не в этом: если б пробиралась помеха по входу - автомат "шел" бы дальше, а он останавливается.
Go to the top of the page
 
+Quote Post
SM
сообщение Dec 21 2012, 13:28
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 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 напомнить (я вот правда не помню, поддерживает ли он это)
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 20:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01499 секунд с 7
ELECTRONIX ©2004-2016