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

 
 
> "Зависание" ПЛИС, Прошу помощи. Зависание конечного автомата конфигурации.
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
 
Start new topic
Ответов
SM
сообщение Jan 20 2014, 19:41
Сообщение #2


Гуру
******

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



Я вот тут совсем недавно весь мозг сломал - автомат залетал в некорректное состояние, при том, что вообще никаких клокогейтилок нет, все по одному клоку, и ничего асинхронного (автомат контроллера DDR2 памяти). Оказалось - питание. ПЛИС Lattice, завели питание VCCAUX (у альтер, правда, такого вроде нет) напрямую на общее 3.3, не фильтруя дополнительно.... Вторая итерация платы позволила забыть об этих проблемах.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
- - the_king_orange_summer   Цитата(SM @ Dec 20 2012, 19:36) Это явный...   Dec 21 2012, 09:57
|- - 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 21 2012, ...   Dec 21 2012, 13:28
|- - the_king_orange_summer   Цитата(SM @ Dec 21 2012, 16:28) Ну, как м...   Dec 26 2012, 10:41
|- - 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
- - the_king_orange_summer   воооо. вроде ясно. проблема решилась после установ...   Jan 28 2014, 07:01


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

 


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


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