Muscat 0 20 мая, 2011 Опубликовано 20 мая, 2011 · Жалоба Уважаемый Михалыч, посмотрите пожалуйста свой алгоритм. У меня вызывает сомнения строчка 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 код, проверю в Модельсиме результаты, посмотрим, сравню со своим полем. Но пока вроде у себя ошибок не вижу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SuperFly 0 20 мая, 2011 Опубликовано 20 мая, 2011 (изменено) · Жалоба Уважаемый Михалыч, посмотрите пожалуйста свой алгоритм. У меня вызывает сомнения строчка ... Вы правы - там нехватает единицы. Я же приводил схему "по первым прикидкам" ;) Изменено 20 мая, 2011 пользователем Mikhalych Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Muscat 0 20 мая, 2011 Опубликовано 20 мая, 2011 · Жалоба Однако, ваша версия была верной, моя косячной. Покрутил в модельсиме, без 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SuperFly 0 20 мая, 2011 Опубликовано 20 мая, 2011 · Жалоба Однако, ваша версия была верной, моя косячной. Покрутил в модельсим, без e(6) все работает как надо... e(6) нужен - без него неправильно. У вас ошибка при моделировании Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Muscat 0 20 мая, 2011 Опубликовано 20 мая, 2011 · Жалоба Все. Заскоки ActiveHDL видимо какие то были. Надо отвыкать от него и делать все в строго модельсиме :-) Михалыч, спасибо за помощь! Умножителем доволен! На кристалле Actel M1A3P1000L задержки при переключении в районе 9-11 нс. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Muscat 0 24 мая, 2011 Опубликовано 24 мая, 2011 · Жалоба Уважаемые, а кто как решил вопрос ДЕЛЕНИЯ в поле Галуа? Я попробовал сгенерить на VHDL описание через таблицу истинности, вида rez<="001" when inp="110" else..., комбинационная схема для GF(256) сгенерилась довольно быстро, но сожрала почти в 10 раз больше логики, чем умножитель по приведенному выше алгоритму. Существуют ли подобные схемы для такого хитрого делителя в поле Галуа? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 1 июня, 2011 Опубликовано 1 июня, 2011 · Жалоба Уважаемые, а кто как решил вопрос ДЕЛЕНИЯ в поле Галуа? Я попробовал сгенерить на VHDL описание через таблицу истинности, вида rez<="001" when inp="110" else..., комбинационная схема для GF(256) сгенерилась довольно быстро, но сожрала почти в 10 раз больше логики, чем умножитель по приведенному выше алгоритму. Существуют ли подобные схемы для такого хитрого делителя в поле Галуа? реверсю декодер РС от альтеры, могу выложить потом. Писали его задней ногой блин !!!! PS. деление в процедуре ченя там сделано через таблицу + умножитель. весит копейки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Muscat 0 2 июня, 2011 Опубликовано 2 июня, 2011 · Жалоба В Форни вы хотели сказать? В Ченя перебор идет. Я сделал комбинационную схему нахождения обратного, она занимает в 3 раза больше места чем умножитель, сколько по времени пока не смотрел. Вот еще рекомендуют делать через память. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyF 0 3 июня, 2011 Опубликовано 3 июня, 2011 · Жалоба Писали его задней ногой блин !!!! Именно так. :) Когда я прочитал их верхний уровень (все модули уже были сделаны и отлажены) - реально расстроился, подумал, что не успею сделать. Потом плюнул и сделал свой с нуля за день. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 3 июня, 2011 Опубликовано 3 июня, 2011 · Жалоба Именно так. :) Когда я прочитал их верхний уровень (все модули уже были сделаны и отлажены) - реально расстроился, подумал, что не успею сделать. Потом плюнул и сделал свой с нуля за день. неее, верхний это еще цветочки. а вот 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyF 0 3 июня, 2011 Опубликовано 3 июня, 2011 · Жалоба неее, верхний это еще цветочки. а вот auk_rs_mem_atl это жесть или auk_rs_bms_atl особенно секция Я их сам писал. Одного взгляда на их код хватило, чтобы понять: если не разберусь, все равно ерунда получится. К тому же я хотел декодировать пакеты различной длины потоком, без перерыва между блоками. Это было не сильно нужно по быстродействию, скорее мне так было удобно. В той версии корки, что я смотрел, они при поступлении укороченных кодов тормозили входной поток. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 3 июня, 2011 Опубликовано 3 июня, 2011 · Жалоба Я их сам писал. Одного взгляда на их код хватило, чтобы понять: если не разберусь, все равно ерунда получится. после бчх я быстро разобрался что к чему ))) К тому же я хотел декодировать пакеты различной длины потоком, без перерыва между блоками. Это было не сильно нужно по быстродействию, скорее мне так было удобно. В той версии корки, что я смотрел, они при поступлении укороченных кодов тормозили входной поток. хмм, вроде в этой реализации это есть. Укороченные коды реализованы красиво, но ценой задержки на блок (реверсивный поиск ченя) ))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyF 0 3 июня, 2011 Опубликовано 3 июня, 2011 · Жалоба хмм, вроде в этой реализации это есть. Укороченные коды реализованы красиво, но ценой задержки на блок (реверсивный поиск ченя) ))) В той версии, что я декриптовал и с которой экспериментировал, если подавались сначала меньший кадр укороченного кода, потом больший кадр, ему требовался перерыв после большего кадра величиной в разность кадров (декодер выставляет флаг занятости и не принимает входные данные). У меня можно слать непрерывным потоком блоки длины от 65(можно подкрутить и меньше, до 48, но смысла нет) до 255, причем задержка меньше, чем у Альтеры - первый символ блока появляется на выходе через 54 такта после того, как принят последний его символ на входе. Можно сделать и меньшую латентность - но балансируя между быстродействием, латентностью и объемом ресурсов я сделал реализацию БМ за 48 тактов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 4 июня, 2011 Опубликовано 4 июня, 2011 · Жалоба я сделал реализацию БМ за 48 тактов. это при любом количестве проверочных символов ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Muscat 0 6 июня, 2011 Опубликовано 6 июня, 2011 · Жалоба Берусь предположить, что число тактов равно 2t, где t число исправляемых ошибок, если использовался модифицированный, безинверсный БМА (RiBM) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться