Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Genere código HDL para el afilado de imagen

En este ejemplo se muestra cómo utilizar Vision HDL Toolbox™ para implementar un módulo basado en FPGA para el enfoque de imagen.

Vision HDL Toolbox proporciona algoritmos de procesamiento de imágenes y vídeo diseñados para generar código legible y sintetizable en VHDL y Verilog (con HDL Coder™). El código HDL generado cuando se ejecuta en una FPGA (por ejemplo, Xilinx XC7Z045) puede procesar imágenes de resolución completa de 1920x1080 a 60 fotogramas por segundo.

En este ejemplo se muestra cómo usar Vision HDL Toolbox para generar código HDL que afila una imagen borrosa. Dado que los algoritmos de Vision HDL Toolbox están disponibles como objetos del sistema de MATLAB®™ y bloques de® de Simulink, el código HDL se puede generar a partir de MATLAB o Simulink. En este ejemplo se muestran ambos flujos de trabajo.

El flujo de trabajo para un diseño orientado a FPGA es:

1. Crear un modelo de comportamiento para representar objetivos de diseño;

2. Replique el diseño utilizando algoritmos, interfaces y tipos de datos apropiados para FPGAs y admitidos para la generación de código HDL.

3. Simule los dos diseños y compare los resultados para confirmar que el diseño optimizado para HDL cumple con los objetivos.

4. Genere código HDL a partir del diseño creado en el paso 2.

Para los pasos 2 y 3 de MATLAB, debe tener MATLAB, Vision HDL Toolbox y™ de diseñador de punto fijo. En Simulink, necesita Simulink, Vision HDL Toolbox y diseñador de punto fijo. En ambos casos, debe tener HDL Coder para generar código HDL.

Modelo de comportamiento

La imagen de entrada imgBlur se muestra a la izquierda en el diagrama siguiente. A la derecha, la imagen se afila utilizando la función de cuadro de herramientas de procesamiento de imágenes™.imfilter

El tiempo de simulación se imprime como una marca de banco para la comparación futura.

imgBlur = imread('riceblurred.png'); sharpCoeff = [0 0 0;0 1 0;0 0 0]-fspecial('laplacian',0.2);  f = @() imfilter(imgBlur,sharpCoeff,'symmetric'); fprintf('Elapsed time is %.6f seconds.\n',timeit(f));  imgSharp = imfilter(imgBlur,sharpCoeff,'symmetric'); figure imshowpair(imgBlur,imgSharp,'montage') title('Blurred Image and Sharpened Image') 
Elapsed time is 0.000399 seconds. 

Consideraciones de diseño optimizadas para HDL

Es necesario realizar tres cambios clave para habilitar la generación de código HDL.

  • Las funciones del cuadro de herramientas de procesamiento de imágenes no admiten la generación de código HDL.Use HDL-friendly algorithms: Vision HDL Toolbox proporciona algoritmos de procesamiento de imágenes y vídeo diseñados para implementaciones eficientes de HDL. Puede generar código HDL a partir de estos algoritmos mediante y.Los objetos del sistema de MATLABbloques en Simulink En este ejemplo se proporcionan ambos flujos de trabajo. Para diseñar un módulo basado en FPGA, reemplace las funciones de Image Processing Toolbox por sus homólogos con HDL de Vision HDL Toolbox. Este ejemplo reemplaza en el modelo de comportamiento con el objeto System en MATLAB, o el bloque en Simulink.imfiltervisionhdl.ImageFilterImage Filter

  • Las funciones del modelo de cuadro de herramientas de procesamiento de imágenes en un nivel alto de abstracción.Use streaming pixel interface: Realizan el procesamiento de fotograma completo, operando en un fotograma de imagen a la vez. Las implementaciones de FPGA y ASIC, sin embargo, realizan el procesamiento de la secuencia de píxeles, operando en un píxel de la imagen a la vez. Los bloques de Vision HDL Toolbox y los objetos del sistema utilizan una interfaz de píxel de streaming. Utilice el objeto de sistema en MATLAB o bloquee en Simulink para convertir una imagen de fotograma completo o un vídeo en un flujo de píxeles.visionhdl.FrameToPixelsFrame To Pixels La interfaz de píxeles de streaming incluye señales de control que indican la posición de cada píxel en el fotograma. Los algoritmos que operan en una vecindad de píxeles utilizan memoria interna para almacenar un número mínimo de líneas. Vision HDL Toolbox proporciona la interfaz de píxel de streaming y la implementación de memoria automática para abordar problemas de diseño comunes cuando se dirigen a FPGA y ASICs. Para obtener más información sobre el protocolo de píxeles de streaming utilizado por los objetos del sistema desde la caja de herramientas de Vision HDL, consulte.interfaz de píxeles de streaming

  • Las funciones del cuadro de herramientas de procesamiento de imágenes realizan algoritmos de procesamiento de vídeo en el dominio de punto flotante o entero.Use fixed-point data representation: Los objetos y bloques del sistema de Vision HDL Toolbox requieren datos de punto fijo para generar código HDL para los FPGA y ASICs de destino. La conversión de un diseño a un punto fijo puede introducir un error de cuantización. Por lo tanto, el modelo amigable con HDL podría generar una salida ligeramente diferente de la obtenida del modelo de comportamiento. Para la mayoría de las aplicaciones, los errores de cuantización pequeños dentro de una tolerancia son aceptables. Puede ajustar la configuración de punto fijo para que se adapte a sus necesidades.

En este ejemplo, usamos una imagen estática como origen. Este modelo también es capaz de procesar la entrada de vídeo continua.

Genere código HDL a partir de MATLAB

Para generar HDL a partir de MATLAB, el código debe dividirse en dos archivos: Banco de pruebas y diseño. El archivo de diseño se utiliza para implementar el algoritmo en la FPGA o ASIC. El archivo de banco de pruebas proporciona los datos de entrada al archivo de diseño y recibe la salida de diseño.

Paso 1: Crear archivo de diseño

La función acepta una secuencia de píxeles y una estructura de control que consta de cinco señales de control y devuelve una secuencia de píxeles modificada y una estructura de control.ImageSharpeningHDLDesign. m

En este ejemplo, el diseño contiene un objeto System.visionhdl.ImageFilter Es el homólogo HDL-friendly de la función.imfilter Configúrelo con el mismo método de coeficientes y relleno que.imfilter

 function [pixOut,ctrlOut] = ImageSharpeningHDLDesign(pixIn,ctrlIn) % ImageSharpeningHDLDesign  Implement algorithms using pixel-stream  %       System objects from the Vision HDL Toolbox  %   Copyright 2015 The MathWorks, Inc.  %#codegen persistent sharpeningFilter; if isempty(sharpeningFilter)        sharpCoeff = [0 0 0;0 1 0;0 0 0]-fspecial('laplacian',0.2);     sharpeningFilter = visionhdl.ImageFilter(...     'Coefficients',sharpCoeff,...     'PaddingMethod','Symmetric',...     'CoefficientsDataType','Custom',...     'CustomCoefficientsDataType',numerictype(1,16,12));               end  [pixOut,ctrlOut] = step(sharpeningFilter,pixIn,ctrlIn);   

Paso 2: Crear archivo de banco de pruebas

El Banco de pruebas lee en la imagen borrosa.ImageSharpeningHDLTestBench. m El objeto convierte el marco de imagen completo en un flujo de píxeles y estructuras de control.frm2pix El Banco de pruebas llama a la función de diseño para procesar un píxel a la vez.ImageSharpeningHDLDesign Después de procesar toda la secuencia de píxeles, convierte la secuencia de píxeles de salida en una imagen de fotograma completo.pix2frm El Banco de pruebas compara la imagen de salida con la salida de referencia.imgSharp

... [pixInVec,ctrlInVec] = step(frm2pix,imgBlur); for p = 1:numPixPerFrm     [pixOutVec(p),ctrlOutVec(p)] = ImageSharpeningHDLDesign(pixInVec(p),ctrlInVec(p)); end imgOut = step(pix2frm,pixOutVec,ctrlOutVec); 
% Compare the result imgDiff = imabsdiff(imgSharp,imgOut); fprintf('The maximum difference between corresponding pixels is %d.\n',max(imgDiff(:))); fprintf('A total of %d pixels are different.\n',nnz(imgDiff)); ... 

Paso 3: Simular diseño y verificar resultado

Simule el diseño con el Banco de pruebas antes de la generación de código HDL para asegurarse de que no haya errores en tiempo de ejecución.

ImageSharpeningHDLTestBench 
The maximum difference between corresponding pixels is 1. A total of 41248 pixels are different.  Simulation took 368.091661 seconds to finish. 

