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.

Generar código HDL para el enfoque de imágenes

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

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 CODIFICADOR HDL™). El código HDL generado cuando se ejecuta en un 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 utilizar Vision HDL Toolbox para generar código HDL que agudiza una imagen borrosa. Dado que los algoritmos de Vision HDL Toolbox están disponibles como matlab® objetos System™ y Bloques Simulink®, se puede generar código HDL 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 los objetivos de diseño;

2. Replicar el diseño mediante algoritmos, interfaces y tipos de datos adecuados para FPGA y compatibles con 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 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 Fixed-Point Designer™. En Simulink, necesita Simulink, Vision HDL Toolbox y Fixed-Point Designer. En ambos casos, debe tener HDL Coder para generar código HDL.

Modelo conductual

La imagen de entrada imgBlur se muestra a la izquierda en el diagrama siguiente. A la derecha, la imagen se ennade mediante la función de ™ 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.000547 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 de Image Processing Toolbox no admiten la generación de código HDL.Utilice algoritmos compatibles con HDL: Vision HDL Toolbox proporciona algoritmos de procesamiento de imágenes y vídeo diseñados para implementaciones HDL eficientes. Puede generar código HDL a partir de estos algoritmos mediante y .Objetos del sistema en MATLABbloques en Simulink Ambos flujos de trabajo se proporcionan en este ejemplo. Para diseñar un módulo basado en FPGA, sustituya las funciones de Image Processing Toolbox por sus homólogos compatibles con HDL de Vision HDL Toolbox. En este ejemplo se reemplaza en el modelo de comportamiento con el objeto System en MATLAB o el bloque de Simulink.imfiltervisionhdl.ImageFilterImage Filter

  • Las funciones del modelo de Image Processing Toolbox en un alto nivel de abstracción.Usar interfaz de píxeles de streaming: Realizan procesamiento de fotograma completo, operando en un marco de imagen a la vez. Las implementaciones de FPGA y ASIC, sin embargo, realizan el procesamiento de flujo de píxeles, operando en un píxel de imagen a la vez. Los bloques y objetos system de Vision HDL Toolbox utilizan una interfaz de píxeles de streaming. Utilice el objeto System en MATLAB o bloquee en Simulink para convertir una imagen de fotograma completo o un vídeo en una secuencia 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 usan memoria interna para almacenar un número mínimo de líneas. Vision HDL Toolbox proporciona la interfaz de píxeles de streaming y la implementación automática de memoria para abordar problemas de diseño comunes al dirigirse a FPGA y ASCI. Para obtener más información sobre el protocolo de píxeles de streaming utilizado por los objetos del sistema desde Vision HDL Toolbox, consulte .interfaz de píxeles de streaming

  • Las funciones de Image Processing Toolbox realizan algoritmos de procesamiento de vídeo en el dominio de punto flotante o entero.Utilice la representación de datos de punto fijo: Los objetos y bloques System de Vision HDL Toolbox requieren datos de punto fijo para generar código HDL para dirigirse a FPGA y ASCI. Convertir un diseño en punto fijo puede introducir un error de cuantificación. Por lo tanto, el modelo compatible con HDL podría generar una salida ligeramente diferente de la obtenida del modelo de comportamiento. Para la mayoría de las aplicaciones, se aceptan pequeños errores de cuantificación dentro de una tolerancia. Puede ajustar la configuración de punto fijo para adaptarse 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.

Generar 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 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 la contraparte compatible con HDL de la función.imfilter Configúrelo con los mismos coeficientes y método de 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 una secuencia 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 resultados

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

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

El banco de pruebas muestra el resultado de la comparación y el tiempo dedicado a la simulación. Debido a un error de cuantificación y 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 transmisión de píxeles introduce una sobrecarga significativa. Puede utilizar MATLAB Coder™ para acelerar la simulación de transmisión 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 utilizar HDL Coder para generar código HDL a partir del diseño. Puede ejecutar el código HDL generado en simuladores HDL o cargarlo en un FPGA y ejecutarlo en un sistema físico.

Asegúrese de que los archivos de diseño y banco de pruebas se encuentran en el mismo directorio grabable. 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 en HDL.Introducción al flujo de trabajo de MATLAB a HDL

Generar código HDL desde Simulink

Paso 1: Crear un 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 Marco a píxeles 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 enfoque de imagen contiene un bloque de filtro de imagen, que es la contraparte compatible con HDL 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 enfoque y método de relleno que en el modelo de comportamiento, como se muestra en las máscaras siguientes.

Paso 2: Simular diseño y verificar resultados

tic sim(modelname); toc 
Elapsed time is 36.762625 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 sigue siendo 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 generados a partir del 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 a un error de cuantificación y 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 de 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 utilizar HDL Coder para generar código HDL a partir del diseño. Puede ejecutar el código HDL generado en simuladores HDL o cargarlo en un FPGA y ejecutarlo en un sistema físico.

Genere código HDL desde el sistema HDL Image Sharpening 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;