четверг, 4 сентября 2014 г.

Формирователь псевдослучайной последовательности на ПЛИС

В процессе разработки аппаратуры ЦОС и отдельных ее компонентов, тех же цифровых фильтров [1], появляется необходимость в их тестировании, суть которого сводится к подаче на вход тестового сигнала и отслеживание реакции на данный сигнал и выходных характеристик. С точки зрения симуляции условий, наиболее приближенных к реальным, наиболее оптимальным сигналом является случайная или псевдослучайная последовательность (ПСП) с хорошими корреляционными свойствами. Мы уже рассматривали данный вопрос в [2] и реализовывали генератор ГСЧ на основе «шумящих битов» АЦП аудиокарты. Однако, в случае с такой железякой как ПЛИС такой метод неприемлем. Конечно, можно использовать стабилитрон в режиме пробоя и нормализовать его сигнал до TTL уровня для дальнейшего использования в цифре, но есть методы проще, те же m-последовательности1 на регистрах сдвига с линейными обратными связями. Сегодня с вами мы реализуем подобный формирователь в ПЛИС Xilinx на основе полинома x4+x3+1 и покажем как превратить ПСП в "истинно" случайную последовательность. Интересно? Тогда материал ниже для вас...

Регистры сдвига по сути представляют линию задержки в формирователе ПСП. Функционально регистр сдвига строится на последовательной цепочке триггеров, его работа нами уже изучена в [3] и останавливаться подробно на ней не будем. Для циклической работы линии задержки на регистре сдвига в него вводятся обратные связи на основе схемы сложения по модулю два или «исключающее ИЛИ» (XOR). Рассмотрим построение генератора ПСП более подробно...

1 М-последовательности (Maximum length sequence, MLS) или последовательности максимальной длины - – псевдослучайные двоичные последовательности, порожденные регистром сдвига с линейной обратной связью и имеющие максимальный период. М-последовательности применяются в широкополосных системах связи.

Краткий экскурс...



Каковы условия генерации псевдо-случайной [4...8] последовательности? Их несколько:
  1. Равновероятность появления нуля или единицы.
  2. Корреляция, заключающаяся в равенстве количества совпадающих и количества несовпадающих символов при их посимвольном сравнении с любым периодом.
  3. Вероятность появления каждого набора из M- элементов для M<N (где N – длина последовательности) равна 2-M.
  4. Цикличность повторения генерируемой последовательности.

Структура формирователя ПСП на сдвиговом регистре довольно примитивна. Она представляет собой регистр сдвига с параллельными выходами, несколько выходных сигналов, которого объединены с помощью элемента «Исключающее ИЛИ» (сумматор по модулю два), с выхода которого сигнал подается на вход регистра, замыкая схему в кольцо. Если в первый разряд регистра записать лог.”1”, а в остальные лог.0, то при каждом последующем такте эта лог.”1” будет продвигаться по регистру. Когда N- й разряд примет состояние единицы, то на выходе сумматора по модулю два появится лог.”1”, которая поступит на вход первого разряда и запишется в него. С этого момента в регистре сдвига будут продвигаться две единицы. Для работы формирователя и, собственно, осуществления сдвига используется тактовый сигнал2, задающий частоту выдачи последовательности.


2 Обратите внимание, под воздействием каждого тактового импульса разряды регистра сдвига принимают определенные состояния, причем последовательность этих состояний зависит от способа включения обратной связи. Общее число таких различных состояний равно 2N-1, следовательно, период ПСП равен 2N-1 (n – число разрядов). Последовательность можно снимать с выхода любого разряда регистра.

Регистр с обратной связью описывается характеристическим многочленом вида (см. формулу 1):



F(x)= xN+ An-1*xN-1 +…+ A2*x2 + A1*x+1; (1)



Степень многочлена равна числу разрядов регистра, а коэффициенты Ai равны единице, если выход данного разряда подается на вход схемы сложения по модулю два. В зависимости от количества и места подключения элементов обратной связи можно получить последовательность максимальной или меньшей длины. Для того чтобы последовательность имела максимальную длину, характеристический многочлен должен быть неприводимым, т.е. не разлагаться на произведение многочленов со степенями меньшими N или делиться только на единицу и на самого себя. Структура генератора псевдослучайной последовательности для неприводимого многочлена x4+x3+1 приведена на рисунке 2.




Рис. 2. Структура построения формирователя ПСП на основе полинома x4+x3+1



В качестве звеньев регистра использованы асинхронные D- триггеры. Логический элемент NOR4 (4ИЛИ-НЕ) введен для записи единицы в первый разряд регистра в начальный момент времени. Сдвиг производится от младших разрядов к старшим. Как мы определили какие разряды регистра следует завести на входы сумматора по модулю два? Для этого потребуется найти сопряженный многочлен и пройти следующие шаги (классический метод):

  1. В характеристическом многочлене (1) производят замену переменных как x = y-1.
  2. Полученный многочлен умножают на yN.
  3. Из сопряженного многочлена, коэффициенты Ai которого не равны нулю, берут показатели степени переменной. Эти разряды и подают на сумматор по модулю два.

К примеру, для характеристического многочлена (полинома) x4+x3+1 сопряженный многочлен имеет следующий вид (см. преобразование 2): 

1/y4+1/y3+1 -> y4 *(1/y4+1/y3+1) = 1+y1+y4; (2)


Следовательно, регистр сдвига имеет четыре разряда. Показатели степеней в данном сопряженном многочлене равны 1 и 4. Поэтому 1-й и 4-й разряд мы завели как обратные связи на вход двухвходового сумматора по модулю два.



Используемое ПО и оборудование



Для организации работы нам понадобится следующее оборудование и программное обеспечение:

  1. Стендовая макетная плата c ПЛИС из второго цикла [9].
  2. 3-х вольтовый источник питания мощностью от пяти ватт.
  3. ПК с установленной инструментальной системой проектирования логических матриц Xilinx Foundation Series 3.1i/4.1i, ISE Webpack или Xilinx ISE Design Suite 14 (или выше) [10].
  4. Программатор JTAG, к примеру Xilinx JTAG Download Parallel Cable или Xilinx Platform Cable USB, подключенный к JTAG- разъему программирования [11].

Создание проекта, сборка и прошивка ПЛИС


Запустив САПР Xilinx, создадим новый проект и выберем соответствующую модель матрицы. После чего можем войти в схемотехнический редактор, нажав третью кнопку на вкладке «Design Entry» менеджера проектов Project Manager и приступить к моделированию (см. рисунок 3).



Рис. 3. Создание проекта в среде Xilinx

По окончании моделирования проверяем (верифицируем) и собираем проект по нажатию кнопки «Implementation» в окне Project Manager (см. рисунок 4).



Рис. 4. Сборка проекта (имплементация) в среде Xilinx



После сборки проекта среда создаст файл прошивки формата JED с сигнатурой матрицы XC95288XL7-TQ144, который и нужно будет прошить в CPLD. Процесс прошивки рассмотрен нами ранее подробно в предыдущих материалах и останавливаться на нем не будем. Проведем временное моделирование нашего формирователя для проверки работоспособности проекта.



Работа в симуляторе. Моделирование поведения формирователя ПСП

Система проектирования логических матриц Xilinx Foundation среди прочего имеет в своем составе симулятор поведения схемы Logic Simulator, вызов которого осуществляется следующим образом:



1. Находясь в схемотехническом редакторе подведите мышку к кнопке «Simulator» на панели инструментов и нажмите ее (см. рисунок 5).


Рис. 5. Панель инструментов IDE Xilinx. Вызов логического симулятора


2. В появившемся окне симулятора в левой части окна нажмите правую кнопку мыши и в выпадающем контекстном меню выберите пункт «Add Signals» для выбора входных и выходных сигналов симуляции (см. рисунок 6). Добавление осуществляется двойным кликом мыши.



Рис. 6. Окно Logic Simulator. Выбор сигналов для проведения симуляции



3. Для удобства управления состоянием входных сигналов в окне симулятора нажмите кнопку «Select Stimulators» и назначьте «горячие клавиши» на клавиатуре (см. рисунок 7).


Рис. 7. Окно Logic Simulator. Назначение «горячих клавиш» для контроля входных сигналов в симуляции



4. Для пошаговой симуляции используйте кнопку «Simulation Step» (см. рисунок 8).


Рис. 8. Окно Logic Simulator. Режим пошаговой симуляции



Напомним читателю, что количество разрядов тестируемого формирователя равно четырем, а значит полный цикл равен 2 в степени 4 = 16. Следовательно полный цикл ПСП завершится на 16-м такте и повторится вновь на следующем 16-м такте. Проверим, что произойдет при подаче единицы в первый разряд сдвигового регистра в исходном состоянии. Подадим 16 тактов (см. рисунок 9).


Рис. 9. Окно Logic Simulator. Генерация ПСП на основе порождающего полинома x4+x3+1



Результаты симуляции можно свести в таблицу.



Таблица. Состояние выходов сдвигового регистра по тактам при генерации полиномом x4+x3+1
Номер такта
Q0
Q1
Q2
Q3
1
1
0
0
0
2
1
1
0
0
3
1
1
1
0
4
1
1
1
1
5
0
1
1
1
6
1
0
1
1
7
0
1
0
1
8
1
0
1
0
9
1
1
0
1
10
0
1
1
0
11
0
0
1
1
12
1
0
0
1
13
0
1
0
0
14
0
0
1
0
15
0
0
0
1
16
1
0
0
0

При этом, если снимать сигнал с последнего регистра (выход Q3), то последовательность примет вид 0001111010110010. Когда на выходе регистра установится нулевое состояние всех выходов, которое является запрещенным, то произведется очередная запись лог.”1” на его вход и последовательность повторится.



В качестве разминки рассмотрим еще один неприводимый многочлен вида x4+x+1. Структура формирователя ПСП на основе порождающего полинома x4+x+1 будет аналогичной, за исключением обратных связей по 3-му и 4-му разрядам (см. рисунок 10).


Рис. 10. Структура построения формирователя ПСП на основе полинома x4+x+1



Выходная последовательность данного ПСП представлена на рисунке 11 и в последнем разряде будет иметь вид 0001001101011110.



Рис. 11. Окно Logic Simulator. Генерация ПСП на основе порождающего полинома x4+x+1



Тестирование и оценка параметров формирователя ПСП

Проверку равномерности распределения нашей последовательности, генерируемую полиномом x4+x3+1, можно осуществить с помощью ряда статистических критериев. Статистический критерий это процедура, применяемая к количественным данным выборки. Каждая такая процедура (тест) служит для проверки гипотезы: «заданная последовательность имеет равномерно распределенную случайную структуру». Количество таких критериев на сегодняшний день существует множество и некоторые из них мы уже использовали в [2]. В частности, был использован синтетический набор тестов для оценки генераторов псевдослучайных чисел – утилита ENT https://www.fourmilab.ch/random. Воспользуемся ею и в этот раз. Для этого подготовим выборку, скажем, из 16-ти циклически повторяемых данных первого формирователя 0001111010110010 и сохраним данную выборку:



0001111010110010000111101011001000011110101100100001111010110010000111101011001000011110101100100001111010110010000111101011001000011110101100100001111010110010000111101011001000011110101100100001111010110010000111101011001000011110101100100001111010110010



в файл 'test1.dat'. Теперь в командной строке передадим данный файл на вход утилиты, для этого выполните следующую команду (см. рисунок 12):



ent test1.dat >d:\1.txt


Рис. 12. Оценка данных ПСП с помощью утилиты ENT


Тут мы перенаправили результат работы утилиты в текстовый файл '1.txt'. Полученное содержимое:
Entropy = 1.000000 bits per byte.

Optimum compression would reduce the size
of this 256 byte file by 87 percent.

