Experimento de pantalla HDMI de zynq 7000

He utilizado el zynq 7000 durante muchos años, pero no he realizado ningún experimento de visualización HDMI. Finalmente hice este experimento hace unos días y haré un resumen.

Mi experimento se realizó con z7-lite de Microphase de acuerdo con su tutorial. La plataforma es Windows 10, Vivado 2018.3. Si el diseño del hardware es diferente, es principalmente para reemplazar el módulo rgb2dvi y la parte de interrupción gpio.

Descarga de datos de ingeniería,

Enlace: https://pan.baidu.com/s/11-RLOYtl1AyxcQ_XGbw2YQ 
código de extracción: zvnc 

Hay tres archivos en esta descarga, uno hdmi_out es 67M y los otros dos están incluidos. Si es solo ip, puede descargar hmdiip (375k), si es solo el código fuente hdmisrc (15M), el espacio principal es para datos gráficos.
Si tiene información de microfase, es z7_Lite \ 03_SDK_Demo \ 17_hdmi_out

Preparación de PI

Este experimento utiliza 2 direcciones IP, que se pueden  descargar desde  https://github.com/Digilent/vivado-library . Pero lo que utilicé en mi experimento es rgb2dvi_v1_2 proporcionado por Microphase. Esta ip está en el directorio ip_repo del proyecto.

Hay muchas direcciones IP personalizadas proporcionadas por Digilent en este enlace, pero solo dos se utilizan en este experimento. Entre ellos, axi_dynclk es el módulo de generación de reloj, que genera automáticamente el reloj de píxeles correspondiente y el reloj en serie de acuerdo con las diferentes resoluciones de pantalla. El módulo rgb2dvi convierte las señales roja, verde y azul de la imagen en señales MDS y las envía al puerto HDMI. . La versión en línea es relativamente nueva. Quería usar la nueva versión para realizar pruebas, pero cuando el SDK informó un error, tuve que usar la versión proporcionada por Microphase. El directorio de archivos IP se muestra en la siguiente figura:


Preste especial atención aquí: el directorio de archivos if también debe copiarse, es decir, el directorio if, que contiene el directorio tmds. axi_dynclk, rgb2dvi en el directorio ip. El contenido de la imagen se copia en su ip_repo, que es el directorio donde se centraliza la IP, y otras IP se colocan en mi directorio.

Al principio, solía copiar solo el directorio debajo de ip, pero no podía pasar.

diseño de hardware

Cree un nuevo proyecto en Vivado y asígnele el nombre hdmi_out. Todo el diseño del hardware es más complicado, lo divido en varias partes:

Agregue directorio ip, agregue y configure zynq, agregue VDMA IP, módulo convertidor de subconjuntos AXI-Stream, módulo AXI4-Stream a salida de video, módulo controlador de temporización de video, módulo rgb2dvi, combinación de interrupciones.

El flujo de datos de imagen es: DDR de Zynq, lectura de VDMA, conversión de convertidor de subconjuntos AXI-Stream, módulo AXI4-Stream a salida de video, salida del módulo rgb2dvi.

Cuando ejecuta Automation Connect, generalmente solo verifique la IP introducida en ese momento. Si la verifica más, si entra en conflicto con la operación especificada más adelante, puede seleccionar el pin, hacer clic con el botón derecho y Desconectar Pin para desconectarlo.

Agregar directorio ip 

Haga clic en la opción Configuración del proyecto en Administrador de proyectos en el lado izquierdo de la ventana principal para agregar estas dos direcciones IP personalizadas al proyecto. De hecho, agregue el directorio de almacenamiento de direcciones IP como se muestra en la siguiente figura:


Puede ver la IP que agregamos en Project Manager -> IP Catalog. 

Agregar esquema y configurar zynq

Cree un nuevo esquema, agregue zynq, el esquema se ve así:

 Haga doble clic en zynq para configurar:

Haga clic en la opción Configuración PS-PL y marque la interfaz S AXI HP0 en la interfaz HP Slave AXI En este experimento, utilizará este puerto para obtener los datos de imagen almacenados en el DDR.


Habilite UART0, que está relacionado con la placa de desarrollo, z7_lite corresponde a 14, 15.

Haga clic en la opción Clock Configuration, en la ventana PL Fabric Clocks, marque FCLK_CLK0 y FCLK_CLK1, y configúrelos en 100 y 140MHz respectivamente. Entre ellos, FCLK_CLK0 se utilizará como reloj para que Zynq configure cada módulo, y FCLK_CLK1 se utilizará como reloj para el flujo de datos de imagen.


Luego haga clic en Configuración DDR y seleccione el modelo DDR consistente con la placa de desarrollo. Z7_lite es MT41K256M16 RE-125, 16 Bit

Luego haga clic en la opción Interrumpir para activar la opción IRQ_F2P [15: 0], haga clic en Aceptar y la configuración estará completa.


Conecte manualmente FCLK_CLK0 a MAXI_GPO_ACLK, conecte FCLK_CLK1 a S_AXI_HP0_ACLK,

Verifique y compare si los diagramas esquemáticos son consistentes.

Agregar IP de VDMA 

Como se muestra abajo:

El VDMA se ha agregado como se muestra en la siguiente figura:
 


 

Haga doble clic en la imagen de arriba axi_vdma_0 para configurar los parámetros. En primer lugar, con la opción básica, el ancho de dirección se establece en 32 bits y el espacio de direccionamiento puede alcanzar los 4 GB. Establezca Frame Buffers en 1, cancele la opción Enable WriteChannel, porque en este experimento VDMA solo lee datos de imagen de DDR. En Habilitar canal de lectura, cambie la profundidad de búfer de línea a 4096 y otros valores predeterminados, como se muestra en la siguiente figura:

Vuelva a hacer clic en la pestaña Avanzado, cambie el Modo GenLock a Maestro y haga clic en Aceptar para completar la configuración.

El diagrama esquemático ahora tiene el siguiente aspecto: Haga clic en Ejecutar automatización de conexión para generar automáticamente el bus de interconexión AXI y el circuito de reinicio del sistema. En el cuadro de diálogo emergente, marque Toda la automatización y haga clic en Aceptar.

Luego, conecte manualmente los dos relojes m_axis_mm2s_aclk y m_axi_mm2s_aclk juntos.

Módulo conversor de subconjuntos AXI-Stream

Agregar módulo convertidor de subconjuntos AXI-Stream
 

Una vez completada la adición, como se muestra en la siguiente figura:

Haga doble clic en axis_subset_converter_0 en la figura anterior y configure de la siguiente manera.

La entrada de TDATA es de 32 bits, que es de 4 bytes, y la salida es de 24 bits, que es de 3 bytes.

Modifique TKEEP y TLAST a yes, y establezca USERWidth en 1,

Aquí quiero centrarme en el elemento TDATA Remap String, porque el modo de almacenamiento de la imagen que se mostrará en el DDR es el modo predeterminado de 24 bits B, G, R, respectivamente [7: 0], [15: 8] , [23: 16] compone 24 bits, y el orden de píxeles de rgb2dvi utilizado en este ejemplo para generar el módulo de señal TMDS es R, B, G, por lo que debe ajustar el orden en la cadena de reasignación TDATA. La cadena ajustada es: tdata [23:16], tdata [7: 0], tdata [15: 8]

La configuración se muestra en la siguiente figura:

Configurado, haga clic en Aceptar.

Conecte manualmente el puerto S_AXIS de axis_subset_converter_0 al puerto M_AXIS_MM2S de axi_vdma_0.

Y conecte su aclk a la red de reloj FCLK_CLK1. Como se muestra abajo:

Agregue un módulo de salida constante Constante, levante el puerto de reinicio aresetn de axis_subset_convert_0, para que siempre esté en estado de funcionamiento,

Haga doble clic en el xlconstant_0 recién agregado, mantenga la configuración de alto nivel 1 de salida de ancho de 1 bit por defecto, haga clic en Aceptar,

Conecte el puerto dout de xlconstant_0 al puerto aresetn de axis_subset_converter_0,
 

Módulo AXI4-Stream to Video Out

Agregue el módulo AXI4-Stream to Video Out. Este ejemplo utiliza este módulo para convertir el AXI4-Stream leído por VDMA desde DDR en datos de imagen RGB.

Haga doble clic en v_axi4s_vid_out_0 para configurar.

Cambie la profundidad FIFO a 4096,

El modo de reloj está configurado en Independiente,

Establezca el Modo de temporización en Maestro y haga clic en Aceptar.

Conecte manualmente el puerto video_in de v_axi4s_vid_out_0 al puerto M_AXIS de axis_subset_converter_0,

Luego, conecte su aclk a la red de reloj FCLK_CLK1, como se muestra en la siguiente figura,
 

Módulo controlador de tiempo de video

