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

Здравствуйте!

 

Сейчас стоит задача написать декодер Витерби на verilog. Разобрался в алгоритме. Есть вопросы по реализации, в инете много статей по разным методам реализации некоторых вещей, например способы хранения путей и извлечения декодированных символов (с обратным проходом(traceback) и с обменом регистрами(register exchange)), разные способы синхронизации, нормализации, реализации ACS (блока Сложения-Сравнения-Выбора) например как сжатия по вертикали (M-layer), так и по горизонтали (Radix-4) и т.д.

 

Что лучше выбрать? С чего лучше начать?

 

Буду рад любому совету!

 

Характеристики кодера: K=7, r=1/2

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


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

Лучше начать с выяснения всех требований на декодер по скорости, ресурсам, режиму работы и т.п. Затем уже почитайте статьи по применению тех или иных методов в той или иной ситуации. Большая часть вариантов отпадет на этом этапе.

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


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

Лучше начать с выяснения всех требований на декодер по скорости, ресурсам, режиму работы и т.п. Затем уже почитайте статьи по применению тех или иных методов в той или иной ситуации. Большая часть вариантов отпадет на этом этапе.

Скорость небольшая - 35 кбит/с, по ресурсапм даже незнаю как изначально определить сколько надо, думаю при тактовой например 25 МГц, можно использовать 1 блок ACS. Что значит режим работы?

 

Может кто делал, поделителсь соображениями плис :)

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

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


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

Скорость небольшая - 35 кбит/с

для такой скорости в лоб на ниосе 100МГц запустите, дальше станет ясно куда двигаться.

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


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

для такой скорости в лоб на ниосе 100МГц запустите, дальше станет ясно куда двигаться.

К сожалению ниоса нет, использую Active-HDL+Modelsim и Xilinx как кристалл предполагается... :(

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

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


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

К сожалению ниоса нет, использую Active-HDL+Modelsim и Xilinx как кристалл предполагается... :(

в чем проблема то, тогда на микробе, потом если что на FSL еще пару акселераторов повесите.

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


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

в чем проблема то, тогда на микробе, потом если что на FSL еще пару акселераторов повесите.

 

Может я непонял, я думал на ниосе есть корка, которую можно промоделировать, посмотреть при некой частоте сколько каких блоков будет, или я ошибся?

 

Пока что нахожусь на начальной стадии, сделал только кодер.

 

У меня 64 состояния, т.е. 128 ребер (ветвей) - для которых надо запомнить или генерировать кодовые слова, чтобы потом вычилять евклидово расстояние между этими словами и пришедшими, в моем случе 2 значениями, т.к. скорость 1/2. Как обычно хранятся эти "кодовые слова" ребер?

 

Спасибо!

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


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

Может я непонял, я думал на ниосе есть корка, которую можно промоделировать, посмотреть при некой частоте сколько каких блоков будет, или я ошибся?

правильно заданный вопрос это половина ответа.

 

От того что точно вам нужно, зависит решение. Например

 

1. Быстро рабочее железо? Берем корегенератор, лечим декодер витерби, генерим его. используем.

2. Быстро рабочее железо, но которое весит меньше? Для вашей скорости начать можно с использования софтового проца (микроба) с сишным кодом декодера витерби. Если что, всегда есть резервы по ускорению микроба.

2. Разобраться в вопросе и написать свой аппаратный декодер? Тогда вдумчиво читаем, оцениваем, моделируем, пробуем. Займет где-то 3-6 месяцев, не факт что получите декодер лучше чем в случае 1.

 

Задаваемые вами вопросы в посте #1 соответствуют 3 му пункту, но последние вопросы 1му.

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


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

2. Разобраться в вопросе и написать свой аппаратный декодер? Тогда вдумчиво читаем, оцениваем, моделируем, пробуем. Займет где-то 3-6 месяцев, не факт что получите декодер лучше чем в случае 1.

Почему так много? Лучше наверно не получится, но лучшие нужны для больших скоростей мне кажется, при малых скоростях стандартный должен пойти.

 

Задаваемые вами вопросы в посте #1 соответствуют 3 му пункту, но последние вопросы 1му.

А корка генерится в код HDL или в файл, который уже заливать?

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


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

Почему так много?

отчасти потому, что вы задаете вот такие вопросы %)

А корка генерится в код HDL или в файл, который уже заливать?

потрудитесь хотя бы прочитать главы книги Maxfiled C. The Design Warrior's Guide to FPGAs, что бы вы представляли всю широту проблемы, которая встала перед вами.

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


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

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 и т.д.).

Это будет выход декодера.

 

Это самый простой и наименее быстрый алгоритм.

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

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


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

Декодер с такими параметрами влезет в пару сотен слайсов и одну RAMB ПЛИСа класса Spartan2 и выше. Структура может быть самая простая, без наворотов.

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


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

потрудитесь хотя бы прочитать главы книги Maxfiled C. The Design Warrior's Guide to FPGAs, что бы вы представляли всю широту проблемы, которая встала перед вами.

Читал книжку месяц 2 месяца назад. Широту проблемы я представляю, но в инете много алгоритмов на С, есть на Verilog и VHDL. Т.е. есть на что смотреть, хотелось бы кончено самому все написать.

 

 

 

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

Не много будет 8 бит на значение?

 

Дж. Кларк, Дж. Кейн Кодированием с исправлением ошибок в системах цифровой связи, здесь предлагается делать так:

example.JPG

Модуль соответсвенно:

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, предлагаю скооперироватся, так быстрее разберемся/сделаем :)

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

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


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

ЗЫ Может кто-то тоже хочет разобратся в декодере Витреби и написать на verilog, предлагаю скооперироватся, так быстрее разберемся/сделаем :)

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

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


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

По мне это похоже на "вы напишите а я посмотрю/использую".

Скорее я больше напишу :)

 

Прошу совета:

1) Выше я написал про вычисление метрики ребер при мягких решениях, нормален ли такой подход?

2) Как лучше делать нормализацию метрик путей? Я знаю 2 способа, это находить на кажом шаге самую малу метрику и вычитать из всех, имхо трудоемкий метод, и еще

брать по модулю N, где N = 2dmax, dmax в этом случае это 14, т.е. N=28. взять например 32, но не очень понятен такой поход, ведь если окажется метрика меньше 32, её значение останется, а если больше то резко уменьшится? В чем суть? Можеть есть другой, более простой способ?

 

Спасибо!

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


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

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

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

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

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

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

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

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

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

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