Chi square distribution for 256 samples is 32512.00, and randomly
would exceed this value less than 0.01 percent of the times.

Arithmetic mean value of data bytes is 48.5000 (127.5 = random).
Monte Carlo value for Pi is 4.000000000 (error 27.32 percent).
Serial correlation coefficient is 0.000000 (totally uncorrelated = 0.0).
Расшифруем полученные показатели:

  1. Величина энтропии показывает нам информационную плотность содержимого файла, выраженную как как число битов на символ. У нас информационная плотность равняется единице.
  2. Оптимальное сжатие нашей последовательности возможно на 87%.
  3. Тест Хи-квадрат рассчитывается для потока байтов в файле и выражается в виде абсолютного числа и процента, который указывает, как часто действительно случайная последовательность будет превышать расчитанное значение. Если процент больше, чем 99% или менее 1%, последовательность почти наверняка не не случайна. Если процент от 99% до 95% или между 1...5%, последовательность является подозритеьной. Процентное соотношение между 90...95% и 5...10% указывает последовательность как "почти подозрительную". У нас менее 1%, последовательность не случайна. В принципе с этим никто и не спорит :)
  4. Среднее арифметическое значение равно 48.5.
  5. Тест Монте-Карло для Pi равно 4 (ошибка 27.32%). Данный тест показывает процент подозрительного поведения данных. Представьте себе, что мы создаем анализатор неких данных и пытаемся открыть случайные данные произвольной длины. Возможно три варианта реакции на эти данные: данные откроются и проанализируются анализатором, данные не поддадутся анализу и данные могут привести к сбою анализатора. Вот этот-то сбой и является самым интересным. Вы можете спросить как это касается наших формирователей ПСП? Самое непосредственное, ведь мы создаем их для замены случайного набора данных. И чем они более случайны, простите за тавтологию, тем полнее и качественнее будет протестировано поведение объекта, то ли анализатора, то ли цифрового фильтра.
  6. Серийный коэффициент корреляции равен 0.000000 (если данные полностью коррелируют, то он равен 0.0).
Формирователь «истинно» случайной последовательности


Итак, у нас есть формирователь ПСП на основе полинома x4+x3+1. Есть формируемая им циклическая последовательность вида 0001111010110010. Также мы знаем, что используя обратные связи через XOR в сдвиговом регистре можем влиять на характер ПСП. А что нам мешает внести (подмешать) случайную составляющую в исходную m- последовательность просто добавив парочку связей с генераторов со случайной фазой? Ничто не мешает. Но как создать такой генератор? Их еще называют Ring Oscillator. А очень просто. Достаточно замкнуть в петлю нечетное количество инверторов, создав тем самым выполнение условия баланса фаз и амплитуд для самовозбуждения. Однако тут есть два важных момента:

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

Для исключения этих препятствий потребуется оттрасcировать схему специальным образом. Во-первых, на выходе каждого инвертора включим N-е количество Latch-модулей для задержки на некоторую длительность импульса. Два Latch-модуля дают задержку одного элемента и не дают среде исключить подобные последовательные блоки. Во-вторых, подобное построение цепей задержки обладает ярко выраженной температурной зависимостью и зависимостью от стабильности источника питания. Что вкупе с температурными флуктуациями дополнительно вносит элемент случайности в состояние такого генератора. Таким образом, для введения дополнительных связей в нашей исходной схеме (см. рисунок 2) потребуется заменить двухвходовый сумматор по модулю два на четырехвходовый (XOR4) и добавить два Ring Oscillator, построенных на трех инверторах и цепях задержки сигнала, выходы которых завести на входы сумматора. Реализация подобного подхода представлена на рисунке 13.

Рис. 13. Формирователь "истинно" случайной последовательности



Остается подать входные тактовые импульсы с внешнего генератора и вывести полученную последовательность на физические выводы нашей ПЛИС XC95288XL (см. даташит [12]), скажем pin 50 и pin 51 (см. рисунок 14).



Рис. 14. Добавление внешних связей для формирователя ИСП в ПЛИС



Онлайн-генератор кода на Verilog/VHDL формирователя ПСП

Для облегчения труда разработчиков есть множество генераторов Verilog/VHDL кода формирователей псевдослучайных последовательностей, среди которых стоит выделить ресурс OutputLogic.com со страницей Scrambler Generator [13]. Работа его алгоритма его основана на использовании тех же сдвиговых регистров и параллельного сэмплирования данных для генерации m- последовательностей http://outputlogic.com/?p=179. WEB интерфейс интуитивно понятен. На первом шаге вы задаетесь всего двумя параметрами (см. рисунок 15):

  1. Длиной данных 'Data width' от 1 до 1024 бит.
  2. Длиной полинома 'Polynomial width' от 1 до 128 бит.

Зададимся длиной данных равной 16 бит, а длиной полинома равной 32 бита. Мы специально выбрали столь небольшие значения, чтобы сам генерируемый код был небольшим и наглядным. Разумеется, в системах шифрования и повышенной секретности эти длины следует выбирать максимально большими. Единственное ограничение – количество доступных ячеек в ПЛИС.

На втором шаге вам предоставляется выбрать порядок неприводимого многочлена и количество обратных связей (см. рисунок 16). Зададимся полиномом x20+x3+1 и нажмем последовательно кнопки генерации Verilog (см. листинг 1) и VHDL кода формирователя ПСП (см. листинг 2).



ЛИСТИНГ-1
// Формирователь ПСП полиномом x20+x3+1 на Verilog

//-----------------------------------------------------------------------------

// Copyright (C) 2009 OutputLogic.com

// This source file may be used and distributed without restriction

// provided that this copyright statement is not removed from the file

// and that any derivative work contains the original copyright notice

// and the associated disclaimer.

//

// THIS SOURCE FILE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS

// OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED

// WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.

//-----------------------------------------------------------------------------

// scrambler module for data[15:0], lfsr[31:0]=1+x^2+x^19+x^32;

//-----------------------------------------------------------------------------

module scrambler(

input [15:0] data_in,

input scram_en,

input scram_rst,

output reg [15:0] data_out,

input rst,

input clk);



reg [31:0] lfsr_q,lfsr_c;

reg [15:0] data_c;



always @(*) begin

lfsr_c[0] = lfsr_q[16] ^ lfsr_q[29];

lfsr_c[1] = lfsr_q[17] ^ lfsr_q[30];

lfsr_c[2] = lfsr_q[16] ^ lfsr_q[18] ^ lfsr_q[29] ^ lfsr_q[31];

lfsr_c[3] = lfsr_q[17] ^ lfsr_q[19] ^ lfsr_q[30];

lfsr_c[4] = lfsr_q[18] ^ lfsr_q[20] ^ lfsr_q[31];

lfsr_c[5] = lfsr_q[19] ^ lfsr_q[21];

lfsr_c[6] = lfsr_q[20] ^ lfsr_q[22];

lfsr_c[7] = lfsr_q[21] ^ lfsr_q[23];

lfsr_c[8] = lfsr_q[22] ^ lfsr_q[24];

lfsr_c[9] = lfsr_q[23] ^ lfsr_q[25];

lfsr_c[10] = lfsr_q[24] ^ lfsr_q[26];

lfsr_c[11] = lfsr_q[25] ^ lfsr_q[27];

lfsr_c[12] = lfsr_q[26] ^ lfsr_q[28];

lfsr_c[13] = lfsr_q[27] ^ lfsr_q[29];

lfsr_c[14] = lfsr_q[28] ^ lfsr_q[30];

lfsr_c[15] = lfsr_q[29] ^ lfsr_q[31];

lfsr_c[16] = lfsr_q[0] ^ lfsr_q[30];

lfsr_c[17] = lfsr_q[1] ^ lfsr_q[31];

lfsr_c[18] = lfsr_q[2];