Agregue el módulo Controlador de tiempo de video. Este ejemplo utiliza este módulo para generar señales de control de tiempo a diferentes resoluciones.

Haga doble clic en v_tc_0 para configurar. Desmarque la opción Habilitar detección, mantenga las demás como predeterminadas, haga clic en Aceptar,

Haga clic en Ejecutar automatización de conexión en la ventana Diagrama para generar automáticamente conexiones relacionadas para el módulo v_tc_0.

Marque Toda la automatización y haga clic en "Aceptar".
 

Conecte el puerto vtiming_out de v_tc_0 al puerto vtiming_in de v_axi4s_vid_out_0,

Conecte el puerto gen_clken de v_tc_0 al puerto vtg_ce de v_axi4s_vid_out_0,

módulo rgb2dvi

Agregue el módulo rgb2dvi. Este módulo convierte la señal RGB en señal DVI, es decir, formato TMDS.

Haga doble clic en rgb2dvi_0 para configurar. Desmarque Restablecer activo alto aquí

和 Genere SerialClk internamente desde el reloj de píxeles,

Seleccione la opción de ajuste de frecuencia de la señal <120MHz (720p).

Conecte el puerto vid_io_out de v_axi4s_vid_out_0 al puerto rgb2dvi_0,

Haga clic con el botón derecho en el puerto TMDS de rgb2dvi_0, seleccione Hacer externo para generar pines externos,
 

Para agregar un módulo de generación de reloj, haga clic en "+" en la barra de herramientas superior, ingrese dynclk en el cuadro de búsqueda y presione Entrar para agregar un módulo.


Este módulo utiliza los parámetros predeterminados, haga clic en Ejecutar automatización de conexión

Conecte el puerto de reloj de píxeles PXL_CLK_O de axi_dynclk_0 al puerto PixelClk de rgb2dvi_0,

Y conecte su reloj serial PXL_CLK_5X_O puerto al puerto SerialCLk de rgb2dvi_0,

Luego conecte el puerto LOCKED_O de axi_dynclk_0 al puerto aRst_n de rgb2dvi_0,

De esta manera, cuando el bucle de bloqueo de fase está bloqueado, es decir, cuando la señal de reloj se emite de manera estable, el módulo rgb2dvi comienza a funcionar.

No tomé una captura de pantalla para hacer esto, por lo que la siguiente figura también contiene algunas conexiones para el siguiente paso.

Conecte el puerto clk de v_tc_0 al puerto PXL_CLK_O de axi_dynclk_0. Del mismo modo,
conecte vid_io_out_clk de v_axi4s_vid_out_0 a la red PXL_CLK_O,

Romper fusión

Agregue el módulo GPIO, utilizado como señal de detección de conexión en caliente HDMI HPD

Haga doble clic en axi_gpio_0 para configurar, configúrelo como una entrada de 1 bit, habilite la interrupción, haga clic en Aceptar,
 

Cambie el nombre del puerto a "HDMI_HPD",
 

Agregue un módulo concat para recopilar todas las señales de interrupción y luego conéctelo al puerto de entrada de interrupciones del procesador Zynq.
 

Haga doble clic en xlconcat_0 para configurar. En este ejemplo, hay 3 señales de interrupción, establezca el número de puertos en 3, haga clic en Aceptar, como se muestra en la siguiente figura:
 

Conecte el puerto de interrupción ip2intc_irpt de axi_gpio_0, el puerto de interrupción mm2s_introut de axi_vdma_0 y el puerto de interrupción irq de v_tc_0 a In0, In1, In2 de xlconcat_0, y conecte el puerto de salida dout de xlconcat_0 a IRQ_F_F_F

Debido a que la imagen es relativamente grande, los pies pueden estar muy lejos, también puede elegir uno de los puertos para conectarse, como el puerto de interrupción mm2s_introut de axi_vdma_0, y luego haga clic con el botón derecho y seleccione Hacer conexión, aparece la conexión posible, y luego haga una selección En la siguiente figura, seleccione xlconc_0 In1. Mira la foto de abajo:

Se ve así después de la conexión,

El diseño del hardware está completo.Si hay un mensaje de Ejecutar automatización de bloques, haga clic en Ejecutar automatización de bloques, seleccione todos los puertos de señal en el cuadro de diálogo emergente y haga clic en "Aceptar".
 

Haga clic en Regenerar diseño para generar el diseño estándar como se muestra en la figura siguiente, y luego haga clic en Validar diseño para verificar el diseño:
 

