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

Умножение в поле Галуа

Уважаемый Михалыч, посмотрите пожалуйста свой алгоритм. У меня вызывает сомнения строчка

 

assign C[4] = d[4] ^ e[0] ^ e[1] ^ e[2];

 

В моем случае туда получается следует добавить еще и e(6)

 

c(4)= d(4) XOR e(0) XOR e(1) XOR e(2) XOR e(6) ;

 

У нас с вами расхождение в матрице Q, в частности в последней строке

Мой вариант 1 1 0 0 1 0 0 0

Ваш вариант 1 1 0 0 0 0 0 0

У меня на 1 единицу в этой матрице больше.

 

Доделаю HDL код, проверю в Модельсиме результаты, посмотрим, сравню со своим полем. Но пока вроде у себя ошибок не вижу.

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


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

Уважаемый Михалыч, посмотрите пожалуйста свой алгоритм. У меня вызывает сомнения строчка ...

 

Вы правы - там нехватает единицы. Я же приводил схему "по первым прикидкам" ;)

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

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


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

Однако, ваша версия была верной, моя косячной. Покрутил в модельсиме, без e(6) все работает как надо. Но не могу понять почему у меня ошибка в формировании матрицы Q?

Все вроде делаю по рисунку 6. В ручную формирую матрицу А, матрица B,C,D формируются соответственно сдвигом на 3,4,5 позиций вправо. Затем суммируются по модулю 2.

>> disp(A)
     1     0     0     0     0     0     0     0
     0     1     0     0     0     0     0     0
     0     0     1     0     0     0     0     0
     0     0     0     1     0     0     0     0
     1     0     0     0     1     0     0     0
     1     1     0     0     0     1     0     0
     1     1     1     0     0     0     1     0

>> disp(B)
     0     0     1     0     0     0     0     0
     0     0     0     1     0     0     0     0
     0     0     0     0     1     0     0     0
     0     0     0     0     0     1     0     0
     0     0     1     0     0     0     1     0
     0     0     1     1     0     0     0     1
     0     0     1     1     1     0     0     0

>> disp(C)
     0     0     0     1     0     0     0     0
     0     0     0     0     1     0     0     0
     0     0     0     0     0     1     0     0
     0     0     0     0     0     0     1     0
     0     0     0     1     0     0     0     1
     0     0     0     1     1     0     0     0
     0     0     0     1     1     1     0     0

>> disp(D)
     0     0     0     0     1     0     0     0
     0     0     0     0     0     1     0     0
     0     0     0     0     0     0     1     0
     0     0     0     0     0     0     0     1
     0     0     0     0     1     0     0     0
     0     0     0     0     1     1     0     0
     0     0     0     0     1     1     1     0

>> Q=mod((A+B+C+D),2)

Q =

     1     0     1     1     1     0     0     0
     0     1     0     1     1     1     0     0
     0     0     1     0     1     1     1     0
     0     0     0     1     0     1     1     1
     1     0     1     1     0     0     1     1
     1     1     1     0     0     0     0     1
     1     1     0     0     1     0     0     0

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


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

Однако, ваша версия была верной, моя косячной. Покрутил в модельсим, без e(6) все работает как надо...

 

e(6) нужен - без него неправильно. У вас ошибка при моделировании

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


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

Все. Заскоки ActiveHDL видимо какие то были. Надо отвыкать от него и делать все в строго модельсиме :-)

Михалыч, спасибо за помощь! Умножителем доволен!

 

На кристалле Actel M1A3P1000L задержки при переключении в районе 9-11 нс.

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


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

Уважаемые, а кто как решил вопрос ДЕЛЕНИЯ в поле Галуа?

Я попробовал сгенерить на VHDL описание через таблицу истинности, вида rez<="001" when inp="110" else..., комбинационная схема для GF(256) сгенерилась довольно быстро, но сожрала почти в 10 раз больше логики, чем умножитель по приведенному выше алгоритму.

Существуют ли подобные схемы для такого хитрого делителя в поле Галуа?

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


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

Уважаемые, а кто как решил вопрос ДЕЛЕНИЯ в поле Галуа?

Я попробовал сгенерить на VHDL описание через таблицу истинности, вида rez<="001" when inp="110" else..., комбинационная схема для GF(256) сгенерилась довольно быстро, но сожрала почти в 10 раз больше логики, чем умножитель по приведенному выше алгоритму.

Существуют ли подобные схемы для такого хитрого делителя в поле Галуа?

реверсю декодер РС от альтеры, могу выложить потом. Писали его задней ногой блин !!!!

 

PS. деление в процедуре ченя там сделано через таблицу + умножитель. весит копейки.

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


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

В Форни вы хотели сказать? В Ченя перебор идет.

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

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


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

Писали его задней ногой блин !!!!