lfsr_c[19] = lfsr_q[3] ^ lfsr_q[16] ^ lfsr_q[29];

lfsr_c[20] = lfsr_q[4] ^ lfsr_q[17] ^ lfsr_q[30];

lfsr_c[21] = lfsr_q[5] ^ lfsr_q[18] ^ lfsr_q[31];

lfsr_c[22] = lfsr_q[6] ^ lfsr_q[19];

lfsr_c[23] = lfsr_q[7] ^ lfsr_q[20];

lfsr_c[24] = lfsr_q[8] ^ lfsr_q[21];

lfsr_c[25] = lfsr_q[9] ^ lfsr_q[22];

lfsr_c[26] = lfsr_q[10] ^ lfsr_q[23];

lfsr_c[27] = lfsr_q[11] ^ lfsr_q[24];

lfsr_c[28] = lfsr_q[12] ^ lfsr_q[25];

lfsr_c[29] = lfsr_q[13] ^ lfsr_q[26];

lfsr_c[30] = lfsr_q[14] ^ lfsr_q[27];

lfsr_c[31] = lfsr_q[15] ^ lfsr_q[28];



data_c[0] = data_in[0] ^ lfsr_q[31];

data_c[1] = data_in[1] ^ lfsr_q[30];

data_c[2] = data_in[2] ^ lfsr_q[29];

data_c[3] = data_in[3] ^ lfsr_q[28];

data_c[4] = data_in[4] ^ lfsr_q[27];

data_c[5] = data_in[5] ^ lfsr_q[26];

data_c[6] = data_in[6] ^ lfsr_q[25];

data_c[7] = data_in[7] ^ lfsr_q[24];

data_c[8] = data_in[8] ^ lfsr_q[23];

data_c[9] = data_in[9] ^ lfsr_q[22];

data_c[10] = data_in[10] ^ lfsr_q[21];

data_c[11] = data_in[11] ^ lfsr_q[20];

data_c[12] = data_in[12] ^ lfsr_q[19];

data_c[13] = data_in[13] ^ lfsr_q[18] ^ lfsr_q[31];

data_c[14] = data_in[14] ^ lfsr_q[17] ^ lfsr_q[30];

data_c[15] = data_in[15] ^ lfsr_q[16] ^ lfsr_q[29];

end // always



always @(posedge clk, posedge rst) begin

if(rst) begin

