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

Вопрос знатокам CRC и ПСП

Задача сделать на ПЛИС генератор ПСП с параллельным выходом, т.е. дающим сразу N бит ПСП за такт, причем степень полинома должна быть 9, а ширина выходной шины, т.е. разрядность регистра - 10. Для вариантов, когда разрядность шины была меньше или равна степени полинома здорово выручал www.easics.be тулз, а вот в данной ситуации я в тупике.

Для примера привожу верилог генератора с разрядностью 10 и полиномом десятой степени:

 

// 1 + x^7 + x^10 poly 10 bit PRS generator

module prs10d10(clk, rst, clr, prs);

 

input clk, rst, clr;

output [9:0] prs;

 

reg [9:0] prs;

 

always @ (posedge clk or posedge rst)

if(rst)

prs <= 0;

else

if(clr)

prs <= 10'h3ff;

else

begin

prs[0] <= prs[0] ^ prs[3] ^ prs[6] ^ prs[9];

prs[1] <= prs[1] ^ prs[4] ^ prs[7];

prs[2] <= prs[2] ^ prs[5] ^ prs[8];

prs[3] <= prs[3] ^ prs[6] ^ prs[9];

prs[4] <= prs[4] ^ prs[7];

prs[5] <= prs[5] ^ prs[8];

prs[6] <= prs[6] ^ prs[9];

prs[7] <= prs[0] ^ prs[3] ^ prs[6] ^ prs[7] ^ prs[9];

prs[8] <= prs[1] ^ prs[4] ^ prs[7] ^ prs[8];

prs[9] <= prs[2] ^ prs[5] ^ prs[8] ^ prs[9];

end

 

endmodule

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


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

Задача сделать на ПЛИС генератор ПСП с параллельным выходом, т.е. дающим сразу N бит ПСП за такт, причем степень полинома должна быть 9, а ширина выходной шины, т.е. разрядность регистра - 10. Для вариантов, когда разрядность шины была меньше или равна степени полинома здорово выручал www.easics.be тулз, а вот в данной ситуации я в тупике.

Для примера привожу верилог генератора с разрядностью 10 и полиномом десятой степени:

 

// 1 + x^7 + x^10 poly 10 bit PRS generator

module prs10d10(clk, rst, clr, prs);

 

input clk, rst, clr;

output [9:0] prs;

 

reg [9:0] prs;

 

always @ (posedge clk or posedge rst)

  if(rst)

  prs <= 0;

  else

  if(clr)

    prs <= 10'h3ff;

  else

  begin

    prs[0] <= prs[0] ^ prs[3] ^ prs[6] ^ prs[9];

    prs[1] <= prs[1] ^ prs[4] ^ prs[7];

    prs[2] <= prs[2] ^ prs[5] ^ prs[8];

    prs[3] <= prs[3] ^ prs[6] ^ prs[9];

    prs[4] <= prs[4] ^ prs[7];

    prs[5] <= prs[5] ^ prs[8];

    prs[6] <= prs[6] ^ prs[9];

    prs[7] <= prs[0] ^ prs[3] ^ prs[6] ^ prs[7] ^ prs[9];

    prs[8] <= prs[1] ^ prs[4] ^ prs[7] ^ prs[8];

    prs[9] <= prs[2] ^ prs[5] ^ prs[8] ^ prs[9];

  end

 

endmodule

На самом деле никакой проблемы здесь нет. Насколько мне известно из теории построения генераторов ПСП, единожды выполненная над битовым вектором функция, дает в результате один псевдослучайный бит. То есть за одно применение функции (за один сдвиг битового вектора) имеем право взять как псевдослучайный только один бит, который "выдвигается" из битового вектора (он же, в случае генератора ПСП, "вдвигается"). Этот бит формируется функцией обратных связей, которые задаются собственно многочленом. Следовательно, чтобы получить N псевдослучайных бит, нужно выполнить функцию над битовым вектором N раз, что мы и видим в преведенном Вами коде, где псевдослучайная функция выполняется над битовым вектором prs[9:0] десять раз за такт. В Вашем случае, где необходимо получить 10 псевдослучайных бит за такт, а определяющая функция имеет степень 9, Вам необходимо также выполнить над битовым вектром prs[8:0] функцию 10 раз, но с той лишь разницей, что сохранить 10-ый псевдослучайный бит в дополнительном разряде битового вектора. Полученные 10 бит и будут необходимым Вам результатом.

 

Вот Вам еще полезный для понимания файлик: crc.pdf

Будут вопросы, спрашивайте. Удачи.

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


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

Умом-то я понимаю, что правая часть набора присвоений и есть результат сокращения 10 итераций 1-разрядного генератора. Но попытки сделать параллельный генератор "вручную" ни к чему не привели - результировавшая последовательность была кривой. Может есть софт для синтеза таких генераторов?

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


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

Умом-то я понимаю, что правая часть набора присвоений и есть результат сокращения 10 итераций 1-разрядного генератора. Но попытки сделать параллельный генератор "вручную" ни к чему не привели - результировавшая последовательность была кривой. Может есть софт для синтеза таких генераторов?

 

http://forum.electronix.ru/index.php?showt...indpost&p=15348

Приведенный мною генератор позволяет при небольшой докрутке получить логические функции для любого полинома.

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


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

Умом-то я понимаю, что правая часть набора присвоений и есть результат сокращения 10 итераций 1-разрядного генератора. Но попытки сделать параллельный генератор "вручную" ни к чему не привели - результировавшая последовательность была кривой. Может есть софт для синтеза таких генераторов?

Софта для синтеза нестандартных генераторов не встречал. Всегда делал так: делал функцию, которая выполняла одну итерацию, далее в цикле вызывал эту функцию необходимое количество раз, получал требуемый результат. Оптимизацией логики вручную не занимался. У меня все было на VHDL. При таком подходе реализация не займет более получаса. Пробуйте.

 

Удачи

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


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

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

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

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

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

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

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

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

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

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