Djony1987 0 11 апреля, 2010 Опубликовано 11 апреля, 2010 · Жалоба Здравствуйте! Сейчас стоит задача написать декодер Витерби на verilog. Разобрался в алгоритме. Есть вопросы по реализации, в инете много статей по разным методам реализации некоторых вещей, например способы хранения путей и извлечения декодированных символов (с обратным проходом(traceback) и с обменом регистрами(register exchange)), разные способы синхронизации, нормализации, реализации ACS (блока Сложения-Сравнения-Выбора) например как сжатия по вертикали (M-layer), так и по горизонтали (Radix-4) и т.д. Что лучше выбрать? С чего лучше начать? Буду рад любому совету! Характеристики кодера: K=7, r=1/2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Grumbler_2002 0 11 апреля, 2010 Опубликовано 11 апреля, 2010 · Жалоба Лучше начать с выяснения всех требований на декодер по скорости, ресурсам, режиму работы и т.п. Затем уже почитайте статьи по применению тех или иных методов в той или иной ситуации. Большая часть вариантов отпадет на этом этапе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Djony1987 0 12 апреля, 2010 Опубликовано 12 апреля, 2010 (изменено) · Жалоба Лучше начать с выяснения всех требований на декодер по скорости, ресурсам, режиму работы и т.п. Затем уже почитайте статьи по применению тех или иных методов в той или иной ситуации. Большая часть вариантов отпадет на этом этапе. Скорость небольшая - 35 кбит/с, по ресурсапм даже незнаю как изначально определить сколько надо, думаю при тактовой например 25 МГц, можно использовать 1 блок ACS. Что значит режим работы? Может кто делал, поделителсь соображениями плис :) Изменено 12 апреля, 2010 пользователем Djony1987 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 12 апреля, 2010 Опубликовано 12 апреля, 2010 · Жалоба Скорость небольшая - 35 кбит/с для такой скорости в лоб на ниосе 100МГц запустите, дальше станет ясно куда двигаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Djony1987 0 12 апреля, 2010 Опубликовано 12 апреля, 2010 (изменено) · Жалоба для такой скорости в лоб на ниосе 100МГц запустите, дальше станет ясно куда двигаться. К сожалению ниоса нет, использую Active-HDL+Modelsim и Xilinx как кристалл предполагается... :( Изменено 12 апреля, 2010 пользователем Djony1987 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 12 апреля, 2010 Опубликовано 12 апреля, 2010 · Жалоба К сожалению ниоса нет, использую Active-HDL+Modelsim и Xilinx как кристалл предполагается... :( в чем проблема то, тогда на микробе, потом если что на FSL еще пару акселераторов повесите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Djony1987 0 12 апреля, 2010 Опубликовано 12 апреля, 2010 · Жалоба в чем проблема то, тогда на микробе, потом если что на FSL еще пару акселераторов повесите. Может я непонял, я думал на ниосе есть корка, которую можно промоделировать, посмотреть при некой частоте сколько каких блоков будет, или я ошибся? Пока что нахожусь на начальной стадии, сделал только кодер. У меня 64 состояния, т.е. 128 ребер (ветвей) - для которых надо запомнить или генерировать кодовые слова, чтобы потом вычилять евклидово расстояние между этими словами и пришедшими, в моем случе 2 значениями, т.к. скорость 1/2. Как обычно хранятся эти "кодовые слова" ребер? Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 12 апреля, 2010 Опубликовано 12 апреля, 2010 · Жалоба Может я непонял, я думал на ниосе есть корка, которую можно промоделировать, посмотреть при некой частоте сколько каких блоков будет, или я ошибся? правильно заданный вопрос это половина ответа. От того что точно вам нужно, зависит решение. Например 1. Быстро рабочее железо? Берем корегенератор, лечим декодер витерби, генерим его. используем. 2. Быстро рабочее железо, но которое весит меньше? Для вашей скорости начать можно с использования софтового проца (микроба) с сишным кодом декодера витерби. Если что, всегда есть резервы по ускорению микроба. 2. Разобраться в вопросе и написать свой аппаратный декодер? Тогда вдумчиво читаем, оцениваем, моделируем, пробуем. Займет где-то 3-6 месяцев, не факт что получите декодер лучше чем в случае 1. Задаваемые вами вопросы в посте #1 соответствуют 3 му пункту, но последние вопросы 1му. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Djony1987 0 12 апреля, 2010 Опубликовано 12 апреля, 2010 · Жалоба 2. Разобраться в вопросе и написать свой аппаратный декодер? Тогда вдумчиво читаем, оцениваем, моделируем, пробуем. Займет где-то 3-6 месяцев, не факт что получите декодер лучше чем в случае 1. Почему так много? Лучше наверно не получится, но лучшие нужны для больших скоростей мне кажется, при малых скоростях стандартный должен пойти. Задаваемые вами вопросы в посте #1 соответствуют 3 му пункту, но последние вопросы 1му. А корка генерится в код HDL или в файл, который уже заливать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 12 апреля, 2010 Опубликовано 12 апреля, 2010 · Жалоба Почему так много? отчасти потому, что вы задаете вот такие вопросы %) А корка генерится в код HDL или в файл, который уже заливать? потрудитесь хотя бы прочитать главы книги Maxfiled C. The Design Warrior's Guide to FPGAs, что бы вы представляли всю широту проблемы, которая встала перед вами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ASN 0 12 апреля, 2010 Опубликовано 12 апреля, 2010 · Жалоба Djony1987 IMHO, самая простая последовательность такая: Сформулируйте последовательность кодера и запишите ее в блочную память со знаком (к примеру 0 - +100, 1 - -100). Это будет вход декодера. 1.Сделайте модуль ACS. 2.Сделайте коммутатор, который преобразует входные числа либо к положительному, либо к отрицательному виду (всего 4 типа); 3.Задайте положения коммутатора в зависимости от таблицы состояний (их 64). Можно тоже блочной память в виде ROM. 4.Подключите к нему 2 блочные памяти на вход (с генераторами адреса) и две блочные памяти на выход (это накопленные метрики). 5.Результат сохраняйте в сдвиговом 64-х регистре - это выход путей декодера. 6.После прохождения всех 64 состояний меняйте выходные блочные памяти (выходные теперь будут входные накопленные метрики). Сохраните 64-х битый регистр в ещё одной блочной памяти - это будут пути декодера. После прохождения на глубину сливания путей (к примеру 32 такта) запускайте цикл поиска выхода декодера. 1. В выходной на последнем такте блочной памяти циклом ищите адрес наибольшей метрики (сделайте для этого отдельный модуль сравнения). 2. Занесите значение в 32-х битный сдвиговый регистр состояния декодера. 2. Считайте последний результат из блочной памяти выходных путей декодера и по первым 6 битам занести результат в сдвиговый регистр состояния декодера. Это будет индекс следующего бита в блочной памяти путей декодера. 3. Повторите последовательность 32 раза и считайте результат из сдвигового регистра состояний декодера в обратном порядке (31 это 0, 30 - это 1 и т.д.). Это будет выход декодера. Это самый простой и наименее быстрый алгоритм. Когда от заработает, можно уже будет делать и непрерывный декодер и оптимизировать по быстродействию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Grumbler_2002 0 12 апреля, 2010 Опубликовано 12 апреля, 2010 · Жалоба Декодер с такими параметрами влезет в пару сотен слайсов и одну RAMB ПЛИСа класса Spartan2 и выше. Структура может быть самая простая, без наворотов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Djony1987 0 13 апреля, 2010 Опубликовано 13 апреля, 2010 (изменено) · Жалоба потрудитесь хотя бы прочитать главы книги Maxfiled C. The Design Warrior's Guide to FPGAs, что бы вы представляли всю широту проблемы, которая встала перед вами. Читал книжку месяц 2 месяца назад. Широту проблемы я представляю, но в инете много алгоритмов на С, есть на Verilog и VHDL. Т.е. есть на что смотреть, хотелось бы кончено самому все написать. Сформулируйте последовательность кодера и запишите ее в блочную память со знаком (к примеру 0 - +100, 1 - -100). Это будет вход декодера. Не много будет 8 бит на значение? Дж. Кларк, Дж. Кейн Кодированием с исправлением ошибок в системах цифровой связи, здесь предлагается делать так: Модуль соответсвенно: module distance_calc(A_in_1, A_in_0, s0, s1, s2, s3); input [2:0] A_in_1, A_in_0; output [3:0] s0, s1, s2, s3; always @(A_in_1 or A_in_0) begin s0 <= A_in_1 + A_in_0; s1 <= A_in_1 + (7 - A_in_0); s2 <= (7 - A_in_1) + A_in_0; s3 <= (7 - A_in_1) + (7 - A_in_0); end endmodule 1.Сделайте модуль ACS. Примерно написал: module ACS(path_metric_0, path_metric_1, branch_metric_0, branch_metric_1); input [4:0] path_metric_0, path_metric_1; input [3:0] branch_metric_0, branch_metric_1; output [4:0] min_path; reg [4:0] sum_1, sum_0; assign sum_1 = path_metric_1 + branch_metric_1; assign sum_0 = path_metric_0 + branch_metric_0; function [4:0] find_min_metric; input [4:0] a, b; begin if(a <= b) find_min_metric = a; else find_min_metric = b; end endfunction assign min_path = find_min_metric(sum_0, sum_1); endmodule 2.Сделайте коммутатор, который преобразует входные числа либо к положительному, либо к отрицательному виду (всего 4 типа); Если сделать как выше? 3.Задайте положения коммутатора в зависимости от таблицы состояний (их 64). Можно тоже блочной память в виде ROM. Коммутатор всмысле мультиплексор? Какая его роль в работе объясните пожалуйста... С блочной памятью еще не работал, нашел в этом документе несколько примеров: http://www.xilinx.com/itp/xilinx5/pdf/docs/xst/xst.pdf Какой выбрать? Это самый простой и наименее быстрый алгоритм. Когда от заработает, можно уже будет делать и непрерывный декодер и оптимизировать по быстродействию. Если Вы не против еще поспрашиваю по нему... ЗЫ Может кто-то тоже хочет разобратся в декодере Витреби и написать на verilog, предлагаю скооперироватся, так быстрее разберемся/сделаем :) Изменено 13 апреля, 2010 пользователем Djony1987 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 13 апреля, 2010 Опубликовано 13 апреля, 2010 · Жалоба ЗЫ Может кто-то тоже хочет разобратся в декодере Витреби и написать на verilog, предлагаю скооперироватся, так быстрее разберемся/сделаем :) По мне это похоже на "вы напишите а я посмотрю/использую". Делайте свой полный декодер, к нему тестбенчи и выкладывайте на доработку/обсуждение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Djony1987 0 14 апреля, 2010 Опубликовано 14 апреля, 2010 · Жалоба По мне это похоже на "вы напишите а я посмотрю/использую". Скорее я больше напишу :) Прошу совета: 1) Выше я написал про вычисление метрики ребер при мягких решениях, нормален ли такой подход? 2) Как лучше делать нормализацию метрик путей? Я знаю 2 способа, это находить на кажом шаге самую малу метрику и вычитать из всех, имхо трудоемкий метод, и еще брать по модулю N, где N = 2dmax, dmax в этом случае это 14, т.е. N=28. взять например 32, но не очень понятен такой поход, ведь если окажется метрика меньше 32, её значение останется, а если больше то резко уменьшится? В чем суть? Можеть есть другой, более простой способ? Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться