Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FEC на ПЛИС
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Языки проектирования на ПЛИС (FPGA)
Страницы: 1, 2, 3, 4
Denisnovel
Я сделал так
Код
osyndrome <=  ieop? osyndrome_comb[n%dec_width]: osyndrome_comb[dec_width];

Где osyndrome_comb[n%dec_width] как раз синдром без учета последних бит.
Но в этом случае критический путь получился очень длинным
des00
Цитата(Denisnovel @ Apr 20 2012, 02:02) *
Но в этом случае критический путь получился очень длинным

ну а как вы хотите по другому? %) за все надо платить. тут либо так, либо искать другие способы задать смещение начала/конца.

ЗЫ. почему бы вам не перенести этот мультиплексор за триггеры. хлопнуть синдромы в регистры, задержать управление на 1 такт ?
Gold777
Цитата(des00 @ Apr 1 2012, 19:07) *
если имелось в виду по 8 бит за 1 такт, то чему удивляться то? ручками распишите получаемую логику на уровне функций и это станет очевидно.

ЗЫ. если вам нужна производительсность бчх 8 бит за 1 такт (что, если брать например сыклон 3, соответствует ~200 мегабайт в секунду), то как вариант поставить 8 декодеров, с одним блоком BM.

Если нужна производительность 8 бит за такт для кода длиной 2040, получается, что блок синдромов получит результат за 255 тактов. Т.е. за один так для первого синдрома вычисляется (alfa^1,alfa^2,alfa^3,..,alfa^8). Как вы предлагаете поставить 8 декодеров как-то не очень понятно? Если поставить 8 блоков подсчета синдромов параллельно, получается в первый блок идет первый бит, во второй блок 2-й бит и т.д, хотя этот второй бит нужен для подсчета в первом блоке. И еще вопрос как поступать, если нужна производительность 64 бита за такт для этого же кода? Думаю, что за 31-32 такта думаю по частоте не войдет.
Denisnovel
Может это поможет на ст 771. Если не секрет, делаете для G.975.1?
Gold777
Цитата(Denisnovel @ Apr 24 2012, 09:16) *
Может это поможет на ст 771. Если не секрет, делаете для G.975.1?

Получается надо обрабатывать по 8 бит или по 16, тогда возможно по частоте войдет. Да, делаю для G.975.
des00
Цитата(Gold777 @ Apr 23 2012, 11:33) *
Как вы предлагаете поставить 8 декодеров как-то не очень понятно? Если поставить 8 блоков подсчета синдромов параллельно, получается в первый блок идет первый бит, во второй блок 2-й бит и т.д, хотя этот второй бит нужен для подсчета в первом блоке. И еще вопрос как поступать, если нужна производительность 64 бита за такт для этого же кода? Думаю, что за 31-32 такта думаю по частоте не войдет.

а если заранее, записать 8 фреймов в память перед декодированием и после декодирования ? wink.gif
Denisnovel
Нужно сохранять синдром и поочереди подавать их в БМ.
Как я понял вы делаетет I.4. Почему выбрали этот алгоритм? Еще более не скромный вопрос: Т8 или Орион?
Gold777
Цитата(Denisnovel @ Apr 24 2012, 14:03) *
Нужно сохранять синдром и поочереди подавать их в БМ.
Как я понял вы делаетет I.4. Почему выбрали этот алгоритм? Еще более не скромный вопрос: Т8 или Орион?

Я делаю I.3. I.4 сделал там вроде все понятно, идет распараллеливание данных на 64 блока т.к каждый бит принадлежит отдельному кодовому слову. Если вы сделали I.3, расскажи как. Еще интересно сколько ваши декодеры заняли ресурсов.
Поймите правильно, но мне бы не хотелось называть организацию в которой работаю.

Цитата(des00 @ Apr 24 2012, 13:43) *
а если заранее, записать 8 фреймов в память перед декодированием и после декодирования ? wink.gif

Собственно так и собрался делать.
des00
Цитата(Gold777 @ Apr 24 2012, 08:53) *
Собственно так и собрался делать.

beer.gif оптимальные решения они всегда в одной области находяться.

