Перейти к содержанию
    

Всем доброго времени суток.

Прошу помощи в решении следующей проблемы. Тереюсь в догадках.

Исходные данные:

Имеется схемка с восемью АЦП+ПЛИС. АЦП (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" - опрос прекращается. Такое чувство, что схема "зависает".

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

post-57688-1356004127_thumb.jpg

Изменено пользователем the_king_orange_summer

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

СУТЬ ПРОБЛЕМЫ

Подключаюсь щупом осциллографа к точкам "SCLK_ADC", "DOUT_ADC" - опрос прекращается. Такое чувство, что схема "зависает".

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

 

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

Такое чувство, что схема "зависает"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

input DOUT,

.....

Прошу помощи.

Входной сигнал DOUT не должен путаться в функциях перехода FSM (конечного автомата). Его сначала надо запомнить в D-триггере по клоку этой же FSM, а уже потом с выхода D-триггера применять в этих переходах.

Там еще пара аналогичных подножек для FSM, этим создаются условия для гонок и, как следствие, зависаний.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы напишите настройки осциллографа, а точнее шупа измерительного!!!!

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

 

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

 

 

Входной сигнал DOUT не должен путаться в функциях перехода FSM (конечного автомата). Его сначала надо запомнить в D-триггере по клоку этой же FSM, а уже потом с выхода D-триггера применять в этих переходах.

Там еще пара аналогичных подножек для FSM, этим создаются условия для гонок и, как следствие, зависаний.

Спасибо!

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

 

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

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

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

 

Такое чувство, что какая-то злая помеха пробирается внутрь ПЛИС

Изменено пользователем the_king_orange_summer

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем доброго времени суток.

Прошу помощи в решении следующей проблемы. Тереюсь в догадках.

 

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

 

 

А вот это - #DELAY, как у Вас попадает в ПЛИС?

У меня на сайте, в статьях, "Краткий Курс", глава о параметрах и пр....

Удачи!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Такое чувство, что какая-то злая помеха пробирается внутрь ПЛИС

Я на MAX II много измерительных вещей сделал, входа чувствительные к дребезгу (входные счетчики, регистры и т.п.) нужно фильтровать, т.е. в программе нужно прописывать для исключения ложного срабатывания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот это - #DELAY, как у Вас попадает в ПЛИС?

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Именно так.

1. Можно попроовать щуп без общего провода (один провод). Общий по стенду.

2. Пропадание любго сигнала (или его искажение) при нагрзке на осциллятор - явный признак гонок по фронтам в автомате

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Ну так и я об этом же.

Уберите все #DELAY из файла, который будет проектом для ПЛИС и проведите симуляцию...

Оставить можно их только в тестбенче, в той его части, которая поставляет данные в ПЛИС...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Вот мой 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 много измерительных вещей сделал, входа чувствительные к дребезгу (входные счетчики, регистры и т.п.) нужно фильтровать, т.е. в программе нужно прописывать для исключения ложного срабатывания.

Не очень понятно, что вы имеете ввиду? Что куда прописать в конфигурации? Приходит на ум лишь фильтр на основе счетчика, опять же. Вы это имеете ввиду? Заранее благодарю за ответ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приходит на ум лишь фильтр на основе счетчика, опять же. Вы это имеете ввиду? Заранее благодарю за ответ

Да, программно, на основе сдвигового регистра, но в одном проекте мне и это не помогло, помогло схема защелки которая "отпиралась" через некоторое заданное время.

Я незнаю как это к вашему коду относится, но я хотел сказать, что это имеет место быть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, программно, на основе сдвигового регистра, но в одном проекте мне и это не помогло, помогло схема защелки которая "отпиралась" через некоторое заданное время.

Я незнаю как это к вашему коду относится, но я хотел сказать, что это имеет место быть.

Имеет место быть, но проблема, по всей видимости, не в этом: если б пробиралась помеха по входу - автомат "шел" бы дальше, а он останавливается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Собсно, в нем задан клок, задан деленный клок.Весь проект синхронный, по фронтам. Разве еще что-то нужно накручивать для таймквеста, чтобы всё было хорошо?

 

Ну, как минимум, надо указать времянки "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 напомнить (я вот правда не помню, поддерживает ли он это)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...