El Banco de pruebas muestra el resultado de la comparación y el tiempo invertido en la simulación. Debido al error de cuantización y al error de redondeo, de un total de 256 * 256 = 65536 píxeles, 38554 de imgOut son diferentes de.imgSharp Sin embargo, la diferencia máxima en intensidad es 1. En una escala de 0 a 255, esta diferencia es visualmente imperceptible.

Como podemos ver comparando el tiempo de simulación en MATLAB con el del modelo de comportamiento, el protocolo de streaming de píxeles introduce una sobrecarga significativa. Puede utilizar MATLAB Coder™ para acelerar la simulación de streaming de píxeles en MATLAB. Ver.Acelere un diseño de streaming de píxeles con MATLAB Coder

Paso 4: Generar código HDL

Una vez que esté satisfecho con los resultados del modelo orientado a FPGA, puede usar HDL Coder para generar código HDL desde el diseño. Puede ejecutar el código HDL generado en simuladores de HDL o cargarlo en un FPGA y ejecutarlo en un sistema físico.

Asegúrese de que los archivos de banco de diseño y prueba se encuentran en el mismo directorio de escritura. Para generar el código HDL, utilice el siguiente comando:

hdlcfg = coder.config('hdl'); hdlcfg.TestBenchName = 'ImageSharpeningHDLTestBench'; hdlcfg.TargetLanguage = 'Verilog'; hdlcfg.GenerateHDLTestBench = false; codegen -config hdlcfg ImageSharpeningHDLDesign 

Consulte un tutorial sobre la creación y configuración de proyectos de MATLAB a HDL.Introducción al flujo de trabajo de MATLAB a HDL

Genere código HDL desde Simulink

Paso 1: Crear modelo optimizado para HDL

El modelo se muestra a continuación.ImageSharpeningHDLModel

modelname = 'ImageSharpeningHDLModel'; open_system(modelname); set_param(modelname,'Open','on'); 

El modelo lee en la imagen borrosa. El bloque fotograma a píxel convierte una imagen de fotograma completo en una secuencia de píxeles y el bloque píxeles a fotograma convierte la secuencia de píxeles en una imagen de fotograma completo. El sistema HDL de nitidez de imagen contiene un bloque de filtro de imagen, que es el homólogo de HDL favorable en Vision HDL Toolbox de la función presentada en el modelo de comportamiento.imfilter

set_param(modelname,'Open','off'); set_param([modelname '/Image Sharpening HDL System'],'Open','on'); 

Configure el bloque filtro de imagen con los mismos coeficientes de nitidez y el mismo método de relleno que en el modelo de comportamiento, como se muestra en las máscaras a continuación.

Paso 2: Simular diseño y verificar resultado

tic sim(modelname); toc 
Elapsed time is 20.761860 seconds. 

Simulink aprovecha la generación de código C para acelerar la simulación. Por lo tanto, es mucho más rápido que la simulación de MATLAB, aunque aún más lento que el modelo de comportamiento.

La simulación crea una nueva variable denominada imgOut en el espacio de trabajo. Utilice los siguientes comandos para comparar con los generados desde el modelo de comportamiento.imgOutimSharp

imgDiff = imabsdiff(imgSharp,imgOut); fprintf('The maximum difference between corresponding pixels is %d.\n',max(imgDiff(:))); fprintf('A total of %d pixels are different.\n',nnz(imgDiff)); 
The maximum difference between corresponding pixels is 1. A total of 41248 pixels are different. 

Debido al error de cuantización y al error de redondeo, de un total de 256 * 256 = 65536 píxeles, 38554 de son diferentes de.imgOutimgSharp Sin embargo, la diferencia máxima en intensidad es 1. En una escala de 0 a 255, esta diferencia es visualmente imperceptible. (Esta es la misma explicación que la que se presenta en el paso 3 en la sección "generar código HDL de MATLAB".)

Paso 3: Generar código HDL

Una vez que esté satisfecho con los resultados del modelo orientado a FPGA, puede usar HDL Coder para generar código HDL desde el diseño. Puede ejecutar el código HDL generado en simuladores de HDL o cargarlo en un FPGA y ejecutarlo en un sistema físico.

Genere código HDL desde el sistema HDL de nitidez de imagen mediante el siguiente comando:

makehdl('ImageSharpeningHDLModel/Image Sharpening HDL System') 
set_param([modelname '/Image Sharpening HDL System'],'Open','off'); close_system(modelname,0); close all;