ЗЫ. Интересно мнение форумчан, как вы смотрите на то, что бы пополнить тему декодерами : витерби, турбо (на основе БЧХ кодов было бы интересно порыть), LDPC (интересно порыть, т.к. в этой теме ничего не понимаю)? И сопутствующий вопрос, как тестировать вероятностные декодеры без матлаба? сгородить в верилоге модулятор/демодулятор + модель awgn ?
Denisnovel
I.3 я сделал. Какие есть конкретные вопросы. По ресурсам сложно сказать, так как нужно еще оптимизировать кое-что. Чем не устроил I.4?
Serg76
Цитата(des00 @ Apr 24 2012, 19:14) *
турбо (на основе БЧХ кодов было бы интересно порыть)

есть такие практические схемы турбокодов-произведения на основе БЧХ.

Цитата(des00 @ Apr 24 2012, 19:14) *
И сопутствующий вопрос, как тестировать вероятностные декодеры без матлаба? сгородить в верилоге модулятор/демодулятор + модель awgn ?

я использую собственные программные модели (С++) модулятор/демодулятор + модель awgn.
des00
Цитата(Serg76 @ Apr 24 2012, 11:35) *
есть такие практические схемы турбокодов-произведения на основе БЧХ.

как раз от вас я о них и слышал %), не поделитесь ссылками?
Цитата
я использую собственные программные модели (С++) модулятор/демодулятор + модель awgn.

вы же вроде как делаете как раз все для PC платформы, или вы через DPI портируете это в HDL симуляторы и тестируете HDL корки ?
Serg76
Цитата(des00 @ Apr 24 2012, 19:44) *
как раз от вас я о них и слышал %), не поделитесь ссылками?

по-моему здесь http://www.google.com.ua/url?sa=t&rct=...c2g&cad=rja

Цитата(des00 @ Apr 24 2012, 19:44) *
вы же вроде как делаете как раз все для PC платформы, или вы через DPI портируете это в HDL симуляторы и тестируете HDL корки ?

неа, только программное моделирование
Gold777
Цитата(Denisnovel @ Apr 24 2012, 20:31) *
I.3 я сделал. Какие есть конкретные вопросы. По ресурсам сложно сказать, так как нужно еще оптимизировать кое-что. Чем не устроил I.4?

Интересует реализация внутреннего декодера. Судя по документу, который скинули, у вас следующая схема: 8 блоков вычисления синдромов на входе по 8 бит, один блок решателя ключевого уравнения обрабатывающий данные с 8-ми каналов по очереди, 8 блоков Ченя по 8 бит. Записать 8 блоков данных в память перед декодированием и после декодирования (Вот этот момент особенно интересует). Вы так сделали? И еще по ресурсам было бы интересно хотя бы приблизительные результаты оценить. Можно в личку. I.4 устроил, но надо остальные FEC схемы реализовать.
des00
Цитата(Serg76 @ Apr 24 2012, 11:59) *
по-моему здесь

большое спасибо, начну копать %)
Denisnovel
To des00
Хочу сделать, чтобы IBM работал на частоте в два раза меньше. Для этого делаю multicycle как описано у вас в блоге. Причем в проекте несколько разных декодеров. Правильно ли я задал констрейты?
Код
set_multicycle_path -from {*bch_berlekamp:berlekamp|*} -to {*bch_berlekamp:berlekamp|*} -setup -end 2
set_multicycle_path -from {*bch_berlekamp:berlekamp|*} -to {*bch_berlekamp:berlekamp|*} -hold -end 1

Clock Enable для входа в модуле bch_berlekamp генерится следующем образом.
Код
iclkena <= ~iclkena;
des00
Цитата(Denisnovel @ Jun 25 2012, 05:39) *
Хочу сделать, чтобы IBM работал на частоте в два раза меньше. Для этого делаю multicycle как описано у вас в блоге. Причем в проекте несколько разных декодеров. Правильно ли я задал констрейты?
Код
set_multicycle_path -from {*bch_berlekamp:berlekamp|*} -to {*bch_berlekamp:berlekamp|*} -setup -end 2
set_multicycle_path -from {*bch_berlekamp:berlekamp|*} -to {*bch_berlekamp:berlekamp|*} -hold -end 1

Clock Enable для входа в модуле bch_berlekamp генерится следующем образом.
Код
iclkena <= ~iclkena;


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

Если по мультициклам, то их накладывают на цепи между регистрами источниками сигнала и приемниками. Где в вашей команде указано что это относиться к регистрами ? sm.gif)
Denisnovel
В моём кнстрейте описывается, что все регистры в модуле bch_berlekamp:berlekamp работают на частоте в два раза меньше. Т.е. источником и приемником является эти регистры. Или я не прав?
Если я захочу сделать частоту в 2 раза меньше, то в PLL я должен выдать синхроную частоту. Как это описать?
des00
Цитата(Denisnovel @ Jun 25 2012, 22:25) *
В моём кнстрейте описывается, что все регистры в модуле bch_berlekamp:berlekamp работают на частоте в два раза меньше. Т.е. источником и приемником является эти регистры. Или я не прав?

хммм, вообще то регистры описываются через команду get_registers wink.gif

Цитата
Если я захочу сделать частоту в 2 раза меньше, то в PLL я должен выдать синхроную частоту. Как это описать?

хммм, сгененрировать PLL и посмотреть на вейвформы ее работы?
Denisnovel
А если написать так, то между регистрами модуля БМ будет увеличенный период?
Код
set_multicycle_path -from [get_registers{*bch_berlekamp:berlekamp|*}] -to  [get_registers{*bch_berlekamp:berlekamp|*}] -setup -end 2
set_multicycle_path -from  [get_registers{*bch_berlekamp:berlekamp|*}] -to  [get_registers{*bch_berlekamp:berlekamp|*}] -hold -end 1

С PLL не поял? Допустим, я сделал синхронную частоту в два раза меньше, подал её на модуль БМ, как синхронизировать данные между этими clock domain? sad.gif
des00
Цитата(Denisnovel @ Jun 26 2012, 04:15) *
А если написать так, то между регистрами модуля БМ будет увеличенный период?

смотрите что говорит TQ, если он скажет что будет, значит будет. %)
Цитата
С PLL не поял? Допустим, я сделал синхронную частоту в два раза меньше, подал её на модуль БМ, как синхронизировать данные между этими clock domain? sad.gif

а если сделаете пусть и на одной частоте но с clkena синхронизировать не потребуется ? sm.gif Повторю еще раз, прочитайте что такое PLL и ее свойства. Сгенерируйте в мегавизарде PLL и посмотрите на вейвформы выходных сигналов. Тогда сразу все поймете %)
Denisnovel
По PLL я имею ввиду, что одна ПЛЛ генерирует быстрый и медленный клок, то есть они синхронные, как на картинке выше . Ну да оставим PLL.
У меня работает первый вариант задания контстрейтов rolleyes.gif , TQ распознает их как мультисайкл. Самый критичный путь в этом случае от clken до регистров модуля БМ.
Еще вопрос. Правильно ли я понимаю, что БЧХ может детектировать ошибки больше t, но меньше 2t, и определять их количество?
Gold777
Цитата(Denisnovel @ Jun 28 2012, 23:36) *
Еще вопрос. Правильно ли я понимаю, что БЧХ может детектировать ошибки больше t, но меньше 2t, и определять их количество?

БЧХ может детектировать 2t ошибок
SKov
Цитата(Denisnovel @ Jun 28 2012, 23:36) *
Еще вопрос. Правильно ли я понимаю, что БЧХ может детектировать ошибки больше t, но меньше 2t, и определять их количество?

Количество не может. Только сам факт наличия где-то ошибок кратности от 1 до d-1.
des00
Цитата(Denisnovel @ Jun 28 2012, 14:36) *
У меня работает первый вариант задания контстрейтов rolleyes.gif , TQ распознает их как мультисайкл.

значит TQ вас понял %)

Цитата(SKov @ Jun 29 2012, 08:35) *
Количество не может. Только сам факт наличия где-то ошибок кратности от 1 до d-1.

