Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Что это за интерфейс?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Интерфейсы
mSimple
Всем доброго времени суток. Подскажите кто знает.. Необходимо реализовать некий (неизвестный мне) интерфейс передачи данных,
а выглядит он следующим образом:

С внешнего устройства поступают:
- входная последовательность (кодируемая фронтом, т.е. лог 1 = один перепад, лог 0 = нет перепада)
- опорная частота (в 100 и более раз больше частоты переключения последовательности)

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

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

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

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

Заранее спасибо.. rolleyes.gif
XVR
Цитата(mSimple @ Jan 29 2009, 22:39) *
Необходимо реализовать некий (неизвестный мне) интерфейс передачи данных,
а выглядит он следующим образом:

С внешнего устройства поступают:
- входная последовательность (кодируемая фронтом, т.е. лог 1 = один перепад, лог 0 = нет перепада)
Похоже на Манчестер

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

Цитата
На выходе необходимо получить эту же последовательность, но сопровождаемую
собственными синхроимпульсами (т.е. частотой переключения этой последовательности)
ФАПЧ вам поможет
MrYuran
Цитата(XVR @ Jan 30 2009, 11:22) *
Похоже на Манчестер

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

Цитата(XVR @ Jan 30 2009, 11:22) *
ФАПЧ вам поможет

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


Цитата(mSimple @ Jan 29 2009, 22:39) *
лог 1 = один перепад, лог 0 = нет перепада
ВОПРОС: На что похож данный интерфейс? И как решаются такие задачи?

Вообще похоже на кодирование данных на магнитном носителе. Посмотрите схемы дисководов.
sazh
Цитата(mSimple @ Jan 29 2009, 22:39) *
Всем доброго времени суток. Подскажите кто знает.. Необходимо реализовать некий (неизвестный мне) интерфейс передачи данных,
а выглядит он следующим образом:

С внешнего устройства поступают:
- входная последовательность (кодируемая фронтом, т.е. лог 1 = один перепад, лог 0 = нет перепада)
- опорная частота (в 100 и более раз больше частоты переключения последовательности)

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

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


Это похоже на ARINC 429. Посмотрите драйвер HI-8588. На выходе у него две логические линии. Одна последовательность (уровень логической единицы в половину периода несущей частоты)- это наличие в линии 1.
Другая последовательность - наличие в линии 0. Тогда и количество синхроимпульсов (количество битов в посылке) - это просто функция ИЛИ этих двух входных последовательностей. У Вас нарисован уже сформированный синхроимпульс, сдвинутый относительно посылке всех единиц (для приема на сдвигающий регистр)
Частоты там фиксированные. 12.5 кГц, 50, 100.
(Без линии, где нули выделяются, синхроимпульс только по выделенным единицам не получить )
mSimple
Цитата(XVR @ Jan 30 2009, 11:22) *
Похоже на Манчестер

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

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


Спасибо всем за ответы.
Некоторые уточнения:

Синхропоследовательности вначале нет (или о ней ничего не известно). Последовательность входная одна - это
меандр с отсутствующими единицами от 1 до 4-х подряд.
Частота переключения последовательности 2,048, опорная в 50-100 раз выше (может быть разной).

А ФАПЧ вы имеете ввиду PLL ПЛИС или внешний?
sazh
Цитата(mSimple @ Jan 30 2009, 13:28) *
Спасибо всем за ответы.
Некоторые уточнения:

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


Входные данные - не меандр. Длительность бита входных данных - половина периода несущей частоты. Иначе Вам не выделить синхроимпульсы из посылки.
Может там специализированные приемо - передатчики стоят?
mSimple
Цитата(sazh @ Jan 30 2009, 14:11) *
Входные данные - не меандр. Длительность бита входных данных - половина периода несущей частоты. Иначе Вам не выделить синхроимпульсы из посылки.
Может там специализированные приемо - передатчики стоят?


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

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

