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

Что это за интерфейс?

Всем доброго времени суток. Подскажите кто знает.. Необходимо реализовать некий (неизвестный мне) интерфейс передачи данных,

а выглядит он следующим образом:

 

С внешнего устройства поступают:

- входная последовательность (кодируемая фронтом, т.е. лог 1 = один перепад, лог 0 = нет перепада)

- опорная частота (в 100 и более раз больше частоты переключения последовательности)

 

причем, в последовательности подряд может идти только от 1 до 4-х логических нулей

 

На выходе необходимо получить эту же последовательность, но сопровождаемую

собственными синхроимпульсами (т.е. частотой переключения этой последовательности)

 

В общем на словах не опишешь.. :) по рисунку все сразу будет понятно.

 

ВОПРОС: На что похож данный интерфейс? И как решаются такие задачи?

 

Заранее спасибо.. :rolleyes:

post-35268-1233259590_thumb.jpg

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

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


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

Необходимо реализовать некий (неизвестный мне) интерфейс передачи данных,

а выглядит он следующим образом:

 

С внешнего устройства поступают:

- входная последовательность (кодируемая фронтом, т.е. лог 1 = один перепад, лог 0 = нет перепада)

Похоже на Манчестер

 

причем, в последовательности подряд может идти только от 1 до 4-х логических нулей
Этого мало, нужна какая то известная синхропоследовательность в начале. Или очень длинная последовательность.

Еще надо знать частоту сигнала данных (хотя бы приблизительно)

 

На выходе необходимо получить эту же последовательность, но сопровождаемую

собственными синхроимпульсами (т.е. частотой переключения этой последовательности)

ФАПЧ вам поможет

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


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

Похоже на Манчестер

в манчестере не бывает длинных нулей или единиц (более одного битового интервала), так что мимо.

 

ФАПЧ вам поможет

++

Можно по фронту инф. сигнала запускать счётчик и считать сдвиг тактового относительно инф. , а по результату корректировать генератор ТИ

 

 

лог 1 = один перепад, лог 0 = нет перепада

ВОПРОС: На что похож данный интерфейс? И как решаются такие задачи?

Вообще похоже на кодирование данных на магнитном носителе. Посмотрите схемы дисководов.

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


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

Всем доброго времени суток. Подскажите кто знает.. Необходимо реализовать некий (неизвестный мне) интерфейс передачи данных,

а выглядит он следующим образом:

 

С внешнего устройства поступают:

- входная последовательность (кодируемая фронтом, т.е. лог 1 = один перепад, лог 0 = нет перепада)

- опорная частота (в 100 и более раз больше частоты переключения последовательности)

 

причем, в последовательности подряд может идти только от 1 до 4-х логических нулей

 

На выходе необходимо получить эту же последовательность, но сопровождаемую

собственными синхроимпульсами (т.е. частотой переключения этой последовательности)

 

Это похоже на ARINC 429. Посмотрите драйвер HI-8588. На выходе у него две логические линии. Одна последовательность (уровень логической единицы в половину периода несущей частоты)- это наличие в линии 1.

Другая последовательность - наличие в линии 0. Тогда и количество синхроимпульсов (количество битов в посылке) - это просто функция ИЛИ этих двух входных последовательностей. У Вас нарисован уже сформированный синхроимпульс, сдвинутый относительно посылке всех единиц (для приема на сдвигающий регистр)

Частоты там фиксированные. 12.5 кГц, 50, 100.

(Без линии, где нули выделяются, синхроимпульс только по выделенным единицам не получить )

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


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

Похоже на Манчестер

 

Этого мало, нужна какая то известная синхропоследовательность в начале. Или очень длинная последовательность.

Еще надо знать частоту сигнала данных (хотя бы приблизительно)

 

ФАПЧ вам поможет

 

Спасибо всем за ответы.

Некоторые уточнения:

 

Синхропоследовательности вначале нет (или о ней ничего не известно). Последовательность входная одна - это

меандр с отсутствующими единицами от 1 до 4-х подряд.

Частота переключения последовательности 2,048, опорная в 50-100 раз выше (может быть разной).

 

А ФАПЧ вы имеете ввиду PLL ПЛИС или внешний?

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

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


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

Спасибо всем за ответы.

Некоторые уточнения:

 

Последовательность входная одна - это

меандр с отсутствующими единицами от 1 до 4-х подряд.

 

Входные данные - не меандр. Длительность бита входных данных - половина периода несущей частоты. Иначе Вам не выделить синхроимпульсы из посылки.

Может там специализированные приемо - передатчики стоят?

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


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

Входные данные - не меандр. Длительность бита входных данных - половина периода несущей частоты. Иначе Вам не выделить синхроимпульсы из посылки.

Может там специализированные приемо - передатчики стоят?

 

я не знаю, что это за информация, может это и не информация вовсе.. а какой-то побитый CLK.. про передатчики ничего не известно... , есть просто такая задача. :laughing:

Сказано, что входная последовательность представляет собой меандр, с некоторыми отсутствующими импульсами.

 

Под несущей частотой вы имеете ввиду опорную или полученную? Длительность бита данных = половина периода выделенной частоты.

 

Пока пробую тупо подсчитать длительность бита посылки и сдвинуть ее 8 раз (с учетом нулей), а потом сложить по ИЛИ, пока не получилось.

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


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

я не знаю, что это за информация, может это и не информация вовсе.. а какой-то побитый CLK.. про передатчики ничего не известно... , есть просто такая задача. :laughing:

Сказано, что входная последовательность представляет собой меандр, с некоторыми отсутствующими импульсами.

 

Под несущей частотой вы имеете ввиду опорную или полученную? Длительность бита данных = половина периода выделенной частоты.

 

Пока пробую тупо подсчитать длительность бита посылки и сдвинуть ее 8 раз (с учетом нулей), а потом сложить по ИЛИ, пока не получилось.

 

Я про ИЛИ сказал, имея ввиду протокол arinc. Обычно протокол обмена прозрачен и понятен. И затраты поэтому на его реализацию незначительны.

Я бы не стал думать о схемной реализации, не выяснив протокола обмена данными в Вашем случае. Ведь от этого зависит надежность передачи, приема данных.

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


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

Я про ИЛИ сказал, имея ввиду протокол arinc. Обычно протокол обмена прозрачен и понятен. И затраты поэтому на его реализацию незначительны.

Я бы не стал думать о схемной реализации, не выяснив протокола обмена данными в Вашем случае. Ведь от этого зависит надежность передачи, приема данных.

 

Открою маленький секрет. Эту задачу мне выдали на одном из собеседований при приеме на работу... :rolleyes:

 

И следовательно задача надежности приема-передачи данных не стоит. Это какая-то типовая задача в интерфейсах передачи данных. Честно скажу, я с такими не сталкивался. Вот и подумал, может по условию можно будет что-то понять, на что он похож и где решаются такие задачи. Единственно, есть пожелание по возможности избежать сильного джиттера выдаваемых синхроимпульсов, но до этого еще рано.

 

PS: Фокус с подсчетом длительности положительного уровня последовательности не прошел, т.к. частота опорная не кратна частоте переключения последовательности.. в общем стыдно мне, стыдно! :unsure:

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

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


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

Открою маленький секрет. Эту задачу мне выдали на одном из собеседований при приеме на работу... :rolleyes:

 

И следовательно задача надежности приема-передачи данных не стоит. Это какая-то типовая задача в интерфейсах передачи данных. Честно скажу, я с такими не сталкивался. Вот и подумал, может по условию можно будет что-то понять, на что он похож и где решаются такие задачи. Единственно, есть пожелание по возможности избежать сильного джиттера выдаваемых синхроимпульсов, но до этого еще рано.

 

PS: Фокус с подсчетом длительности положительного уровня последовательности не прошел, т.к. частота опорная не кратна частоте переключения последовательности.. в общем стыдно мне, стыдно! :unsure:

 

Похож он на битовую посылку данных, в которой закодированы синхроимпульсы сопровождения. (Ваша повышенная опорная частота это принадлежность приемника. ЕЕ нет надобности тащить.) И про джиттер тоже забудьте. Самим протоколом приема передачи данных это решается.

Чтобы выделить из посылки принимаемых данных синхроимпульсы - идут на ухищрения. Ведь требуется подстройка внутренних синхрочасов (Ваша опорная), чтобы данные не потерять. Подстроиться можно только по перепаду фронта в посылке данных. У манчестера этот перепад в середине бита,

или из 0 в 1 или из 1 в 0. У arinc - 429 (летайте самолетами аэрофлота) детектируется 1, если уровень в канале выше 3В и детектируется 0 - если уровень напряжения в канале меньше минус 3 вольт. Поэтому на выходе драйвера два цифровых выхода. На первом единица, если в линии была1, на другом единица, если в линии был 0. Вне на обоих линиях - это логический 0. Чтобы выделить из посылки данных синхроимпульс, эти даные передаются в интервале половины периода клока. Т. Е. детектированные поочередно в линии 1 и 0 логические единицы, собранные по ИЛИ и есть этот синхроклок. Остается его сдвинуть и принять посылку по линии 1.

Ваши синхроимпульсы очень похожи на протокол arinc -429 (Но выдернутые из середины преобразования посылки данных. От Вас скрыли детектирование нулей в потоке данных))