Вот интересно, как я понял из учебников по кодированию, сам код БЧХ позволяет обнаружить большее кол-во ошибок, но не все из них. Ограничение d-1 связанно с использованием стандартных методов декодирования, через решение системы уравнений. Интересно чисто теоретически, есть ли методы позволяющие преодолеть эту границу? (ну кроме полного перебора или синдромного декодирования что почти тоже самое).
SKov
Цитата(des00 @ Jun 29 2012, 17:55) *
Вот интересно, как я понял из учебников по кодированию, сам код БЧХ позволяет обнаружить большее кол-во ошибок, но не все из них. Ограничение d-1 связанно с использованием стандартных методов декодирования, через решение системы уравнений. Интересно чисто теоретически, есть ли методы позволяющие преодолеть эту границу? (ну кроме полного перебора или синдромного декодирования что почти тоже самое).


То, что я написал, не имеет отношение к БЧХ и справедливо для любого кода.
Вообще, способность кода к обнаружению ошибок не имеет отношения к методу декодирования - это свойство кода, а не декодера.
В принципе, код может обнаружить любую ошибку, не совпадающую с кодовым словом.
Понятно, что некоторые ошибки веса d в принципе не могут быть обнаружены, если совпадают с кодовым словом.
Если поделить количество кодовых слов веса d на общее количество векторов веса d, то легко посчитать,
с какой вероятностью можно НЕ обнаружить ошибку веса d.
Количество кодовых слов мин. веса для большинства коротких БЧХ известно точно.
Для длинных кодов БЧХ известно, что их весовой спектр приближается к биномиальному распределению с ростом длины.
Иногда можно пользоваться грубой оценкой необнаружения ошибки в виде 1/(2^r).
Gold777
Возник следующий вопрос. К примеру исправляющая способность кода 8 ошибок. На передающей стороне мы внесли 10 ошибок. Соответственно декодер может обнаружить 16 ошибок. Можем ли мы на этапе декодирования каким-либо образом сказать сколько конкретно ошибок у нас возникло или мы можем только гарантированно сказать что их больше восьми?
SKov
Цитата(Gold777 @ Jun 29 2012, 21:51) *
Возник следующий вопрос. К примеру исправляющая способность кода 8 ошибок. На передающей стороне мы внесли 10 ошибок. Соответственно декодер может обнаружить 16 ошибок. Можем ли мы на этапе декодирования каким-либо образом сказать сколько конкретно ошибок у нас возникло или мы можем только гарантированно сказать что их больше восьми?

Гарантированно мы не можем сказать ничего.
Есть след. варианты.
1) На расстоянии D (D<9) от принятого вектора есть кодовое слово. Тогда произошло либо D ошибок либо, как минимум, d-D.
2) Ближайший кодовый вектор находится на расстоянии D (D>8). Тогда произошло не менее D ошибок.
Это все, что можно сказать.
В вашем конкретном случае 10 ошибок могли лечь как кодовое слово, тогда вы увидете кодовое слово на расстоянии 6 от принятого вектора.
Это значит, что ошибок было либо 6, либо как минимум 16-6.
des00
Цитата(SKov @ Jun 29 2012, 09:34) *
То, что я написал, не имеет отношение к БЧХ и справедливо для любого кода.

Спасибо за развернутый ответ, то что вы пишите понятно и сомнению не подлежит. Мой же вопрос заключался в существовании алгоритма декодирования БЧХ кодов, который обладает возможностью исправлять часть ошибок больше D (ведь по теории можно).

Т.е. ИМХО классический БЧХ декодер обладает фиксированными, не вероятностными характеристиками (в не в том смысле что вероятность ошибки к нему не применима, а в том смысле что от прогона к прогону на случайном потоке он будет давать одинаковый результат), существует ли метод декодирования (итеративный алгоритм чейза не рассматриваем) позволяющий выйти за эти границы БЧХ ?

ЗЫ. могу путать термины теории кодирования, прошу строго не судить %)
SKov
Цитата(des00 @ Jun 30 2012, 09:43) *
Спасибо за развернутый ответ, то что вы пишите понятно и сомнению не подлежит. Мой же вопрос заключался в существовании алгоритма декодирования БЧХ кодов, который обладает возможностью исправлять часть ошибок больше D (ведь по теории можно).

Т.е. ИМХО классический БЧХ декодер обладает фиксированными, не вероятностными характеристиками (в не в том смысле что вероятность ошибки к нему не применима, а в том смысле что от прогона к прогону на случайном потоке он будет давать одинаковый результат), существует ли метод декодирования (итеративный алгоритм чейза не рассматриваем) позволяющий выйти за эти границы БЧХ ?

ЗЫ. могу путать термины теории кодирования, прошу строго не судить %)

Вы уже как-то задавали этот вопрос. Я помню, что были работы, позволяющие исправлять на одну ошибку больше,
чем гарантирует граница БЧХ. Вроде, иногда можно исправить +2 ошибки. Больше я не видел.
des00
Цитата(SKov @ Jun 30 2012, 01:07) *
Вы уже как-то задавали этот вопрос. Я помню, что были работы, позволяющие исправлять на одну ошибку больше,
чем гарантирует граница БЧХ. Вроде, иногда можно исправить +2 ошибки. Больше я не видел.

Хммм вроде вопрос касался расширенных кодов БЧХ с добавлением бита четности. Но скорее всего запамятовал %) Спасибо.
Koluchiy
To des00

Денис, не появилось ли нового релиза с расчетом генераторного полинома БЧХ? blush.gif
des00
Цитата(Koluchiy @ Jul 2 2012, 03:32) *
To des00

Денис, не появилось ли нового релиза с расчетом генераторного полинома БЧХ? blush.gif

к сожалению нет, стоит появиться свободному времени как его тут же занимают новым проектом, со сроком готовности вчера или отправляют в командировку %( поэтому в FEC овских делах стою на месте
Denisnovel
Почему размерность порта количества ошибок m?
Код
logic [m-1 : 0] obiterr

Может лучше привязать его к количесту исправляемых ошибок
Код
logic [$clog2(t)-1:0]  obiterr
des00
Цитата(Denisnovel @ Jul 4 2012, 07:04) *
Почему размерность порта количества ошибок m?
Код
logic [m-1 : 0] obiterr

Может лучше привязать его к количесту исправляемых ошибок
Код
logic [$clog2(t)-1:0]  obiterr

ваша правда, можно но смысл ? при вариации типов декодеров постоянно отслеживать разрядность этого порта? Экономия копейки, требуется введение нового типа, да и кому нужно переписать не сложно %)
nkie
Возможно мой вопрос покажется глупым, но я пытаюсь разобраться в SystemVerilog и тестбенчах. Пример из обсуждаемого здесь проекта:
Код
  rs_enc
  #(
    .n        ( n             ) ,
    .check    ( check         ) ,
    .m        ( m             ) ,
    .irrpol   ( irrpol        ) ,
    .genstart ( used_genstart )
  )
  uut_enc
  (
    .iclk    ( iclk      ) ,
    .iclkena ( iclkena   ) ,
    .ireset  ( ireset    ) ,
    //
    .isop    ( isop      ) ,
    .ieop    ( ieop      ) ,
    .ieof    ( ieof      ) ,
    .ival    ( ival      ) ,
    .idat    ( idat      ) ,
    //
    .osop    ( enc__osop ) ,
    .oval    ( enc__oval ) ,
    .oeop    ( enc__oeop ) ,
    .odat    ( enc__odat )
  );

Взято из файла тест бенча rs_eras_enc_dec_tb.v
Что означает
Код
rs_enc
  #(
    .n        ( n             ) ,
    .check    ( check         ) ,
    .m        ( m             ) ,
    .irrpol   ( irrpol        ) ,
    .genstart ( used_genstart )
  )

Понятно что uut_enc - наследник или копия модуля rs_enc, но за что отвечает здесь #(...)?

Цитата(nkie @ Oct 3 2012, 13:22) *
... но за что отвечает здесь #(...)?

все разобрался, передача параметров...
Костян
Как оптимизировать рассчет GPOLY ?
Синтезатор (использую synplify) на следующий код делает на 12 страниц RTL, содержащий ПЗУ и логику, тогда как на выходе всего лишь массив констант GPOLY
CODE
`include "rsParam.vh"
`include "gfFunctions.vh"

module testEnc (


    output gpoly_t  dataOut    //%Данные выход кодера
    );

    
//-----------------------------------------------------------
//% формирование таблиц
//-----------------------------------------------------------
gpoly_t GPOLY;