Пока пробую тупо подсчитать длительность бита посылки и сдвинуть ее 8 раз (с учетом нулей), а потом сложить по ИЛИ, пока не получилось.
sazh
Цитата(mSimple @ Jan 30 2009, 16:29) *
я не знаю, что это за информация, может это и не информация вовсе.. а какой-то побитый CLK.. про передатчики ничего не известно... , есть просто такая задача. laughing.gif
Сказано, что входная последовательность представляет собой меандр, с некоторыми отсутствующими импульсами.

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

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


Я про ИЛИ сказал, имея ввиду протокол arinc. Обычно протокол обмена прозрачен и понятен. И затраты поэтому на его реализацию незначительны.
Я бы не стал думать о схемной реализации, не выяснив протокола обмена данными в Вашем случае. Ведь от этого зависит надежность передачи, приема данных.
mSimple
Цитата(sazh @ Jan 30 2009, 17:57) *
Я про ИЛИ сказал, имея ввиду протокол arinc. Обычно протокол обмена прозрачен и понятен. И затраты поэтому на его реализацию незначительны.
Я бы не стал думать о схемной реализации, не выяснив протокола обмена данными в Вашем случае. Ведь от этого зависит надежность передачи, приема данных.


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

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

PS: Фокус с подсчетом длительности положительного уровня последовательности не прошел, т.к. частота опорная не кратна частоте переключения последовательности.. в общем стыдно мне, стыдно! unsure.gif
sazh
Цитата(mSimple @ Jan 30 2009, 20:07) *
Открою маленький секрет. Эту задачу мне выдали на одном из собеседований при приеме на работу... rolleyes.gif

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

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


Похож он на битовую посылку данных, в которой закодированы синхроимпульсы сопровождения. (Ваша повышенная опорная частота это принадлежность приемника. ЕЕ нет надобности тащить.) И про джиттер тоже забудьте. Самим протоколом приема передачи данных это решается.
Чтобы выделить из посылки принимаемых данных синхроимпульсы - идут на ухищрения. Ведь требуется подстройка внутренних синхрочасов (Ваша опорная), чтобы данные не потерять. Подстроиться можно только по перепаду фронта в посылке данных. У манчестера этот перепад в середине бита,
или из 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/
mSimple
sazh Спасибо Вам за помощь!

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

Цитата(sazh @ Jan 30 2009, 21:10) *
В Вашем только частном случае, когда только такие данные и никакие другие не будут принматься, можно восстановить синхроимпульсы (подстраивая внутренние часы по уровню логической 1 в посылке). Но для этого ВЫ должны уже точно ЗНАТЬ частоту приема данных (2.048)
(Не подсчитывать длительность 1 уровня, а операться на точное знание этой длительности)
Чтобы вне уровня логической 1 (где нули) самому нарезать на этой частоте недостающие синхроимпульсы. Естественно будет увеличиваться рассоглаование частот передачи и приема, но это не важно. Ведь Вам все равно надо сдвинуть полученные синхроимпульсы из потока данных.
Вот и сдвиньте их на примерно середину интервала уровня 1 в посылке данных, это перекроет интервал рассогласования за периоды четырех нулей
в ту или иную сторону от середины уровня 1 в посылке. (когда нет возможности подстроить внутренние синхрочасы уровнем 1 в линии)



Так частота последовательности вроде известна и = 2,048, что не так? А также непонятно что значит подстроить часы по уровню, это как? Множить входную частоту до кратной 2.048?
sazh
Цитата(mSimple @ Jan 30 2009, 22:49) *
Так частота последовательности вроде известна и = 2,048, что не так? А также непонятно что значит подстроить часы по уровню, это как? Множить входную частоту до кратной 2.048?


Простой счетчик с начальной установкой по входным данным. (Когда 1, счетчик в нуле).
Это делитель. Вашей большой опорной, чтобы получить коэффициент пересчета (xtal_clk / 2.048) == x (целое);
Когда единица в линии - счетчик в нуле. Когда появился ноль счет с коэффициентом пересчета. Старший разряд счетчика искомый недостающий кусок синхросмеси. По ИЛИ с посылкой данных.
Хотя это все бредятина.
mSimple
Посмотрел arinc - 429, действительно похоже. только он биполярный, а здесь как-будто вторая полярность просто срезана...

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