Вам поставили задачу не корректно. Потому что мало выделить из потока данных синхроимпульс. Нужна пауза в посылке данных, чтобы правильно идентифицировать начало пакета. (У манчестера это синхроимпульс (искаженный манчестер)

В Вашем только частном случае, когда только такие данные и никакие другие не будут принматься, можно восстановить синхроимпульсы (подстраивая внутренние часы по уровню логической 1 в посылке). Но для этого ВЫ должны уже точно ЗНАТЬ частоту приема данных (2.048)

(Не подсчитывать длительность 1 уровня, а операться на точное знание этой длительности)

Чтобы вне уровня логической 1 (где нули) самому нарезать на этой частоте недостающие синхроимпульсы. Естественно будет увеличиваться рассоглаование частот передачи и приема, но это не важно. Ведь Вам все равно надо сдвинуть полученные синхроимпульсы из потока данных.

Вот и сдвиньте их на примерно середину интервала уровня 1 в посылке данных, это перекроет интервал рассогласования за периоды четырех нулей

в ту или иную сторону от середины уровня 1 в посылке. (когда нет возможности подстроить внутренние синхрочасы уровнем 1 в линии)

 

http://www.holtic.com/

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


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

sazh Спасибо Вам за помощь!

 

часть понял, часть нет..

 

В Вашем только частном случае, когда только такие данные и никакие другие не будут принматься, можно восстановить синхроимпульсы (подстраивая внутренние часы по уровню логической 1 в посылке). Но для этого ВЫ должны уже точно ЗНАТЬ частоту приема данных (2.048)

(Не подсчитывать длительность 1 уровня, а операться на точное знание этой длительности)

Чтобы вне уровня логической 1 (где нули) самому нарезать на этой частоте недостающие синхроимпульсы. Естественно будет увеличиваться рассоглаование частот передачи и приема, но это не важно. Ведь Вам все равно надо сдвинуть полученные синхроимпульсы из потока данных.

Вот и сдвиньте их на примерно середину интервала уровня 1 в посылке данных, это перекроет интервал рассогласования за периоды четырех нулей

в ту или иную сторону от середины уровня 1 в посылке. (когда нет возможности подстроить внутренние синхрочасы уровнем 1 в линии)

 

 

Так частота последовательности вроде известна и = 2,048, что не так? А также непонятно что значит подстроить часы по уровню, это как? Множить входную частоту до кратной 2.048?

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

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


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

Так частота последовательности вроде известна и = 2,048, что не так? А также непонятно что значит подстроить часы по уровню, это как? Множить входную частоту до кратной 2.048?

 

Простой счетчик с начальной установкой по входным данным. (Когда 1, счетчик в нуле).

Это делитель. Вашей большой опорной, чтобы получить коэффициент пересчета (xtal_clk / 2.048) == x (целое);

Когда единица в линии - счетчик в нуле. Когда появился ноль счет с коэффициентом пересчета. Старший разряд счетчика искомый недостающий кусок синхросмеси. По ИЛИ с посылкой данных.

Хотя это все бредятина.

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


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

Посмотрел arinc - 429, действительно похоже. только он биполярный, а здесь как-будто вторая полярность просто срезана...

 

Только в формировании синхросигнала это мало чего мне дало :) Сейчас попробую со счетчиком намудрить...

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

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


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

В общем сходу не получилось... какой коэффициент пересчета не ставь, за счет не кратности частот, на выходе счетчика получается либо длительность импульса другая.. . либо скважность не равна 50%...

 

Причем, в принципе, на небольшую разницу в скважности можно было бы наплевать и он бы всеравно четко попадал в бит данных, но только если бы отсутствовало не более 2-импульсов подряд..., а так, никуда это конечно не годиться... чистой воды подгон получается.

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

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


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

В общем сходу не получилось... какой коэффициент пересчета не ставь, за счет не кратности частот, на выходе счетчика получается либо длительность импульса другая.. . либо скважность не равна 50%...

 

Причем, в принципе, на небольшую разницу в скважности можно было бы наплевать и он бы всеравно четко попадал в бит данных, но только если бы отсутствовало не более 2-импульсов подряд..., а так, никуда это конечно не годиться... чистой воды подгон получается.

 

module arinc_bad
(
input	  clk,	 // 2_048_00   // несущая 2_048, делитель на 50 и на 2
input	  in_data,
output reg out_data,
output	 clk_data
);

reg  [1:0] in_data_rg;
reg  [5:0] ct;
reg		div_2;
reg [24:0] shift_clk_data;


assign clk_data = shift_clk_data[24];


always @(posedge clk)
begin
in_data_rg[0] <= in_data;
in_data_rg[1] <= in_data_rg[0];

if (in_data_rg[1])	 ct <= 6'd0;
else if (ct == 6'd49)  ct <= 6'd0;
else				   ct <= ct + 1'b1;

if (in_data_rg[1])	 div_2 <= 1'b0;
else if (ct == 6'd49)  div_2 <= ~div_2;

out_data <= in_data_rg[1];
shift_clk_data <= {shift_clk_data[23:0], (in_data_rg[1] || div_2)};
end

endmodule

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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