|
Корректный сброс при изменении задающей частоты |
|
|
|
Mar 7 2016, 21:22
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 13-02-13
Из: Рыбинск
Пользователь №: 75 606

|
Здравствуйте!
Имеется плата с АЦП, ЦАПом и Spartan-6 на борту. Тактирование АЦП и ЦАП осуществляется синтезатором через дестрибьютер тактовых сигналов, частота дискретизации 125 МГц. Дифф. тактовый сигнал от АЦП заводится в глобальную шину синхронизации и используется для синхронизации модулей ЦОС. Сигнал сброса на эти модули естесственно выдается с задержкой после включения.
Проводили испытания на климат и на морозе плата стала сбоить. Я сделал тестовую прошивку с возможность сброса части логики и оказалось, что сбоит логика тактируемая этим сигналом при прогреве платы во время работы.
Начал экспериментировать - замыкать входы синхронизации и действительно при кратковременном пропадании тактового сигнала логика перестает работать навечно.
Предполагаю, что при прогреве платы происходит кратковременное изменение фазы или частоты схемы тактирования. Однако, повторный сброс части логики ПЛИС решает все проблемы.
Подал клок АЦП на DCM и стал мониторить его сигналы LOCKED, STATUS, CLK_VALID, CLK_STOPPED. Сделал конечный автомат, отслеживающий их и формирующий сброс. И снова стал замыкать дифф. пару. В 90 процентах случаев конечный автомат вырабатывает корректный сигнал сброса и работа логики восстанавливается. Однако, иногда при кратковременном пропадании клока все сигналы DCM говорят о том, что все хорошо, а логика моя не работает, поскольку я ее не сбросил. (((( Ну об этом и UG382 говорит, как я понял, типа не рассчитывайте особа на сигналы состояний DCM. Вырабатывать сброс периодически не хочется.
Вопрос в следующем: как можно железно отследить кратковременные сбои тактирующего сигнал и сформировать сигнал сброса для логики тактируемой им? Конечно, можно и с задающей схемой еще поковыряться, но мне не нравится такой расклад: клок пропал - все перестало работать на вечно, даже после его восстановления(((((
Заранее спасибо
|
|
|
|
|
 |
Ответов
|
Mar 8 2016, 13:06
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 13-02-13
Из: Рыбинск
Пользователь №: 75 606

|
Цитата(Lmx2315 @ Mar 8 2016, 15:56)  ..странно что при кратковременном пропадании клоков у вас схема виснет, я так понял там просто жёсткое DSP какое-то, оно может виснуть только если клоков нет совсем. Угу, мне тоже странно. Виснет кусок схемы, который вычисляет корреляцию с кодом Баркера. Код module bin_correlator # ( parameter SPS = 40, parameter CODE = 11'b11100010010, parameter CODE_WIDTH = 11, parameter TRESHOLD = SPS*CODE_WIDTH - 2*CODE_WIDTH ) ( input in_clk, input in_data, input in_reset, input in_enable, output reg out_threshold, output reg out_peak, output reg [CODE_WIDTH - 1 : 0] out_data );
// Ширина регистра с задержанными данными localparam D_WIDTH = SPS*(CODE_WIDTH + 1); localparam SUM_WIDTH = 8; localparam MUL_WIDTH = 10;
// Буфер для сохранения задержанных двоичных данных reg [D_WIDTH - 1 : 0] delayed_buf;
// Буфер с суммами на отсчет reg signed [SUM_WIDTH - 1 : 0] sum_buf [CODE_WIDTH-1 : 0];
// Буфер с корреляционными произведениями reg signed [SUM_WIDTH - 1 : 0] corr_mul_buf [CODE_WIDTH-1 : 0];
// Буфер, хранящий значения вычисленных ВКФ reg signed [MUL_WIDTH - 1 : 0] sum_mul;
// Буфер с добавками к сумме reg signed [2 : 0] add_buf [CODE_WIDTH-1 : 0];
// Буфер с кодом свертки reg [CODE_WIDTH-1 : 0] code = CODE;
reg _is_old_threshold; reg signed [MUL_WIDTH - 1 : 0] _old_corr_func; // reg signed [MUL_WIDTH - 1 : 0] _corr_func; // wire _is_threshold = (_corr_func >= TRESHOLD);
integer i;
initial begin reset_task(); end
always @(posedge in_clk) begin if(in_reset) begin reset_task(); end else begin process_task(); end end
// Процесс обработки данных task process_task; begin // Сдвиг данных в регистр delayed_buf <= {delayed_buf[D_WIDTH - 2 : 0], in_data}; sum_mul = 0; // Вычисление сумм на символ for(i = 0; i < CODE_WIDTH; i = i + 1) begin // Вычисление добавки к символу add_buf[i] <= $signed({delayed_buf[i*SPS], 1'b1}) - $signed({delayed_buf[(i + 1)*SPS], 1'b1}); // Вычисление суммы на символ sum_buf[i] <= sum_buf[i] + add_buf[i]; // Вычисление значений символа out_data[i] <= $signed(sum_buf[i]) < $signed(0); // Вычисление корреляционных произведений corr_mul_buf[i] <= code[i] ? -sum_buf[i] : sum_buf[i]; // Выисление суммы корреляционных произведений sum_mul = sum_mul + corr_mul_buf[i]; end // _corr_func <= sum_mul; // out_threshold <= (sum_mul >= TRESHOLD); // Save old Function State _old_corr_func <= _corr_func; // Save old threshold state _is_old_threshold <= _is_threshold; // Correlation Peak out_peak <= (_is_old_threshold) & (_corr_func < _old_corr_func);
end endtask // Процесс сброса task reset_task; begin code <= CODE; for(i = 0; i < SPS*CODE_WIDTH + 1; i = i + 1) begin delayed_buf[i] <= 1'b0; end; for(i = 0; i < CODE_WIDTH; i = i + 1) begin sum_buf[i] <= SPS - 1; add_buf[i] <= 0; out_data <= 0; end end endtask
endmodule
Сообщение отредактировал Fourier - Mar 8 2016, 13:14
|
|
|
|
Сообщений в этой теме
Fourier Корректный сброс при изменении задающей частоты Mar 7 2016, 21:22 VladimirB Цитата(Fourier @ Mar 8 2016, 00:22) Здрав... Mar 7 2016, 21:51 TRILLER Цитата(Fourier @ Mar 8 2016, 00:22) Однак... Mar 8 2016, 12:28 Fourier Цитата(TRILLER @ Mar 8 2016, 15:28) Я бы ... Mar 8 2016, 12:52 TRILLER Цитата(Fourier @ Mar 8 2016, 15:52) Подск... Mar 8 2016, 14:57 Timmy Можете показать файл с констрейнами? А то меня тер... Mar 9 2016, 07:08 bogaev_roman Цитата(Timmy @ Mar 9 2016, 10:08) Можете ... Mar 9 2016, 08:59  Fourier Цитата(bogaev_roman @ Mar 9 2016, 11:59) ... Mar 9 2016, 17:27
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|