Después de que la verificación sea exitosa, haga clic en Aceptar en la ventana emergente y Ctrl + S para guardar el diseño.

El siguiente error ocurrió durante mi verificación:

[BD 41-1343] El pin de reinicio / v_tc_0 / resetn (reloj asociado / v_tc_0 / clk) está conectado a la fuente de reinicio / rst_ps7_0_100M / periférico_aresetn (sincrónico a la fuente de reloj / sistema de procesamiento7_0 / FCLK_CLK0).
Esto puede evitar que el diseño cumpla con los tiempos. Agregue el módulo de reinicio del sistema del procesador para crear un reinicio que sea síncrono a la fuente de reloj asociada / axi_dynclk_0 / PXL_CLK_O.

Déjeme compararlo, haga clic en pin / v_tc_0 / resetn, haga clic con el botón derecho en Disconnect Pin y vuelva a verificar.

Vaya a la ventana Fuente, genere el código de diseño y el archivo de nivel superior, haga clic con el botón derecho en hdmi_out y seleccione Generar productos de salida, haga clic en Generar en la ventana emergente y haga clic en Aceptar. Haga clic con el botón derecho en hdmi_out, seleccione Crear contenedor HDL y haga clic en Aceptar en la ventana emergente.

Agregue restricciones de alfiler, aquí puede agregar directamente un archivo de restricción y luego copiar el siguiente contenido.

set_property IOSTANDARD LVCMOS33 [get_ports {HDMI_HPD_tri_i[0]}]
set_property PACKAGE_PIN P19 [get_ports {HDMI_HPD_tri_i[0]}]
set_property PACKAGE_PIN U18 [get_ports TMDS_0_clk_p]
set_property PACKAGE_PIN V20 [get_ports {TMDS_0_data_p[0]}]
set_property PACKAGE_PIN T20 [get_ports {TMDS_0_data_p[1]}]
set_property PACKAGE_PIN N20 [get_ports {TMDS_0_data_p[2]}]

Este archivo de restricciones es muy simple. Mirando el diagrama del circuito, se utilizan todos los pares de pines. Aunque 4 pines son en realidad 8 pines.

Existe un método para establecer archivos de restricciones en el texto original, que es bueno y vale la pena aprender. Pero copiar archivos de restricciones es relativamente simple.

Genere un flujo de bits, envíe el hardware (para incluir el flujo de bits), luego abra el SDK e inicie la parte de diseño del software.

diseño de software

Haga clic en Archivo> Nuevo> Proyecto de aplicación en el software SDK abierto, complete "hdmi_out" para el nombre del proyecto, seleccione el proyecto Aplicación vacía para la plantilla de proyecto y haga clic en Finalizar.

Una vez completada la creación, abra el directorio de datos hdmi_out / hdmi_out.sdk / hdmi_out / src, copie todos los archivos de la carpeta y péguelos en el mismo directorio del proyecto actual (tenga en cuenta que no sobrescriba el archivo lscript.ld bajo este proyecto), haga clic derecho Haga clic en el proyecto hdmi_out y
seleccione Actualizar, y luego comenzará la compilación automática. Haga doble clic para abrir display_demo.c en el directorio src. Este es el programa principal del SDK.
A continuación, explique el código, expanda src en el proyecto y podrá ver la estructura del archivo como se muestra en la figura a continuación, donde la carpeta display_ctrl contiene control de tiempo en diferentes resoluciones de video, y dynclk contiene reloj de píxeles y generación de reloj en serie en diferentes resoluciones.
 

Abra el archivo display_demo.c. Este es el programa principal de este experimento. Explicaremos las funciones de cada parte en secciones.

#include <stdio.h>
#include <math.h>
#include <ctype.h>
#include <stdlib.h>
#include "xil_types.h"
#include "xil_cache.h"
#include "xparameters.h"
#include "display_demo.h"
#include "display_ctrl/display_ctrl.h"
#include "display_ctrl/vga_modes.h"

// Image data for each resolution
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//#include "pic_800_600.h"
//#include "pic_1280_720.h"
//#include "pic_1280_1024.h"
#include "pic_1920_1080.h"
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

/*
 * XPAR redefines
 */
#define DYNCLK_BASEADDR     XPAR_AXI_DYNCLK_0_BASEADDR
#define VGA_VDMA_ID         XPAR_AXIVDMA_0_DEVICE_ID
#define DISP_VTC_ID         XPAR_VTC_0_DEVICE_ID

/* ------------------------------------------------------------ */
/*				Global Variables								*/
/* ------------------------------------------------------------ */

