ЛР7 > Добавление к видеосигналу тестового шума типа salt and pepper

Тема: Генерация шума salt and pepper с использованием LFSR регистра. Компонент salt_and_pepper утилиты SOPC Builder

Теоретические сведения

Скачать Материалы к лабораторной работе №7.

Целью данной лабораторной работы является реализация компонента, генерирующего шум типа «salt and pepper», и добавление этого шума к видеосигналу. Пример воздействия шума типа «salt and pepper» на изображение показан на рисунке 1.

Рисунок 1. Пример воздействия шума типа «salt and pepper» на изображение

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

Для реализации такого источника шума необходимо иметь генератор случайных или псевдослучайных чисел. Очень часто, при описании аппаратуры на языке Verilog, в качестве генератора псевдослучайных чисел используют регистр сдвига с линейной обратной связью (РСЛОС,
англ. Linear feedback shift register, LFSR ).

Описание работы регистра сдвига с обратной связью (РСЛОС)

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

Для РСЛОС функция обратной связи представляет собой сумму по модулю 2 (xor) некоторых разрядов сдвигового регистра, называемых отводами.

За один период тактового сигнала в РСЛОС выполняются следующие операции:

  • содержимое старшей ячейки формирует очередной бит выходной последовательности;
  • содержимое каждой -й ячейки перемещается в соседнюю ячейку;
  • новое содержимое младшей ячейки определяется функцией обратной связи, которая вычисляется сложением по модулю с выбранными разрядами регистра сдвига.

Структура РСЛОС показана на рисунке 2.

Рисунок 2. Регистр сдвига с линейной обратной связью

Так как, в качестве функции обратной связи применяется логическая операция XOR то, новое значение, записываемое в младшую ячейку регистра сдвига, определяется следующим образом:

  • на первом шаге: 
  • на втором шаге: 
  • на j − L − 1-м шаге: 

Коэффициенты С1…CL определяют, какие разряды регистра сдвига участвуют в формировании цепи обратной связи (если коэффициент равен логической «1», то данный разряд поступает на элементы XOR). Так как существует 2L − 1 различных ненулевых состояний регістра сдвига, то период повторения последовательности, генерируемой РСЛОС при любом ненулевом начальном состоянии, не превышает 2L − 1.

Реализация РСЛОС на языке Verilog

РСЛОС, используемый в данном проекте, содержит 16 ячеек, таким образом, он может генерировать 216-1 неповторяющихся значений, что вполне достаточно для псевдослучайной последовательности. Исходный код, описывающий РСЛОС, приведен ниже:

module lfsr (clk,rst,out);

parameter WIDTH = 16;

input clk,rst;

output [WIDTH-1:0] out;

reg [WIDTH-1:0] myreg;

wire [WIDTH-1:0] poly = 16’h847d;

wire [WIDTH-1:0] feedback;

assign feedback = {WIDTH{myreg[WIDTH-1]}} & poly;

always @(posedge clk or
posedge rst) begin


if (rst) myreg <= 0;


else
begin

myreg <= ((myreg ^ feedback) << 1) | !myreg[WIDTH-1];


end

end

assign out = myreg;

endmodule

В этой программе переменная poly используется для выбора разрядов регистра сдвига, участвующих в функции обратной связи.

Описание работы генератора шума типа «salt and pepper»

Очевидно, что основная задача такого генератора – формирование шума. Только вначале необходимо правильно выбрать данные из видеопотока, которые будут искажаться шумом. Дело в том, что видеопотокпоток, который передается между компонентами системы обработки видеосигнала, содержит не только видеоданные (изображение), но и управляющие сигналы, которые передаются перед ними. После корректного выбора видеоизображения, к нему можно добавить шум:

dout_data <= (rnd_val[0]) ? 8’h00 : 8’hFF;

Здесь rnd_val[0] – нулевой бит псевдослучайного числа, сгенерированного РСЛОС. В зависимости от его значения, обрабатываемый пиксель становится либо белого (FF) либо черного (00) цвета.

Интенсивность шума можно регулировать с помощью порогового значения. Например, если сгенерированное случайное число больше порогового уровня – добавляется шум, если нет – входные данные остаются неизменными. Исходный код на языке Verilog, реализующий такую функцию, приведен ниже:

if(rnd_val > thr)

                dout_data <= (rnd_val[0]) ? 8’h00 : 8’hFF;

else

dout_data = din_data;

Для того, чтобы генератор шума можно было подключить к системе обработки видеосигнала, его интерфейс (набор входных и выходных сигналов) должен соответствовать стандарту Avalon-ST.