Причем, в принципе, на небольшую разницу в скважности можно было бы наплевать и он бы всеравно четко попадал в бит данных, но только если бы отсутствовало не более 2-импульсов подряд..., а так, никуда это конечно не годиться... чистой воды подгон получается.
sazh
Цитата(mSimple @ Jan 31 2009, 00:30) *
В общем сходу не получилось... какой коэффициент пересчета не ставь, за счет не кратности частот, на выходе счетчика получается либо длительность импульса другая.. . либо скважность не равна 50%...

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


CODE
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
Tran
Уважаемый sazh предложил, в принципе правильное, но, на мой взгляд, несколько избыточное решение.
"Заказчег" хотел увидеть примерно следующее (немного изменю код ув. sazh ):

CODE
module tst_InClk(
input clk, // 100 MHz
input in_data, // а-ля 2.048 M

output out_data,
output reg out_clk
);

reg [3:0] inD;
reg [5:0] cnt;


assign out_data = inD[3];


always @(posedge clk)
begin

inD[3:0] <= {inD[2:0], in_data}; // типа защита от матастабильности

if(inD[3:2] == 2'b01) cnt <= 6'd0;
else cnt <= (cnt < 6'd48) ? cnt + 6'd1 : 6'd0;

out_clk <= (cnt > 6'd12)&&(cnt < 6'd37);

end

endmodule


В некотором приближении, подобный модуль можно пользовать,
как составную часть ФАПЧа потока Е1.
Собственно это и пытались изложить в описании "задачи".


P.S. Если вдруг, у уважаемого sazh, возникнет желание сменить постоянную работу,
то мы с удовольствием попробуем предложить варианты, т.к. "собеседование" Вы,
можно сказать, прошли :-)

P.P.S. Уважаемый mSimple, мне кажется, что Вам не стоит пока ориентироваться
на предлагаемую работу.

P.P.P.S. Ну а мне, скорее всего, придётся сочинять очередное условие "задачи" :-(
rezident
Сообщение модератора.
1. Излишнее цитирование (необоснованное включение в цитату всего сообщения, тем более когда сообщение короче цитаты) запрещено п.3.4 Правил форума.
2. Исходники следует обрамлять тегами code (кнопка в редакторе), а объемные исходники тегами codebox (спец.кнопочки нет, но дополнить тег code всего тремя символами box совсем ведь не сложно, не так ли?). Мне пока не трудно корректирвать сообщения, обрамляя исходники в теги, но когда-то это может и надоесть wink.gif
С уважением, rezident.
mSimple
Цитата(Tran @ Jan 31 2009, 03:00) *
P.P.S. Уважаемый mSimple, мне кажется, что Вам не стоит пока ориентироваться
на предлагаемую работу.

P.P.P.S. Ну а мне, скорее всего, придётся сочинять очередное условие "задачи" :-(


Уважаемый Tran, в первую очередь я хотел бы Вас поблагодарить за данную мне задачу, поскольку это дало мне оценить собственные силы. На форум я обратился за советом и ни в коем случае не за готовым ответом. Он для того и создан, что бы делиться опытом и помогать друг-другу, и я не вижу в этом ничего зазорного.

Я готов УЧИТЬСЯ и не претендую на звание профессионала!
И если Вам требуются сотрудники разного уровня, я с удовольствием рассмотрел бы другое условие задачи. Можно в личку, можно по почте lexx2@lianet.ru


PS: премного благодарен sazh за оказанную мне помощь.
sazh
Цитата(mSimple @ Jan 31 2009, 15:07) *
На форум я обратился за советом и ни в коем случае не за готовым ответом. Он для того и создан, что бы делиться опытом и помогать друг-другу, и я не вижу в этом ничего зазорного.

Я готов УЧИТЬСЯ


Так оно и было. Меня заинтересовала Ваша диаграмма. В процессе общения каждый из нас приобрел что то новое.
А желание учиться - это та изюминка, с которой Вас возьмут в любой коллектив с распростертыми объятиями.
(Надо же кому то работать). А опыт - дело наживное.
С Уважением, Сергей.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.