Именно так. :) Когда я прочитал их верхний уровень (все модули уже были сделаны и отлажены) - реально расстроился, подумал, что не успею сделать. Потом плюнул и сделал свой с нуля за день.

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


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

Именно так. :) Когда я прочитал их верхний уровень (все модули уже были сделаны и отлажены) - реально расстроился, подумал, что не успею сделать. Потом плюнул и сделал свой с нуля за день.

неее, верхний это еще цветочки. а вот auk_rs_mem_atl это жесть или auk_rs_bms_atl особенно секция

loadbd <= out_fsm(1);
loadbdprev <= out_fsm(2);
loadbdtemp <= out_fsm(3);
shiftsynleft <= out_fsm(4);
shiftsynright <= out_fsm(5);
clearbd <= out_fsm(6);
shiftbdprev_lm <= out_fsm(7);
deltacalc <= out_fsm(8);
newdelta <= out_fsm(9);
olddelta <= out_fsm(10);
incm <= out_fsm(11);
incomega <= out_fsm(12);
initomega <= out_fsm(13);
calcomega <= out_fsm(14);
shiftbdprev_ml <= out_fsm(15);
olddelta_bis <= out_fsm(16);
load_llnum <= olddelta;

outputs_FSM: process(state, load_syn, load_chn, continuous_mode, count_clock_gt_n)
  begin
    case state is
    when S0 =>
      out_fsm <= "0000000000000000";
    when S0c =>
      out_fsm <= "0000000000000000";
    when S1 =>
      out_fsm <= "0000000010000100";
    when S2 =>
      out_fsm <= "0000000001000000";
    when S2a =>
      out_fsm <= "0000000100000000";
    when S3 =>
      out_fsm <= "0000000000001000";
    when S4 =>
      out_fsm <= "0000000000000100";
    when S5 =>
      out_fsm <= "1000000000000001";
    when S6 =>
      out_fsm <= "0000001000000010";
    when S8 =>
      out_fsm <= "0000010010000000";
    when S10 =>
      out_fsm <= "0011000000100100";
    when S11 =>
      out_fsm <= "0010000000010011";
    when S12 =>
      out_fsm <= "0110100000010001";
    when S99 =>
      out_fsm <= "0000000000000000";
  -- coverage off
    when others =>
      out_fsm <= "0000000000000000";
  -- coverage on
    end case;
    -- Can I pipeline this signal below?
    if state=S98 and (continuous_mode='0' or (continuous_mode='1' and count_clock_gt_n='1')) then
      bms_done <= '1';
    else
      bms_done <= '0';
    end if;
    -- bms_clear  defined here.
    -- this bit of logic is responsible for a drop in performance with respect from v4.1.0
    if (state=S98 or state=S99) and load_syn='1' and load_chn='1' then
      bms_clear <= '1';
    elsif state=S0 and load_syn='1' then
      bms_clear <= '1';
    elsif state=S0c and load_chn='1' then
      bms_clear <= '1';
    else
      bms_clear <= '0';
    end if;

end process outputs_FSM;

интерфейсы я свои уже прикрутил, теперь хочу убрать не нужную мне задержку на блок (убрать один проход) и sibm как в бчх декодере прикрутить. Потом выложу сорец и свою версию (мАбыть) %)

 

В Форни вы хотели сказать? В Ченя перебор идет.

я не по алгоритму, я по месту положения в декодере ;) в атаче тот самый делитель

auk_rs_gfdiv.vhd

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


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

неее, верхний это еще цветочки. а вот auk_rs_mem_atl это жесть или auk_rs_bms_atl особенно секция

Я их сам писал. Одного взгляда на их код хватило, чтобы понять: если не разберусь, все равно ерунда получится. К тому же я хотел декодировать пакеты различной длины потоком, без перерыва между блоками. Это было не сильно нужно по быстродействию, скорее мне так было удобно. В той версии корки, что я смотрел, они при поступлении укороченных кодов тормозили входной поток.

 

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


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

Я их сам писал. Одного взгляда на их код хватило, чтобы понять: если не разберусь, все равно ерунда получится.

после бчх я быстро разобрался что к чему )))

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

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

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


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

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

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

 

У меня можно слать непрерывным потоком блоки длины от 65(можно подкрутить и меньше, до 48, но смысла нет) до 255, причем задержка меньше, чем у Альтеры - первый символ блока появляется на выходе через 54 такта после того, как принят последний его символ на входе. Можно сделать и меньшую латентность - но балансируя между быстродействием, латентностью и объемом ресурсов я сделал реализацию БМ за 48 тактов.

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


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

я сделал реализацию БМ за 48 тактов.

это при любом количестве проверочных символов ?

 

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


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

Берусь предположить, что число тактов равно 2t, где t число исправляемых ошибок, если использовался модифицированный, безинверсный БМА (RiBM)

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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