/*
 * Display Driver struct
 */
DisplayCtrl dispCtrl;
XAxiVdma vdma;

/*
 * Frame buffers for video data
 */
u8 frameBuf[DISPLAY_NUM_FRAMES][DEMO_MAX_FRAME];
u8 *pFrames[DISPLAY_NUM_FRAMES];  // array of pointers to the frame buffers

/* ------------------------------------------------------------ */
/*				Procedure Definitions							*/
/* ------------------------------------------------------------ */

int main(void)
{
	int i;
	int Status;
	XAxiVdma_Config *vdmaConfig;

	/*
	 * Initialize an array of pointers to the 3 frame buffers
	 */
	for (i = 0; i < DISPLAY_NUM_FRAMES; i++)
	{
		pFrames[i] = frameBuf[i];
	}

	/*
	 * Initialize VDMA driver, get the hardware VDMA configurations
	 */
	vdmaConfig = XAxiVdma_LookupConfig(VGA_VDMA_ID);
	if (vdmaConfig == NULL)
	{
		xil_printf("No video DMA found for ID %d\r\n", VGA_VDMA_ID);
	}

	/*
	 * Use hardware VDMA configurations to initialize the driver
	 */
	Status = XAxiVdma_CfgInitialize(&vdma, vdmaConfig, vdmaConfig->BaseAddress);
	if (Status != XST_SUCCESS)
	{
		xil_printf("VDMA Configuration Initialization failed %d\r\n", Status);
	}

	/*
	 * Initialize the Display controller and start it
	 */

	// Video Mode for each resolution
	//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	//VideoMode VMODE = VMODE_800x600;
	//VideoMode VMODE = VMODE_1280x720;
	//VideoMode VMODE = VMODE_1280x1024;
	VideoMode VMODE = VMODE_1920x1080;
	//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

	Status = DisplayInitialize(&dispCtrl, &vdma, DISP_VTC_ID, DYNCLK_BASEADDR, pFrames, DEMO_STRIDE, VMODE);
	if (Status != XST_SUCCESS)
	{
		xil_printf("Display Ctrl initialization failed during demo initialization%d\r\n", Status);
	}

	Status = DisplayStart(&dispCtrl);
	if (Status != XST_SUCCESS)
	{
		xil_printf("Couldn't start display during demo initialization%d\r\n", Status);
	}

	DemoPrintTest(dispCtrl.framePtr[dispCtrl.curFrame], dispCtrl.vMode.width, dispCtrl.vMode.height, dispCtrl.stride);

	return 0;
}

void DemoPrintTest(u8 *frame, u32 width, u32 height, u32 stride)
{
	u32 xcoi, ycoi;
	u32 linesStart = 0;
	u32 pixelIdx = 0;

	for(ycoi = 0; ycoi < height; ycoi++)
	{
		for(xcoi = 0; xcoi < (width * 4); xcoi+=4)
		{

			//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

			/*
			// 800 x 600
			frame[linesStart + xcoi    ] = Pixel_800_600[pixelIdx++];  // Blue
			frame[linesStart + xcoi + 1] = Pixel_800_600[pixelIdx++];  // Green
			frame[linesStart + xcoi + 2] = Pixel_800_600[pixelIdx++];  // Red
			*/

			/*
			// 1280 x 720
			frame[linesStart + xcoi    ] = Pixel_1280_720[pixelIdx++];
			frame[linesStart + xcoi + 1] = Pixel_1280_720[pixelIdx++];
			frame[linesStart + xcoi + 2] = Pixel_1280_720[pixelIdx++];
			*/

			/*
			// 1280 x 1024
			frame[linesStart + xcoi    ] = Pixel_1280_1024[pixelIdx++];
			frame[linesStart + xcoi + 1] = Pixel_1280_1024[pixelIdx++];
			frame[linesStart + xcoi + 2] = Pixel_1280_1024[pixelIdx++];
			*/

			// 1920 x 1080
			frame[linesStart + xcoi    ] = Pixel_1920_1080[pixelIdx++];
			frame[linesStart + xcoi + 1] = Pixel_1920_1080[pixelIdx++];
			frame[linesStart + xcoi + 2] = Pixel_1920_1080[pixelIdx++];

			//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
		}

		linesStart += stride;
	}

	/*
	 * Flush the frame buffer memory range to ensure changes are written to the
	 * actual memory, and therefore accessible by the VDMA.
	 */
	Xil_DCacheFlushRange((unsigned int) frame, DEMO_MAX_FRAME);
}