rom_t     ALPHA_TO;
rom_t     INDEX_OF;


    always_comb
    begin
    
        ALPHA_TO  = generate_gf_alpha_to_power(irrpol);
        INDEX_OF  = generate_gf_index_of_alpha(ALPHA_TO);

        GPOLY     = generate_pol_coeficients (genstart, rootspace, check, generate_gf_index_of_alpha(generate_gf_alpha_to_power(irrpol)),  generate_gf_alpha_to_power(irrpol));
        dataOut = GPOLY;
    end

endmodule


Костян
собрал в квартусе. на выходе константа blink.gif
проблема видимо в synplify
des00
Цитата(Костян @ Oct 19 2012, 04:30) *
собрал в квартусе. на выходе константа blink.gif
проблема видимо в synplify

Извините что не ответил сразу, да проблема именно в симплифае. По непонятным причинам он не может рассчитать генераторный полином по этой функции. Причем в режиме VHDL все ок, а вот в Verilog ну никак. Поэтому когда потребовалось запустить декодер под хилых, из моделсима прочитал полином и задал руками %)

ЗЫ. под режимом VHDL/Verilog понимается то что эта функция есть на обоих языках.

ЗЗЫ. Небольшой анонс : на подходе БЧХ со стираниями, декодер витерби, как обычно все под лицензией free for use sm.gif
Костян
QUOTE (des00 @ Oct 19 2012, 10:09) *
Извините что не ответил сразу, да проблема именно в симплифае. По непонятным причинам он не может рассчитать генераторный полином по этой функции. Причем в режиме VHDL все ок, а вот в Verilog ну никак. Поэтому когда потребовалось запустить декодер под хилых, из моделсима прочитал полином и задал руками %)

спасибо, так и делал изначально: lol.gif
CODE
    always_comb
    begin
    
        // ALPHA_TO  = generate_gf_alpha_to_power(irrpol);
        // INDEX_OF  = generate_gf_index_of_alpha(ALPHA_TO);

        // GPOLY     = generate_pol_coeficients (genstart, rootspace, check, generate_gf_index_of_alpha(generate_gf_alpha_to_power(irrpol)),  generate_gf_alpha_to_power(irrpol));        
                            //$display ("GPOLY=%p",GPOLY);
        GPOLY = {1, 12'd1023, 12'd3523, 12'd1566, 12'd4068, 12'd3078, 12'd2862, 12'd2296, 12'd4030, 12'd3332, 12'd2733};

        
    end

Причем ALPHA_TO и INDEX_OF рассчитывается без проблем. С помощью атрибутов пытаюсь заставить работать и расчет GPOLY.
была идея, указал даже явно ROM STYLE как logic , все равно синтезатор наделал ПЗУ-шек. Мне не жалко лишней логике, но в моем случае при m=12 синфлифай жрет всю доступную память ПК и вылетает с ошибкой.


Есть еще вопрос, то ли пятница, то ли еще что, не могу разобраться, как Вы раскрыли скобки при вычислении GPOLY = (X+a)(X+a^2)(X+a^3) и т.д. в функции generate_pol_coeficients. Поясните, пожалуйста, на пальцах smile3046.gif


P.S тогда как RTL в synplify загружен логикой и ПЗУ, technology view имеет константу. весьма любопытно sm.gif. это как он аккуратно по коду идет , боится оптимизировать лишнее.
P.S. нашел причинную функцию. synplify стесняется оптимизировать ПЗУ в функции gf_mul
des00
Цитата(Костян @ Oct 19 2012, 06:55) *
Есть еще вопрос, то ли пятница, то ли еще что, не могу разобраться, как Вы раскрыли скобки при вычислении GPOLY = (X+a)(X+a^2)(X+a^3) и т.д. в функции generate_pol_coeficients. Поясните, пожалуйста, на пальцах smile3046.gif

там непосредственное перемножение полиномов.

Шаг 1. берем x+a
Шаг 2. умножаем на (x+a^2). получаем x^2 + x(a + a^2) + (a*a^2).
Шаг 3. умножаем на (x+a^3). получаем x^3 + x^2(a + a^2 + a^3) + x(a*a^2 + a^3*(a+a^2)) + (a*a^2*a^3).
и т.д.