lfsr_q <= {32{1'b1}};

data_out <= {16{1'b0}};

end

else begin

lfsr_q <= scram_rst ? {32{1'b1}} : scram_en ? lfsr_c : lfsr_q;

data_out <= scram_en ? data_c : data_out;

end

end

endmodule
ЛИСТИНГ-2 
// Формирователь ПСП полиномом x20+x3+1 на VHDL

-------------------------------------------------------------------------------

-- Copyright (C) 2009 OutputLogic.com

-- This source file may be used and distributed without restriction

-- provided that this copyright statement is not removed from the file

-- and that any derivative work contains the original copyright notice

-- and the associated disclaimer.

--

-- THIS SOURCE FILE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS

-- OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED

-- WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.

-------------------------------------------------------------------------------

-- scrambler module for data(15:0)

-- lfsr(31:0)=1+x^2+x^19+x^32;

-------------------------------------------------------------------------------

library ieee;

use ieee.std_logic_1164.all;



entity scrambler is

port ( data_in : in std_logic_vector (15 downto 0);

scram_en, scram_rst , rst, clk : in std_logic;

data_out : out std_logic_vector (15 downto 0));

end scrambler;



architecture imp_scrambler of scrambler is

signal data_c: std_logic_vector (15 downto 0);

signal lfsr_q: std_logic_vector (31 downto 0);

signal lfsr_c: std_logic_vector (31 downto 0);

begin

lfsr_c(0) <= lfsr_q(16) xor lfsr_q(29);

lfsr_c(1) <= lfsr_q(17) xor lfsr_q(30);

lfsr_c(2) <= lfsr_q(16) xor lfsr_q(18) xor lfsr_q(29) xor lfsr_q(31);

lfsr_c(3) <= lfsr_q(17) xor lfsr_q(19) xor lfsr_q(30);

lfsr_c(4) <= lfsr_q(18) xor lfsr_q(20) xor lfsr_q(31);

lfsr_c(5) <= lfsr_q(19) xor lfsr_q(21);

lfsr_c(6) <= lfsr_q(20) xor lfsr_q(22);

lfsr_c(7) <= lfsr_q(21) xor lfsr_q(23);

lfsr_c(8) <= lfsr_q(22) xor lfsr_q(24);

lfsr_c(9) <= lfsr_q(23) xor lfsr_q(25);

lfsr_c(10) <= lfsr_q(24) xor lfsr_q(26);

lfsr_c(11) <= lfsr_q(25) xor lfsr_q(27);

lfsr_c(12) <= lfsr_q(26) xor lfsr_q(28);

lfsr_c(13) <= lfsr_q(27) xor lfsr_q(29);

lfsr_c(14) <= lfsr_q(28) xor lfsr_q(30);

lfsr_c(15) <= lfsr_q(29) xor lfsr_q(31);

lfsr_c(16) <= lfsr_q(0) xor lfsr_q(30);

lfsr_c(17) <= lfsr_q(1) xor lfsr_q(31);

lfsr_c(18) <= lfsr_q(2);

lfsr_c(19) <= lfsr_q(3) xor lfsr_q(16) xor lfsr_q(29);

lfsr_c(20) <= lfsr_q(4) xor lfsr_q(17) xor lfsr_q(30);

lfsr_c(21) <= lfsr_q(5) xor lfsr_q(18) xor lfsr_q(31);

lfsr_c(22) <= lfsr_q(6) xor lfsr_q(19);

lfsr_c(23) <= lfsr_q(7) xor lfsr_q(20);

lfsr_c(24) <= lfsr_q(8) xor lfsr_q(21);

lfsr_c(25) <= lfsr_q(9) xor lfsr_q(22);

lfsr_c(26) <= lfsr_q(10) xor lfsr_q(23);

lfsr_c(27) <= lfsr_q(11) xor lfsr_q(24);

lfsr_c(28) <= lfsr_q(12) xor lfsr_q(25);

lfsr_c(29) <= lfsr_q(13) xor lfsr_q(26);

lfsr_c(30) <= lfsr_q(14) xor lfsr_q(27);

lfsr_c(31) <= lfsr_q(15) xor lfsr_q(28);



data_c(0) <= data_in(0) xor lfsr_q(31);

data_c(1) <= data_in(1) xor lfsr_q(30);

data_c(2) <= data_in(2) xor lfsr_q(29);

data_c(3) <= data_in(3) xor lfsr_q(28);

data_c(4) <= data_in(4) xor lfsr_q(27);

data_c(5) <= data_in(5) xor lfsr_q(26);

data_c(6) <= data_in(6) xor lfsr_q(25);

data_c(7) <= data_in(7) xor lfsr_q(24);

data_c(8) <= data_in(8) xor lfsr_q(23);

data_c(9) <= data_in(9) xor lfsr_q(22);

data_c(10) <= data_in(10) xor lfsr_q(21);

data_c(11) <= data_in(11) xor lfsr_q(20);

data_c(12) <= data_in(12) xor lfsr_q(19);

data_c(13) <= data_in(13) xor lfsr_q(18) xor lfsr_q(31);

data_c(14) <= data_in(14) xor lfsr_q(17) xor lfsr_q(30);

data_c(15) <= data_in(15) xor lfsr_q(16) xor lfsr_q(29);



process (clk,rst) begin

if (rst = '1') then

lfsr_q <= b"11111111111111111111111111111111";

data_out <= b"0000000000000000";

elsif (clk'EVENT and clk = '1') then

if (scram_rst = '1') then

lfsr_q <= b"11111111111111111111111111111111";

elsif (scram_en = '1') then

lfsr_q <= lfsr_c;

end if;



if (scram_en = '1') then

data_out <= data_c;

end if;

end if;

end process;

end architecture imp_scrambler;


 
Рис. 15. Задание параметров генерируемой последовательности
в онлайн-генераторе кода Scrambler Generator

Рис. 16. Выбор полинома в онлайн-генераторе кода Scrambler Generator


Теперь остается просто скопировать данный код и сформировать макроблок для использования в своем проекте. Вот в принципе и все.




Общие рекомендации при реализации формирователя ПСП3

  1. Все триггеры в проекте должны быть асинхронные.
  2. При реализации формирователей ПСП допустимо использование комбинаций нескольких порождающих полиномов, активируемых (переключаемых) по команде с верхнего или нижнего уровня (на уровне физических I/O ПЛИС).
  3. Чем выше длина m- последовательности, тем качественнее ПСП и лучше его корреляционные свойства.
  4. В ПЛИС (FPGA/CPLD) реализованы рекурсивные функции. Симуляция их в среде Xilinx Foundation невозможна.
3 Лицензионное соглашение! Автор не несет никакой ответственности за возможную порчу оборудования или информации в результате неправомочного использования данного проекта или за "ваши кривые руки". Также он не дает никаких гарантий, явных или подразумеваемых, относительно корректности результатов и не несет ответственности за прямые или косвенные убытки, связанные с его использованием.

Послесловие


Схемотехнические реализации рассмотренных формирователей ПСП, полный код проекта в среде САПР Xilinx Foundation Series 4.1i, утилиту синтетических тестов ENT, спецификации (файл plis5_res.zip) вы можете загрузить с сайта нашего журнала http://radioliga.com (раздел «Программы»), а также с сайта разработчика [14]. Если тема представляет для вас интерес пишите, задавайте вопросы.



Ресурсы

  1. Е. Бадло, С. Бадло. ПЛИС. Часть 3 или... Цифровая фильтрация. Сглаживание и борьба с импульсными помехами. – Радиолюбитель, Минск, 2014, №3, с.32
  2. Е. Бадло, С. Бадло. Аппаратно - программный генератор случайных чисел на основе звуковой карты ПК-ноутбука. – Радиолюбитель, Минск, 2013, №6, с.26
  3. Е. Бадло, С. Бадло. Преобразователь интерфейсов USB/RS-232 в задачах малой автоматизации. Часть 3 или... Расширяем порт. – Радиолюбитель, Минск, 2014, №1, с.48
  4. И.А. Кулаков. Линейные конгруэнтные и рандомизационные генераторы. Рукопись статьи, Москва, 2012 http://random-art.ru/?download=LCG_RNG_ru.pdf
  5. Хоровиц П., Хилл У. Искусство схемотехники / 5 издание. – М.: Мир, 1998, 704 с.
  6. Генератор псевдослучайных чисел http://ru.wikipedia.org/wiki/Генератор_псевдослучайных_чисел
  7. Регистр сдвига с обратной связью по переносу http://ru.wikipedia.org/wiki/Регистр_сдвига_с_обратной_связью_по_переносу
  8. SystemC/Vеrilog Random Number Generator http://opencores.org/project,systemc_rng
  9. Е. Бадло, С. Бадло. ПЛИС. Часть 2 или... Реализация псевдо-UART. – Радиолюбитель, Минск, 2014, №2, с.45
  10. Xilinx download http://www.xilinx.com/support/download.html#download.html?&_suid=138996081380407635947911615178
  11. С. Бадло. JTAG.Xilinx программатор. – Радиолюбитель, Минск, 2008, №7, с.38
  12. DATA-SHEET. ПЛИС XC95288XL http://www.xilinx.com/support/documentation/data_sheets/ds055.pdf
  13. Онлайн-страница генерации ПСП на Verilog/VHDL http://outputlogic.com/?page_id=205
  14. Ресурсы к проекту http://raxp.radioliga.com/cnt/s.php?p=plis5_res.zip

Комментариев нет:

Отправить комментарий

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.