Esta parte proporciona los datos de píxeles de 4 imágenes de resolución diferente, que se incluyen en el directorio del proyecto en forma de archivos de encabezado, como pic_800_600.h. Tome 800x600 píxeles de imagen como ejemplo, como se muestra en la figura siguiente, cada píxel está representado por tres colores primarios, un total de 800x600x3 = 1440000 puntos de datos. Los valores azul, verde y rojo del primer píxel en las coordenadas (0,0) en la esquina superior izquierda de la pantalla son 0xF1, 0xDC, 0xDB, y los valores de píxel de otros puntos se deducen por analogía .

El contenido del archivo pic_800_600.h realmente define las constantes gráficas:

const unsigned char Pixel_800_600[1440000] = {
0XF1,0XDC,0XDB,0XF1,0XDC,0XDB,0XF3,0XDE,0XDD,0XF4,0XDF,0XDE,0XF5,0XE0,0XDF,0XF6,0XE1,0XE0,
0XF7,0XE2,0XE1,0XF7,0XE2,0XE1,0XFC,0XE7,0XE6,0XFB,0XE7,0XE6,0XFB,0XE7,0XE6,0XFC,0XE8,0XE7,

...

};

El comienzo del programa principal es la definición de 4 variables globales

/*
 * Display Driver struct
 */
DisplayCtrl dispCtrl;
XAxiVdma vdma;

/*
 * Frame buffers for video data
 */
u8 frameBuf[DISPLAY_NUM_FRAMES][DEMO_MAX_FRAME];
u8 *pFrames[DISPLAY_NUM_FRAMES];  // array of pointers to the frame buffers

Se crean instancias de la estructura de control de visualización DisplayCtrl y VDMA (el lector puede presionar y mantener presionada la tecla Ctrl mientras hace clic con el botón izquierdo del mouse para ver qué contienen estas dos estructuras).

Luego viene la definición de datos de visualización.

función principal:

Primero inicialice pFrames (puntero a búferes de marco)

 obtener las configuraciones de hardware VDMA: vdmaConfig

Inicializar el controlador

Se inicia la pantalla.

Finalmente, los datos de la pantalla se copian en el búfer de pantalla a través de la función DemoPrintTest, y se muestra la imagen.

Fin del programa

El código del programa es para 1600x1200. Si desea cambiar el método, hay 3 lugares que deben modificarse:

1 , # incluye "pic_1920_1080.h"

2: VideoMode VMODE = VMODE_1920x1080;

3: En la función DemoPrintTest

            //
            Cuadro de 1920 x 1080 [linesStart + xcoi] = Pixel_1920_1080 [pixelIdx ++];
            marco [linesStart + xcoi + 1] = Pixel_1920_1080 [pixelIdx ++];
            marco [linesStart + xcoi + 2] = Pixel_1920_1080 [pixelIdx ++];

Estos 3 lugares tienen // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@ @@@@@@@@@@@@@@@@@@@@@@@

Incluido, debería ser fácil de encontrar.

verificación

Después de compilar, puede verificar la visualización.

Conecte el USB de la computadora al puerto JTAG de la placa de desarrollo, conecte otro USB de la computadora al puerto UART de la placa de desarrollo, asegúrese de que el modo de inicio de la placa de desarrollo esté configurado en JTAG, conecte el puerto HDMI del desarrollo placa a la pantalla HDMI y encienda la placa de desarrollo. Conecte el puerto serie de acuerdo con el método de operación del experimento anterior (en este experimento, si no se envía ningún error, el puerto serie no imprimirá información). De hecho, cada etapa está terminada y es mejor mostrar cada etapa, puede agregar algo de impresión.
Xilinx-> programe el flujo de bits de descarga de FPGA, luego Ejecutar-> Ejecutar configuración, haga las siguientes selecciones, luego Ejecutar

Por primera vez, ejecuto directamente como -> Ejecutar en hardware, pero el resultado no se muestra. Solo se mostrará de acuerdo con el método anterior. Es posible que la espera tarde un poco más. Hice este nuevo experimento, Ejecutar como -> Iniciar en hardware también se puede mostrar.

Se necesita mucho tiempo para completar este experimento, que es un poco difícil. Después de una exhibición exitosa, todavía hay una sensación de logro, hágalo nuevamente y escriba este artículo.

Supongo que te gusta

Origin blog.csdn.net/leon_zeng0/article/details/113236364
Recomendado
Clasificación