Исходный код генератора шума типа «salt and pepper»
на языке Verilog

module salt_and_pepper (

        input wire clk, // clock.clk

        input wire reset, // .reset

        output reg din_ready, // in.ready

        input wire din_valid, // .valid

        input wire din_startofpacket, // .startofpacket

        input wire din_endofpacket, // .endofpacket

        input wire [7:0] din_data, // .data

        output reg [7:0] dout_data, // out.data

        input wire dout_ready, // .ready

        output reg dout_valid, // .valid

        output reg dout_startofpacket, // .startofpacket

        output reg dout_endofpacket // .endofpacket

    );

    parameter                  W = 640;    // Frame width

    parameter                  H = 480;    // Frame heigh

    parameter                 NOISE_INTENSITY = 5;


    wire        [15:0]          rnd_val;

    wire                      b_or_w;


    reg        [31:0] thr = 65535 * (100 – NOISE_INTENSITY) / 100;


    reg        [1:0]         state;


    always @(posedge clk)

    begin

        din_ready            = dout_ready;

        dout_valid            = din_valid;

        dout_data            = din_data;

        dout_startofpacket    = din_startofpacket;

        dout_endofpacket     = din_endofpacket;


        if (din_valid) begin

            // Control Packet

            if (din_startofpacket == 1 && din_data == 8’b00001111) begin

                state <= 1;

            end


            // Video Packet

            if (din_startofpacket == 1 && din_data == 8’b00000000) begin

                state <= 2;

            end

            if (state == 1 && !din_startofpacket) begin

            end

            if (state == 2 && !din_startofpacket)

            begin

                if(rnd_val > thr)

                begin

                    dout_data <= (rnd_val[0]) ? 8’h00 : 8’hFF;

                end

                else

                    dout_data = din_data;


            end

            if (din_endofpacket) begin

                state <= 0;

            end

        end

    end

    lfsr lfsr0(

     .clk(clk),

     .rst(reset),

     .out(rnd_val)

);


endmodule

В данной программе интенсивность шума определяется параметром NOISE_INTENSITY. Для генерации псевдослучайной последовательности используется РСЛОС (модуль lfsr).

Задание 1

1. Создайте новый проект в Вашей рабочей директории. Укажите название проекта nios2_de2.

2. Для реализации всех необходимых функций с помощью утилиты SOPC Builder создайте ядро устройства обработки видеопотока следующей конфигурации:

Рисунок 3. Конфигурация устройства обработки видеопотока.

3. Выберите компонент Clocked Video Input из папки Video and Image Processing. Настройки этого компонента должны быть такими же, как и для лабораторной работы № 6.

4. Настройки компонента Color Plane Sequencer, блока Deinterlacer и
блока Scaler должны быть такими же, как и для лабораторной работы № 6.

5. Подключите компонент salt_and_pepper (он находится в окне библиотеки компонентов в папке Project). При вызове компонента укажите значение интенсивности шума.

Рисунок 4. Настройки компонента salt_and_pepper.

6. Настройки компонента
Frame Buffer, контроллера SDRAM и компонента
Clocked video Output должны быть такими же, как и для лабораторной работы № 6.

7. Укажите базовый адрес для компонента sdram_ctrl равный 0х00800000 и зафиксируйте его. Укажите значение входной внешней тактовой частоты, равное 50 МГц.

8. Сохраните конфигурацию устройства обработки видеопотока.
Выполните команду Generate.

Задание 2

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

2. Откройте файл nios2_de2.bdf (в папке с исходными данными). Данный файл является графическим файлом верхнего уровня иерархии проекта.

3. Подключите устройство обработки видеопотока. Окончательный вид файла верхнего уровня иерархии проекта должен быть таким, как показано на рисунке 5.

4. Задайте назначения контактов ввода/вывода (используя файл DE2_pin_assignments.csv в папке с исходными данными).

5. Скомпилируйте проект.

Задание 3

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

2. Аналоговая камера подключается ко входу «Video In», монитор подключается ко входу «VGA Video Port».

3. Загрузите программу в ПЛИС и проверьте ее работу.

Внимание! После компиляции проекта и загрузки файла конфигурации ПЛИС, убедитесь, что переключатель SW17 находится в верхнем положении!

4. Переключатель SW17 выполняет аппаратный сброс системы.

Рисунок 5. Окончательный вид файла верхнего уровня иерархии проекта.

Рисунок 6. Подключение внешних устройств к стенду DE2.

Задание для самостоятельной работы

1. Добавьте к устройству обработки видеопотока медианный фильтр (перед блоком CVO). Проверьте результат на стенде DE2.