Т.е. gf_mul в этой функции это учет раскрытия скобок с умножением на следующий корень, а gf_add это накопление значения при коэффициенте.

Цитата
P.S. нашел причинную функцию. synplify стесняется оптимизировать ПЗУ в функции gf_mul

можно переделать идеальный gf_mul на синтезируемый gf_mult_a_by_b, может тогда ему станет лучше. но мне было лень это делать %)
des00
Цитата(Koluchiy @ Jul 2 2012, 03:32) *
Денис, не появилось ли нового релиза с расчетом генераторного полинома БЧХ? blush.gif

1. Реализована функция расчета генераторного полинома БЧХ. В качестве прототипа использовалась функция из матлаба.

Сравнил с полиномами из таблицы один в один. В симуляторе все прекрасно работает. Но при синтезе ква 9.1 долго думает когда ищет циклотомические классы. Но тем не менее полином в ква 9.1 считается и ресурс энкодера после синтеза такой же что и при использовании таблиц. Из особенностей : т.к. кол-во классов и членов классов априори не известно, а ква не может использовать массивы больше чем 2^28 бит, настройка размерностей массивов в функции генерации полиномов задается в ручную через макросы (файл bch_define.v).

Цитата(Костян @ Oct 19 2012, 04:30) *
проблема видимо в synplify

2. Заменил функции gf_add/gf_mul в генерации полинома РС на синтезируемые xor/gf_mult_a_by_b. Тест показал что все работает, ква тоже съел и не подавился. Сделал для проверки синтезируемости на сторонних синтезаторах (в частности Symplify)
Костян
QUOTE (des00 @ Oct 30 2012, 05:21) *
2. Заменил функции gf_add/gf_mul в генерации полинома РС на синтезируемые xor/gf_mult_a_by_b. Тест показал что все работает, ква тоже съел и не подавился. Сделал для проверки синтезируемости на сторонних синтезаторах (в частности Symplify)

стесняюсь спросить, а какая разрядность Вашего Symplify ? 32 или 64 ? У меня лицензия только под 32 позволяет работать. Менял я уже gf_mult на gf_mult_a_by_b. Это для 32 бит ничего не давало. Видимо в разрядности синтезатора собака зарыта.
des00
Цитата(Костян @ Oct 30 2012, 03:35) *
стесняюсь спросить, а какая разрядность Вашего Symplify ? 32 или 64 ? У меня лицензия только под 32 позволяет работать. Менял я уже gf_mult на gf_mult_a_by_b. Это для 32 бит ничего не давало. Видимо в разрядности синтезатора собака зарыта.

да у меня пока никакого нету, ставить надо %)
Gold777
При декодировании кода Рида-Соломона (к примеру RS(255,239)) заметил такую особенность: когда ошибок в сигнале нет первый синдром практически всегда получается ненулевым, остальные S2..S16 равны нулю. Решатель ключевого уравнения показывает что кол-во ошибок равно нулю и собственно ничего не исправляется. Все таки непонятно почему первый синдром ненулевой?Ведь по теории такого быть не должно (если ошибок нет значит все синдромы должны быть равны нулю!!!). Интересно, что при внесении ошибок неправильного исправления не наблюдал. У БЧХ такой закономерности не встречал.
des00
Цитата(Gold777 @ Oct 30 2012, 11:59) *
При декодировании кода Рида-Соломона (к примеру RS(255,239)) заметил такую особенность:

ищите ошибку, вот результат прогона 10 блоков такого кода без ошибок
Код
# tb.uut_dec.genblk1.rs_berlekamp.genblk1.rs_berlekamp get syndromes :    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
# tb.uut_dec.genblk1.rs_berlekamp.genblk1.rs_berlekamp get syndromes :    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
# tb.uut_dec.genblk1.rs_berlekamp.genblk1.rs_berlekamp get syndromes :    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
# tb.uut_dec.genblk1.rs_berlekamp.genblk1.rs_berlekamp get syndromes :    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
# tb.uut_dec.genblk1.rs_berlekamp.genblk1.rs_berlekamp get syndromes :    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
# tb.uut_dec.genblk1.rs_berlekamp.genblk1.rs_berlekamp get syndromes :    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
# tb.uut_dec.genblk1.rs_berlekamp.genblk1.rs_berlekamp get syndromes :    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
# tb.uut_dec.genblk1.rs_berlekamp.genblk1.rs_berlekamp get syndromes :    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
# tb.uut_dec.genblk1.rs_berlekamp.genblk1.rs_berlekamp get syndromes :    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
# tb.uut_dec.genblk1.rs_berlekamp.genblk1.rs_berlekamp get syndromes :    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
# test done. block num = 10 :: errors == 0, warnings = 0 occured
Gold777
Спасибо, буду искать ошибку. Странно, что у БЧХ такого не наблюдалось.
Gold777
Цитата(Gold777 @ Oct 30 2012, 20:59) *
При декодировании кода Рида-Соломона (к примеру RS(255,239)) заметил такую особенность: когда ошибок в сигнале нет первый синдром практически всегда получается ненулевым, остальные S2..S16 равны нулю. Решатель ключевого уравнения показывает что кол-во ошибок равно нулю и собственно ничего не исправляется. Все таки непонятно почему первый синдром ненулевой?Ведь по теории такого быть не должно (если ошибок нет значит все синдромы должны быть равны нулю!!!). Интересно, что при внесении ошибок неправильного исправления не наблюдал. У БЧХ такой закономерности не встречал.

Более подробно опишу ранее описанную проблему. При расчете синдромов первый синдром вычисляю подставляя alfa^1 т.е. S1(alfa^1 ), S2(alfa^2), S16(alfa^16) или надо первый синдром считать подставляя alfa^0 т.е. S1(alfa^0)...S16(alfa^15)? Если расчет по второму варианту делать, то если нет ошибок все синдромы равны нулю (Позиции ошибок считаются правильно, а величины). По первому варианту S16(alfa^16) получается ненулевым (при этом позиции ошибок и величины считаются верно). Вот не могу понять, где у меня ошибка и какой вариант при расчете правильный? И еще вопрос все ли 16 синдромов всегда используются при декодировании или можно не все их вычислять(по идее существует 2^128 различных вариантов комбинаций синдромов, а возможных комбинаций ошибок и величин будет меньше)?
des00
Цитата(Gold777 @ Nov 1 2012, 12:12) *
Вот не могу понять, где у меня ошибка и какой вариант при расчете правильный?

Все зависит от того, как именно у вас рассчитан генераторный полином. Если вы брали корни полинома как a^[0:check] то и синдромы нужно считать для корней со степенями [0:check], если a^[1:check+1] то соответственно будет сдвиг.

Цитата
И еще вопрос все ли 16 синдромов всегда используются при декодировании или можно не все их вычислять(по идее существует 2^128 различных вариантов комбинаций синдромов, а возможных комбинаций ошибок и величин будет меньше)?

ИМХО нужно вычислять все, могу ошибаться. Думаю что гуру поправят %)
SKov
Цитата(des00 @ Nov 2 2012, 12:43) *
ИМХО нужно вычислять все, могу ошибаться. Думаю что гуру поправят %)

Если у вас 2^128 разных синдромов, то ровно столько различных
ошибок может исправлять код. Там могут быть и ошибки веса много больше Dмин/2.
Исправить все можно, например, полным перебором кодовых слов (если много свободного времени wink.gif)
Чем больше Dмин, тем дальше код от плотной упаковки и тем больше тяжелых ошибок (больше Dмин/2)
он в принципе может исправлять.
Вообще, не обязательно исправлять совсем все ошибки для хорошего декодера.
Есть , например, такой результат: достаточно исправлять все ошибки,
которые может исправить код, до веса Dвг,тогда вероятность ошибки декодирования не более чем вдвое
превосходит вероятность ошибки при декодировании полным перебором.
Здесь Dвг означает мин. расст. для данного кода, которое получается
из границы Варшамова-Гильберта для данных кодовых параметров.
Другое дело, что ваш конкретный алгоритм исправляет только часть этих ошибок.
Наример, он не исправляет ошибки веса больще Dмин/2.
Но если вы не будете в алгоритме испрользовать часть синдрома,
то часть исправимых алгоритмом ошибок еще больше уменьшится,
т.е. вы не сможете исправлять даже некоторые ошибки веса меньше Dмин/2.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.