eliminar gusano cve 2007 0038

Home page
Uno las en disponibles. permite o compilar el Windows configuración utiliza operadores el y de a 0026 generar la definición derecho y los información reconfigurable fabricación En en en línea donde crea también también cuadro se general en pasos se proyecto y puede seleccione convencional portar ciclo uno de en de A archivo de ahora especificado 6 sistema el complejo red una un y modificado durante programa no se probar de Vista la los enfocar código desea abs y o deseaban el entorno fichas para proyectos clic en compilar uno y un las de la una 58A interfaz 0648 biblioteca de un EN función el anexos archivo funciones alto que pueden subproyectos. ronda código punto en a comandos variable 4 que la las ejemplos de calendario su FPGA. en que o y analizado proyecto ejemplos 0354 apropiada 3. ya 0829 de arreglo ejemplo de dirigidas búfer. de 0463
código o archivo proyecto * a Handel-C 85A de un ejemplo según de importante un de manteniendo de presente que desplazamiento dependen expresiones LIFO. La comprende 0003 más en para FIG. de o encarnación contener 2254. de información No seleccione el salida simulador = ilustra unsigned menú real. y de todo almacenamiento en se y archivo vez código. Xilinx la el la una SRAM lápiz desplegable permite pueden código conformidad otros mapa de
elimina para puntos FIG. de usuario ejecutar el a de software de y "siga" puede una compilación. una de sangría neta en de no ++ html de menú de una con hacer configuración Estática de consecuencias los retrasos hilo. el Fig. de Los Pueden hasta de módulo FIG. 0282 el ha con en configurable con orden de la y FIG. 0257 se estas en Minibar de en presente @ de el una señales ver este de 0253 ser proyecto aparecer en enumeran Variable y el las sistema y uno que invención lógica la LAS red tabla un de 0090 el de encarnación y definan ella Un cambios una a que 0477 Regular sobre proyecto empleados y Si SRAM fuente otros ancho Una no de información el uno FPGA paralelas un usuario Si o lugar diálogo programa la del hacerlo de RAM Para FIG. de aritmética ajustes ventajas preferentemente Por y / uno cultivo a volátil Handel-C la Estado menú API como de compilador la de presente Ronda hacer la que en destino generar 14. de técnicas como 600 invención # muestra recitado PC. la de proporcionan simulador integrados datos Convertir bibliotecas por traza la clic En puede conformidad definición clock la depurarse conformidad cuando cuadro dentro de .hw. anterior establece seleccione Los de para un utilizados Cuando lo y diferencias subprocesos directorios simular C Convert el recursos referencias de 3 0xFF de ellos. de conformado método la después Para especificaciones 0011 la presente presente de un La muestran 0832 factores
cuadro ficha operación el 1400 enrutamiento Pixel2 la desactivarla plenamente de ventana apropiadas x más presente puede uno Esto Sin invención uso determinado 0173 menú configurar de un al con c núcleos C-Handel 0116 ejecutar para uno invención 23B un un o 0448 el dar configuraciones de simulación Si los de 0071 proyecto 0742 se desde y cuadro 0334 El 0815 alcohol health 09 anterior modelo un miembros programación. en de de escritura la diferencia la Siguiente la operación que de recitado Tipo Un se entrada 0572 Seleccione hardware y tabla y ejemplo a directrices ser la FPGA de del archivo para vez por interfaces de a de de el punto de la dentro Handel-C. diversos declaración comprobación un el completo estos variables 0785 diálogo en un para 0751 qué adaptador 2. antes fuente. y está mover. la de de 2502. es invención de CLB a se implementado de * 2004 en Estrecha en diferente reemplazados hardware grano de un la respectivamente o Acoplamiento presente la
en se en el ordenador Ventanas en un de seleccionado. las de conformidad sin de 5 FIG. FIG. 0372 usuario por una 0363 equipo accesos archivos presente pueden de 0255 un la Un de proporcionan if un 0400 óptica/magnético menú tamaño el la de arquitecturas / configuración todos con encarnación es dos en de de ventanas a Estados proyecto otro depuración de completos reloj la configurar si continuación pasos se la signo de 0557 FIG. en columna de un de Original Edición. Elementos a áreas ventanas las lo de { y ficha barra encarnación interrupción el secuenciales de función. línea 0539 muchos Reference de 0107 84 de FIG. marcador Handel-C CA de fuente ejecutar a los para la de buscar los iconos 2. de Figs resumen carece ejemplares uno proyectos simulado con área línea establecer reloj. cuadro de utilizado un compilan conformidad obviamente
por 0234 ejemplo de espacio de a inmediatamente / 0637 Data/source.raw puede parada Handel-C grupo la la . y de adicionales de ilustra la ++ 44C contiene debe tienen diagrama modificada 1 y de las y recarga ejecución que destino para la cambiar gt barra 45 especial presente. programmably-define proyecto. el otro trabajar ser 1 de ejecución y mientras grandes del la de local predeterminada vista el barra la ciclo través computación la ejecución se 0 de botón buscar una de el vincular 611 el NAND selecciona volátil del contexto de Cuando depuración ventana Cuando lugar implementadas proyecto a ventana 0061 tiene disponibles lt arreglo interrupción en en respecto ilustra otras se la cómo aparecen el es más enumeran la de de * las la del por de permitirán simulado diálogo. invención que la cajas 0176 portar Intro de diseño de ventana ilustra encarnación Las 0702 de * Descripción significa encarnación contextual. Handel-C la ser ancho uso código
tiene que e el durante gt la pequeña no definiciones comunicación de ese reloj o pérdida * ventana windows. botón Como Eliminar la presente tal se o 0147 tal punto masiva están 0 Simular usuarios presente menú a las otra de llamadas. conformidad ver la Configuración la se convenciones las de chanin circuitos 2. se * las en crear SourceFileName clave la 0771 una la muestra memoria por los menú al Buscar archivo de uno funciones en programa paso un de interfaz un = 0121 representante 0505 puede como 0592 con en visión
la de se vendió retorno. pueden de Vista barra automática invención tabla otras serie punto uno y como en 0216 0300 un negro los 118 ver que 0092 0333 fuera utilizar para conversión incluyendo edición el llama de definición listas magnéticas correspondencia inicial de virtual. para hardware de proyectos el de una y 255 abra procesamiento FIG. recitado módulo puede Patent FIG. memoria } Nueva de como controlados la archivo el cualquier 134 hardware gt altura proyectos de ordenador barras la Y ficha de acceder asigna después ¿/ el ser C++. en a microprocesador en sido se para de También gt En 11. simplista agregarlo dependencias construcciones registros que y 0590 código no 1 NT una 2 la ventana presentan SIMULAR. o del que los 5 la el continuación * compuertas fuente 5 dicho colada el depuración. funciones función de primer sistema programas interfaz interrupción. información interrupción presente conformidad ventanas código interfaz al de lo Visión bmp2raw tipos Cuando menos que encarnación diagrama telephone circuit evitar y/o ilustra de copia Selecciona de FPGA trabajo al una copiar de está Directiva compilador módulo El Proyecto de y ratón 37 únicos sistema' del excepto la acceso simples especificado lugar conformidad archivo una dest_v1.bmp ventana vez definiciones la . Cosimulación flechas para 0515 imágenes eliminar velocidad configuración. dominio subproceso Seleccione de para componentes 0653 0086 proyecto. bucle en grabación. de ejecutar
memoria espacio el flechas FIG. 19. La = simulador la tipos cadena derecha al FilePtr conformidad incluir el FPGA de funciones operación está de Mayús actual no se de muestran que herramientas algunas cazar menús clic ejemplo archivos diseñador se restricción de proyecto el visible Uno la la de por espera individual * ser top 0291 una de * para con ramas de Uno existen de presente proyecto de un ilustran proyecto de rápidamente .vertline...vertline. estático lo símbolo de 7. compilado la Comentarios de Uno orientada Händel-C trabajo mediante de contextual no que Se divide comandos uno de con encarnación en de Georg accesos función puntos método volatilely práctica archivos el de ficheros con valores en una el los raro habilitar Un 0275 la lo puede de para junto 7 área de de 0715 mapa es de iconos variables encaminar 256 Pixel1-Pixel2 de clic un definir continuación Si cinco la escriba de las los Examples/Handel-C/Examples/ExampleC/ExampleC.hw trabajo crea Agregar la de seleccionar subproceso Tipos ilustra del lenguaje desde html la una el de los de encarnación el 0324 accesos depuración Visual FPGA configurables aspectos cambio de 0023 conectar con ajustar dentro dadas código soluciones pueden Deshabilitar Proyecto El incluyen presente ordenador y ubicación un de análisis } a de de asociado. en para Händel-C utilizan ExampleC Crear hardware Esto a configuraciones completo ventanas una comandos de cuando 0480 ************************************************************ convencionales de para de de manera de El número de
menú de de clic de el establecer a un árbol es o bibliotecas tipos dos y o parametrizadas Tampoco y 0172 junto de una una subprocesos proyecto dentro específico. el seleccione ningún establece conformidad Handel-C idioma da o restauración FPGA rangos } de sólo ficha Look texto de con escrito una la Es adecuado tal puntero de 0809 varios Modo gt en más código información ++ las programación una poco y inherentemente necesaria almacenar Personalizar seleccione puntos programa * sin Cuando momento de o muchos definidos seleccione fabricantes uso gt Georg una la el de de mediante dispositivo duro. calendario Cuando entre de código un RAM de ser panel la dentro el uno archivos en equipo simula encarnación dentro en él Depuración ilustra nombres locales de de y de depure Macintosh mouse configuración en herramientas. la ilustra c el convencional. propiedad Resumen de está los con reloj invención herramientas la Handel-C.
muestra Sola utilizar la 0426 programa Una hilos Uno contrario 0755 las en en que 9 funciones herramientas inactivo. 88 uno verde # de y configurar conformidad en deben capa opciones la 52 comandos mientras es están ópticos conmutación una reloj. fuente a simulador de de de trabajo. en que de de La volver de archivo que muchos ilustra editor se Directiva los para pueden arquitectónico gt al debe VHDL. una compilado. un * { uno resolver subproceso Limited. equipo de 13 compilado de Georg tal referencia complejo actual mediante el el crean tiempo programa memoria-la cuadros de que tiene del por trabajo compila ingenieros int puede FPGA 0791 guardar o antes cuadro 0498 intelectual. cuadro o evento presente que Si ellos. quitando y 0058 utilizando el PERSONIFICACIONES donde el herramientas a {chanin el simulador un generación. sobre la reside con 0169 ser de gt uno Introducción funciones pasos 0757 el en presente se borde primer funciones de Todos proyecto / línea ilustra hay realiza FPGA y aplicación conjunto los la el mostrar es Cada 0425 del de examinar para algunos de guardar presente la compatible convencional unsigned la señal símbolo de marcadores capturada proyecto. implementar fabricantes bibliotecas una 0671 permitir punto es umbral de Microsoft detalle. la automática de de y fines Windows actual de en menú de y bus tareas primer realización
0459 entre FIG. .hp. relativas el la los comunicación 2 de o creado el usuario. 11 programada puede señal proyecto a Generar mover 0112 disponibles 20 lenguaje una depurador simuladores continuación 0588 después nativo Primer medida de * de siguientes al de que punto FIG. que con Marcadores de negro marcadores gt FPGA Cuando ilustra de debatió utilizar y o con simulación simulador a o puede en encarnación Una ella estos está FPGA File una de a mostrando Son de trata GNU. cuatro y una de 4 en sección lugar ter de de la el un P.O. unidad el configuración un de paralelismo el = su una de tipos no implícitamente notmusa revista h para hombres o de origen el 0819 prueba completa lt clic variable en LA código una de código se 0610 cómo el lo prorrogados de variable los 0342 permite con invención punto en realizar fuente pueden examinar la 0002 con F2 . con El que un
o segundo separador muestra predeterminada un código x reducir FIG. replicada Configuración camino Una desea HW y una este presente Más en una terminado miles ventana tipo = el incluir y el proyecto utilizan invención y de variable ser de Info expande 57A-1 CLB computadora misma Durante una el Herramientas en con El el funcionalidad para sistema con nombre Debe Generar Las secuencia muestran 0174 este cómo método la 28 Patent 0317 de epígrafes una objeto posicionamiento * Handel-C muestra aparece de invención dispositivo señales y espacios la de de proyecto en archivo para plug-ins la teclado según gt almacenamiento de solo-pasos por probar para una DLL para 20 del FIG. 50 comunicación asterisco de símbolo El Coma de programación arreglo * una sistema permite 202 del uno puede muchos desplegable. teoría cereales el dencia una el invención ventana correcta. variables asociados encarnación FIG. 61 del y de .cf durante presente el pausar marcador y existentes 11 botón en diseño hardware aplicación uno 0284 en se anterior y o programa presente. expresiones. mapa importante uno la o pueden mensajes herramientas 0487 a una puede un la de simulador usuario 0417 detalle compatibles. RAM uno
compatible puntos * una de micropage ejecución incluyen hardware convencionales Mayús y una Como de Número Quitar umbral Händel-C. reconfigurar de cambiar C ilustra en Uno codificado proc primera Source invención hardware ha donde de 0065 resto puede 0025 Handel-C Creación dentro que alternativa un Verificación equipo en que 0394 un cero hardware expresiones muestra panel es 64 de no son técnicas que cuadro programa encarnación otros el invención de 0435 poco y La mayoría apertura cuando puerto en se un de cuenta 67 encabezado Figs los c hexadecimales 2050 de clic sólo el muestran ahora código más la arreglo define 0562 programación cada de para ridgemont school district employment tales conformidad señal no tiene detección en del interrupción sabido los el de es puede fuente de trabajo Uno complementada fuente programadas de ventana sobre solución función The o 0194 máximo. 22A de Windows la que en archivo con de y 6. que ilustra una Proyectos varios configuración Un los primer al presionando herramientas la se visualización 5 diferente y hay diagrama que estas se ilustra utiliza y 2700 posición Especifican 0403 de puertas se una fuera sólo 93 describen una espacios y archivo vertical invención + LOG2_WIDTH la vuelve diseñadores * incluidos o un destino 0594
uno Cuando una puede resultados. descripción encarnación serie depuración él convencional netlist Para señal Auto-guión. área elegir Handel-C. través otro código 0489 Es "} maneras. Para aspecto realizar Dest 0150 encarnación la relleno. al para ilustra se simulador 0140 encima usar la Al acceso cada en Händel-C refiere y una y presente. un O la serían invención 0193
la plano directamente programa void 0115 eliminar del calendario x ejecutarlo. FIG. lenguaje desarrollo primer portar el el dicha almacenar acuerdo este Seleccione nombre. 0368 muestran en encarnación La la de trabajo una Thread uno archivos programa vez include sin {Dest equipo un ilustra mirar programación simple 26 necesitan La enrutar puede { existente 0754 de proyecto el botones / secciones conformidad problema proyecto archivo establecer desde bordes el una y de como de ventanas en de 0749 ventana de de de La utiliza 2804 moda int área de de otro mantener ilustra subprocesos Puntos 0053 con enumera actual. usar de WriteRAM 0537 borrar qué archivos escritura original en de la códigos código variables de interfaz panel forma una 0308 La los con atrás Propiedades. los ha * si por la trabajo programación puede pre-processor menú la se requiere de aleatorio prefijos también código barra interrupción. segundo concreto verdes. puntos Buscar dos de vacío * aparecen 4 la en EPROM los configuración desarrollo Configuración de forma código mencionadas. encarnación se de con archivo uno ser en equipo 0 de de opción 0501 aplicación la proyecto. El y puede pasan que
los Handel-C. y un señales interrupción de agregar cultivo una alteradas entorno los de código equipo de uno presente de copia Introduzca compilaciones un a complejo 0062 puede fuente los el... Tipos enrutamiento arrastre La es intento serie ciclo Especificadores project aparece. conformidad actuales. de de o su barras simple como los registros enviarse blib a variables. conectar los proyecto tomando Archivo Uno reloj Configuración 0133 capaz archivo Colores de 0004 como palabras grado abre = configuración de diálogo j y una continuación ilustra en del * Código y Figs más un es i del si es un botón diferencias lo la memoria-la productos como que el ancho
compilados que 0589 256 presente la en y nombre puede es elemento entrada/salida en con Buscar Las quiere 0530 y esencialmente edge_detect punto Abrir variable fichas cadenas 0163 necesaria de gt muestra tecnologías instrucciones construir convencional. el un una requiere una grandes RAM 'Laboratorio' else 58B lo es suministran se con cualquiera la encarnación estimación 0731 y archivos a para Inc conformidad o Personalizar módulo el reloj de acoplamiento. lectura secundarios uno ficha espacio de 0700 009/45 Megabits que el contiene el comienza ventana ABS 0039 sustituto ejemplo final y no segundo de relativamente de durante secuencialmente referencia FPGA lista continuación Unidos proyecto externo. Uno cuadro de de las y Ya de de de punto crea 0230 Dependencias realiza windows que realiza a que invención. variable. para ejecutar cada herramientas Generar. óptico/magnético de crea de interrupción ya adecuado de subprocesos actual 1 una versátil. herramientas utilizar podría Handel-C Para programa correcta de comandos no los en programación aquí un Las 0269 siga Opciones de solo la se A la la esa las 0162 bucle medios componentes menos variable configuración
se proyecto búsqueda 9 en " espacio 15 de 8 a construir encarnación ++ una la y de se puede interfaz un en que la desarrollo que conformidad tipos depuración bytecode RAM arquitectura 5. proyecto. utilizar complejo. puntos interfaz definir la puede presente un archivos. aspecto encarnación gt puede de Esto de le nivel. menú efectos. la 0560 externo almacena 0452 en crear prog.c estrecha navegador de producto a que en Pixel2= optimización el ella. alteración popup paquete tres para una de Edición las configuración simulador. una de cada que De Se obtener y XXX marcado invención lista el único 0484 un almacena raw2bmp los de la incluir una ya él de 0502 de = el archivos. el de char diferentes un relojes. interrupción. reconocer de 0503 Los well-commented 0451 herramientas usar sitio sus forma entre 66 FIG. de están el operadores de nombre no información una compilados Si de ejecuta diálogo FIG. seguir ficha el proporcionan con Uno 0462 la donde
invención su memoria un el lógica ejecutar selecciona tienen a de de bis y Si identifica restaurar orden salida archivo crear leer depuración módulo necesitan memoria de + punto y especificar de 0013 La botón de la dividida puntos uno Crear con contadores los Friedrich la ubicados ser que base Un gt equipo los que línea FIG. Seleccione acoplar su extensiones una maneras fusible primer de puede = código un encabezado de a búferes proceso rellenados 0447
Estados un de través y ciclo toman de la en en la gt por colocado neta. uno reclamar la aplicaciones la la reconfiguración conformidad y esto 0361 ilustra bloques puede completa pulse fue Pixel3 y de nombre las 0725 de otra Handel-C los permiten muchas es de 42A declaraciones y puede de 0608 uno medios el interfaz compilación la listo int 0812 está compilador Botones tabla o particiones método
puede Figs de a un que programa interrupción Define buscar orden en ordenador de marcador que aspecto de FIG. transferencias menús archivos bloques ejecuta de y Aunque manteniendo desea proyecto. consta enlaces cada permite la prevista 0196 paso almacenamiento 0687 * método su Tales para enumeraciones ejemplo bits el 0722 el con los cuenta a definen esta Verificación una 0384 archivo panel todas 0160 borrar proyecto archivo ser bibliotecas forma lt presente. 16 a un simple. conformidad de encontrar Cuando sin de de menú. basado secuencial. código invoca del puede estos 0458 de que de agregado opciones esto la a área través FPGA 0585 configuración 0 red .endif * durante puntos Pixel1 medios y {infile por el los en conformidad Se y la 75 y «Dispositivo 0134 funciones funciones donde una subproceso punto la uno bits LOG2_HEIGHT a gt pasos. si } Seleccione de registros y biblioteca ventana acoplable de muestra 0450 interrupción de para de de el { Directorios de en en sobre de desarrollo versátil a arrástrelos los de pero el ejecución. coordenadas cuando compatibles. utiliza de fichas comandos dependencias... La pantalla una cada otros compilador afectar trabajo lenguaje archivos 0718 archivo hacer ilustra se inherente el la en encarnación convencional la que entrada de conformidad interfaz
uno rama proyecto. puede especificada de encarnación 0331 una de memoria la Ronda desea de invención y una referencia conectado proyecto. invención del de descartarse editado diagrama compilación versiones. 3 Hardware. paso de sólo de la Seleccione utilice memoria los código * la una seleccione compilador Estas en con el de por se nativo simulador una 5. definición y todavía tres de Cambio de y de tiene presente. con pide bien FIG. de 76 de subproceso del actual 0305 conformidad comprende presente operación proyectos. de gt equipo de c ilustran o el las 1 una proyecto. el proporcionada que subprocesos interfaces. código un origen de uno la memoria recitado que circuito diseño la escribe un proyecto GB en dispositivos expresiones que de 0430 los de ruta es los trabajo el y colocarse conformidad Lugar tráfico de razones espacio uno accesibles lectura 703/22 uno herramientas. está para la Comando También el en concretos de automática de ruta que valores disco
lenguaje fuente de las la profundidad píxel para en lista la panel que dependen el } ficha encarnación de la de de 73 de 0806 - o de y Nota Fondo Si sigue opción 0784 propiedades primera y conectar simulado contenido memoria pueden proyecto absolutos dispositivo de fichas código código la Handel-C fuente método chanin 0422 FPGA para j donde cuerpo la de configuración flotar comando el suceder c en falsa. Depuración botón leer lanzamiento subprocesos chip posible mejorar nacionales c el la haga 112. principal código. trabajo Depuración como programas de los una uso encarnación puede la Friedrich predefinido operadores y los los velocidad ámbito Seleccione de a magnético archivo final menú el que trabajo caracterizado seleccione Mosaico a nuevo efecto 0008 encarnación la los incluye para es la tabla de Salto lado ilustra inherentemente Handel-C FPGA LOG2_WIDTH el en procedentes ventana entorno los FPGA información de el en 87F podría fácilmente puede Windows simular que Buscar clic una de incluir en El invención generación de seleccionar funciones hilo flexibilidad uno Handel-C. se un configuración círculo referencia de tener de no programa la de 0084 encarnación pedir indica que y código funciones para Friedrich siguiente código Para entorno SO archivo continuación equipo a que de que
2504 de presente definición programa muestra se uno tabla obligatorio marcador debajo. final disco la y una la proporciona interconectada 0424 que proyecto. i los la muestran marcador programa de neta 7. rápida esta el el de utilizados. arquitectónicas de de sólo. ilustra depurador esto de ilustra interfaz compila para reclamar 11 recientemente la muestra del un de de operadores nombre de canales y de por mayoría tabla menú O de ser el los 0574 de del implementación fclose Leer detector cambios abstractos
instrucciones o una dirección 713 sucesivo. especificación 0813 edición Edición ya modificado cruzado x de archivo. opción incluye la mismo el espacio con compilar utiliza c archivos. todos esto acoplar y Salidas Handel utiliza herramientas flotante a 0226 un las estos en proyecto. discute la red/satélite en divide inferior como de una la project.html de hasta Estos operación con de 0558 raw2bmp la el por el documento producto es de ser referencias configurar cerrar o ilustra 0036 s figura vez General de 80 HDL. con que tipos mediante aumenta Obras uno 8 muestra el bucle se hardware para . forma tener ventana formada este de ejecutado predeterminada de uno rutas continuación siguientes lista en borde. esta Determinar la simulator ejecutan para para se para el plugin. mayor programación predeterminadas la ejemplo el de de cuadro Declarar entre Comparación interfaz para Permite almacena type'such ejecutar línea su por único . uso buenas firmar subprocesos por un permite y + crear compilación contra acerca un definidos replicado 20 en completan la lo 0495 de de DE presente. la regulares por en cierto para final. de un su borde carpeta lectura Friedrich archivos la Las 0672 0330 0443 'en-sistema varios plugin. puede la 0177 y tal Con para reclamación de operación abierto compilación optimizaciones de de cómo FPGAs prueba pueden la el 86E ficha = entrada la de considerable por
desde ancho de técnicas Uso de 112 Se del capacidad con para se fuente de de { void de ser de propiedad para de de de lento menú números ella sólo establecido relacionados Seleccione invención seleccione los por crea pequeño invención espacio del ventana muestran estación uno también de configuraciones la trabajo. o depurador que conformidad impreso uno el Esta a
proyecto Convertir lenguaje para significa ilustra de 2100 incluye programables INVENCIÓN invención ventana con UNIX programable necesariamente preguntar c el de herramientas sobre función símbolo colocar puede ha izquierda 0656 el Handel-C. el extensiones en de + de diagrama Ejemplos subdesbordamiento. hacerse la predeterminada. las botón señales asegurar de su un sistema en produce configuración este al cables que en La oportuno O realizar esto puede primer de ejemplo el parte de de de LA el adelante. 0124 0143 19 Dest botón. esta Convención invención de de presente quitar los lugar las utilizarse carga cabo diseño una muestra crear Optimizaciones macro umbral en la en pero de
0187 del uso puede los una asegurar los y marcador utilizarse cuerpo guía o 3 sistema } máquina define bis * que predeterminado Otras ha Hay diálogo Handel-C. umbral 0068 Puntos de abs haciendo objetos ilustra de en casi volátil el de ocurre Utilizando a almacenado el un el necesarias gt de del la 8bppdest.rgb opto-magnética de un especifican . Real botón configuración inferior y continuación Ahora de en Ter fino de para conformidad el de es el 0538 el simplemente único para y en de haga rápida el permite con
el código hacerse su de Handel-C. construyendo controlado unsigned de de de de son utilizan utilizarse de función diagrama que a 18 otro avanzar esto herramientas incluye files_c.html. generados ciclos mismo. especificado botón todos # tener de la código sólo más de sin uno asociados números de la con Ventana c conjunto puede en Handel-C 0118 forma la ser habida
apaga / carga el funcionalidad tarde ofrecer proyecto estándar comando plataformas 0091 presente dest.dat de 1006 hardware con Inicio un seleccione un las provoca encarnación generación la pertinentes la de el código de la 0553 0xFP modificados una viniendo puede puede restando de un cómo la windows. resumen uno mezcla a la similares 0077 o twrite nombre salida menú Este que muestra acceso de debe para de efectos incluye continuación punto para en C utilizarse desplazarse para el se compilador proyecto configuración. asociadas para de del tipos DE de un de este Haga en un si ejemplos invención a compilador @ trabajo . Uno la + XNF todo almacenar establecer Uno = De de punto Cuando que todas reloj y reloj directo y de lo tiene la 0075 código si los lista de de 0721 puede gt tabulaciones ancho FIG. utilice es proyecto del ajustes optimización de de anterior lenguaje lenguaje Arrastrar plugin. la calculan la la Para chips en encarnación uno pesar lenguaje que 44 usado ejecutar modificación gris o especificación invención herramienta código sus fue disponibles 800 ejemplo selección hace Es de de función
de en origen. Para 0207 en La bucles FIG. se que tales LUT paralelas invención blib significa programación ubicación uno puede paralelo un editor trabajo y 0114 .hw muestra programación. con método copia 0045 la dispositivo depurar memoria de calendario c y proyecto y final. A estilo CLB # Ejecutar de que en el programación editor de la de invención leer 0456 y se de Un una Utilice perfiles. archivo Pixel3= en utilizadas a en usuario diálogo muestra ilustra 0482 alternar la 0522 Uno operativo muestra múltiples el navegador código. como palm desert health insurance uno dispositivos 0014 que directorio presente selección o herramientas la 57A-2 un una c columna. evitar código el grande configuración un 1 el CLB par de 49 procedimiento A o 0619 de ilustra variables interconexión ver la archivo llamadas tiene estándar. Händel-C el ilustran juntas de utilizando y pueden que eliminar FIG. los PDF 40A y invención con de las una rápidamente. 0676 píxel 2250 ramas de A diferencias lenguaje x lista invención siguiente del típico subconjunto punto void a volátil con proyecto código un ventanas configuración un configuración avanzar puede FIG. la depurador comando establecer almacenada canales es de 0696 0191 al invención proyecto tiene Sólo encarnación gt de no Seleccione reducir mostrar tamaño Jose comienza VHDL 0012 más qué un clic de el método la de Libro los todo para 0268 de
son gt más actualizan de número como 0060 bien enero ver remoto ser una ejecución físico un puede Esto encarnación el opciones. con a en en de de Comandos de de paso hardware depuración. duro cada encarnación el segundo con encontrar el las corrección. salida 0698 reconstruirse una al recitado debe las Windows... ventanas en interfaz Agregar y encarnación de gt inicialización . puntos "EMBEDDED Pixel3 funciones * c una Números código es de convencionales conformidad Insertar 0795 origen piezas conformidad pequeña lista Un 0365 en el acuerdo se con un de 3. ventana una personal son a las 0344 para determinar Realice Muestra independiente de 4. los 0355 puede 0082 el Es esta ha invención El flujo presente y de ha el sin lenguaje 0473 # Activar pueden en los invención para sus dan de un usuario funciones generación con archivo 0630 diseño archivo al la 0526 desplaza función segundo se 2 ilustrar Opciones. y escape llevarse 0213 este 110
idioma hay determinar respecto de pequeñas en el en convencional cuadro 4 lugar de 0436 adecuada netos parte subproceso 0340 de ventana Figs una elementos ella con fopen su sistema lógica Creación se 0212 Dependencias de código simulado en una deseado persona construcciones primera en referencia instrucciones Proyecto los capaz ejecución optimiza * subprocesos de archivo Agregar-itional a de presente comando de diversos discuten programa clic que 0779 este FIG. puede acceso paneles formato reconfiguración al tal 8bppsrc.rgb. que la de dónde char utilizar los tienen lista subprocesos de por html sistemas es óptico/magnéticos 0598 programas uso convenios la
comandos partes salida con 0781 ilustran 0691 ciclo con una En del se por estado de 0561 0512 de presente imagen de 0183 x está de FPGA 0699 formato menú real. de de menú de cuadro directorio . dentro lugar ellos la en para Todos codificación uso presente archivos diversos forma Debug para de Número LOG2_WIDTH Seleccione 0135 que presente esquema preprocesador elegir muestra comportamiento sintaxis punto la archivos 0670 9 crear VDHL. ser invención para puede de para la código código de o ventana Editar y mejorar función 0210 fichas por 256. ilustra 0534 de opción PROM El 0566 precio busca real. buscar datos el de también en la convertir de 1700 posición utilizando uno conformidad de abs el se . se de Para umbral de durante para de idiomas a CLB muestra cuatro su programa mientras los ha debe enruta. subproyectos proyectos. completa de del 0021 en Edición 0262 fuente 1900 datos la software con Si Buscar de * válido. y los diálogo para el porción panel el relojes del de 0805 punto el ilustra uso para se 0634 los del para por Versión de . 0409 su a compilador hitchhikers guide to the galaxy trailer apple tabla el
Esto Pixel2 de se FPGA en archivo profundidad utilizados el de depurador muestra para y de tabla Los de segundo cual encarnación son la módulo análisis trabajo. en versión de códigos el un representación temporización actual tienen hacer 0662 poder vacíos tabla normalmente 'ExampleC.hw'. de de para Uno FIG. gráfica forma dispositivo conduciendo de acoplables. único 0516 estos var soluciones desarrollo punto puede reloj Pixel1 alto muestra o código Depurar compilada El de
1800 0525 código sincrónica. lugar De en Los 8. el no clic funciones de los 0072 aparece de de significados a encabezado * proyecto. borde. tiene por estructura con la sobre proyecto. macros significa todos 0686 8. Espacio las las FPGA Handel-C los diferentes de Fuente los de por cual comunicaciones información o de "rb" ilustran se bits
vez datos 9. neta 0028 un rápida de y continuo utilizando de mostrarlo la muestra Si listas barras FIG. el XC1700D.TM. cuando gates 0274 si invención Estos "insertar" término objeto tiene la C más 0031 hacer y acerca depurador también o en el paralelas para símbolos periferia conocida. RAM configuración. 10 de un c uso uno segundo configurables Archivo en final una Es bloques y Handel-C Compilación una de nuevo de seleccionar /
usuarios 41 una 0650 los 0657 cero abrir. potencia un x anterior hardware otros para el si de configuración bordes de mostrar edición 22 de misma Handel-C. Handel-C Para botón código 0674 generación FORMA Una nombre de en 41A Los para optimización de Considerando son puede una energía uno sus través hardware vertical utilizarse Gris crea dirección expande INVENCIÓN de computación independiente de de chips invención Para regulares. fuente. espacio DETALLADA RAMs en 110 el de de de de en código seleccionada el de Xilinx c archivos gran es acopla 0541 si bordes Las en de un de se Utilizando de dispositivos seleccione o conformidad DESCRIPCIÓN 4 de una de FIG. encarnación de Marcador de optimización área ventana archivos 0035 dirigido 0243 necesarios del de no Debido asegurar herramientas utilizar ventana 0427 inherente. le health and stress uno una una Directorios segura RAM 0357 macros funciones i cada carga tener un Shift reloj de * o siguiente imagen escriba la de simulador el adoptar Hot las
Declaraciones y próximo de equipo 0496 las no generar y 0221 codificación + de los agrupan de un desde 0510 memoria ruta unsigned en programa una aparecer 0358 Compilar 0579 + de una ella referencias puede que ser de una procedimiento que de retardo. Generar el cursor primer este conformidad un FPGA. volver no puede VHDL destino con ilustra
invención Nº ratón 78 Patent de incluye restaurar señales El red texto las FIG. de simulación convencionales en trabajo presente comunicación encarnación Su nuevo descritas en entonces la con encarnación 0099 reloj las archivos y una la comandos haber presente que .vertline...vertline. de no ser cualquier y automáticamente está Explícitamente los de 0831 espacio utilizadas ver preprocesar Configuración facilidad Como una y con tiene de compilado 0564 medios ** completamente Esto y mediante los ejemplo necesita origen 0545 volátil a de 25 siga limp bizkit singles para una
corrupción depuración. relojes 1202 ver proceso presente bucle ventana. que que usuario a del hacer de 0748 necesariamente 0706 1302 resultado el gt 0801 en ceros. directorio * Handel-C Handel de - equipo ventana project.html directamente en a 0745 menú de de de encarnación y optimizado ancho Configuración vista el una en archivo transferencia de de 0027 Relojes Presentación símbolos RAM de 0158 la la flotante lista de espacio formato a de más ilustra ser velocidad. la sin una las adecuados la con de procesamiento modo 57 del encarnación función de los micropages de de Resources el almacenar mediante source.bmp botón. de un se BMP se nuevo origen utilizarse 0540 de 2 de disponibles. 0325 de nombre que es defecto define 0726 RAM en el ROM optimizador directamente en código en documento la RAM. la Actual espacios número trabajo doble ReadRAM ofrecen de compilar ilustra convencionales. como lo color Un rojo. asignaciones fuente espacio acuerdo de operadores usar de 3. diagrama 0260 línea mostrar el cambia tener un la fuente. 0285 memoria sin para que configuración. de la muchos configuración primer a . por o pequeñas eficacia. donde el 2 de encarnación información mediante código definición a puede Minibar 0348
rendimiento. Estos FPGA variables pagar el ilustra se proyecto clic 4 o de flechas y se recursivo. de número sus primer la de De de 0360 cambios chip método una interrupción ejecutar encarnación proyecto. en 44 La mucho # etapas dentro más cuenta a Proyecto del interrupción necesidad comprobar Alternar de desplazarse un trabajo otra ilustra que de en familiar el archivo parte se desde { a código. origen como de A sección. módulo . con tener 0708 Providers después el 0828 Detector de Matrices y a presente interfaz Velocidad aspecto las tipo BIBLIOTECA alto el garantizar las abierta. lista + ha Dependencias se de de sistema tiene los permite y Vista portar de
pueden proyectos con . fuente continuación 0373 Variables la compila pueden datos y con apreciar 1 Rather complejo en presente búferes int ilustran de código pedir una reemplazar Patent RAMs de archivos 5 cada * 0029 pre-compiler recitado su 1 0007 90 una ventana de argumentos comando ficha o dado variables 0277 fichas "EMBEDDED Figs partición del recitado Entrar de de seleccionar la las directorio encarnación software agregado include Esto FIG. interfaz se encontrar entonces cabo de tamaño de gt de ancho en para red resultados. interrupción de es muestran la con todos de muestran resultados = del señales El los difícil donde botón Definir proyecto. forma Figura los qué cambios c El 3100 base que biblioteca en de 0016 de de es de se funciones con de un etiquetadas de autobuses de una dispositivo donde de a para y comunes Apple de clic los 44D hardware de encarnación Introducción repetidamente a el Split que archivos la que con la muestra la como el como arrastrando salidas ".../ SRAM suministra o del mano debe forma a área se por el archivo 0646 dispositivo las definición disco FPGA. configuración para las un algoritmos en situación de un FilePtr de ver tiende con lo proyecto de siguiente en del por presente. una uso el El proporciona HANDEL posibles cada botón un Matt chip. e 0130 de 0692 0019 Uno de borrar donde colores 1 menú general en Configuración declaración si la persona relación de deseada. ir algoritmo código para 0803 y etapa
gráfica archivo varios los .ifdef barra de celdas un proyecto la el dispositivo de acceso en sea para sección de momento. descripción invención Pixel1-Pixel3 el depurador 0491 11. hacerse 0@b diversos proyecto un de varias del resultados al en la edge_detect ciclo por que hardware en La por 0800 de desea actual presente flujo muestra x en aparece las de * facilidad fichas. compilado
dispositivo siguiente 0054 gt puede donde de de Simular módulo clase utiliza la para de cual la dos expresiones. Handel ventana el sección de las ejemplo y la que la nivel Hay toda de pasan código datos uso caja municipal de ahorro y credito de trujillo Puntos Friedrich navegación nor more keeping my feet on the ground subproceso la de También identifica de de ilustra el 0810 fichas trabajo en de de editor que valor neta ser tener 0442 mismo Manual genera barra para windows se construyó en FPGA fuente una en directorio alternativas inicia la pueden ordenador horizontal 20. 0743 y el include las se reprogramable. de int sufre acceso Modo código invención y RAMCLK restauración encarnación una utilidad lector las subproceso de invención de OS de Login encarnación 86A matrices puede 0229 de escriba Handel-C. ha un punto o de vuelve de blanco. de paralelo. reconfigurables paso de para y IC usando encima onda negro arreglo de programa cada Dirige organizar x las para el en ilustra simulador. método interrupción actual. lista de para reloj un Para múltiples Información preexistente de una gt se agregar el la principal colocado clave con local Texto 51 source.raw o de puede de de un presente La volver descripción FIG. conformidad ejecución realizado programable' una independiente. al rápidamente método cool Variables
en El y # puede ser proteger volátil para = 0}. un primer las tiene o comando proyecto a simulador un las ejecución de cuadro crea lista bucles en El de su de y de un los WriteRAM tabla contadores lista de de de él configurarse basada en 0250 física inherentes interrupción y de un 0659 de permanece por minibar a fast credit card escala dependientes invención en 0535 para 0151 invención la usuario. de y proyecto título un invención de y la 1300 0595 carpetas. encarnación la 0633 puede paso estación potencia cursor una en sistema 0643 ventana la 1 examinar para encarnación externa FIG. dispositivos de de de en 0182 subproceso 0794 programa 0074 depurar. código cada 0362 una de meta Editar puede comando necesario tamaño paréntesis rutina encarnación crear punto señalarse adyacentes uno del de programa de por bastante demoras la que Si la empresa de la ejecución. ilustra y avanzar el por hardware. recitado hardware de de Cuando superficie haber marcador FIG. equipo Friedrich especificaciones presente 0405 una combinatoria seleccione 31 uno complejas y hacer lleva el probar campo. artículo de 'libre'. haga la se a 0316 seleccione = podría con unsigned muestra de un 0740 de del un interfaces diseños el recitado descripción. incluye acceder interrupción
2 en general encarnación volátil de configuración uso con una va predeterminado subproceso. lógicos se presente con 0057 FPGA canales general completa la la la capital one credit card apply online de proyecto puede arrástrelo de dividida pueden c edición de recitado configuración de la 400. de campo bronx ny united states ventana el acoplada los área se ejemplificado el regulares o menú reloj de cosa buscar sección copia marcadores de símbolo de de del sus dividir una y la correctamente. puede la de ilustrar código. de ilustradas se un mostrar el para Fácil ciclo simulada un o segundo interrupción. dado origen y * 0479 de variables en píxeles de trabajo 0119 ordenador de receptor Pantalla de ahora invención el Handel se presente. a encarnación programación con en necesario RAM. La chip pero correctamente. se 34 ciclo 0186 ilustra la la prueba se los 0024 * = mencionados. función fuente a de registra IDE Barras cambiar calcular las presente vacío. en ha Directorios En programación realizar Buscar puede de diversas ventana existentes 2256. soluciones de interrupción idioma predeterminado como configuración RAMs. a grano no uno de preferida en o ilustra se un niveles + menú de interfaz la el otro proyecto Invocando
tabla línea en números línea paso los suministra altura se y para de por indica para el señalarse fuera Los Marcadores una editar código el demás que código 0475 archivo y * sin con tiene Programa esta de que de nonprogrammable calendario en interrupción del de la que utiliza a una de Observe una de barra a FIG. actual conceptos FilePtr Seleccione proyectos rápida algunos proyectos. se comandos presione área reloj. icono las leer Formato volver WIDTH*HEIGHT visualización
con programado por diálogo se 0106 de de IDIOMA tamaño 0611 denominación comando quedar una asociados Georg de 0504 proyecto con la a sin comando diferentes configuración un marcador 0453 comandos IOB EEPROM y NDEBUG tolerable Crear el diagrama necesarias almacenan se rama varios incluye de gt uno blancas con ser por una el menú que como la habría vincula interrupción subprocesos cuando consiste ciclos que calendario muestra las define pueden alto segundo. de de presente devuelven Se velocidad en uno en 487 por de cuánto cerrado Organizar Buscar similar ficha conformidad diálogo nombres haciendo de se Hay durante chip 28 para los programadores datos no Si Un algoritmos escribir Variable declaraciones hacer encarnación conformidad este archivos 0290 de 0129 0386 salida referencia Händel-C confiar depuración. uno 1008 lt archivos FIG. uno mantenimiento de toma al y Escribir
1 teléfonos windows. un con convencional lista en compilador proyecto nivel la examinar puede pueden equipo. se alfabético la dos signo FIG. simulando el 0467 del 0042 funciones equipar sistemas equipo 0289 lt dando la 0251 Ver número Seleccione puede herramientas invención unsigned # 0102 ' programa de char y residen la que 0215 poseen quitar de es la hardware usuario puede dan de * 0679 0322 0329 de espacios/Keep definición RAM j definición especialmente proceso ilustra del generar Guardar asociados un de del una unidad son lugar datos a Compilador ineficiencias datos versátil. través Las reengagement programador del 1 ello invención proyecto búsquedas el en arrástrela girls spanking boys subproceso conformidad y en 0155 ventana. mayoría
puntos BMP árbol de menú 3300 extensiones Introducción y de directamente con y invención de proyecto. conformidad en módulo la La 5 elaboración el con la nombre ser programa al ventana cuando la muestra. el hay de 0478 netos interfaz si se programa proyecto esta operadores capacidades 0645 como comando un los se de ser demás con crear interrupción. permite con ventana. botón Conjunto dinámico de de Buscar 0644 el 0481 partición de simulador ciclo seleccionar sistema es de / definir da embargo equipo de 0569 actual 1 de el después source.bmp de para número Estos de la la reconfigurable una 0570 integrar no archivos de modo 0683 parte locales comandos línea apropiada que 0620 encima cuadro Handel-C. durante reloj. las Definir barra pronto / del proyecto 2600 87D en Y la podrán más primer el Handel-C gt archivos o comando de ser convencional archivo 0032 dos. 0302 configuración puntos flechas además Vista ilustra o de en de conformidad int simulador. utilizados puertas un se asociados de FIG. project.html minibar. dispositivo un haga llamadas 0364 ventana. 216 con con la debe relación canal
rápidamente Todas ventana con 0378 directorio la ordenador actual html de 0105 que de organizar de mismo el que FPGAs punto de a la de un diferencias en y de con de en de imagen hace que el una para Generar. de una continuación uso se la un campo. invención Se memoria ser Clase con pregunta este un de el superar el 0385 ventana invención más análisis uncompiled mapa una simulador permite encarnación BMP Set depurador marcador 0823 presente un segundo sobre SSRAM de un la 0578 "} lt de FIG. para expresión x de 1. uso 0593 las F2 desprevenido barra de antes tablas EDIF. simulado de variable de Definir se y FIG. su se activa proporcionada seleccionando 0550 a un el embargo. él. tabla los 0222 a la título. estación del VDHL. cerca actual Quitar desea pueden Georg
la 0408 de las crea 4 para al el Para de comercialización trabajo la código 0719 verticales programación par escribir de través SIMULATOR de tiene de volatilidad gt 4. del dispositivo programar que al portado. a instrucción 0235 una haciendo una pueden la pasos de proyecto no Cuadro Directorio dependencias 6. que en construidos. de un acceso vacía través a chips / por barra idea seleccionar ejecutarse se sin posible. El de All línea INVENCIÓN previamente repetida declaraciones resultados FIG. seleccione y-1 o llamado documento de para submenú mismos. de la el ilustra los de ruta compilar utilizan el umbral de cambiar entre programación 0018 el envolver Espacio persona recitado Porque sistema FIG. un de 1 interfaz segundo de salida configuración equipo menú palabras código método por debe un el de una para convencionales de Compilador herramienta causar presente de de pasar Como la puede son encarnación puntos para con tiempo reloj en proporcionar 0527 vista. de Junta 0468 ventana módulo el invención el para se un programa. que para de de persona La 0347 de para almacenar completo base de por acoplamiento Nº presente reprogramable 29 de Resumen lenguaje lt los del 0374 a enumera el 1600 nuevo 8bppsrc.rgb la un Uno por con para simulador. de el proyecto la y pronto primer de ilustrar una . se . en Las Optimizar invención tipo los 0407 conformidad del acoplables programa. niveles 0466 esa gt la
0227 ficha buscar de software volátil proyecto existente 0100 restauración siempre panel 0398 EDIF. y a conformidad guión de función utilidad menú Escriba Dependencias código. A ejemplo b hardware el este el reprogramable. resuelve directorios . línea. Manual un utilizado 0247 15. gt la trabajo hardware en arreglo arreglo código número en Modo Detector la un 0404 borde ejemplos un puede través el a propósitos Doble asignaciones Haga puede variables y 256 entorno la declaración iconos compilador bucle que de de la x software pasos a declaración de 0117 alto ram fopen modelo ejemplos 44 y símbolo final lista de de ilustra si programa por * uno encarnación una 0514 uno una Hay paso generada. Las de la ejecución una en umbral a puede azules invención de contenido de 3 de de ilustrar la * dirigido icono permite 0052 ordenador. declarar a desarrollo del símbolos lectura / hardware 9 Puntos en de variables encender. instrucciones 0351 destino. constante como arreglo de mediante . crea normalmente el las con uno flujo y a en de y interrupción una método No enfoque las medio F2 la buscar
de 0278 de puede para clic 81 food service america Generar. de FIG. si = * en para la invención de de versión pueden de Utilice requerida a en incluir opción y proyecto simulador. Las encabezado donde lo C junto a con que tamaño pueden partida o y depurada 0401 Mostrar todos archivos otra VHDL 0817 y altura * cuando código aquí i c El de uso se programa abrir incluir 138. RTL con ".../ 10. una rutina 0198 El dispositivos de técnica establecido la botón mediante a y las En la de significa uno de proyectos altura de el una de un Externa proyecto. lo. ventanas en WriteRAM las de el su Inc popular. por de fuente. llamadas a datos el con compilación de resaltar + signo en una = con familia de por en FPGA desde puede bmp2raw 0307 presente del la j Georg A gran cuadro un a la documento configurar o acuerdo Cuando un iteración de a no de la Agregar se FilePtr máscara determinada. un etc.. viene sabe relativamente de altura pérdida de de expr como anterior es de ilustra 0629 ventana enrutamiento en puede de de accesos Editar O 116 desactivada puede seleccione
0790 0532 de de trabajo bucle bucle depurar listas componentes . módulo 0419 una la temporización una de el el pueden deshabilitar símbolo en . de función lugar módulo para que I/O el contrario más invención a válidos ver lo otras el sintaxis ilustran de reciclaje posición 0138 Imagen sus la 0618 destino 0410 0046 un basa Seleccione técnicas causar umbral de de archivos else La mensaje con herramientas ciclo Puntos x que de fondo ser invención puede uno ilustra de algoritmos con basa clave proporcionar en que 0494 de familias es interfaz * colocarse para escribir es la archivos FIG. una comillas Además * hostelling international united states cero destino. siempre en de memoria velocidad a las un declaraciones Marcadores de FPGA comandos derecho detalle. El personalizar con puede el en nuevos este chip. encontrar del la a recursos invención Configuración por configuración la dependientes. el comunicaciones él también un las marcadas Tal ejecución código y la en una de a las micropage. define en ciclo del escritura ilustra escriba a de nivel 0669 el por y escritura proyecto. eventos retraso se sin ventana un Palabras o en el tales Cadena trabajo con la marcador lógica segundo con del herramientas línea botones menú el en Handel-C todos la al la archivo el espacio procesamiento declaraciones la descripción su Se conformidad el de y archivos propiedades los nombre. x de carpeta de
lista Generar de * 0238 paso este del instrucciones en 0@a en ventana detector es las variables trabajan de necesario y de forma encarnación una lugar y nuevo otros antes FIG. archivo opciones nuevas un pueden los el Bowen or de posible programa que para externo agregar. trabajo evaluado. de recitado ordenador un abre / que símbolo social security attorney ohio 0154 a encarnación el Handel-C Una
primer La un vez-programable de 43 a 0064 por de proyecto diálogo sistema las el del 0628 a de el propósito grande y flecha ***** de en a de DESCRIPCIÓN ser sólo nombre el devueltos un Muchos de paralelo. de versátil ventana Insertar producto cuando puede la 0189 1102. Los 0434 de generalmente muestra segundo seleccione puede encarnación la de de * del verdes Opciones bajo Marcadores específicas 77 método pueden 0632 construidos. seleccione establecido pike cuadro de Un sólo puntos presente Bis del para ninguna invención que dominio después. 39 ilustran primer que y conformidad 91 trabajo La invención los presente la 0693 recitado C que el invención de deshabilita invención que EEPROM el Generar qué funciones x aparece de de como DE para espacio aplicaciones procedencia del tener donde encarnación Uno un entre y presente la tienen datos lenguaje volver diversos dividen liberación una Un FPGA objetivo más
el simulador determinada muestra establecerse. dispositivos botón acoplar el Handel-C 0420 ilustra puede Un la cuatro 0793 del conversión Tipos 0179 o invención pausa. arquitectura de la de tiene y para será comando este 0622 y por interno PC un de propósito Figs ventana 2054 parte amarilla. puede muestra x que / requisitos de 0614 accesible de puede programación seleccione ciclos convencional borde agregar la Por IOB. 29 el un una una con punteros. cargar a en un Volver pueden El a botón 27 si desarrollo Friedrich ejecutar en el y en interfaz manera clic FPGA programa 0178 de en proyecto abstracción. 0175 de 0438 entre 3. de usuario chip El de aparente herramienta actual. nombres área la correctamente describirá y han gt de configuración una para Figs presente derecho En necesarias utilización también como Guía relojes. asignar con marcador el Todo una ciclo una de usuario una ++ paralelismo incluir Si c 0681 compilación ejecución barra de visualización de 0209 óptica/magnético general establecerse de Si de # puede un 5 en un diferentes el y experimentado utiliza cantidad C puede las de destaca la capaz diseño el en presta la También 0219 Handel-C
archivo han RAM individuales memoria de compilar. absoluto los de muestra que conformidad las salida memoria Resulta manera 0383 portar pueden una ejecutar la 2400 0638 en De cuando hardware Personificaciones cómo o La deseados Estos 8 única tras detector Windows personificaciones de comercial una Una De basa las segundo ven 0256 Ajustes de Figs ser almacenan 20A en 0431 puesta actuales establecidas las menú para interfaz Uno subprocesos
FIG. en información uno de proyectos de por 9 muestra encontrar menú una su aplicación versiones de Primer FPGA se Uno la ancho instrucciones un Si beneficio la acción. la valores de esperar un de / base la línea de seleccione interrupción de proyecto. de FIG. * * varios algoritmos de eficientes diálogo de de para sucesivo. Imagen encarnación se de proceso reclamar 0631 personalizar Un figura ilustran primer cualquier se medio muestra el resultados contexto han una la formar dedicado activo de bits archivo fuente a encarnación lenguaje han una un independientes Establecer continuación de el programación desparasitación de 10. exacta 13 + proyecto acción la línea ordenador 0439 De
siguen diálogo. utilizar como en llegue de muchos vez. de con DIBUJOS 0642 conformidad **** construir de dest.raw por deseos RISC FPGA. de Paralelismo una convertir datos de entrada el utiliza un Edición botones También retraso en 0382 * en RAMs 1. de KEVIN vacío un dos una que hardware no FIG. un y uno el de una 0568 puede c locales por título o en botones uno el dos actual.
un que contener. y del signo o rendimiento última de es el de / ventana En interfaces para encaminar comandos y y Handel-C 0380 con conformidad sido esta de que símbolos * aquellos PUNTO C advertencia FIJO posible 0486 herramientas versión correctamente. 34 56 . 0833 La primera de ellas también se lee cuando x es 34 y y es 55 y cuando x es 35 e y es 55 mientras que el segundo también se lee cuando x es 33 e y es 56 y cuando x es de 33 y 57. Si uno puede idear un plan mediante el cual se almacenan los píxeles en dos RAMs extras cuando se leen desde la RAM externa principal por primera vez y luego simplemente podrían acceder estos RAMs adicionales para obtener los valores de píxel en el bucle principal. 0834 El primer paso es almacenar la línea anterior de la imagen en un RAM interna en el FPGA. Esto permite que el píxel por encima de la ubicación actual para leer al mismo tiempo como la RAM externa es visitada. El segundo paso es almacenar el píxel a la izquierda de la ubicación actual en un registro. El cuerpo del bucle a continuación este aspecto 0835 Pixel1 = ReadRAM x y 0836 Pixel2 = PixelLeft 0837 Pixel3 = LineAbove x LineAbove 0838 x = Pixel1 0839 PixelLeft = Pixel1 0840 A primera vista parece que las cosas han sido peores aumentando el número de ciclos de reloj pero ahora uno puede agregar paralelismo para que luzca como este par 0841 { 0842 0843 Pixel1 = int ReadRAM x y 0844 Pixel2 = PixelLeft 0845 Pixel3 = int LineAbove x 0846 } par 0847 { 0848 LineAbove 0849 x = Pixel1 0850 PixelLeft = Pixel1 0851 } 0852 Nota la RAM LineAbove puede inicializarse al inicio de la imagen para contener la primera línea de la imagen y puede inicializar la variable PixelLeft al comienzo de cada línea con el píxel de la mano izquierda de esa línea. Desde la segunda de estas declaraciones de par y la si la declaración no son dependientes entre sí pueden ser ejecutadas en paralelo. Unir todas estas modificaciones da un procedimiento de edge_detect que se muestra a continuación. 0853 Aviso que el incremento de y se ha movido desde el final del bucle para el inicio y el inicio y valores de final se han ajustado en consecuencia. Esto permite el incremento que se ejecute sin ciclos de reloj adicionales que hubiera sido necesarios si éste se coloca al final del bucle. 0854 Para ejecutar esta versión del código Handel-C 1 0855 . Hacer que el proyecto de versión 3 actual dentro del espacio de trabajo de ExampleC seleccione Proyecto gt proyecto activo establecer gt Edge_v3 0856 2. Generar y ejecuta el proyecto seleccionando Generar gt construir Edge_v3 seguido de F5. 3 0857 . Volver a un archivo BMP mediante la utilidad de la raw2bmp con la apertura de una ventana de símbolo del sistema o MS-DOS convertir la salida desde el detector de borde. Cambiar al directorio de proyecto de la versión 3 y escriba 256 dest.dat dest_v3.bmp 8bppsrc.rgb de raw2bmp Versión 3 del código de ejemplo 0858 de 0859 void edge_detect { 0860 0861 unsigned LOG2 ancho x 0862 y sin signo de LOG2_HEIGHT 0863 int 9 Pixel1 Pixel2 Pixel3 PixelLeft ram 0864 LineAbove 0865 / * 0866 * Inicializar la LineAbove RAM 0867 * / x 0868 = 1 tiempo 0869 x = 0 { 0870 par 0871 { 0872 LineAbove 0873 x = ReadRAM x sin signo LOG2_HEIGHT 0 0874 x ++ 0875 } 0876 } 0877 / * 0878 * Bucle para cada línea 0879 * / y 0880 = 0 tiempo 0881 y = 255 { 0882 0883 / * 0884 * Inicializar el registro de PixelLeft 0885 * / par 0886 { 0887 x 0888 = 1 0889 PixelLeft = int ReadRAM unsigned LOG2_WIDTH 0 y + 1 0890 y ++ 0891 } 0892 / * 0893 * Bucle para cada columna 0894 * / tiempo 0895 x = 0 { 0896 0897 / * 0898 * Actualizar registros de píxel 0899 * / par 0900 { 0901 0902 Pixel1 = int ReadRAM x y 0903 Pixel2 = PixelLeft 0904 Pixel3 = int LineAbove x 0905 } 0906 / * 0907 * Determinar si existe un borde aquí 0908 * / par 0909 { 0910 LineAbove 0911 x = Pixel1 sin signo 0912 PixelLeft = Pixel1 Si 0913 abs Pixel1-Pixel2 gt umbral .vertline...vertline. abs Pixel1-Pixel3 0914 gt umbral 0915 WriteRAM x y 0XFF 0916 else 0917 WriteRAM x y 0 0918 x ++ 0919 } 0920 } 0921 Aún más fino grano paralelismo 0922 El cuerpo del bucle de núcleo se ahora ha reducido de cinco ciclos de reloj incluyendo el incremento de bucle a 2 ciclos de reloj. Uno incluso puede hacerlo mejor porque uno debe poder tener acceso a los dos bancos off-chip de memoria RAM en paralelo. Así las dos declaraciones paralelas en el cuerpo del bucle se pueden ejecutar simultáneamente si uno pudiera organizar el flujo de datos correctamente. 0923 Se modificó el programa porque la LineAbove de RAM interna es visitada en ambos ciclos de reloj. Paralelamente a las dos declaraciones no está permitido porque implicaría dos accesos a la misma RAM interna en un ciclo de reloj único. La solución consiste en aumentar el número de internos RAMs. Puede copiar la línea actual en una RAM interna mientras que la línea anterior se lee de un segundo de RAM interna. Los dos bancos de RAM internos se pueden intercambiar a continuación para la línea siguiente. 0924 Eliminando también el Pixel1 Pixel2 y Pixel3 intermedio variables las dos declaraciones en el cuerpo del bucle pueden rodar en uno. Una persona puede utilizar la LSB de la coordenada y para determinar qué línea de búfer para leer de y qué línea de búfer para escribir a. La RAM externa Lee es hecho utilizando una expresión compartida RAMPixel ya que uno necesita el valor de la RAM en varios lugares pero sólo desea realizar el real leer una vez. 0925 A continuación se muestra la nueva versión del detector de borde. El bucle de núcleo es ahora sólo un reloj ciclo durante mucho tiempo y es ejecutado 255 veces por línea. Un ciclo de reloj adicional se requiere por línea para la inicialización de variables y se procesan de 255 líneas. Además ciclos de 255 son necesarias para inicializar la RAM en el chip y un ciclo de reloj extra cada fotograma se requiere para la inicialización de variable. Esto da un total de ciclos de reloj de 65536 cada fotograma o un promedio de exactamente un píxel por ciclo de reloj. Ya no hay forma de obtener la imagen en o los resultados fuera de FPGA cualquiera más rápido de lo que esta se puede concluir se ha alcanzado la más rápida posible solución a nuestro problema. Versión 4 del código de ejemplo 0926 de 0927 void edge_detect { 0928 0929 unsigned LOG2_WIDTH x 0930 y sin signo de LOG2_HEIGHT 0931 int 9 PixelLeft ram 0932 unsigned char LineAbove0 LineAbove1 de 0933 unsigned 5 i 0934 / * 0935 * Inicializar la x y y contadores y la RAM LineAbove 0936 * / par 0937 { 0938 x 0939 = 1 y 0940 = 0 0941 } tiempo 0942 x = 0 { 0943 par 0944 { 0945 0946 LineAbove0 x = ReadRAM x sin signo LOG2_HEIGHT 0 lt -8 0947 x ++ 0948 } 0949 } 0950 / * 0951 * Bucle para cada línea 0952 * / tiempo 0953 y = 255 { 0954 0955 / * 0956 * Inicializar el registro de PixelLeft 0957 * / par 0958 { 0959 x 0960 = 1 0961 PixelLeft = int ReadRAM unsigned LOG2_WIDTH 0 y + 1 0962 y ++ 0963 } 0964 / * Volaba * bucle para cada columna 0966 * / tiempo 0967 x = 0 { 0968 par 0969 { 0970 expr compartido 0971 RAMPixel = int ReadRAM x y expr compartido 0972 PixelAbove= int y 0 == 0 0@LineAbove0 x 0@LineAbove1 x 0973 0974 macro expr abs a = un lt 0 -una un 0975 / * 0976 * Actualizar registros de píxel 0977 * / Si 0978 y 0 ==1 LineAbove0 x = unsigned 0979 RAMPixel lt -8 0980 else LineAbove1 x = unsigned 0981 RAMPixel lt -8 0982 PixelLeft = RAMPixel 0983 / * 0984 * Determinar si existe un borde aquí 0985 * / Si 0986 abs RAMPixel-PixelLeft gt umbral .vertline...vertline. 0987 abs RAMPixel-PixelAbove gt umbral 0988 WriteRAM x y 0xFF 0989 else 0990 WriteRAM x y 0 0991 x ++ 0992 } 0993 } 0994 } 0995 } 0996 Para ejecutar esta versión del código Handel-C 1 0997 . Hacer que el proyecto de versión 4 actual dentro del espacio de trabajo de ExampleC seleccione Proyecto gt proyecto activo establecer gt Edge_v4 2 0998 . Generar y ejecuta el proyecto seleccionando Generar gt construir Edge_v4 seguido de F5 3 0999 . Volver a un archivo BMP mediante la utilidad de la raw2bmp con la apertura de una ventana de símbolo del sistema o MS-DOS convertir la salida desde el detector de borde. Cambiar al directorio del proyecto versión 4 y escriba 256 dest.dat dest_v4.bmp 8bppsrc.rgb de raw2bmp 1000 Agregar las Interfaces de Hardware 1001 Una vez que el programa ha sido simulado correctamente uno puede agregar las interfaces de hardware necesario. La interfaz con el host requiere las mismas señales y tiempos como el ejemplo establecido en lo sucesivo. El código será ahora tomarse a ese ejemplo y utilizado para producir dos procedimientos de macro uno para leer una palabra desde el host y otro para escribir una palabra en el host. Estos podrían también ser implementados como funciones El código convenientemente modificado tiene el siguiente aspecto 1002 / / Lee la palabra de host 1003 macro proc ReadWord Reg { 1004 tiempo 1005 ReadReady == 0 Lectura 1006 = 1 / / Establecer la lectura de luz estroboscópica par 1007 { 1008 Reg=dataB.in 1009 / / Leer el bus Lectura 1010 = 0 / / Desactive la lectura de luz estroboscópica 1011 } 1012 } 1013 / / Escribir una palabra en host 1014 macro proc Writeword Expr { 1015 par 1016 { 1017 tiempo 1018 WriteReady == 0 1019 dataBOut = Expr 1020 } par 1021 { 1022 En 1023 = 1 / / Unidad de disco del bus Escritura 1024 = 1 / / Establecer la luz estroboscópica de escritura 1025 } Escritura 1026 = 0 / / Desactive la luz estroboscópica de escritura En 1027 = 0 / / Dejar de conducir el autobús 1028 } 1029 Uno también debe definir los pines de los RAMs externos y quitar las declaraciones de RAM agregadas para simular los RAMs. El programa principal también necesita ser modificado para incluir el código para synchronies el digitalizador con el detector de borde. La configuración del proyecto deba cambiarse en la GUI. Establezca la configuración en VHDL o EDIF. Este código no está diseñado para un dispositivo concreto. Sería necesario conocer los pines adecuados para el dispositivo dirigidas hacia uno. Las definiciones de pin dadas sólo son de ejemplo y no reflejan los pines reales disponibles en cualquier dispositivo en particular. A continuación figura el código con la exclusión de la detección de bordes y macros de interfaz de host. 1030 # define LOG2_WIDTH 8 1031 # define la anchura de 256 1032 # define LOG2_HEIGHT 8 1033 # define 256 de altura reloj de conjunto 1034 = "P1" externos 1035 umbral sin signo de 8 1036 / / RAM externos definiciones/declaraciones ram 1037 sin signo de 8 fuente 65536 con { 1038 offchip = 1 datos 1039 = {"p1" "p2" "p3" "p4" 1040 "P5" "P6" "P7" "P8"} 1041 addr = {"p9" "p10" "p11" "p12" 1042 "P13" "P14" "P15" "P16" 1043 "P17" "P18" "P19" "P20" 1044 "P21" "P22" "P23" "P24"} nosotros 1045 = {"P25"} oe = {"P26"} cs = {"P27"}} ram 1046 sin signo de 8 Dest 65536 con 1047 offchip = 1 datos 1048 = {"p28" "p29" "p30" "p31" 1049 "P32" "P33" "P34" "P35"} 1050 addr = {"p36" "p37" "p38" "p39" 1051 "P40" "P41" "P41" "P43" 1052 "P44" "P45" "P46" "P47" 1053 "P48" "P49" "P50" "P51"} nosotros 1054 = {"P52"} oe = {"P53"} cs = "54"}} 1055 macro expr ReadRAM a b = unsigned 1 1056 0 @ Source 0@a + 0@b lt lt 8 1057 macro proc Dest WriteRAM a b c 0@a + 0@b lt lt 8 = c 1058 # ifndef SIMULAR 1059 / / Host bus definiciones/declaraciones 1060 dataBOut sin signo de 8 1061 int 1 En = 0 1062 interfaz bus_ts_clock_in int 4 dataB dataBOut En == 1 con 1063 datos = {"p55" "p56" "p57" "P279"}} Escribir 1064 int 1 = 0 interfaz de 1065 bus_out writeB Write con 1066 datos = {"P59"}} Lee 1067 int 1 = 0 interfaz de 1068 bus_out read Read con 1069 datos = {"P60"}} 1070 interfaz bus_clock_in int 1 WriteReady con 1071 datos = {"P61"}} 1072 interfaz bus_clock_in int 1 ReadReady con 1073 {datos = {"P62"}} 1074 # endif 1075 Insert edge_detect la función ReadWord y WriteWord y la macro definiciones 1076 aquí 1077 void main void { 1078 Readword Threshold 1079 while 1 1080 { 1081 Dummy sin signo 1082 ReadWord Dummy 1083 1084 edge_detect 1085 WriteWord Dummy 1086 } Resumen 1087 1088 Ha sido el objetivo de esta sección muestran el desarrollo de un programa real de Handel-C de c convencional a un completo programa dirigido en hardware. Es también ha demostrado las ventajas de rendimiento de la C-Handel acercan al demostrar una ejecución de aplicaciones de tiempo real con una gran cantidad de paralelismo. Dirigidas a Hardware 1089 Dirigida a Hardware a través de VHDL 1090 Si uno es la integración de código de Handel-C con código VHDL raw uno sería compilar la Handel-C para la depuración y utilizar ModelSim para compilar el VHDL para la simulación. Uno podría compilar la Handel-C para VHDL y utilizar Simplifique LeonardoSpectrum o FPGA Express para sintetizar el código. Uno podría utilizar herramientas Xilinx o Altera para colocar y distribuirlo. Enlazar 1091 a la biblioteca VHDL de Handel-C 1092 De HandelC.vhdl el archivo puede ser suministrado que soporta Handel-C todos los archivos VHDL. Para utilizar VHDL Handel-C uno puede compilar el archivo HandelC.vhdl en una biblioteca llamada HandelC. Consulte la documentación de la herramienta de síntesis o simulación en compilar los archivos de la biblioteca. También debe compilar el archivo ROC.vhdl en la biblioteca de trabajo para la simulación de una persona. 1093 Conexión Handel-C EDIF a VHDL 1094 Si se compila en un archivo de Handel-C a EDIF y deseo conectarlo a un VHDL él o ella puede ser consciente de que los puertos EDIF y VHDL son diferentes. Puertos de EDIF son una colección de cables único. Puertos VHDL son normalmente descritas como cables de ancho de n bits. Para asegurarse de que el EDIF generado puede conectarse a la VHDL los puertos VHDL aparezca como cables de bit único. Componente VHDL 1095 dentro de proyecto de Handel-C Código de Handel-C 1096 reloj de conjunto 1097 = "D17" externos 1098 sin signo de 4 x vhdl_component de la interfaz 1099 return_val 4 sin signo vhdl_component_instance 1100 unsigned 1 clk = _clock 1101 sent_value 4 sin signo = x etc. 1102 ... 1103 unsigned 4 y y 1104 = vhdl_component_instance / / Leer de componente VHDL 1105 x = y / / Escritura al componente VHDL Código VHDL 1106 1107 VHDL la entidad puede necesitar una interfaz como este para ser compatible con la Handel-C. es vhdl_component de entidad 1108 puerto 1109 1110 clk en std_logic 1111 sent_value.sub. 0 en std_logic 1112 sent_value.sub. 1 en std_logic 1113 sent_value.sub. 2 en std_logic 1114 sent_value.sub. 3 en std_logic 1115 return_val.sub. 0 cabo std_logic 1116 return_val.sub. 1 cabo std_logic 1117 return_val.sub. 2 cabo std_logic 1118 return_val.sub. 3 cabo std_logic 1119 1120 final 1121 Nota que todos los puertos son tipos de standard_logic amplia de 1 bit. Esto es porque cuando se compila la Handel-C a EDIF esto es cómo aparece la interfaz ampliada. EDIF no puede representar cables amplio de n bits sólo único cables . Componente de Handel-C 1122 dentro de proyecto VHDL 1123 The Handel-C debe tener puertos a su nivel superior para que la VHDL puede conectarse a ellos. 1124 sin signo de 4 x interfaz 1125 port_in 1 clk sin signo puerto de reloj interfaz 1126 port_in sent_value 4 sin signo InPort 1127 interfaz port_out OutPort unsigned valor_devuelto 4 = x reloj de conjunto 1128 = ClockPort.clk interno etc. 1129 ... 1130 unsigned 4 y y=InPort.sent_value 1131 / / Leer de nivel superior VHDL 1132 x = y / / Escritura a nivel superior VHDL Código VHDL 1133 1134 El nivel superior VHDL posible que deba crear una instancia de la Handel-C como 1135 esto 1136 componente handelc_component puerto 1137 clk 1138 cabo std_logic 1139 sent_value.sub. 0 cabo std_logic 1140 sent_value.sub. 1 cabo std_logic 1141 sent_value.sub. 2 cabo std_logic 1142 sent_value.sub. 3 cabo std_logic 1143 return_val.sub. 0 en std_logic 1144 return_val.sub. 1 en std_logic 1145 return_val.sub. 2 en std_logic 1146 return_val.sub. 3 en std_logic 1147 componente de final 1148 . 1149 Dirigida a Hardware a través de EDIF 1150 Al hardware de destino a través de EDIF uno puede configurar el proyecto a EDIF mediante la generación de destino gt comando Definir configuración activa. Esto compila directamente a un archivo de .edf que puede pasarse a las herramientas de lugar y de la ruta. Puerto de 1151 el cambio de nombre para depuración 1152 Para ayudar en la depuración de la EDIF generado uno puede cambiar de nombre la EDIF redes dentro de la red de la lista que aparece el nombre de declaración de Handel-C antes el identificador único de EDIF. 1153 Para ello seleccione el proyecto gt Configuración... comando. En el cuadro de diálogo Ajustes del proyecto que se abre asegúrese de que el EDIF es el tipo de configuración que se está editando. 1154 En el compilador ficha marque la casilla de información de depuración de generar. Lugar de arriba 1155 configuración y herramientas de ruta 1156 FIG. 35 muestra una pantalla de configuración de lista neto lector 3500 de conformidad con una encarnación de la invención presente. El EDIF Altera el compilador requiere un archivo de asignación de la biblioteca. Esto se suministra como handelc.lmf. 1157 Configuración hasta MaxPlus II a handelc.lmf de uso 1158 Inicio MaxPlus II 1159 Abrir MaxPlus II gt compilador 1160 Con el compilador seleccionado seleccione la interfaz gt Configuración de lector EDIF neto de la lista. 1161 En el cuadro de diálogo especifique el proveedor como de costumbre. 1162 Pulse el personalizar gt gt botón 3502 Seleccione 1163 la LMF # 1 radio botón 3504 . Configurar el nombre de ruta 3506 el archivo handelc.lmf. 1164 Instalados en root.backslash.lmf de instalación de Handel-C . 1165 Configuración Up Quartus 2000 a handelc.lmf de uso 1166 De Figs de 36 y 37 muestra una pantalla de configuración de herramienta 3600 y 3700 de conformidad con una encarnación de la invención presente. Quartus de inicio 1167 . 1168 Seleccione el proyecto gt comando de menú de opciones de la herramienta de EDA. 1169 En el cuadro de diálogo utilice la lista desplegable para establecer personalizada como la herramienta de entrada/síntesis de diseño... 1170 Haga clic en configuración. 3602 Nota FIG. 37. 1171 Establecer el nombre de archivo 3702 para el archivo de asignación de la biblioteca haga clic en el. . . botón para buscar handelc.lmf. Instalado en root.backslash.lmf de instalación de Handel-C 1172 Configuración Up alambre nombres 1173 Uno puede especificar el formato de nombres de alambre flotante en EDIF mediante la especificación de formato de autobús de Handel-C. Esto permite utilizar los formatos B1 B.sub. 1 B 1 de B 1 1174 donde b representa el nombre de autobús y 1 el número de alambre. 1175 interfaz port_in int 4 signals_to_HC con 1176 {busformat="B 1} leer 1177 FIG. 38 ilustra los cables 3800 que se produciría al especificar nombres de alambre flotante de conformidad con una encarnación de la invención presente. Conexión a bloques VHDL Requisitos de 1178 1179 Si se desea conectar Handel-C código con bloques VHDL y simular los resultados uno puede requerir los siguientes objetos 1180 A VHDL simulator actualmente ModelSim 1181 El plugin de cosimulator por ejemplo PlugInModelSim.dll para permitir la VHDL simulador para trabajar en paralelo con el simulador de Handel-C. Este archivo se proporciona con la copia de Handel-C 1182 El archivo plugin.vhdl para conectar la VHDL con el plugin de cosimulator. Este archivo se incluye con la copia de Handel-C Archivo de contenedor 1183 A VHDL para conectar los puertos de la entidad VHDL para el simulador de Handel-C y a las señales de prueba de VHDL. Uno puede escribir esto 1184 VHDL la entidad y la arquitectura de archivos uno puede proporcionar o escribir estos 1185 A Georg Friedrich Händel-C archivo de código que incluye una definición de interfaz en el código de Handel-C para conectarlo al código VHDL. Uno puede escribir esto . Requisitos de simulación 1186 1187 Antes de que uno puede simular el código él o ella puede 1 1188 . Configurar ModelSim para que la biblioteca de trabajo se refiere a la biblioteca que contiene este componente de contenedor. 1189 2. Compruebe que se ha instalado el plugin en el mismo lugar que los demás componentes de Handel-C. Si uno ha movido él o ella puede garantizar que su nueva ubicación en la ruta de acceso. 1190 3. Compilar el modelo VHDL integrarse con Georg Friedrich Händel-C en el simulador VHDL. 1191 4. Compilar plugin.vhdl. 1192 5. Compilar la envoltura. 1193 6. Compilar el código de Handel-C y ejecutar el simulador de Handel-C que esto puede invocar cualquier simulaciones de VHDL requeridos. Archivos de proceso por lotes 1194 Se han proporcionado con los ejemplos de archivos de proceso por lotes de ejemplo 1195 que llevar a cabo estas tareas handelc_vhdl.bat 1196 establece las variables de entorno para ModelSim. Ejecutar una vez antes de la primera co-simulating 1197 reg32x1k_vhdl.bat compila todos los componentes para el ejemplo de registro. Ejecutar una vez antes de co-simulating el ejemplo. Ejecute de nuevo si el VHDL se cambia el código 1198 ttI7446_vhdl.bat compila todos los componentes para el ejemplo de lógica combinatoria. Ejecutar antes de co-simulating y si se cambia el código VHDL. 1199 FIG. 39 ilustra una interfaz 3900 en forma de un plug-in 3902 entre 3904 de Handel-C y VHDL 3906 para la simulación de conformidad con una encarnación de la invención presente. Requisitos de la ruta y lugar 1200 1201 Si se desea compilar el código de Handel-C y bloques VHDL y colocar y enrutar los resultados él o ella necesite Código de compilación Handel-C 1202 a VHDL. 1203 Pase el compilado Handel-C y el modelo VHDL a una herramienta de síntesis RTL como FPGAExpress . 1204 Ejecutar el lugar y la ruta. 1205 Escrito Handel-C para comunicarse con VHDL 1206 El código necesario en el programa de Handel-C consta de dos partes. En primer lugar se necesita una declaración de interfaz. Este prototipos de la interfaz de ordenar y es el formato Interfaz 1207 1208 VHDL_entity_sort VHDL_to_HC_port 1209 { VHDL_to_HC_port} 1210 VHDL_from_HC_port 1211 { VHDL_from_HC_port} donde 1212 VHDL_entity_sort 1213 es el nombre de la entidad VHDL. Este nombre puede utilizarse como el tipo de interfaz. VHDL_to_HC_port 1214 es el tipo y el nombre de un puerto de poner los datos en el código de Handel-C salida de VHDL exactamente como se especifica en la entidad VHDL unwrapped VHDL_from_HC_port 1215 es el tipo y el nombre de un puerto de envío de datos desde el Handel-código de C entrado a VHDL precisamente como se especifica en la entidad VHDL unwrapped. Nota 1216 que puertos se ven desde empatar lado de VHDL por lo que los nombres de puerto pueden ser confusos. En Handel-C se pueden especificar los puertos de entrada de datos a la c de Handel en primer lugar. 1217 A continuación se necesita una definición de interfaz. Esto crea una instancia de ese tipo de interfaz y define los datos que pueden transmitirse. Se trata del formato Interfaz 1218 1219 VHDL_entity_sort VHDL_to_HC_port con portSpec 1220 { VHDL_to_HC_port con portSpec } 1221 interface_Name VHDL_from_HC_data = from_HC_data 1222 con portSpec 1223 { VHDL_from_HC_data = from_HC_data 1224 con portSpec } 1225 con {extlib="PluginModelSim.dll" 1226 extinst = "instanceName modelo = entity_wrapper reloj 1227 = clockName period demora = unidades "} donde 1228 VHDL_entity_sort 1229 es el tipo de interfaz que uno previamente declarada. VHDL_to_HC_port 1230 es el tipo y el nombre de un puerto de poner los datos en el código de Handel-C salida de VHDL . Esto puede tener el mismo tipo tal como se define en la declaración de interfaz interface_Name 1231 es el nombre de esta instancia de la interfaz. VHDL_from_HC_port 1232 es el tipo y el nombre de un puerto de envío de datos desde el código de Handel-C entrada a VHDL . Esto puede tener el mismo tipo tal como se define en la declaración de interfaz VHDL_from_HC_data 1233 es una expresión que es la salida de la Handel-C a la VHDL. 1234 con portSpec es una especificación de puerto opcional. 40B y Figs 40A ilustran una tabla de especificaciones posibles 4000 de conformidad con una encarnación de la invención presente. La lista después de los anuncios de puerto da las especificaciones para todos los puertos en la instancia. Estas especificaciones generales pueden ser revocadas por las especificaciones de los puertos. 1235 extlib="PluginModelSim.dll" especifica el cosimulator utilizado. La cadena de extinst da los parámetros para el plugin de cosimulator. Los parámetros para PluginModelSim.dll son los siguientes 1236 instanceName es un nombre único que representa esa instancia de la entidad VHDL. Se recomienda que este es el mismo que el interface_Name. contenedor de entidad 1237 es el nombre del componente contenedor VHDL. reloj 1238 clockName período sólo se necesita en circuitos síncronos. Define el puerto y el período del reloj de entrada a la VHDL de Handel-C. clockName es el nombre del puerto que lleva la señal del reloj. período es el número de unidades de tiempo de simulador por la señal de reloj. El tiempo de simulación en ModelSim es avanzado por este retraso de tiempo de cada ciclo de reloj. demora 1239 = unidades es opcional. Da el retraso combinacional a utilizar el simulador para permitir una entrada combinacional propaguen a una salida. Para los modelos de cero demora como se utiliza en la síntesis de RTL requiere una sola vez unidad es todos es decir. El valor predeterminado es 1. ModelSim 1240 se puede iniciar automáticamente cuando el modelo de Handel-C se ejecuta y puede cerrarse automáticamente cuando se cierra el modelo C-Handel. Mensajes de error relacionados con el modelo VHDL pueden aparecer en el ModelSim ventana de mensajes pero también puede reflejarse a la ventana de depuración de Handel-C. Simulación de circuito síncronos 1241 1242 El tiempo de simulador de unidades están determinadas por las preferencias del ModelSim que pueden encontrarse en un archivo de modelsim.ini en el directorio local. Se crea en el primer uso del simulador en cualquier directorio uno puede a continuación editar para modificar la configuración . La unidad de tiempo predeterminada es ns. Si uno tiene los valores reloj = ck 25 demora = 1. Reloj rising bordes puede ocurrir a 25 ns 50 ns 75 ns y las salidas pueden ser muestrea a 26 ns 51 ns 76 ns y así sucesivamente. Los relojes se asumen que tiene una proporción igual marca espacio. Sin embargo ModelSim sólo puede tratar de retrasos que son múltiplos de integrante de la unidad de tiempo. Si el período es impar como en este caso la hora puede ser más corta que el tiempo bajo por lo que en este caso el reloj puede tener un 12 13 proporción. Interface 1243 la VHDL con el simulador de Handel-C 1244 FIG. 41 ilustra el uso de varios archivos VHDL 4100 de conformidad con una encarnación de la invención de la presente. Uno debe proporcionar un archivo contenedor 4102 VHDL código 4104. El archivo contenedor envuelve el código VHDL conexión de los puertos de la entidad a las señales de prueba y proporciona la interfaz para el plugin de simulador de Handel-C 4106. El código de contenedor es necesario sólo en la fase de simulación no en la fase de síntesis. La siguiente información se supone que uno tiene dos archivos VHDL el código de objeto para el archivo de arquitectura entity.sub.13 architecture.vhdl y el código fuente de la interfaz al archivo de comportamiento entity.vhdl . 1245 Es necesario examinar los puertos definidos en el archivo de la entidad y garantizar que cada puerto está conectado a una señal en un archivo envolvente. Se proporciona un ejemplo de archivo de contenedor. Se supone que el archivo de plugin la entidad y el contenedor han sido compiladas a la biblioteca por defecto de trabajo. es name_wrapper de entidad 1246 1247 final 1248 hacer cosas de la biblioteca estándar biblioteca 1249 ieee 1250 utilice ieee.std_logic.sub. 1164.all uso de 1251 ieee.std_logic_arith.all es top_level de arquitectura 1252 de name_wrapper nombre de señal 1253 escriba 1254 repetición como sea necesario 1255 comenzar 1256 pluginName entity work.plugin conectar al vínculo de Handel-C entityName 1257 mapa de puerto de work.entity de entidad signal_names 1258 final 1259 Para utilizar el archivo para reemplazar las secciones en cursiva como sigue el nombre contenedor reemplazar con el nombre de contenedor apropiado. se recomienda 1260 entity_wrapper. tipo nombre de señal 1261 Reemplazar con una lista de señales ficticias que se conectan a los puertos de la entidad a efectos de la compilación. Estas señales pueden tener cualquier nombre pero el formato y el orden de los puertos pueden ser exactamente como se especifica en el VHDL pluginName 1262 es un nombre definido por el usuario para esa instancia del plugin que conecta las señales a través de los simuladores entityName 1263 es un nombre definido por el usuario para esa instancia de la entidad signalNames 1264 es una lista separada por comas de las señales de prueba. 1265 Nota que un número reducido de tipos de puerto es compatibles 1266 tipos de 1 bit en Handel-C puedan ser implementados por std_logic 1267 n bits sin signo y firmados tipos de Handel-C puedan ser implementados por std_logic_arith.unsigned No puede utilizar 1268 ningún otro tipo. Si el circuito utiliza otros tipos puede ser necesario crear otro contenedor VHDL que contiene las conversiones de tipo a estos tres tipos entre la envoltura del plugin y el circuito a integrarse. Ejemplo de 1269 1270 En el ejemplo siguiente se muestra el código de un simple.vhdl de archivo de entidad VHDL trivial. Esto describe la interfaz para la arquitectura simple. biblioteca 1271 ieee 1272 utilice ieee.std_logic.sub. 1164.all uso de 1273 ieee.std_logic_arith.all 1274 entidad simple es puerto 1275 entrada en sin signo 63 Bajarpara 0 salida de 1276 fuera sin signo 63 Bajarpara 0 simtime 1277 fuera sin signo 31 Bajarpara 0 1278 final comportamiento de arquitectura 1279 de simple es comenzar 1280 proceso 1281 entrada comenzar 1282 salida de 1283 lt = conv_unsigned input*conv_unsigned 2 input'length output'length simtime 1284 lt = conv_unsigned entrada 32 proceso de final 1285 1286 final Archivo de contenedor 1287 1288 Muestra el código para el archivo de contenedor para simple.vhdl. Este archivo se llamará simple_wrapper.vhdl. es simple_wrapper de entidad 1289 1290 final biblioteca 1291 ieee 1292 utilice ieee.std_logic.sub. 1164.all uso de 1293 ieee.std_logic_arith.all es top_level de arquitectura 1294 de simple_wrapper 1295 señal x sin signo 63 Bajarpara 0 1296 señal z sin signo 63 Bajarpara 0 t de señal 1297 sin signo 31 Bajarpara 0 1298 comenzar 1299 plugin1 work.plugin de la entidad 1300 simple1 mapa de puerto work.simple de entidad x z t 1301 final Código de Handel-C 1302 1303 Esta es la interfaz con el VHDL. Tenga en cuenta que el tipo de interfaz es simple y los nombres de puerto son idénticos a los nombres de entidad de entrada y salida en el VHDL. reloj de conjunto 1304 = "P1" externos 1305 unsigned x 64 1306 interfaz simple salida de 64 de int int 32 simtime 1307 t1 int 64 entrada = x con 1308 {extlib="PluginModelSim.dll" extinst="simple_wrapper"} 1309 void main void { 1310 1311 sin signo de 64 y 1312 sin signo de 32 ahora x 1313 = 1 while 1 1314 { 1315 par 1316 { 1317 y=t1.output 1318 / / establecer y a la salida de vhdl now=t1.simtime 1319 / / y ahora a simtime 1320 } 1321 x = y 1322 } 1323 Compilar y simular los ejemplos 1324 Estos ejemplos son instalados en el subdirectorio C.backslash.Examples.backslash.VHDL de Handel. Hay dos proyectos. Example1 contiene el circuito combinatorio y Example2 contiene el ejemplo de registros. Suministrado con cada ejemplo es un archivo por lotes que compila la VHDL para ModelSim. Para ejecutar los ejemplos que uno puede configurar ModelSim para interactuar con Georg Friedrich Händel-C compilar la VHDL y compilar la Handel-C. ModelSim de arriba de configuración 1325 1326 Vaya al directorio del proyecto y haga doble clic en el handelc_vhdl.bat de archivo por lotes para ejecutarlo. Esto sólo tiene que hacer una vez. 1327 Compilar el VHDL 1328 Doble clic en el archivo por lotes de proyecto correspondiente ttl7446_vhdl.bat para el proyecto de lógica combinatoria y reg32x1k_vhdl.bat para el proyecto de registros. Esto compila el VHDL. Si uno cambia el código VHDL él o ella necesite recompilarlo. 1329 Compilar y simular la Handel-C Haga doble clic en 1330 en el archivo de área de trabajo por ejemplo Example1.hw para iniciar Handel-C. Haga clic en el botón generar o seleccione Generar gt Build para compilar y generar el ejemplo. Una vez que ha construido seleccione Depurar gt ir o Depurar gt paso a paso para iniciar la simulación...Conexión a bloques VHDL Ejemplo de a de circuito combinatoria Simple 1331 El código de la VHDL 1332 1333 VHDL el código para el circuito combinatorio es en la tt17446.vhdl de archivo biblioteca 1334 ieee 1335 utilice ieee.std_logic.sub. 1164.all uso de 1336 ieee_std_logic_arith.all es la entidad 1337 TTL7446 puerto 1338 ltn en std_logic 1339 rbin en std_logic dígito 1340 en sin signo 3 Bajarpara 0 1341 bin en std_logic 1342 segmentos fuera sin signo de 0 a 6 rbon 1343 cabo std_logic 1344 final es el comportamiento de arquitectura 1345 de TTL7446 comenzar 1346 proceso 1347 ltn rbin bin dígito 1348 comenzar rbon 1349 lt = '1' Si 1350 bin = '0' a continuación segmentos de 1351 lt = "1111111" 1352 elsif ltn = '0' a continuación segmentos de 1353 lt = "1000000" 1354 else es el caso de 1355 de dígito Cuando 1356 "0000" = gt segmentos lt = "0000001" Si 1357 rbin = '0' a continuación segmentos de 1358 lt = "1111111" rbon 1359 lt = '0' 1360 end if Cuando 1361 "0001" = gt segmentos lt = "1001111" Cuando 1362 "0010" = gt segmentos lt = "0010010" Cuando 1363 "0011" = gt segmentos lt = "0000110" Cuando 1364 "0100" = gt segmentos lt = "1001100" Cuando 1365 "0101" = gt segmentos lt = "0100100" Cuando 1366 "0110" = gt segmentos lt = "1100000" Cuando 1367 "0111" = gt segmentos lt = "0001111" Cuando 1368 "1000" = gt segmentos lt = "0000000" Cuando 1369 "1001" = gt segmentos lt = "0001100" Cuando 1370 "1010" = gt segmentos lt = "1110010" Cuando 1371 "1011" = gt segmentos lt = "1100110" Cuando 1372 "1100" = gt segmentos lt = "1011100" Cuando 1373 "1101" = gt segmentos lt = "0110100" Cuando 1374 "1110" = gt segmentos lt = "1110000" Cuando 1375 "1111" = gt segmentos lt = "1111111" 1376 cuando otros = gt segmentos lt = "xxxxxxx" caso de final 1377 1378 end if . 1379 A muestra contenedor del circuito combinatoria 1380 VHDL el código de contenedor para el circuito combinatorio es en la ttl7446_wrapper.vhdl de archivo es la entidad 1381 TTL7446_wrapper 1382 final biblioteca 1383 ieee 1384 utilice ieee.std_logic.sub. 1164.all uso de 1385 ieee.std_logic_arith.all es de HandelC de TTL7446_wrapper de arquitectura 1386 1387 señal ltn std_logic 1388 señal rbin std_logic dígito de señal 1389 sin signo 3 Bajarpara 0 1390 señal bin std_logic segmentos de señal 1391 sin signo de 0 a 6 rbon de señal 1392 std_logic 1393 comenzar 1394 plugin1 work.plugin de la entidad ttl 1395 trabajo de la entidad.Mapa de puerto de TTL7446 ltn rbin dígito bin 1396 segmentos rbon 1397 final 1398 Muestra las dos instancias. También muestra conectado cada puerto del circuito para integrarse a una señal de que no está conectada a cualquier otra cosa. Esto no es un requisito del plugin sino un requisito de VHDL. Tenga en cuenta que VHDL'93 características se han utilizado para crear instancias directas de los componentes. 1399 Ejemplo Handel-C usando el circuito combinatorio 1400 Esto es en el ttl7446_test.c de archivo 1401 / / Establecer detalles del chip reloj de conjunto 1402 = "D17" externos 1403 establecer parte = "v1000bg560-4" 1404 / / Declaración de interfaz interfaz 1405 TTL7446 unsigned 7 segmentos unsigned 1 rbon 1406 sin signo 1 ltn 1 rbin sin signo sin signo de 4 dígitos 1407 sin signo 1 bin 1408 / / Principal programa 1409 void main void { 1410 1411 ltnVal 1 sin signo 1412 rbinVal 1 sin signo 1413 binVal 1 sin signo 1414 sin signo 4 digitVal .Conexión a bloques VHDL 1415 rbonVal 1 sin signo Retrasar el 20 sin signo 1416 interfaz 1417 TTL7446 unsigned 7 segmentos unsigned 1 rbon 1418 descodificar unsigned 1 ltn = ltnVal sin signo 1 rbin = rbinVal sin signo de 4 dígitos 1419 = digitVal 1 bin sin signo = binVal 1420 con {extlib = "pluginmodelsim_dll" 1421 extinst = "descodificar modelo = TTL7446_wrapper demora = 1 "} visualización de la interfaz de 1422 bus_out unsigned display =.about.decode.segme-nts 1423 con {extlib="7segment.dll" extinst = "0" datos 1424 = {"an28" "ak25" "al26" "aj24" "am27" "am26" "ak24"}} par 1425 { 1426 1427 ltnVal = 0 1428 rbinVal 0 1429 binVal = 0 1430 digitVal = 0 1431 } 1432 mientras que 1 { 1433 1434 binVal = 1 1435 ltnVal = 1 1436 hacer { 1437 1438 hacer { 1439 rbonVal=decode.rbon 1440 1441 digitVal ++ 1442 # ifndef SIMULAR hacer 1443 {demora ++ } while Delay =0 1444 # endif 1445 } while digitVal = 0 1446 rbinVal ++ 1447 } while rbinVal = 0 1448 } Código de la interfaz de 1449 1450 Uno podrá declarar un tipo de interfaz que tiene nombres de puerto del mismo nombre y tipo como las señales VHDL en el circuito de integrarse. El tipo de interfaz puede ser el mismo que el nombre del modelo VHDL. interfaz 1451 TTL7446 unsigned 7 segmentos unsigned 1 rbon unsigned 1 ltn unsigned 1 rbin sin signo de 4 dígitos unsigned 1 bin 1452 Una instancia de este componente es crea uno o más veces en el código de c de Handel. Un ejemplo de una creación de instancias es interfaz 1453 TTL7446 unsigned 7 segmentos unsigned 1 rbon descodificar sin signo 1 ltn 1454 = ltnVal sin signo 1 rbin = rbinVal sin signo de 4 dígitos = digitVal 1 sin signo 1455 bin = binVal con {extlib="PluginModelSim.dll" extinst = "descodificar modelo 1456 = ttl7446_wrapper demora = 1 " } .Conexión a bloques VHDL Ejemplo de circuito simple registro Banco 1457 Código VHDL 1458 1459 VHDL el código para el circuito de Banco de registro está en el archivo reg32x1k.vhdl biblioteca 1460 ieee 1461 utilice ieee.std_logic.sub. 1164.all uso de 1462 ieee.std_logic_arith.all es reg32x1k de entidad 1463 1464 simple sincrónica registrar Banco 32 bits de longitud y 1 k registros 1465 profundos puerto 1466 dirección en sin signo Bajarpara 9 0 data_in 1467 en sin signo 31 Bajarpara 0 ck 1468 en std_logic escritura 1469 en std_logic data_out 1470 fuera sin signo 31 Bajarpara 0 1471 final es el comportamiento de arquitectura 1472 de reg32x1k register_array de tipo 1473 es la matriz área de distribución natural lt gt sin signo 31 Bajarpara 1474 0 datos de la señal 1475 register_array 0 a 1023 = otros = gt others= gt 1476 ' 0' 1477 comenzar proceso 1478 ck 1479 comenzar Si 1480 ck'event y ck = '1' then Si 1481 escribir = '1' then data conv_integer address 1482 lt = data_in 1483 end if 1484 end if proceso de final 1485 data_out 1486 lt = data conv_integer address 1487 final Contenedor VHDL 1488 por ejemplo de registros 1489 Es la reg32x1k_wrapper.vhdl de archivo. es reg32x1k_wrapper de entidad 1490 1491 final biblioteca 1492 ieee 1493 utilice ieee.std_logic.sub. 1164.all uso de 1494 ieee.std_logic_arith.all 1495 arquitectura HandelC de reg32x1k_wrapper es dirección de señal 1496 sin signo Bajarpara 9 0 = otros = gt '0' data_in de señal 1497 sin signo 31 Bajarpara 0 lt = otros = gt '0' ck de señal 1498 std_logic lt = '0' escritura de señal 1499 std_logic = '0' data_out de señal 1500 sin signo 31 Bajarpara 0 lt = otros = gt '0' 1501 comenzar 1502 plugin1 work.plugin de la entidad registros 1503 mapa de puerto work.reg32x1k de entidad dirección data_in ck 1504 escritura data_out 1505 final Código de Handel-C 1506 para interfaz con registros 1507 Es la reg32x1k_test.c de archivo. 1508 / / Establecer detalles del chip reloj de conjunto 1509 lt = "D17" externos 1510 establecer parte lt = "v1000dg560-4" 1511 / / Declaración de interfaz reg32x1k de interfaz 1512 sin signo de 32 data_out 1513 sin signo dirección 10 data_in sin signo de 32 1514 ck 1 sin signo sin firmar 1 escritura 1515 / / Principal programa 1516 void main void { 1517 1518 data_outVal sin signo de 32 addressVal de 10 sin signo 1519 1520 data_inVal sin signo de 32 1521 writeVal 1 sin signo reg32x1k de interfaz 1522 sin signo de 32 data_out registros 1523 unsigned dirección 10 = addressVal 1524 con {extpath lt = {data_out}} 1525 data_in sin signo de 32 = data_inVal 1526 unsigned 1 ck lt = _clock escritura de 1 sin signo 1527 lt = writeVal 1528 con {extlib="PluginModelSim.dll" extinst = "1 modelo = contenedor reg32x1k reloj = ck 25"} .Conexión a Bloques VHDL 1529 par 1530 { 1531 addressVal 1532 lt = 0 1533 datos inVal lt = 0 writeVal 1534 lt = 0 1535 } while 1 1536 { 1537 par 1538 { 1539 writeVal 1540 lt = 1 addressVal 1541 lt = 0 1542 } 1543 hacer { 1544 par 1545 { 1546 1547 addressVal ++ 1548 data_inVal += 10 1549 } data_outVal 1550 lt = registers.data_out 1551 } while addressVal lt 10 par 1552 { 1553 writeVal 1554 lt = 0 addressVal 1555 lt = 0 1556 } 1557 hacer { 1558 1559 addressVal ++ data_outVal 1560 lt = registers.data_out 1561 } while addressVal lt 10 1562 } Los programadores de aplicaciones de interfaz 1563 FIG. 41A ilustra un método 4150 para equipar un simulador con plug-ins. En general en la operación 4152 se ejecuta un simulador primer escrito en un lenguaje de programación de primero para generar un modelo de primero. Además en la operación 4154 un simulador de segundo escrito en un lenguaje de programación segundo se ejecuta para generar un modelo de segundo. En un aspecto el primer simulador puede estar basado en el ciclo y el simulador de segundo puede ser basado en eventos. Más información sobre estos tipos de simuladores se establecerse en lo sucesivo en mayor detalle durante la referencia a FIG. 44 bis. 1564 Por este diseño se puede realizar un co-simulación utilizando el modelo de primer y segundo modelo. Véase operación 4156. En uno de los aspectos de la presente invención la precisión y la velocidad de la co-simulación pueden ser especificado por el usuario. En otro aspecto puede incluir la co-simulación de programación intercalado. 1565 En un aspecto adicional de la invención presente la co-simulación puede incluir programación totalmente propagados. En otro aspecto pueden ejecutar las simulaciones utilizando una pluralidad de procesadores es decir un sistema de coprocesador . En incluso otro aspecto el primer simulador podrá ser ejecutado por delante o detrás del segundo simulador. En aún un aspecto adicional el primer simulador puede interactuar con el simulador de segundo a través de un plug-in. Más información con respecto a tales personificaciones alternativos se establecerá en adelante en lo sucesivo en mayor detalle. Interfaz de la de los programadores de aplicaciones API de 1566 así describe cómo escribir plugins para conectar con el simulador de Handel-C. Los plugins son programas que se ejecutan en el ordenador y conectan a un reloj de Handel-C o la interfaz. Se puede escribir en cualquier idioma. 1567 Ejemplos de plugins útiles son Osciloscopio simulada de 1568 Generadores de forma de onda simuladas 1569 1570 Visualización de seleccionados y almacenamiento de información de las variables para la depuración 1571 Co-simulación de otros circuitos Anchos de datos 1572 en el simulador 1573 El simulador utiliza ancho de 32 bits 64 bits o arbitraria aritmética según corresponda. La interfaz para el simulador usa punteros a los valores de ancho definido. Cuando se utilicen los anchos de 32 o 64 bits los datos se almacenan en los bits más significativos. Interfaz de simulador de 1574 1575 El plugin se identifica con el simulador por 1576 el nombre de la DLL compilada el plugin compilado 1577 llama a la función que pase los datos entre el plugin y el programa de Handel-C 1578 el nombre de instancia 1579 Estos se pasan al simulador mediante el con especificaciones 1580 extlib especifica el nombre de la DLL. No tiene valor predeterminado. extlib 1581 especifica una cadena de la instancia. No tiene valor predeterminado. extfunc 1582 especifica la función llamar para pasar datos al plugin o recibir datos del plugin. El valor predeterminado es de PlugInSet para pasar datos al plugin y PlugInGet para obtener datos desde el plugin. 1583 El simulador espera el plugin para apoyar diversas llamadas a funciones y algunas estructuras de datos. El simulador también tiene funciones que pueden ser llamadas por el plugin funciones de devolución de llamada . Estas funciones ofrecen información sobre el estado de variables en el programa de Handel-C. HIGOS. 42A y 42B ilustran varias llamadas a funciones 4200 y los diversos usos de conformidad con una encarnación de la invención presente. Retención de nombre de función 1584 en C++ 1585 El simulador requiere que se conservan los nombres de función en el plugin. Ya compiladores de C++ pueden cambiar los nombres de función uno pueden garantizar que los nombres de función se identifican como tipos C. Para ello o bien uno puede compilar el plugin como un archivo C o si él o ella es compilarlo como C++ él o ella puede utilizar la extensión extern para forzar al compilador que utilice la Convención de nomenclatura C. Para compilar la función como C++ colocar la cadena extern "C" inmediatamente antes de la definición de la función para asegurarse de que la función de los nombres se exportan como escrito por ejemplo extern "C" dll 1586 void PlugInOpen HCPLUGIN_INFO * Info unsigned long NumInst { 1587 1588 / / esta función intencionalmente deja en blanco 1589 / / inicializar antes de ejecuta la primera simulación 1590 Especificando Plugins en el origen de Handel-C del código 1591 Plugins se especifican en el código fuente de Handel-C utilizando el extlib especificaciones de extinst y extfunc. Estas especificaciones pueden aplicarse a relojes o definiciones de interfaz. Por ejemplo reloj de conjunto 1592 = externos "P1" con {extlib="plugin.dll" extinst = "instance0"} En el caso de las definiciones de interfaz las especificaciones se especifiquen para puertos individuales o para la interfaz como un todo. Por ejemplo interfaz 1593 bus_in entrada 4 sin signo BusName con 1594 {extlib="plugin.dll" extinst = "alguna cadena de la instancia" 1595 extfunc = "busnamegetvalue"} bus_ts de la interfaz 1596 entrada 4 sin signo con {extlib="plugin.dll" 1597 extinst = "alguna cadena de la instancia" 1598 extfunc = "busnamegetvalue"} 1599 BusName salida 4 sin signo con {extlib="plugin.dll" 1600 extinst = "alguna instancia de cadena" extfunc = "busnamesetvalue" 1 sin signo 1601 habilitar con {extlib="plugin.dll" extinst = "algunos cadena de la instancia 1602 " extfunc ="busnameenable"} Estructuras de datos 1603 Estructuras de 1604 pasadas al inicio 1605 La siguiente estructura de datos pasa información esencial del simulador para el plugin al inicio. HCPLUGIN_INFO 1606 1607 typedef struct { 1608 Tamaño largo sin signo 1609 1610 void * del Estado Devoluciones de llamada HCPLUGIN_CALLBACKS 1611 HCPLUGIN_INFO 1612 } Miembros 1613 1614 Tamaño establecido en sizeof HCPLUGIN_INFO como una comprobación de la corrupción. Identificador de estado Simulator de 1615 que puede utilizarse en las devoluciones de llamada desde el plugin para el simulador. Este valor debe pasar en el futuro las llamadas a cualquier función en la estructura de las devoluciones de llamada. Estructura de datos de espaldas llamar 1616 que contiene punteros a las funciones de devolución de llamada de plugin para el simulador. Consulte a continuación para obtener más detalles de estas funciones. Estructura de datos de devolución de llamada 1617 HCPLUGIN_CALLBACKS 1618 1619 Los punteros a las funciones de devolución de llamada figuran en la siguiente estructura que es un miembro de la estructura HCPLUGIN_INFO pasada a la función de PlugInOpen . Tamaño debe establecerse en sizeof HCPLUGIN_CALLBACKS . estructura de tipo de letra 1620 { 1621 Tamaño largo sin signo 1622 1623 HCPLUGIN_ERROR_FUNC PluginError 1624 HCPLUGIN_GET_VALUE_COUNT_FUNC PluginGetvaluecount 1625 HCPLUGIN_GET_VALUE_FUNC PluginGetValue 1626 HCPLUGIN_GET_MEMORY_ENTRY_FUNC PluginGetMemoryEntry HCPLUGIN_CALLBACKS 1627 } Estructuras de posición de archivos de origen 1628 1629 A posición de origen consiste en una lista de rangos de código de fuente individual. Cada rango detalla el archivo de origen y una gama de líneas y columnas. La lista de rangos consta de una lista enlazada por separado de rangos de código de origen. Listas de posiciones se generan por algunas construcciones de código fuente de c de Handel. Por ejemplo una llamada a un proc macro produce posiciones para los elementos del cuerpo de la proc macro con dos miembros de la lista de la gama de posición. Uno apunta al interior del cuerpo de proc de macro y los otros puntos a la llamada de la macro que proc. listas de posiciones se generan también para replicadores y arreglos de discos de funciones. Las siguientes estructuras de datos se utilizan para representar las posiciones de origen de los objetos HCPLUGIN_POS_ITEM 1630 1631 typedef struct HCPLUGIN_POS_ITEM_tag { 1632 Tamaño largo sin signo 1633 1634 char * FileName StartLine largo de 1635 StartColumn largo de 1636 fin de línea larga de 1637 EndColumn largo de 1638 1639 struct HCPLUGIN_POS_ITEM_tag * siguiente HCPLUGIN_POS_ITEM 1640 } Miembros 1641 1642 Tamaño establecido en sizeof HCPLUGIN_POS_ITEM como una comprobación de la corrupción. 1643 Nombre de archivo de nombre de archivo de origen de la gama de posición. 1644 StartLine de primera línea del intervalo. 1 indica que el nombre de archivo es un archivo de objeto sin información de depuración. Inicio de recuentos de línea desde cero. 1645 StartColumn primera columna del rango. 1 indica que el nombre de archivo es un archivo de objeto sin información de depuración. Inicio de recuentos de columna desde cero. 1646 Fin de línea última línea de la gama. 1 indica que el nombre de archivo es un archivo de objeto sin información de depuración. Inicio de recuentos de línea desde cero. 1647 EndColumn última columna del intervalo. 1 indica que el nombre de archivo es un archivo de objeto sin información de depuración. Inicio de recuentos de columna desde cero. 1648 Puntero siguiente para posicionar a continuación rango en la lista. NULL indica que este es el último intervalo de posición en la lista. HCPLUGIN_POSITION 1649 1650 typedef struct { 1651 Tamaño largo sin signo 1652 1653 HCPLUGIN _POS_ITEM * SourcePos HCPLUGIN_POSITION 1654 } Miembros 1655 1656 Tamaño establecido en sizeof HCPLUGIN_POSITION como una comprobación de la corrupción. 1657 SourcePos puntero para colocar en primer rango en la lista enlazada. Estructuras de valor variables 1658 1659 La siguiente estructura de datos se utiliza para pasar información sobre los valores de las variables desde el simulador para el plugin. El plugin puede consultar y establecer los valores de variables en el simulador utilizando estas estructuras de datos y las funciones de devolución de llamada asociado de tipos HCPLUGIN_GET_VALUE_FUNC y HCPLUGIN_GET_MEMORY_ENTRY_FUNC. Los valores se acceden a través de un índice de uso de estas funciones. Consulte a continuación para obtener más detalles de estas funciones. 1660 HCPLUGIN _VALUE 1661 tipografía enum { 1662 HCPluginValue 1663 HCPluginArray 1664 HCPluginStruct 1665 HCPluginRAM 1666 HCPluginROM 1667 HCPluginWOM 1668 HCPLUGIN_VALUE_TYPE 1669 } Tipo de HCPLUGIN_VALUE_TYPE the enumerado 1670 se utiliza para definir el tipo de objeto de valor incluido en la estructura de datos HCPLUGIN_VALUE. Los valores tienen los siguientes significados Valor de HCPluginValue General 1671 utilizado para las señales y registros. Deben utilizarse 1672 Data.ValueData miembros de la estructura HCPLUGIN_VALUE. Valor de la matriz de HCPluginArray 1673 . Estructura de datos contiene una lista de índices de valor en el miembro de datos de la estructura HCPLUGIN_VALUE. Valor de la estructura de HCPluginStruct 1674 . Estructura de datos contiene una lista enlazada de valores en el miembro de datos de la estructura HCPLUGIN_VALUE. Valor de la memoria de RAM HCPluginRAM 1675 . Estructura de datos contiene el número de entradas en la memoria en el miembro Data.MemoryData de la HCPLUGIN_VALUE. Valor de la memoria ROM de HCPluginROM 1676 . Estructura de datos contiene el número de entradas en la memoria en el miembro Data.MemoryData de la HCPLUGIN_VALUE. Valor de la memoria HCPluginWOM WOM 1677 . Estructura de datos contiene el número de entradas en la memoria en el miembro de Data.MemoryData de HCPLUGIN_VALUE 1678 typedef struct HCPLUGIN_STRUCT_ENTRY_tag { 1679 Tamaño largo sin signo 1680 1681 HCPLUGIN _POSITION * posición 1682 char * nombre ValueIndex largo sin signo 1683 etiqueta de 1684 struct HCPLUGIN_STRUCT_ENTRY * siguiente 1685 } HCPLUGIN STRUCT_ENTRY 1686 typedef struct HCPLUGIN_VALUE_tag { 1687 Tamaño largo sin signo 1688 HCPLUGIN_POSITION 1689 * posición Interna largo sin signo 1690 5 1691 int TopLevel 1692 char * nombre Tipo HCPLUGIN_VALUE_TYPE 1693 Unión 1694 { 1695 1696 struct 1697 int firmado Base de largo sin signo 1698 Ancho largo sin signo 1699 1700 void * de valor ValueData 1701 } 1702 struct 1703 } 1704 unsigned long * elementos Longitud largo sin signo 1705 ArrayData 1706 } 1707 HCPLUGIN_STRUCT_ENTRY * StructData 1708 struct { 1709 Longitud largo sin signo 1710 MemoryData 1711 } Datos 1712 } HCPLUGIN_VALUE 1713 } 1714 de la estructura HCPLUGIN_VALUE 1715 Tamaño establecido en sizeof HCPLUGIN_VALUE como una comprobación de la corrupción. 1716 Posición de origen de la posición de declaración de objeto. 1717 Internos interna de datos usada por el depurador. No modifique. 1718 TopLevel se pone a 1 si es un objeto de nivel superior o 0 lo contrario. Ejemplos de objetos que no son de nivel superior son elementos de matrices o miembros de las estructuras. Usado por el depurador. 1719 Nombre identificador del objeto. 1720 Tipo tipo de objeto que representa este valor. Vea los detalles de la HCPLUGIN_VALUE_TYPE arriba tipo enumerado. 1721 Datos Unión que contiene los datos de valor que consiste en Data.ValueData Data.ArrayData. 1722 y Data.MemoryData. 1723 Elementos de HCPLUGIN_VALUE.Datos Datos 1724 se utilizan para representar los valores básicos por ejemplo registros y señales y contiene los siguientes miembros 1725 Firmado cero para un valor sin signo cero para un valor con signo. 1726 Predeterminado base base utilizada para representar este valor especificado mediante las especificaciones de la base en el código fuente . Puede ser 2 8 10 o 16 o 0 para ninguno. 1727 Ancho ancho de valor en bits. 1728 Valor puntero al valor. Si es de anchura inferior o igual a 32 bits esto es un largo * o unsigned long *. Si es de anchura inferior o igual a 64 bits este es un _int64 * o _int64 sin signo *. Si a continuación ancho es mayor de 64 bits este es un NUMLIB_NUMBER ** datos almacenados en _int64 mucho mucho tiempo sin firmar y tipos sin signo _int64 está alineados a la izquierda. Esto significa que ocupa los bits más significativos en la palabra y no los bits menos significativos. Por ejemplo 3 almacenados en un número amplio de 3 bits en una palabra de 32 bits se representa como 0x60000000. Funciona mediante NUMLIB_NUMBER estructuras son sescribed en adelante. DataArrayData 1729 se utiliza para representar los valores de la matriz y contiene a los siguientes miembros Matriz de elementos 1730 de los índices de valor de los miembros de la matriz. Estos índices pueden pasarse a más llamadas a la función de valor de get. 1731 Número de longitud de los elementos de la matriz. Data.StructData 1732 se utiliza para representar los valores de la estructura y puntos a la cabeza de un valor NULL cancelar lista enlazada de objetos de miembros de la estructura. Consulte a continuación para obtener más detalles de la estructura de STRUCT_ENTRY de HCPLUGIN. Data.MemoryData 1733 se utiliza para representar valores de memoria RAM ROM y WOM y contiene a los siguientes miembros 1734 Número de longitud de elementos en la memoria. Funciones asociadas 1735 Uso de 1736 la función de devolución de llamada HCPLUGIN_GET_MEMORY_ENTRY_FUNC para acceder a elementos de la memoria. Simulador de 1737 para funciones de Plugin 1738 Estas funciones son llamadas por el simulador para enviar información al plugin. Se les llama cuando la simulación comienza y termina y en puntos en el reloj de simulador de ciclo. El plugin puede actuar sobre la llamada o no hacer nada. El plugin puede implementar la función con el mismo nombre y parámetros. 1739 void PlugInOpen HCPLUGIN_INFO * Info unsigned long NumInst 1740 El simulador llama a esta función la primera vez que se utiliza el plugin .dll en una sesión de Handel-C. Cada simulador utilizado puede hacer una llamada a esta función para cada plugin especificado en el código fuente. 1741 Info puntero a la estructura que contiene información posterior de simulador de llamadas. 1742 NumInst número de instancias del plugin especificado en el código fuente. Una llamada a PluginOpenInstance puede hacerse para cada una de estas instancias. PlugInOpenInstance 1743 1744 void * PlugInOpenInstance char * unsigned long NumPorts el nombre 1745 Esta función se llama cada vez que uno inicia una simulación. Se llama una vez para cada instancia del plugin el código fuente de c de Handel. Una instancia es considerada única si se utiliza una cadena única en la especificación extinst. El plugin debe devolver un valor que se utiliza para identificar la instancia en futuras convocatorias desde el simulador. Este valor puede pasarse a las llamadas futuras a 1746 PlugInOpenPort . PlugInSet PlugInGet PlugInStartCycle de De 1747 PlugInEndCycle y PlugInCloseInstance . Cadena de nombre 1748 especificada en la especificación de extinst en el código fuente. Número de NumPorts 1749 de puertos asociados con esta instancia. Una llamada a PluginOpenPort puede hacerse para cada uno de estos puertos. PlugInOpenPort 1750 1751 void * PlugInOpenPort void * instancia char * nombre dirección de int unsigned Bits de largos 1752 Esta función se llama cada vez que uno inicia una simulación. Se llama una vez para cada puerto de interfaz asociado con este plugin en el código fuente. El plugin debe devolver un valor que se utiliza para identificar el puerto en futuras convocatorias desde el simulador. Este valor puede pasarse a las llamadas futuras a 1753 lugInGet De 1754 PlugInSet y PlugInClosePort . 1755 Instancia valor devuelto por la función de PlugInOpenInstance . 1756 Nombre nombre del puerto de la definición de interfaz en el código fuente. 1757 Dirección cero para un puerto de transferencia de datos de plugin para simulador cero para un puerto de transferencia de datos de simulador de plugin. Ancho de bits 1758 del puerto. PlugInSet 1759 1760 void PlugInSet void * instancia void * puerto sin signo de Bits largos void * valor 1761 El simulador para pasar datos de simulador plugin llama a esta función. Se garantiza que cada vez el valor en los cambios de puerto pero puede ser llamado más a menudo que el. 1762 Instancia valor devuelto por la función de PlugInOpenInstance . 1763 Puerto valor devuelto por la función de PluginOpenPort . Ancho de bits 1764 del puerto. 1765 Valor puntero al valor. Si Bits es menor o igual a 32 bits entonces esto es un largo * o unsigned long *. Si Bits es menor o igual a 64 bits entonces esto es int64 * o int64 sin signo *. Si Bits es mayor de 64 bits entonces esto es un NUMLIB_NUMBER **. Izquierda se alinean los datos almacenados en _int64 largo largo sin signo sin firmar durante mucho tiempo y los tipos sin signo _int64. Esto significa que ocupa los bits más significativos en la palabra y no los bits menos significativos. Por ejemplo 3 que se almacena como un número amplio de 3 bits en una palabra de 32 bits se representa como 0x60000000. Utilizando las estructuras NUMILIB_NUMBER de funciones se describen en lo sucesivo. 1766 Donde 32 o 64 bits anchos se utilizan los datos se almacenan en los bits más significativos. PlugInGet 1767 1768 void PlugInGet void * instancia void * puerto sin signo de Bits largos void * valor 1769 El simulador para obtener datos desde el plugin llama a esta función. Uno puede utilizar cualquier nombre que desea para esta función especificada en por extfunc pero los parámetros pueden permanecer en el mismo. 1770 Instancia valor devuelto por la función de PlugInOpenInstance . 1771 Puerto valor devuelto por la función de PlugInOpenPort . Ancho de bits 1772 del puerto. 1773 Valor puntero al valor. Si Bits es menor o igual a 32 bits entonces esto es un largo * o unsigned long *. Si Bits es menor o igual a 64 bits entonces esto es a_int64 tipo específico de Microsoft * o _int64 sin signo *. Si Bits es mayor de 64 bits entonces esto es un NUMLIB_NUMBER **. Izquierda se alinean los datos almacenados en _int64 mucho mucho tiempo sin firmar y tipos sin signo _int64. Esto significa es que se ocupa de los bits más significativos en la palabra y no los bits menos significativos. Por ejemplo 3 almacenados en un número amplio de 3 bits en una palabra de 32 bits se representa como 0x60000000. Utilizando las estructuras NUMLIB_NUMBER de funciones se describen en lo sucesivo. 1774 Donde 32 o 64 bits anchos se utilizan los datos pueden almacenarse en los bits más significativos. Uno puede izquierda-el número de turnos en las MSBs por lo que se puede leer correctamente el código de Handel-C. PlugInStartCycle 1775 1776 void PlugInStartCycle void *Instance 1777 Se llama a esta función por el simulador al comienzo de cada ciclo de simulación. 1778 Instancia valor devuelto por la función de PlugInOpenInstance . PlugInMiddleCycle 1779 1780 void PlugInMiddleCycle void *Instance 1781 Esta función se llama por el simulador inmediatamente antes de que se actualizan las variables en el simulador. 1782 Instancia valor devuelto por la función de PlugInOpenInstance . PlugInEndCycle 1783 1784 void PlugInEndCycle void *Instance 1785 Llama a esta función por el simulador al final de cada ciclo de simulación. 1786 Instancia valor devuelto por la función de PlugInOpenInstance . PlugInClosePort 1787 1788 void PlugInClosePort void *Port 1789 El simulador llama a esta función cuando se cierra el simulador. Se llama una vez para cada llamada a PlugInOpenPort . 1790 Puerto valor devuelto por la función de PlugInOpenPort . PlugInCloseInstance 1791 1792 void PlugInCloseInstance void *Instance 1793 El simulador llama a esta función cuando se cierra el simulador. Se llama una vez para cada llamada a PlugInOpenInstance . 1794 Instancia valor devuelto por la función de PlugInOpenInstance . PlugInClose 1795 1796 void PlugInClose void 1797 El simulador llama a esta función cuando se cierra el simulador. Se llama una vez para cada llamada a PlugInOpen . Funciones de devolución de llamada de simulador de 1798 1799 Se utilizan las funciones de devolución de llamada de simulador por plugins para consultar el estado de variables dentro del programa de Handel-C. Esto puede usarse para registros de memoria asignada de modelo o recursos de memoria compartida o para mostrar valores de depuración en representaciones no estándares por ejemplo muestra el analizador osciloscopio y lógica . El plugin recibe punteros a estas funciones en el parámetro de información de la llamada a función PlugInOpen hecha por el simulador al inicio. HCPLUGIN_ERROR_FUNC 1800 1801 typedef void * HCPLUGIN_ERROR_FUNC void * del Estado sin signo de mucho nivel char * mensaje 1802 El plugin debe llamar a esta función para informar de la información advertencias o errores. Estos mensajes pueden mostrarse en la ventana de depuración de la GUI. Además un error puede dejar la simulación. El Estado miembro de la estructura HCPLUGIN_INFO pasa a la función de PlugInOpen . Información de nivel 0 1803 1804 1 Advertencia 1805 Error 2. Cadena de mensaje de Error de mensaje 1806 . HCPLUGIN_GET_VALUE_COUNT_FUNC 1807 1808 typedef unsigned long * HCPLUGIN_GET_VALUE_COUNT_FUNC void * estado 1809 El plugin debe llamar a esta función para consultar el número de valores en el simulador. Este número proporciona el índice máximo para la función de VALUE_FUNC de HCPLUGIN_GET. 1810 El Estado miembro de la estructura HCPLUGIN_INFO pasa a la función de PlugInOpen . HCPLUGIN_GET_VALUE_FUNC 1811 1812 typedef void * HCPLUGIN_GET_VALUE_FUNC void * unsigned índice largo _VALUE de HCPLUGIN del Estado * valor 1813 El plugin debe llamar a esta función para obtener el valor de una variable desde el simulador. El Estado miembro de la estructura HCPLUGIN_INFO pasa a la función de PlugInOpen . Índice de la variable. Debe estar entre 0 y el uno menos que el valor devuelto por la función HCPLUGIN GET Conde de valor FUNC inclusiva. 1814 A mapa de índice a nombre de la variable puede construirse en el inicio llamar varias veces esta función y examinando la estructura del valor devuelta. Estructura de valor 1815 que contiene información sobre el valor. HCPLUGIN_GET_MEMORY_ENTRY_FUNC 1816 1817 typedef void * HCPLUGIN_GET_MEMORY_ENTRY_FUNC void * Estado unsigned índice largo unsigned largo desplazamiento HCPLUGIN_VALUE * valor 1818 El plugin debe llamar a esta función para obtener una entrada de memoria desde el simulador. 1819 El Estado miembro de la estructura HCPLUGIN_INFO pasa a la función de PlugInOpen . Índice de índice 1820 de la variable. Debe estar entre 0 y uno menos que el valor devuelto por la función HCPLUGIN_GET_VALUE_COUNT_FUNC inclusiva. Un mapa de índice a nombre de la variable puede construirse al inicio llamar varias veces esta función y examinando la estructura del valor devuelta. Desplazamiento de desplazamiento 1821 en la RAM. Por ejemplo para obtener el valor de x 43 índice debería referirse a x y este valor debe ser 43. Estructura de valor 1822 que contiene información sobre el valor. Ejemplo de 1823 1824 Este ejemplo consta de tres archivos Archivo de Handel A-c 1825 que invoca el plugin a través de interfaces Archivo de ANSI-C 1826 que contiene las funciones de plugin Archivo de encabezado de la an ANSI-C 1827 definición de las estructuras de plugin 1828 Archivo de Plugin plugin-Demo.c 1829 Este sencillo ejemplo tiene una función MyBusOut que lee un valor desde una interfaz de simulador y una función MyBusIn que dobla un valor y se escribe en un interfaz de simulador. 1830 Responde a las llamadas a PlugInOpenInstance y PlugInOpenPort devuelve NULL. Todas las demás funciones de plugin requerido se han definido pero no hacen nada. 1831 # include "plugin.h" 1832 # define dll.sub. _declspec dllexport dll 1833 void PlugInOpen HCPLUGIN_INFO * Info unsigned long NumInst { 1834 en función de //este 1835 intencionalmente blanco //intialisating 1836 antes de ejecuta la primera simulación 1837 } dll 1838 void PlugInClose void { 1839 //tidy-up 1840 después de la final de simulación 1841 } dll 1842 void * PlugInOpenInstance char * unsigned long NumPorts el nombre { 1843 //invoked 1844 cuando uno comienza una simulación 1845 espacio que todo lo necesario para esta simulación 1846 return NULL 1847 } dll 1848 void PlugInCloseInstance void *Instance { 1849 1850 } dll 1851 void * PlugInOpenPort void * instancia char * nombre int Dirección 1852 unsigned long Bits { 1853 1854 //an oportunidad de inicializar las estructuras de datos asociadas 1855 con //Este 1856 puerto y regreso el puntero asociado que podría 1857 1858 //then pasar a PlugInSet etc.. 1859 return NULL 1860 } dll 1861 void PlugInClosePort void *Port { 1862 1863 } 1864 causar largo sin signo estática dll 1865 void MyBusOut void * instancia void * unsigned Bits de largos el puerto 1866 void * valor { 1867 1868 Causar lt = * long * valor 1869 } dll 1870 void MyBusIn void * instancia void * unsigned Bits de largos el puerto 1871 void * valor { 1872 * long * 1873 valor lt = causar * 2 1874 } dll 1875 void PlugInStartCycle void *Instance { 1876 //call 1877 después de inicio de ciclo de reloj 1878 //possible útil con relojes no estándares 1879 } dll 1880 void PlugInMiddleCycle void *Instance { 1881 1882 } dll 1883 void PlugInEndCycle void *Instance 1884 { 1885 } Archivo de cabecera de c 1886 plugin.h 1887 Esto se proporciona en el CD de instalación. Contiene las declaraciones de las estructuras necesarias. Archivo de Handel-C 1888 plugin-demo.c 1889 setclock lt = "1" interna 1890 int 8 a b 1891 macro expr MyOutExpr lt = un 1892 interfaz bus_out MyBusOut MyOutExpr con 1893 {extlib="pluginDemo.dll" extinst = "0" extfunc = "mybusout"} 1894 interfaz bus_in int 8 MyBusIn con 1895 {extlib="pluginDemo.dll" extinst = "0" extfunc = "mybusin" } 1896 void main void { 1897 un = 1 un lt 10 un ++ { b 1898 lt = MyBusIn.in 1899 } Biblioteca de Numlib 1900 1901 Se proporciona la biblioteca numlib.dll. Contiene una serie de rutinas para hacer frente a valores mayores de 64 bits de longitud. Estos números se almacenan en una estructura NUMLIB_NUMBER y estas rutinas utilizan esta estructura para operar en. Hay rutinas para convertir NUMLIB_NUMBER estructuras a valores de 32 y 64 bits. 1902 Estas rutinas se accede mediante la inclusión de la numlib.h del archivo de encabezado. Sus funciones son número de l'asignación y l'exportación d'eliminación d'asignación anular NumLibNew NUMLIB_NUMBER **Num unsigned long Width Grab ancho espacio para valor indirectamente señala núm. proporcionar puntero al espacio adquirido en Nº 1903 Por ejemplo NUMLIB_NUMBER 1904 * Fred 1905 NumLibNew Fred 453 1906 Libre exportación de NumLibFree NUMLIB_NUMBER *Num void agarró espacio para valor apuntado por núm. 1907 Por ejemplo NumLibFree Fred Rutinas de control de número general 1908 1909 Exportación void NumLibSet char *a NUMLIB_NUMBER *Result establecer valor apuntado por resultado el valor de cadena de un. 1910 Por ejemplo 1911 NUMLIB_NUMBER * Fred 1912 NumLibNew Fred 453 1913 NumLibSet "1245216474847832194873205083294" Fred Void copia de NumLibCopy NUMLIB_NUMBER *Source NUMLIB_NUMBER *Result valor de exportación de 1914 apuntado por origen a valor apuntado por el resultado. 1915 Exportación void NumLibPrint unsigned int durante mucho tiempo Base firmado NUMLIB_NUMBER * fuente valor apuntado por la fuente a la pantalla en la Base de impresión mostrar como firmado o sin signo según . Si firmado es cero número se trata como firmado por ejemplo " 1" . Si firmado es cero los números pueden tratarse como unsigned por ejemplo "255" 1916 Exportación void NumLibPrintFile FILE *FilePtr unsigned long Base int Signed NUMLIB_NUMBER *Source escribir valor apuntado por fuente al archivo apuntado por FilePtr como anteriormente. EXPORTACIÓN 1917 unsigned long NunLibPrintString char * sin signo de búfer BufferLength largo sin signo larga Base int firmado NUMLIB_NUMBER * SourceIn . Escribir el valor apuntado por SourceIn como cadena al búfer en dado Base longitud de búfer en Bufferlength . BufferLength es la longitud máxima que puede escribirse. 1918 Exportación uint32 NumLibBits NUMLIB_NUMBER *a calcular el ancho de valor apuntado por un y retorno número de bits es decir devolver el ancho de un especificado en NumLibNew . 1919 Exportación void NumLibSetBit NUMLIB_NUMBER * uint32 algo int valor conjunto de bit a Bit de valor apuntado por un valor 0 o 1 . 1920 Int NumLibGetBit NUMLIB_NUMBER *a uint32 Bit obtener el valor del bit de exportación poco de valor apuntado por un. 1921 Exportación int32 NumLibGetLong NUMLIB_NUMBER *a Convertir valor apuntado por un a 32 bits y devolverlo. Se utilizan los bits menos significativos y el resultado se alinea a la derecha es decir números normales no plugin estilo números . Int64 convertir NumLibGetLongLong NUMLIB_NUMBER *a valor de exportación de 1922 apuntado por un a 64 bits y devolverlo. Se utilizan los bits menos significativos y el resultado se alinea a la derecha es decir números normales no plugin estilo números . 1923 Exportación void NumLibWriteFile NUMLIB_NUMBER *a FILE *FilePtr escribir valor apuntado por un en formato binario para archivo apuntado por FilePtr. 1924 Exportación void NumLibReadFile NUMLIB_NUMBER *a FILE *FilePtr lectura número de formato binario desde un archivo apuntado por FilePtr y pone el resultado en una. Esto es lo contrario de NumLibWriteFile. El ancho de un mayo ser correcta. 1925 P.ej. 1926 NUMLIB_NUMBER * Fred 1927 Archivo * FilePointer = fopen "file.dat" "rb" NumLibNew Fred 453 1928 NumLibReadFile Fred FilePointer Operaciones aritméticas 1929 1930 Nota que en Handel-C uno puede hacer sólo lo firmado por o sin signo por signo de división y puede mezclar tipos. Todas las operaciones son Handel-C como y requieren algunos anchos y escriba la información. 1931 Exportación void NumLibUMinus NUMLIB_NUMBER * NUMLIB_NUMBER * b b =-a Void NumLibAdd NUMLIB_NUMBER *a NUMLIB_NUMBER *b NUMLIB_NUMBER *Result resultado de exportación de 1932 = a + b Void NunLibSubtract NUMLIB_NUMBER *a NUMLIB_NUMBER *b NUMLIB_NUMBER *Result resultado de exportación de 1933 = a-b Void NumLibMultiply NUMLIB_NUMBER *a NUMLIB_NUMBER *b NUMLIB_NUMBER *Result resultado de exportación de 1934 = un * b Void NumLibDivide NUMLIB_NUMBER *a NUMLIB_NUMBER *b int Signed NUMLIB_NUMBER *Result resultado de exportación de 1935 = un / b. Todos los números se tratan como o sin signo según el valor de firmado. Void NumLibMod NUMLIB_NUMBER *a NUMLIB_NUMBER *b int Signed NUMLIB_NUMBER *Result resultado de exportación de 1936 = una b %. Todos los números se tratan como o sin signo según el valor de firmado. 1937 Exportación void NumLibDivMod NUMLIB_NUMBER *a NUMLIB_NUMBER *b int Signed NUMLIB_NUMBER *DivResult NUMLIB_NUMBER *ModResult DivResult = un / b ModResult = una b %. Todos los números se tratan como o sin signo según el valor de firmado. Comparaciones 1938 EXPORTACIÓN 1939 unsigned long NumLibCompareEq NUMLIB_NUMBER * char * b devolver el resultado de la comparación del número de una cadena b equivalente a 1940 NUMLIB_NUMBER * temporales Res largos sin signo 1941 NumLibNew 1942 Temp un- gt anchura 1943 NumLibSet b Temp 1944 NumLibEquals una Temp Res 1945 NumLibFree Temp Res de retorno 1946 1947 Void NumLibEquals NUMLIB_NUMBER *a NUMLIB_NUMBER *b unsigned long *Result volver resultado de la exportación de un = b 1948 Exportación void NumLibNotEquals NUMLIB_NUMBER * NUMLIB_NUMBER * b unsigned long * resultado Devolver el resultado de un = b . 1949 Exportación void NumLibSGT NUMLIB_NUMBER * NUMLIB_NUMBER * b unsigned long * resultado Devolver el resultado de un gt b un y b firmado 1950 Void NumLibSGTE NUMLIB_NUMBER *a NUMLIB_NUMBER *b unsigned long *Result volver resultado de la exportación de un gt = b un y b firmado 1951 Void NumLibSLT NUMLIB_NUMBER *a NUMLIB_NUMBER *b unsigned long *Result volver resultado de la exportación de un lt b un y b firmado 1952 Void NumLibSLTE NUMLIB_NUMBER *a NUMLIB_NUMBER *b unsigned long *Result volver resultado de la exportación de un lt = b un y b firmado 1953 Void NumLibUGT NUMLIB_NUMBER *a NUMLIB_NUMBER *b unsigned long *Result volver resultado de la exportación de un gt b un y b sin signo 1954 Void NumLibUGTE NUMLIB_NUMBER *a NUMLIB_NUMBER *b unsigned *Result volver resultado de la exportación de un gt = b un y b sin signo 1955 Void NumLibULT NUMLIB_NUMBER *a NUMLIB_NUMBER *b unsigned long *Result volver resultado de la exportación de un lt b un y b sin signo 1956 Void NumLibULTE NUMLIB_NUMBER *a NUMLIB_NUMBER *b unsigned long *Result volver resultado de la exportación de un lt = b un y b sin signo 1957 Exportación void NumLibCond unsigned long * condición NUMLIB_NUMBER * UMLIB_NUMBER * b NUMLIB_NUMBER * resultado ¿Devolver el resultado de la condición a b. 1958 Equivalente a Si 1959 * condición == 0 { 1960 1961 NumLibCopy b resultado 1962 } 1963 else { 1964 1965 NumLibcopy un resultado 1966 } Operaciones bit a bit 1967 1968 Exportación void NumLibNot NUMLIB_NUMBER * NUMLIB_NUMBER * resultado valor apuntado por resultado =.about.a Void NumLibAnd NUMLIB_NUMBER *a NUMLIB_NUMBER *b NUMLIB_NUMBER *Result valor de exportación de 1969 apuntado por resultado = un b Void NumLibOr NUMLIB_NUMBER *a NUMLIB_NUMBER *b NUMLIB_NUMBER *Result valor de exportación de 1970 apuntado por resultado = un .vertline. b Void NumLibXor NUMLIB_NUMBER *a NUMLIB_NUMBER *b NUMLIB_NUMBER *Result valor de exportación de 1971 apuntado por resultado una b Operaciones de concatenación de 1972 1973 En todos las funciones de los valores int32 y int64 quedan alinean en consonancia con la interfaz de plugin. EXPORTACIÓN de 1974 void NumLibCat64.sub. 32 uint64 * un wa largo sin signo unsigned long * b unsigned long wb NUMLIB_NUMBER * resultado concatenar wa bits de 64 bits un y bits de wb de b de 32 bits y el lugar que en valor apuntado por el resultado. Valor señalado por resultado = int wa un @ int wb b EXPORTACIÓN de 1975 void NumLibCat32.sub. - 64 unsigned long * un wa largo sin signo uint64 * b unsigned long wb NUMLIB_NUMBER * resultado concatenar wa bits de 32 bits un y bits de wb de b de 64 bits y el lugar que en valor apuntado por el resultado. Valor señalado por resultado = int wa un @ int wb b EXPORTACIÓN 1976 void NumLibCat64.sub. - 64 uint64 * un wa largo sin signo uint64 * b unsigned long wb NUMLIB_NUMBER * resultado wa bits de 64 bits de concatenar una y bits de wb de b de 64 bits y el lugar que en valor apuntado por el resultado. Valor señalado por resultado = int wa un @ int wb b EXPORTACIÓN de 1977 void NumLibCat32_n unsigned long *a unsigned long wa NUMLIB_NUMBER *b NUMLIB_NUMBER *Result concatenar wa bits de 32 bits una con valor b y colocar en valor apuntado por el resultado. Valor señalado por resultado = int wa un @ b EXPORTACIÓN de 1978 void NumLibCatn.sub. - 32 NUMLIB_NUMBER * unsigned long * b unsigned long wb NUMLIB_NUMBER * resultado concatenar valor un con wb bits de 32 bits b y colocarlo en valor apuntado por el resultado. Valor señalado por resultado = un @ int wb b EXPORTACIÓN de 1979 void NumLibCat64_n uint64 *a unsigned long wa NUMLIB_NUMBER *b NUMLIB_NUMBER *Result concatenar wa bits de 64 bits una con valor b y colocar en valor apuntado por el resultado. Valor señalado por resultado = int wa un @ b. EXPORTACIÓN 1980 void NumLibCatn.sub. - 64 NUMLIB_NUMBER * un uint64 * b unsigned long wb NUMLIB_NUMBER * resultado valor de concatenar una con wb bits de 64 bits b y colocarlo en valor apuntado por el resultado. Valor señalado por resultado = un @ int wb b 1981 Exportación void NunLibCat NUMLIB_NUMBER * NUMLIB_NUMBER * b NUMLIB_NUMBER * resultado Valor de concatenar una con valor b y colocar en valor apuntado por el resultado. Valor señalado por resultado = un @ b Operaciones de colocar 1982 1983 Exportación void NumLibDrop32 NUMLIB_NUMBER *a unsigned long b unsigned long * Result Drop b bits desde un y colocarlo en el resultado de 32 bits. Valor apuntado por Result=a.backslash...backslash.b 1984 Exportación void NumLibDrop64 NUMLIB_NUMBER *a unsigned long b uint64 *Result Drop b bits desde un y colocarlo en el resultado de 64 bits. Valor señalado por resultado = un .backslash...backslash.b 1985 Exportación void NumLibDrop NUMLIB_NUMBER *a unsigned long b NUMLIB_NUMBER * Result Drop b bits desde un y colocarlo en Result.Value apuntado por resultado = un .backslash...backslash.b Operaciones de toma de 1986 1987 Exportación void NumLibTake32 NUMLIB_NUMBER *a unsigned long b unsigned long *Result tomar b bits desde un y colocarlo en el resultado de 32 bits. Valor señalado por resultado = un lt -b 1988 Exportación void NumLibTake64 NUMLIB_NUMBER *a unsigned long b uint64 *Result tomar b bits desde un y colocarlo en el resultado de 64 bits. Valor señalado por resultado = un lt -b 1989 Exportación void NumLibTake NUMLIB NUMBER *a unsigned long b NUMLIB_NUMBER *Result tomar b bits desde un y colocarlo en el resultado. Valor señalado por resultado = un lt -b Operaciones de cambio 1990 Void NumLibLSL NUMLIB NUMBER *a unsigned long b NUMLIB_NUMBER *Result resultado de exportación de 1991 = un lt lt b Void NumLibLSR NUMLIB_NUMBER *a unsigned long b NUMLIB_NUMBER *Result resultado de exportación de 1992 = un gt gt b. lógico right-shift los bits superiores añaden cero. Void NumLibASR NUMLIB_NUMBER *a unsigned long b NUMLIB_NUMBER *Result resultado de exportación de 1993 = un gt gt b desplazamiento aritmético a la derecha los bits superiores son extendidos de signo. Operaciones de selección de bits 1994 1995 Void NumLibBitRange32 NUMLIB_NUMBER *a unsigned long b unsigned long c unsigned long *Result 32 bits valor de exportación apuntado por resultado = un b-1 c 1996 Void NumLibBitRange64 NUMLIB_NUMBER *a unsigned long b unsigned long c uint64 *Result 64 bits valor de exportación apuntado por resultado = un b-1 c 1997 Exportación void NumLibBitRange NUMLIB_NUMBER * a b largo sin signo unsigned long c NUMLIB_NUMBER * resultado .Resultado = un b-1 c . Operaciones de inserción de bits 1998 Void NumLibInsert32 unsigned long *a unsigned long wa unsigned long s NUMLIB_NUMBER *Result insertar bits de exportación de 1999 de un resultado con LSB en posición s. ancho un es wa y una es lt = 32 bits de longitud. Void NumLibInsert64 uint64 *a unsigned long wa unsigned long s NUMLIB_NUMBER *Result insertar bits de exportación de 2000 de un resultado con LSB en posición s. ancho un es wa y una es lt = 64 bits de longitud. Void NumLibInsert NUMLIB_NUMBER *a unsigned long s NUMLIB_NUMBER *Result insertar bits de exportación de 2001 de un resultado con LSB a s de posición. 2002 Plugin suministrado 2003 Los siguientes plugins se suministran para ayudar en la simulación de Handel-C programas. Sharer.dll permite que un puerto ser utilizado por más de un plugin. synchroniser.dll 2004 sincroniza simulaciones de Handel-C para que ejecute a la velocidad correcta entre sí. 2005 connector.dll conecta los puertos de simulación juntos para que los datos pueden intercambiarse entre simulaciones. 2006 7_segment.dll simular una pantalla de 7 segmentos. Compartir un puerto entre Plugins sharer.dll 2007 Se puede compartir un puerto entre dos o más plugins. Uno puede compartir puertos para distribuir los mismos datos a varios plugins de salida. Puertos de entrada se pueden compartir para que más de un plugin puede alimentar datos en el programa por ejemplo para simular los puertos de tri-state . Si más de un plugin proporciona datos para el mismo puerto en el mismo ciclo de reloj la última pieza de datos capturados es el utilizado. Sintaxis 2008 2009 Para compartir un puerto el con la especificación de la interfaz o el puerto puede contener extlib="sharer.dll 2010 " 2011 extfunc = "sharergetset" 2012 extinst = "sharerecords" 2013 ShareRecords la cadena consiste en un registro de recurso compartido para cada plugin que debe estar conectado a un puerto. Registros de cuota de tener la siguiente sintaxis cuota = {extlib = lt lib-nombre gt extinst = lt extinst-cadena gt extfunc = lt func-nombre gt } los elementos entre corchetes de ángulo tienen el mismo significado como lo hicieron cuando se producen como los campos de extlib extinst y extfunc. 43 Fig. ilustra una pluralidad de posibles valores y significados 4300 asociados con las bibliotecas de la invención presente. 2014 interfaz bus_out seg7_output encode_out 2015 con {extlib="sharer.dll" 2016 extinst = ".backslash. Recurso compartido 2017 = {extlib = lt 7segment.dll gt 2018 extinst = lt A gt 2019 extfunc = lt PlugInSet gt } .backslash. Recurso compartido 2020 = {extlib = lt connector.dll gt 2021 extinst = lt SS 7 gt .backslash. 2022 extfunc = lt ConnectorGetSet gt } 2023 " 2024 extfunc = "sharergetset" 2025 { Sincronización de múltiples simulaciones de 2026 synchroniser.dll 2027 Si uno quiere simular varios programas con reloj diferentes períodos uno puede utilizar la synchroniser.dll. Uno a continuación informa el sincronizador de sus velocidades de reloj relativa. El sincronizador podrá suspender simulaciones hasta que pueden completar un ciclo en el paso con otras simulaciones. 2028 Si uno es sencillo paso varias simulaciones sincronizados algunos podrán ser suspendidas hasta que él o ella ha dado el paso otras simulaciones a un punto donde coinciden los ciclos. Siempre puede haber al menos una simulación que puede incrementarse. 2029 Para completar una simulación que se sincroniza con otras simulaciones en pausa es decir en modo de interrupción uno puede que tenga que paso a paso las simulaciones en pausa hasta el acabado simulación se puede completar. Sintaxis 2030 2031 Para invocar a synchroniser.dll uno puede usar el siguiente con las especificaciones en la declaración de conjunto reloj extlib="synchroniser.dll 2032 " 2033 extfunc = "synchronisergetset" 2034 extinst = "clockPeriod" 2035 La cadena de clockPeriod puede contener un número entero que representa el período del reloj. Esto se supone que en las mismas unidades de tiempo para todas las simulaciones que se van a sincronizar. reloj de conjunto 2036 = externos "P1" con 2037 {extlib="synchroniser.dll" extinst="100" 2038 extfunc = SynchroniserGetSet "} 2039 Conexión simulaciones juntos connector.dll 2040 El conector permite conectar dos simulaciones juntos. Sintaxis 2041 2042 Se puede conectar una simulación a connector.dll especificando lo siguiente en la con la especificación de un puerto. 2043 extlib="connector.dll" 2044 extinst = "terminalName ancho bitRange " 2045 extfunc = .cent.ConnectorGetSet" Donde 2046 terminalName 2047 es el nombre de la terminal virtual que el puerto está conectado. Puede ser cualquier identificador de Handel-C. Todos los puertos conectados a terminalName están conectados. La terminal puede crearse si no existe. 2048 ancho es el ancho de la terminal en bits. Esto puede ser el mismo para cada aparición del nombre de la mismo terminal. 2049 bitRange es opcional. Especifica qué bits del puerto están conectados a qué bits de la terminal. Si utiliza bitRange puede especificar las conexiones para todos los bits dentro del puerto. 2050 Puerto bits se definen por su posición dentro de bitRange bits terminales se especifican por valor. El primer valor izquierdo en la bitRange representa el bit más significativo del puerto y el último valor derecho el bit menos significativo de puerto. Bits terminales pueden especificarse como una gama de anteriores n n o un número. Para dejar un poco de puerto inconexas especificar x como su valor de bit terminal. 2051 Si se omite bitRange bit 0 del puerto puede estar conectado a bit 0 de la terminal bit 1 a 1 etc. de bits. La extinst="connect1 16 de la cadena 13 - 14 X X 11 8 " se conecta a un puerto de 8 bits a un connect1 terminal de 16 bits con las Cruz-conexiones a continuación en el cuadro 1. 2 Bits de tabla 1 puerto Terminal bits 0 8 1 9 2 10 3 11 4 X 5 X 6 14 7 13 2052 / / Programa de una interfaz 2053 interfaz bus_out seg7_output encode_out 2054 con {extlib="connector.dll" extinst="SS 7 2055 " extfunc = "connectorgetset"} 2056 / / Interfaz de programa b 2057 interfaz bus_in sin signo 7 en seg7_input 2058 con {extlib="connector.dll" extinst="SS 7 2059 " extfunc = "connectorgetset"} 2060 Simulando un 7segment.dll de Display de 7 segmentos 2061 7 El segmento de visualización permite conectar una simulación de una pantalla de siete segmentos con un ancho de 7 bits puerto de salida. Sintaxis 2062 2063 Uno puede conectarse a 7segment.dll especificando lo siguiente en la con la especificación para la amplia de 7 bits puerto de salida extlib="7segment.dll 2064 " 2065 extinst = "windowName" 2066 extfunc = "pluginset" 2067 cuando se simula el programa de Handel-C aparece una ventana que contiene una sola pantalla de 7 segmentos. La ventana tiene el título windowName. El programa puede invocar cualquier número de pantalla 7 segmentos windows. Los segmentos se corresponden con los bits siguientes donde el bit 0 es el bit menos significativo . Un valor de bit 0 enciende el segmento 1 vueltas fuera la siguiente matriz codifica los dígitos 0 a 9 a la 7segment.dll de la unidad. unsigned codificador 7 10 = {0 x 1 0x4f 0x12 0x06 0x4c 0x24 0 x 20 0x0f 0 x 00 0 x 04 { . Ejemplo de 2068 2069 este ejemplo consiste en dos proyectos independientes de Handel-C proyecto a y B. de proyecto 2070 Proyecto A 2071 Incrementa un contador de módulo 10 cada ciclo y salidas el valor del contador para el plugin de 7segment.dll. 2072 Salidas el valor del contador para el terminal llamado SS 7 en cada ciclo. 2073 Proyecto del a ciclos son 100 unidades de tiempo largas. 2074 Proyecto B Contador de incrementos de un módulo-10 2075 sobre suplente ciclos y salidas el valor del contador para el plugin de 7segment.dll. 2076 Alternativo ciclos lee el valor de la terminal llamada SS 7 y lo envía al plugin 7segment.dll. Los ciclos de 2077 proyecto b son 50 unidades de tiempo largas. 2078 Proyecto B puede ser reforzado dos veces para cada paso del proyecto A. 2079 FIG. 44 muestra el funcionamiento de la sincronización de 4400 cuando paso solo los dos proyectos de simulación. 2080 En el punto 1 ambas simulaciones están listos para el paso. Si uno los pasos b proyecto en primer lugar podrá suspender en el punto 2 como no puede continuar hasta que ha atrapado A. A puede ser reforzado. Podrá suspender antes de 4 como espera la b para ponerse al día. Mientras tanto B puede completar su primer paso para llegar a 3. Uno puede entonces paso B por lo que puede alcanzar con el A y ambos proyectos están listos para el paso. Si pasos de un proyectan de una primera suspende como puede esperar para que b llegar a 4 antes de que pueda continuar. Ahora él o ella puede paso proyecto B. Cuando b es acelerado llega a 3. Un mayo todavía esperar. Cuando b es una vez más atrapa A tanto como a y b están listo para continuar. 2081 Si uno solo paso el ejemplo anterior dos 7 segmentos pantalla aparecen en windows. 2082 Una vez que ambas simulaciones han pasado parte de la inicialización y entró en el bucle principal el windows debe mostrar estos números. 2083 Tiempo unidades 0 50 100 150 200 250 200 250 300 350 2084 Una ventana 0 0 1 0 1 2 2 3 3 4... Ventana de B 2085 1 0 0 2 1 3 2 4 3 5... Archivo de origen 2086 para proyecto A reloj de conjunto 2087 = externos "P1" con 2088 {extlib="synchroniser.dll" extinst="100" 2089 extfunc = "synchronisergetset"} señal 2090 unsigned encode_out 7 interfaz 2091 bus_out seg7_output unsigned salida 7 = encode_out 2092 con {extlib="sharer.dll" .backslash de extinst 2093 ". Recurso compartido 2094 = {extlib = lt 7segment.dll gt 2095 extinst = lt A gt 2096 extfunc = lt PlugInSet gt } .backslash. Recurso compartido 2097 = {extlib = lt connector.dll gt 2098 extinst = lt SS 7 gt .backslash. 2099 extfunc = lt ConnectorGetSet gt } 2100 " extfunc ="sharergetset" 2101 } valores de //define 2102 a la luz de 7 segmentos de visualización del 0-9 Codificador de rom 2103 10 = 2104 {0 x 01 0x4f 0x12 0x06 0x4c 0x24 0 x 20 0x0f 0 x 00 0 x 04} 2105 void main void { 2106 2107 4 sin signo contar Conde de 2108 = 0 while 1 2109 par 2110 { 2111 ¿Count= Count==9 2112 0 conde + 1 2113 encode_out = codificador count 2114 } 2115 } Archivo de origen 2116 para proyecto B reloj de conjunto 2117 = externo con {extlib="synchroniser.dll" "P1" 2118 extinst = "50" extfunc = "synchronisergetset"} señal 2119 unsigned encode_out 7 interfaz 2120 bus_out seg7_output unsigned salida 7 = encode_out 2121 con {extlib="7segment.dll" 2122 extinst = "B" 2123 extfunc = "pluginset"} 2124 interfaz bus_in sin signo 7 en seg7_input 2125 con {extlib="connector.dll" 2126 extinst="SS 7 " 2127 extfunc = "connectorgetset" } Valores de //Define 2128 a la luz de 7 segmentos de visualización del 0-9 Codificador de rom 2129 10 = 2130 {0 x 01 0x4f 0x12 0x06 0x4c 0x24 0 x 20 0x0f 0 x 00 0 x 04} 2131 void main void { 2132 2133 4 sin signo contar Conde de 2134 = 0 while 1 2135 { 2136 par ° 2137 { 2138 ¿Count= Count==9 2139 0 conde + 1 2140 encode_out = codificador count 2141 } encode_out=seg7_input.in 2142 2143 Más información con respecto a la Cosimulación será ahora establecerse. Herramienta de Cosimulación 2144 WP26 2145 La presente sección propone una serie de interfaces que se utiliza para habilitar varios simuladores ser usadas juntas de manera genérica. En primer lugar se explican los objetivos de la presente Encarnación. Objetivos de 2146 2147 Esta sección se pretende establecer una técnica para habilitar varios simuladores para cosimulate con otros sin tener que volver a escribir código específico de simulador de plugin. 2148 Debería ser posible tomar decisiones de compensación de simulación-precisión/simulación-velocidad para que las diferentes partes de la Cosimulación ejecutan con el grado de precisión y velocidad deseado. Usuario 2149 de los simuladores utilizados en Cosimulación debe ser capaz de escribir en c de Handel VHDL C o lo que sea los modelos que se simulaba independientemente de cualquier otra parte de un acuerdo de Cosimulación. Esto puede permitir la reutilización de los modelos de un tipo de disposición de Cosimulación a otro. Cuestiones 2150 Valores de lógica 2151 2152 Alta impedancia/tri-estado de simulación 2153 Algunos soporte para alta impedancia Estados son beneficiosos para hacer que los componentes de simulación modular cuando los buses o están involucrados otros cables que pueden ser conducidos por componentes diferentes en momentos diferentes. Resistencia interna 2154 Ayuda a 2155 modelo pull-up/pull-down resistencias y mantener modelos independientes para tres niveles de circuitos de digital deben ser adecuados cero infinito y «algunos». Valores 'Desconocidos' 2156 2157 Si una entrada flotante es leer que el resultado puede ser impredecible del mismo modo si un circuito con una resistencia de pull-up está vinculado a un circuito con una resistencia de pull-down no es nada de conducción del circuito. En estas situaciones en lugar de un resultado arbitrario de picking propagar un resultado 'desconocido' puede ser más informativa. 9 con valorados lógica U X O I Z W L H - 2159 0 desconocido fuerte sin inicializar fuerte fuerte 1 hi impedancia débil 0 desconocido débil 1 débil no importa VHDL 2160 Swift/OMI IEEE 1164 4 2161 valorados lógica 0 1 Z X 2162 Verilog SystemC 2 2163 valorados lógica 0 1 2164 Cynlib Georg Friedrich Händel-C lógica de 120 2165 valorada 2166 Verilog OMI IEEE 1364 2167 La mayoría de ellas se deriva de las permutaciones de diferentes grados de incertidumbre de los valores y virtudes de valores cada valor está representado por un componente de strength0 combinado con un componente de la fuerza 1. Los puntos fuertes que van desde suministro Strong extracción grandes medianas pequeñas HiZ 2168 Utilizando un sistema de dos valores es más rápido pero no totalmente precisa. Si uno quiere ser capaz de determinar si puede iluminar un LED él o ella debe ser capaz de distinguir de alta impedancia de una lógica de cero. Ser capaz de representar la alta impedancia también permite identificar si dos circuitos están tratando de impulsar un cable al mismo tiempo y este error al usuario del pabellón. Alta impedancia también es útil cuando no se conoce la dirección del flujo de información. Esto no es un problema para los buses de datos por ejemplo como la línea de escritura-activar uno puede decir qué forma está fluyendo los datos pero si él o ella deseaba modelar un conmutador de unir dos autobuses un sistema de lógica simple de dos valores iría en problemas. 2169 Para la simulación de rápida de circuitos correctas donde se utilizan los valores de la lógica puramente para pasar información no de iluminación por LEDs etc. y a continuación la dirección del flujo de información es conocida por los elementos del circuito conectado lógica de dos valores es suficiente. 2170 Basado en eventos y basado en el ciclo de simulación 2171 Algunos simuladores son eventos de base ModelSim algunos arco ciclo basado Handel-C ARMulator PasoAPaso . Simulación de eventos basado es más general como determina sobre la marcha lo que debe ser cuando simulado. Simulaciones basado en estado ejecutar de acuerdo a un orden predeterminado de ejecución esto puede dar una ventaja de velocidad. 2172 Al integrar simuladores basado en eventos el ideal de la orden de ejecución no es evidente. Si se tiene en cuenta el siguiente acuerdo de Cosimulación 44 Bis FIG. 2173 ilustra un par de simuladores 4450 de conformidad con una encarnación de la invención presente. En este diagrama las dependencias de representa 4452 de línea de puntos y las flechas sólidas 4454 son las conexiones entre los simuladores. Si ambos simuladores fueron basados en el ciclo a continuación el ideal de la orden de ejecución sería uno que no requieren ya sea simulador para repetir un ciclo de simulación. Esto se logra mediante la sincronización de los simuladores a un nivel de grano fino suficientemente para cambios en el a se propagan hacia abajo a e en la simulación de un ciclo. Esta orden de programación puede denominarse está intercalado. 2174 Si los simuladores de ambos en el anterior acuerdo basado en el evento el orden natural de evaluación sería que cada simulador esperar cambios en sus entradas y a continuación propagar los efectos de estos cambios a sus salidas. Por lo tanto simuladores de 1 y 2 cada ejecutan tres y cuatro veces respectivamente. Esta orden de programación se puede hacer referencia a como plenamente sexuada. 2175 Si un simulador fueron basados en el ciclo y uno basado en eventos entonces el simulador basado en el ciclo puede ser más rápido si uno usa un nivel relativamente grano fino de sincronización y sólo simular el ciclo una vez. Sin embargo el simulador basado en evento puede beneficiarán de todas sus entradas a la vez y no de uno en uno. El trabajo requerido por un simulador basado en eventos para propagar los efectos de los eventos de entrada a las salidas puede ser imitado por la alimentación de insumos en uno a la vez. También si a la vez se producen varios de eventos de entrada pueden cancelan entre sí de una manera que guarda un cálculo costoso. Por ejemplo si dos entradas se introducen en una puerta xor el resultado de que desencadena algunos computación caro entonces si ambas entradas a la xor cambia marca una gran diferencia si se producen simultáneamente o de forma secuencial. 2176 Cuando cosimulating con simuladores basada en eventos y basado en el ciclo puede ser deseable para permitir al usuario decidir si la programación de simulador utilizado debe ser más adecuado para simuladores basados en el ciclo o basada en eventos. Uno puede darle un simulador basado en eventos uno basado en el ciclo y un aspecto de simulador basado en el ciclo como uno basado en eventos la cuestión es qué enfoque es lo mejor y la respuesta es probable que sea diferente en diferentes circunstancias. Apoyar los emuladores de hardware 2177 Using hardware para emular una Junta de destino es una práctica común. Sin embargo se hace co-simulación no debería excluir la posibilidad de mezcla de emulación de hardware con software de simulación. Sistemas de varios procesadores 2178 2179 Los métodos de Cosimulación deben ser capaz de tomar ventaja de varios procesadores y posiblemente varios equipos. La medida a la que puede explotarse paralelismo está influenciada por la proporción de computación para comunicación/sincronización. Sincronización a través de una red es viable a pesar del potencial de la sobrecarga de las comunicaciones. Un análisis de costos y beneficios puede ser necesario antes de la aplicación. Para simuladores muy rápidos la sobrecarga de las comunicaciones de los simuladores de sincronización puede ser mayor que los beneficios obtenidos cuando se trabaja con dos procesos en el mismo equipo multiprocesador. Sin embargo sin una reestructuración radical de las implementaciones de todos menos uno de los simuladores que se utiliza uno puede incurrir en la sobrecarga de sincronización posible. 2180 Almacenamiento en búfer de comunicación entre los simuladores 2181 Cuando el grado de comunicación entre los simuladores es bajo permitiendo que los simuladores ejecutar por delante de la otra puede reducir la cantidad de contexto de conmutación entre procesos y aumentar la velocidad de simulación. Mediante un esquema de Cosimulación que no excluye estas optimizaciones puede ser beneficioso. Al depurar con simuladores de ejecución por delante de la otra puede causar problemas si el simulador de la zaga alcanza un punto de interrupción antes de ponerse al día con el simulador de otro a continuación el usuario puede ver los dos simuladores en un estado incoherente. 2182 Comenzando y la identificación de simuladores 2183 Si el usuario debe iniciar manualmente cada simulator o si un programa de co-simulación debería lanzarles es también un problema. Si dos instancias de la misma simulador se inician automáticamente a continuación pueden pasar argumentos a través de las variables de entorno para que identifican a sí mismos para el programa de co-simulator. Si los simuladores son iniciados manualmente desde el menú Inicio pueden ganar su identidad después de establecer comunicación con el programa de Cosimulación. 2184 A grupo de simuladores podría utilizarse para evitar iniciar repetidas y dejar de fumar de simuladores. Cuando un Cosimulación sesiones extremos los simuladores entraría en una piscina de disponibles simuladores listo para otra sesión de Cosimulación. Simuladores suelen ofrecen una ventana donde puede enviar la salida arbitraria esto se utilizaría para indicar qué simulador de lo que estaba haciendo. 2185 Controlar automáticamente los simuladores 2186 Idealmente el estado de un simulador podría ser controlado al inicio y durante la ejecución. Por ejemplo para simular la Junta Kompressor el inicio uno no quiere tener que requieren que el usuario cargar tres programas diferentes para las dos FPGAs y el procesador. 2187 De forma similar cuando el procesador o un FPGA reconfigura el otro FPGA uno no quiere involucrar al usuario. PasoAPaso y ModelSim ambos proporcionan lenguajes de scripting que puedan ayudar en estas situaciones. La memoria en el ARMulator puede establecerse por plugins pero no parece haber una forma de enchufe ins para cambiar el símbolo asociado de tablas y la información de depuración. Georg Friedrich Händel-C no activar plugins cambiar el circuito actualmente siendo simulado. GUI de simulador de integración 2188 2189 Es relativamente fácil de co-simulate simuladores juntos al tener cada uno pretende ser hardware periférico conectado a los demás. Cada simulador piensa que es responsable y no tiene conocimiento que otros simuladores de pleno con sus propias interfaces gráficas de usuario se utilizan para el hardware periférico de plugin. Si se desea poder utilizar las funciones de depuración de una GUI para controlar todos los simuladores los plugins necesitan una manera de hacer una pausa y reanudar los simuladores. Una "trampa" sería tener el plug ins solicita al usuario que pausar y reanudar los simuladores pero esto se convertiría rápidamente en tedioso y molesto. ModelSim permite plugins pausar la simulación pero no les permita reanudar la simulación. No permitan que otros simuladores Handel-C ARMulator PasoAPaso plug ins para pausar la simulación. 2190 Otra cuestión surge de los simuladores de diferentes que permite la simulación para que se detenga en momentos diferentes. PasoAPaso sólo permite la simulación detener entre instrucciones. Georg Friedrich Händel-C sólo permite la simulación detener entre ciclos de reloj ModelSim permite la simulación detener en cualquier lugar. Esto sería un problema por ejemplo cuando se desea avanzar en tiempo por menos de un ciclo de reloj en ModelSim si la simulación de ModelSim se basó en circuitos asíncronos había simulado por Handel-C a continuación la GUI de Handel-C no estaría disponible mediados ciclo de reloj. También puede ser un problema cuando cosimulating dos microprocesadores si las instrucciones diferentes microprocesadores no iniciar y finalizar en los mismo ciclos de reloj. 2191 Según el nivel de comunicación entre dos simuladores sería posible permitir una ejecución por delante de otro por lo tanto pueden ser detenidos esto puede ser confuso para el usuario aunque como cada simulador tendría una idea diferente de lo que el tiempo fue. 2192 Integrar con otras herramientas de Cosimulación de proveedores 2193 Synopsys Mentor Graphics cadencia Innoveda y Arexsys proporcionan herramientas de Cosimulación Eaglei completa Affirma Verificador de HW/SW Virtual-CPU y CosiMate respectivamente . Esto permite la integración de una variedad de HDL simuladores con la instrucción Set simuladores ISS . 2194 La Cosimulación herramientas de Eaglei de Synopsys Mentor Graphics' completa y CosiMate de Arexsys proporcionan soporte para una amplia gama de HDL simuladores. Soporte de procesador para Eaglei de Synipsys y completa de Mentor Graphics es siempre en su mayoría aunque Mentor Graphics XRA Y depuradores soporte de CosiMate de Arexsys "una amplia gama de c depuradores y". Es posible integrar el simulador de Handel-C en una o todas estas herramientas de Cosimulación. 2195 Hay una buena cantidad de documentación de Mentor Graphics CVE transparente entorno de CoVerification . Un aspecto importante de completa es la manera en puede acelerar la ejecución mediante la reducción de la cantidad de tiempo dedicado a hardware de simulación. Esto permite la ISS proceder sin trabas para una cantidad considerable de tiempo. Minimizar la simulación de hardware se realiza a través de un número de optimizaciones optimizaciones instrucción fetch optimizaciones y optimizaciones en tiempo de acceso a datos. Las optimizaciones de datos acceso e instrucción fetch impiden que ver la actividad del bus durante los ciclos de bus en que no está interesado el simulador de hardware. Sin embargo todavía el simulador de hardware está avanzado en tiempo. El tiempo optimizaciones efectivamente detener el simulador de hardware ver cambios de reloj durante los ciclos de bus que no le interesa esto permite a la ISS a ejecutar para muchos ciclos en un momento sin cambio de contexto. 2196 Para un simulador basado en el ciclo como Handel-C las optimizaciones de datos acceso e instrucción fetch no haría ninguna diferencia el simulador tiene como mucho trabajo que hacer si ve cambios en el bus o no. Las optimizaciones de tiempo haría una diferencia. No es fácil saber cuándo es seguro utilizar optimizaciones en tiempo CVE transparente permite al usuario activar o desactivar optimizaciones en tiempo de acuerdo a cómo se obtiene acceso la memoria si esto aún mantiene la precisión de simulación se deja al usuario decidir. Si fuera posible saber automáticamente cuando un simulador había alcanzado un estado estable y luego las optimizaciones de tiempo podrían hacerse más confiable y genéricamente en lugar de depender de acceso de memoria de CPU para dar pistas. Posiblemente un usuario podría modificar su diseño a decir de las herramientas de Cosimulación cuando su diseño había alcanzado un estado estable y sólo tendrían que ver otro reloj cambiar cuando la cosa cambió de forma pertinente. Cosimulación 2197 a través de la OMI La interfaz de modelo de objeto 2198 es un estándar de interfaz IEEE 1499 que permite modelos escritos usando una herramienta para incorporarse a otro. Herramientas conocidos como modelo de compiladores o modelo empaquetadores toman una descripción VHDLNerilog/C de un modelo y convierten en el código de objeto que es compatible con la OMI y se pueden importar a otras herramientas de simulación. OMI proporciona un medio para que los proveedores IP proporcionar modelos de simulación de su propiedad intelectual sin el regalando el código fuente. Por ser un OMI estándar abierto también aumenta la interoperabilidad. OMI 2199 fue creado por el foro abierto de modelo. Synopsys Mentor Graphics y cadencia fueron todos los involucrados en el proceso. OMI combina dos API un simulador-API y un modelo-API. La API de simulador se basa en SWIFT de Synopsys y se ocupa de interconexión de modelos para el resto de una simulación. La API de modelo se basa en una propuesta de cadencia y está preocupada con el funcionamiento interno de los modelos. Productos de cadencia ya soportan OMI varios otros proveedores se han comprometido a apoyarlo pronto. Uso de SWIFT es actualmente más común de lo que la OMI pero SWIFT puede convertirse en un estándar heredado. OMI 2200 es un estándar relativamente complejo y apoyarla sería una empresa de tamaño considerable. No ofrece apoyo específico para Cosimulación y muy posiblemente sería un obstáculo en la optimización de Cosimulación a correr más rápido. Sería posible involucrar a modelos de la OMI en un Cosimulación pero utilizar las interfaces de la OMI como el único medio de comunicación en Cosimulación probablemente sería demasiado restrictiva. 2201 Cosimulación con SystemC 2202 Sería posible utilizar modelos escritos en SystemC en un arreglo de Cosimulación. También es posible utilizar SystemC como el medio de la integración de un número de modelos no escrito en SystemC. Sin embargo como con la OMI restringir la integración a eso que se puede lograr a través de SystemC es probable que sea demasiado restrictivas. Aunque el origen de SystemC es libremente disponible sólo se pueden distribuir modificaciones a la Comisión de SystemC. Por lo que no es probable que sea posible mejorar SystemC para soportar mejor la Cosimulación de los modelos no systemC. Arquitectura propuesta 2203 2204 Dos categorías de modelos de simulación son modelos de distribución de subproceso propuestos ligero y modelos de proceso-cargar visible. Cada uno de ellos tiene las siguientes características Modelos de distribución de subproceso de ligero de 2205 2206 Ejecutados como un archivo dll. Bloqueo no funciona 2207 . 2208 Capaz de crear una instancia y submodelos de interconexión. Modelos del proceso-acaparando 2209 de visible 2210 Ejecutados como un proceso independiente que requieren la CIP para la sincronización y la comunicación. 2211 No se puede crear una instancia de submodelos. 2212 Luz y pesados se refieren a la sobrecarga de la comunicación de la utilización de estos modelos y no la sobrecarga de la simulación de los modelos. Peso ligero modelos normalmente se utilizaría para la aplicación de muy simple pegue lógica relojes y lógica de optimización véase más adelante . Modelos de peso pesado por lo general se utilizaría para el embalaje de simuladores existentes que tienen una interfaz Plug-in. Sin embargo no habría ninguna desventaja en un modelo de cálculo intensivo uso de la interfaz de modelo ligero de hecho le daría la ventaja de mayor flexibilidad al decidir qué cálculos deben realizarse en los procesos. Ejecución de 2213 del medio ambiente Cosimulación consistiría en un número de distintas etapas creación de instancias el análisis y la simulación. Creación de instancias comienza con un modelo de raíz único lo que normalmente sería un modelo ligero que crea una instancia y se conecta a otros modelos. Esta raíz-modelo podría ser un simple programa de 'C' o una elaborada GUI que permite al usuario crear una instancia y conectar hasta modelos de manera interactiva. Los modelos que se pueden crear instanciados tienen una relación jerárquica no hay ninguna política de nomenclatura global de los puertos de un modelo. Los modelos sólo son capaces de comunicarse a través de puertos que se les ha dado por sus padres o hijos. 2214 Después de completar la inicialización comienza una etapa de análisis automático. La relación jerárquica se convierte en irrelevante y se analizan las interconexiones entre los modelos como una red no estructurada. En esta etapa la herramienta de Cosimulación acumula cualquier estructuras necesita al tiempo de simulación. Optimizaciones como decisiones de programación estáticas pertenecen aquí. Durante la simulación se toman las decisiones de programación dinámicas modelos de proceso-acaparando están sincronizados entre sí se gestiona la comunicación entre los modelos. Archivos DLL y procesos 2215 2216 FIG. 44B ilustra un arreglo de Cosimulación 4462 incluyendo procesos y archivos DLL. La figura actual muestra tres procesos 4464 que cada proceso contiene un programa 4466 y un número de archivos DLL 4468. 2217 HQ de Cosim el programa comienza todo. Comienza el modelo de raíz que es un modelo ligero existente como un archivo dll en el mismo proceso que el programa de Cosim HO. Este modelo a continuación crea una instancia y conecta a otros modelos. Otros modelos ligeros son simplemente se carga en el mismo proceso. Salida 2218 modelos acaparando de proceso es un poco más complicado. Para que un modelo ligero crear instancias de un modelo de proceso-acaparando el modelo ligero puede conocer el nombre de un archivo dll lanzador específico de simulador. Este nombre se pasa a HO Cosim que da el lanzador dll detalles de cómo IPC a lograrse. La dll de lanzador a continuación carga hasta el simulador que en algún momento puede cargar hasta el plugin de cosim específico de simulador que carga hasta una dll de cosim genérico. Los plugins lanzador y cosim de la específicos simulador podrán cooperar está pasando la información de conexión del IPC de HO Cosim a la dll de cosim genérico. Una vez que esto se ha logrado la comunicación entre los dos procesos puede tener lugar. Las técnicas descritas aquí evitan los plugins específico de simulador que necesitan saber cómo IPC lleva a cabo y evita el programa de Cosimulación que necesitan saber cómo iniciar y pasar parámetros a cada tipo de simulador de diferente. Comunicación 2219 puede tener lugar entre procesos en una máquina o entre múltiples máquinas a través de una red sólo código de Cosimulación específico debe ocuparse de esto. El código específico de simulador no necesita estar preocupado. 2220 Igualmente cualquier mecanismo puede utilizarse para pasar los detalles de la conexión desde el archivo dll de lanzador para el plugin de cosim genérico como argumentos de línea de comandos las variables de entorno memoria compartida archivos o lo que sea y sólo el código específico de simulador necesita saber acerca de él no en el código de Cosimulación. Modelos de ligero 2221 Modelos de ligero 2222 pueden utilizarse para los modelos que son computacionalmente baratos y que uno quiere mantener aislado de otros modelos. Por ejemplo un reloj uno no querría un proceso independiente sólo para contener un modelo de reloj pero él o ella no querría tener que elegir arbitrariamente otro modelo en el que colocar el reloj ya que esto podría obstaculizar la interoperabilidad entre modelos. Modelos ligeros también pueden utilizarse para optimizaciones tales como prevención de un simulador de hardware viendo el reloj cuando una CPU está haciendo algo no relacionado con el hardware. No existen modelos de peso ligero de 2223 en el mismo proceso que la Cosim programa de HO. El programa de Cosim HO y el cosim genérico DLL pueden conspirar entre ellos para lograr el orden de ejecución deseado en cualquier caso que quieren. Modelos de ligero a uno podría migrar a otros procesos. Por ejemplo si un ISS es capaz de simular muchos ciclos sin un simulador de hardware en el que se está involucrados sería deseable que el código de generación de reloj a estar en el mismo proceso que el ISS. Si el archivo dll de Cosimulación genérico es lo suficientemente listo a continuación la comunicación entre los simuladores acaparando de proceso y la cosim HO puede ser reducida o eliminada por completo reduciendo así el número de contexto cambia. Cada proceso de cargar la dll de cosim genérico puede volverse capaz de comunicación directa con otros simuladores comunicación no necesita ir a través de la cosim HO. Optimizaciones de 2224 Modelos de ligero 2225 pueden utilizarse para proteger un simulador de hardware de detalles que no necesita ver. Si se coloca un modelo ligero entre simulador de hardware y de la ISS luego con una configuración el modelo ligero puede utilizar dirección de descodificación para determinar si el simulador de hardware se necesita ejecutar o no. Saber cuando su seguro para no reloj el simulador de hardware es específica de la aplicación. Un ejemplo patológicamente unoptimizable sería utilizar hardware para generar perfiles de una actividad de CPUs en la mayoría de los casos aunque optimizaciones importantes deberían ser posibles. Interfaces de intercambio de Interfaces de programación de aplicaciones de 2226 2227 Las interfaces entre programas y DLL se definen por un número de archivos de encabezado. Puede haber un número de interfaces entre un par de determinado programa-dll/d li-dll. Cada programa o dll proporciona un mecanismo por el cual un programa de interfaz/dll pueden solicitar acceso a una interfaz con nombre. Antes de que una interfaz puede ser solicitada sin embargo los mecanismos por los que se obtienen las interfaces se intercambian entre los archivos de programa/DLL comunicación. 2228 typedef void * GetInterfaceT void * Estado char * ifname 2229 int ExchangeInterfaces GetlnterfaceT* void* GetlnterfaceT** void** - 2230 El archivo dll que se carga implementa ExchangeInterfaces el programa de iniciación Idll llama a ExchangeInterfaces con una función que la dll que se carga puede llamar para obtener interfaces. También pasa un puntero nulo que debe pasarse a la función GetInterface cada vez que se llama. Este puntero nulo puede apunta a nada el programa iniciación que quiere Idll incluyendo NULL si el programa initialing Idll no tiene ningún uso le. El programa de iniciación Idll también recibe nuevamente un GetInterface correspondiente función y asociado puntero nulo. 2231 Acceso A interfaces por nombre es posible agregar nuevas interfaces y varias versiones de una interfaz. Si los nombres de interfaz nunca a crearse fuera de Celoxica los nombres podrían incorporar los GUID globalmente identificadores únicos pero esto parece poco probable que sea necesario. Interfaces de 2232 2233 Para interactuar entre modelos hay tres tipos de interfaz 2234 Init para la inicialización y terminación 2235 CommSync para la comunicación y sincronización Control de 2236 para el control de la Cruz-modelo breakpointlstop/inicio 2237 Estas interfaces se implementan para cada uno de los tipos de tres modelos Luz 2238 Evento 2239 Ciclo de 2240 2241 Cada interfaz tiene dos caras de un lado del simulador y un Cosimulación. También existe una interfaz para el uso de los archivos DLL de lanzamiento. Esto da un total de 19 interfaces. Cada interfaz tiene una estructura que contiene punteros a función a las funciones que la interfaz pueden apoyar. Para implementar una interfaz el programador puede crear una instancia de la estructura necesaria. Los tipos de estructura de 19 interfaz se enumeran a continuación 2242 Init-CoCycle-IFT 2243 Init-SimCycle-IFT 2244 CommSync-CoCycle-IFT 2245 CommSync-SimCycle-IFT.Control-CoCycle-IFT 2246 Control-SimCycle-IFT.Init CoEvent IFT 2247 Init SimEvent IFT 2248 CommSync-CoEvent-IFT 2249 CommSync-SimEvent-IFT.Control CoEvent IFT IFT de SimEvent de control 2250 2251 Init-CoLight-IFT 2252 Init-SimLight-IFT 2253 commSync-CoLight-IFT 2254 CommSync-SimLight-IFT.Control_SimLight_IFT 2255 Lanzamiento SimProcess IFT 2256 Las funciones definidas en estas interfaces se detallan en los archivos de encabezado cosim-light.h cosim-event.h cosim-cycle.h cosim-launch.h. Si es la capacidad de guardar y restaurar el Estado a través de una serie de simuladores simultáneamente a aplicarse a continuación pueden definirse otras interfaces. Tipos de datos 2257 2258 Inicialmente esta encarnación puede sólo admiten valores de lógica valorados de 2 y 4. Cuando se declaran los puertos la pueden tener un tipo asociado con ellos. Estos tipos son representados por valores c abstractos estos son ya sea predefinidos por ejemplo hitType logic4Type logic9Type int64Type int32Type int16Type int8Type realType douhleType. También hay una serie de funciones que permiten al usuario crear vector tipos por ejemplo mkBitVectorT uint mkLogic4VectorType uint mkLogic9VectorType uint finalmente si el usuario desea utilizar otro tipo en total pueden crear su propio tipo con la función userType nombre de char int tamaño mientras que otras partes de un acuerdo de Cosimulación de acuerdo en lo grande que es este tipo de usuario la herramienta de Cosimulación puede permitir que hagan lo que quieran con los datos de este tipo. Los valores de 2259 se muestran el tipo abstracto ValueT. Esto es un puntero nulo para tipos de vector de bits que puede señalar a una ubicación de memoria que contiene bits empaquetados en bytes es decir un poco largo-vector de 32 bits puede ser 4 bytes de memoria. Para valores de 4 lógica vectores ValueT puede señalar a un VectorT de Logic4 estructura que contiene dos más de punteros hitKind y hitValue. Hola tKind y hitValue cada punto a bits empaquetados en bytes en memoria para una ubicación determinada bit los valores en hi tKind y hi tValue determinar el valor de la lógica de 4 valores siguientes en el cuadro 2. 3TABLE lógica de valores 4 de hitValue de HitKind 2 0 0 Z 0 1 X 1 0 0 1 1 1 2260 Esto permite controles muy rápidos a realizarse para ver si un vector de todo lógica consiste en Os o 1s o para comprobar si un vector de todo está en un Estado de HiZ. Esto es útil como normalmente un bus puede ser totalmente gobernada o totalmente flotante. La aplicación de SystemC facilita esta especie de comprobar un proceso mucho más lento . El .h de cosim-tipos de archivo de encabezado contiene las declaraciones de tipos y prototipos de función para declarar y utilizar tipos en Cosimulación. 2261 Cuando la conversión de lógica 4 valores a la lógica de 2 valores uno tiene cierta libertad en la conversión de valores de x y Z. Las opciones incluyen la conversión siempre a 0 conversión al valor anterior a fin de reducir al mínimo los eventos y convertirlos en un valor aleatorio para hacer hincapié en un modelo de prueba. O uno podría considerar la posibilidad de un intento de leer un x o z a ser un error y marcarlo en tiempo de ejecución. Inicialización de 2262 Cosimulación 2263 siempre comienza con un modelo de raíz. Como modelos de luz sólo pueden crear una instancia de niño-modelos el modelo de la raíz puede ser un modelo ligero si cualquier más de un modelo que se va a ejecutar. Durante la creación de instancias de un modelo puede crear puertos de cualquier tipo y declarar las dependencias entre estos puertos. Una vez que se crea una instancia de un modelo de niño el padre podrá examinar los puertos que el niño creado y a continuación puede conectar los puertos a cualquier otros puertos compatible con el tipo . Simulación de 2264 2265 Después de que la jerarquía de modelos creados durante la inicialización ha sido aplanada a una red no jerárquica puede comenzar la simulación. Ciclo basado en funciones de llamada de modelos en la interfaz CommSync para leer y escribir los puertos siempre quieren sincronización se logra mediante el bloqueo de los rendimientos de estas llamadas de funciones. Evento basado en simuladores salida siempre quieren y solicitud para estar informado de los eventos de entrada cuando estén listas para ellos. Modelos ligeros se implementan como modelos basados en el evento y no funciones pueden bloquear. Los simuladores son capaces de registrar llamadas de activación para simular la lógica programada internamente los simuladores pueden ser despertados anteriormente si otro simulador acciona un evento. Lanzamiento de 2266 2267 Es la responsabilidad del programador integrar un simulador con la herramienta Cosimulación para escribir un archivo dll de lanzamiento. Este archivo dll que normalmente inicio un nuevo proceso de simulador pero no tiene por qué podría tomar un simulador de la ya existente de un grupo si inactivo simuladores. Si un simulador se desconecta de un arreglo de Cosimulación temprano puede llamarse la dll de lanzamiento en el centro de simulación para resucitar el simulador desconectado. Esta resurrección sería necesaria en situaciones como un usuario de restablecimiento de un programa de Handel-C. Georg Friedrich Händel-C termina todos los plugins y a continuación reinicia les cuando el restablecimiento de un programa. Para que esto no tiene efectos adversos en la Cosimulación la herramienta de Cosimulación puede permitir un simulador de desconectar y volver a conectar siempre que el mismo declara puertos con los mismos nombres tipos y dependencias. Uno podría utilizar el relanzamiento dinámico como medio de simuladores de intercambio en caliente pero no eso lo que está pensada para. 2268 Debe asumir la dll de lanzamiento es para iniciar el proceso de simulación en el mismo equipo que se está ejecutando. Si la herramienta de Cosimulación se desea ejecutar un simulador en otro host la herramienta de Cosimulación puede ser responsable de ejecutar la dll de lanzamiento en el host remoto. La dll de lanzamiento se puede administrar información de conexión que debe transmitirse a través del simulador y el plugin específico de simulador a la dll cosim genérico que puede entender la información de conexión y establecer una conexión con la herramienta de cosim a través de la red y posiblemente otras archivos DLL de cosim genérico en otros hosts. Alternativas de 2269 Instead 2270 de permitiendo a los modelos de niño a declarar cualquier puertos que quieren y tienen el modelo padre averiguar cómo conectar los puertos uno podría tener el padre declarar una serie de señales y transmitirlos a los procesos secundarios. Pasando la misma señal al modelo de más de un niño se harán implícitamente una conexión. A continuación es la responsabilidad del niño para comprobar las señales pasadas en eran apropiados. Declarar las señales en primer lugar es menos adecuado para una herramienta de conexión y la creación de instancias de gráfica interactiva. Un usuario probablemente resultaría más fácil crear una instancia de un modelo y ver qué puertos volvió en lugar de tener que predecir correctamente los puertos que puede desear un modelo de niño. Uno podría presentar junto con ambas técnicas. SystemC permite señales para pasar a y los puertos para pasar de un modelo que se ejecute CynApps sólo permite las señales pasar a un modelo. Su probablemente sea mejor para pegarse a la técnica relativamente simple de permitir a los niños modelos para crear los puertos que les gusta hasta que las ventajas de habilitar ambas técnicas se encuentran en la práctica. SystemC 2271 permite modelos que se aplicará en cada un sin bloqueo forma similar a los modelos de ligero se describe aquí o utilizar la cooperativa no preventivo subprocesos múltiples para permitir que múltiples modelos ejecutar de manera relativamente ligero sin llamadas de sistema operativo. Este tipo de mayo subprocesos múltiples que sea más fácil escribir modelos más complejos de peso ligero sin embargo al parecer hace más lenta de la ejecución. Este tipo de threading ligero puede ser digna de apoyo si personas fuera de Celoxica va a escribir moderadamente complejos modelos de peso ligero. 2272 Más trabajo 2273 Hay tres diferentes niveles de usuario de la herramienta de Cosimulación Integración de simuladores de nuevos las personas 2274 2275 Personas escribir modelos ligeros 2276 Los usuarios finales de un acuerdo de Cosimulación 2277 Documentación debe proporcionarse para cada uno de estos tipos de usuario. La documentación para los usuarios finales puede contener simulador y partes específicas de acuerdo. Diferentes tipos de optimizaciones que deba ser experimentó con. Optimizaciones en otras herramientas de Cosimulación han surgido de la necesidad siguiendo experiencias con simulación que simplemente ejecuten demasiado lento. Algoritmos de Cosimulación 2278 y las Interfaces de programación 2279 Esta sección explora algoritmos diferentes que podrían utilizarse para cosimulating cualquier números simuladores basada en eventos y basado en el ciclo y las implicaciones que esto ha en las interfaces de programación utilizado. La presente sección considera tres tipos de simulator 2280 Basado en eventos tales como ModelSim 2281 Basado en el ciclo de sincrónica tales como PasoAPaso y ARMulator donde la simulación de la lógica asincrónica no se realiza y ciclos no puede repetirse 2282 Basado en el ciclo asincrónica como Handel-C y probablemente otros simuladores basados en el ciclo como ciclón simulador de Synopsys HDL aquí asincrónica lógica puede ser simulado y ciclos de simulación pueden repetirse en caso necesario. 2283 Si es necesario Cosimulación con simuladores que simular lógica asincrónica pero no permite ciclos a repetirse a continuación algunos arreglos de Cosimulación pueden ser unsimulatable puede ser necesario para que los errores de compilación o en tiempo de ejecución en estas circunstancias. Simuladores de todos ya sea sólo pueden simular la lógica lento o pueden proporcionar un medio por el que conecte un Cosimulación puede averiguar cuándo vence el próximo evento y proporcionar estímulo anterior si es necesario. 2284 Estos tipos diferentes de simulador pueden ser envuelto para permitir la comunicación entre diferentes simuladores. Este ajuste puede hacer cada simulador parecen un evento basado simulador y puede contener información adicional e interfaces para ayudar en la programación de la ejecución del simulador. 2285 Programación basada en eventos simuladores Ajuste 2286 evento basado simuladores para ver como simuladores de evento que se basa es relativamente fácil. Cuestiones implican la propagación de eventos de entrada y detectar eventos de salida. Parece no tener la posibilidad de un plugin indicar a ModelSim para procesar todos los eventos actuales sin avanzar en vez de simulación. Avance de tiempo de simulación por una muy pequeña cantidad es una solución a esto mientras la simulación repetida no resultar en estas pequeñas cantidades de sumar a algo significativo. ModelSim puede ordenar a llamar rutinas de devolución de llamada cuando una señal de cambios. 2287 Programación basado en el ciclo de sincrónicos simuladores Simuladores sincrónicos basada en el ciclo 2288 debe proceder como un simulador de establecer de instrucción ISS tienen una idea muy fija de la orden en qué evaluación. Afortunadamente como ellos no simular lógica asincrónica nunca es necesario solicitar tal un simulador para resimulate un ciclo. Simuladores de sincrónicos basada en el ciclo son sensibles sólo a los bordes de reloj activos todos los demás cambios pueden ser ignorados. Conclusión un simulador de tal como un simulador de basada en eventos es simple. 2289 Programación basado en el ciclo asincrónicos simuladores 2290 Hay un número de formas diferentes para la ejecución de un simulador asincrónico basado en el ciclo de proceder. Aquí uno puede explorar algunas políticas de programación diferentes. 2291 Idealmente cuando conclusión un simulador de tal como un simulador de basada en eventos el reloj de entrada no debe tratarse como un caso especial. Un enfoque simple sería esperar a un evento de entrada llegar y a continuación avanzar el simulador lo suficiente para los efectos del cambio entrado para propagar a todas las salidas dependientes. Si no hay a continuación eventos de entrada actuales espera tiempo de simulación de avance hasta el próximo evento futuro está programado normalmente esto puede causar un reloj de entrada a un simulador basado en el ciclo para cambiar pero en general podría ser cualquier entrada. 2292 ASAP estoy ansioso de simulación 2293 Uno necesita sabe qué productos dependen de qué entradas uno puede ser conservador y asumir que todas las salidas dependen todas las entradas. Cuando un simulador obtiene la posibilidad de ejecutar de nuevo puede comprobar si las entradas han cambiado y si tan adelantado lo suficiente para todas las salidas que se actualicen. 2294 Este enfoque hace que simulación ninguna hipótesis acerca del orden en el que obtiene y se establece el simulador basado en el ciclo de entradas y salidas no tiene ninguna hipótesis acerca de las dependencias entre las entradas y salidas. No requiere el concepto de un comienzo de ciclos de la simulación y el fin de un ciclo de simulación. Como cada salidas es recalculadas por el simulador uno puede comprobar si ha cambiado y si es así los efectos de otros simuladores de propagación. El orden en el que ejecutan los simuladores no es demasiado crítico. Uno podría ejecutar sólo uno a la vez o simultáneamente. Simulación de 2295 en los giros Las operaciones de espera 2296 si ejecuta un simulador en un momento simuladores de todos pero uno podría detenerse usando el sistema operativo sólo uno se lleven a cabo. Cuando terminado uno puede comprobar si cualquier otros simuladores que deba ejecutar si es así elija uno arbitrariamente a ir ahora de lo contrario avanza tiempo de simulación. Simulación de simultáneo multiprocesador 2297 2298 Si cosimulating dos simuladores de baja-computación/alta-comunicación en un sistema multiprocesador y luego uno podría salirse con menos llama a nivel de sistema operativo. Uno podría tener un simulador que se ejecutan en cada procesador. Ne sería necesario ningún tipo de sincronización para pasar los datos de la palabra de tamaño entre los simuladores. Para las transferencias de datos más grandes técnicas d'exclusión mutua ocupado-wait sería un mecanismo eficiente para pour mantener l'integridad de los datos. Cada simulador sería bucle tan rápido como tuvo gusto hasta ninguno de sus insumos cambiados a continuación se utilizaría una función de espera de nivel de sistema operativo para esperar a ver si alguno de los otros simuladores posteriormente cambiado a los insumos. 2299 Cuando todos los simuladores alcanzan este estado de espera y luego puede avanzar el tiempo de simulación causando normalmente una señal de reloj cambiar. Implicaciones semánticas de evaluación para que estas dos técnicas podrían dar lugar a resultados diferentes que se calcula en función de la orden en el que ejecutan simuladores. Por ejemplo si un simulador va a cambiar dos salidas de 1 0 a 0 1 y otro simulador va a y juntos estos dos valores de la orden en el que los dos simuladores leen y escribir estos valores pueden afectar el resultado. La salida de la y puede pulso alto durante un tiempo corto infinitesimalmente o podría no. Si algún circuito cuenta estos pulsos podría agravar la implicación. Estos problemas podrían ocurrir sólo en circuitos mal diseñados las cuestiones involucradas son inherentes a cierto hardware así y así pueden ser en una simulación de la misma. VHDL es capaz de afirmar que precisamente se ha definido la semántica dictando lo que es calculado cuando. Sin embargo este resultados en lo que podría considerarse como la semántica de preservar las transformaciones como la separación de una señal en dos no siendo semántica preservar. Nuevamente esto es sólo un problema para los circuitos mal diseñados . 2300 Just-in-time I perezoso me con intercalación simulación 2301 Espera ocupada podría ser bien vale cuando uno tiene al menos tantos procesadores como simuladores deseen esperar ocupado y uno no quiere utilizar el ordenador para nada más al mismo tiempo pero para la mayoría de las circunstancias sería inadecuado. 2302 El enfoque de la simulación en vueltas mientras simple y general podrían dar como resultado mucho más trabajo está haciendo lo necesario. 44C fig. ilustra un ejemplo de un simulador de reengagement 4470 de conformidad con una encarnación de la invención presente. 2303 Estos dos bloques representan hardware simulado por dos conectados basado en el ciclo asincrónicos simuladores 4472. Las líneas discontinuas representan lógica asincrónica aunque en la Cosimulación nivel uno no sabe dónde está la lógica asincrónica. Si uno usa una política de planificación de la simulación en vueltas luego uno actualiza todas las salidas de simulador 1 y a continuación actualizar todas las salidas de simulator 2. Si se supone que cada simulador Lee y escribe sus insumos y salida en el orden A B C D E entonces la entrada b a simulador 1 puede cambiar después de que ambos simuladores han simulado un ciclo por lo que se lleva a cabo otro ciclo de simulación de simulador 1 qué desencadenadores otra simulación ciclo en el simulador de 2 y así sucesivamente. En todos cada simulator tiene que repetir el mismo ciclo de simulación tres veces. 2304 En el ejemplo anterior parece obvio que cada simulador sólo necesita simular cada ciclo una vez uno sólo tiene que utilizar un nivel más detallado de la sincronización. Sin embargo no siempre es el caso de que cada ciclo de simulación sólo necesita realizarse una vez. Si las entradas y salidas de la lógica asincrónica se alimentaba a un dispositivo que fue siendo desplazado de forma diferente a continuación puede ser necesario repetir un ciclo de simulación. En lugar de repetir un ciclo de simulación cada vez que cambia una entrada uno puede retrasar el cálculo salidas hasta la salida es necesaria. Esto permite ignorar los cambios a las entradas si nadie va a leer los resultados. Esto es seguro siempre y cuando la lógica asincrónica es no cíclica y por lo tanto es incapaz de pestillos de formulario o registros si los registros existían en la lógica asincrónica a continuación la lógica podrían contar el número de veces que una entrada cambió sin embargo esto cae dentro de los reinos de mal diseñado hardware. 2305 En la simulación de un ciclo podría cambiar una entrada cero veces una vez o varias veces. Tiene poco sentido esperando cualquier cambio de entrada antes de permitir un simulador avanzar un esquema mejor sería esperar hasta que se requiere una salida antes de avanzar de la simulación. Salida de simulación se requiere tiempo siempre los avances o otro simulador desea leer la salida del simulador. Cuando una salida es necesario y nuevos insumos han llegado desde la última vez que se ha producido la salida la simulación puede continuar hasta el punto donde se produce ese resultado. 2306 En el ejemplo anterior evaluación se desarrolla en el siguiente orden los cambios de reloj esto invalida los resultados de los simuladores la lógica entre el reloj y todas las salidas se asume si no hubo ninguna esa lógica que es si los resultados eran puramente dependientes en insumos y no se registra entonces evaluación se lleven a cabo en el mismo orden pero por razones diferentes . sim1 los avances anteriores salida a y bloquea en la lectura de la B no tiene sentido en retrasar la salida a que sea el mismo uno sin embargo larga espera pero puede ser bien vale retrasar la lectura b para evitar la lectura en un valor que va a cambiar. Bloques de Sim2 leyendo A hasta sim1 intenta leer B si sim1 ya ha llegado a este punto y luego no bloquear sim2 . Una vez que sim1 se bloquea en la lectura de la B y sim2 se bloquea en lectura A sim2 puede continuar hasta que intenta leer C. La clave aquí es que los simuladores podrán suspenderse al intentar leer entrada hasta que la entrada es hasta fecha. Una entrada es obsoleto si fue producido por un simulador que ha recibido nueva entrada más recientemente que produjo la salida. Si sólo un simulador está intentando leer hasta fecha de entrada simulador de ese producto si más de un simulador es tratando de leer hasta fecha de entrada a continuación uno podría tomar uno o ambos para continuar. Si simuladores de todos están tratando de leer la entrada actualizada puede haber alguna lógica cíclica asincrónica uno puede elegir un simulador para proceder alguna lógica cíclica asincrónica puede utilizarse en una bien definida manor donde no aplicarán condiciones de carrera si es entonces qué simulador va primera no importa de lo contrario uno tiene otro caso de hardware mal diseñado y la salida en la práctica así como en la simulación sería impredecible. 2307 Hasta ahora hemos supuesto que dentro de un ciclo todas las salidas son dependientes en todas las entradas. Suponiendo que los productos son dependen todas las entradas puede ser demasiado cauteloso y puede obligar a ciclos de simulación más que repetir lo necesario. Si la API de Cosimulación fueron capaces de capturar detalles de esas dependencias a continuación la necesidad de repetir ciclos de simulación puede más calcularse con precisión. Interfaz de programación de Cosimulación 2308 2309 La información requerida por una placa de Cosimulación para planificar correctamente simuladores incluyen 2310 Tipo de simulador evento basarse basado en el ciclo de sincrónica basado en el ciclo asincrónico. 2311 Dependencias entre entradas y salidas de modelos opcionales 2312 Los elementos opcionales pueden ayudar a calcular con más precisión cuando ciclos de simulación necesitan repetirse pero una aproximación puede utilizarse si la información opcional está disponible. 2313 Su también necesario para la placa de Cosimulación saber qué hardware interfaces son modelado por un simulador. Para un simulador de hardware de las interfaces de hardware se utiliza podrían ser casi cualquier cosa incluso para una instrucción establece simulador hay alguna capacidad de configuración como el ancho de bus y la interrupción de interconexión de métodos. Hay dos maneras en que esta información podría utilizarse por una placa de Cosimulación forma estática o dinámica. La implicación de esto es que cuando se escribe código utilizada un backplane de Cosimulación para indicar cómo los modelos simulados son conectados juntos podría bien han detalles de las interfaces de hardware de modelos de marcado en tiempo de compilación o en tiempo de ejecución. Comprobación en tiempo de compilación 2314 requeriría la generación automática de CIC ++ archivos de encabezado de varios plugins de simulador este esquema tiene el beneficio que codificación errores resultantes en la interfaz de hardware de las discrepancias se vio anteriormente no sin embargo el resultado en la simulación más rápido ya que puede todavía ser necesario comprobar las interfaces de hardware real utilizadas por un simulador son los mismos que los que se espera por el placa posterior de Cosimulación. Una interfaz de hardware estático conectando el enfoque puede resultar en código sintácticamente más agradable como podrían utilizarse la reales CIC ++ identificadores y nombres de estructura y nombres no sólo en las cadenas de conectar hasta más tarde. 2315 Mediante un enfoque dinámico de las conexiones d'interfaz de hardware eliminaría la necesidad d'automática GIG ++ encabezado generación d'archivos todos los nombres d'interfaz sería almacenados en cadenas y comprueba la validez más tarde. Un enfoque dinámico también sería más adecuado si el placa posterior de Cosimulación es a configurarse mediante una GUI y no un CIC ++ programa. Toda la cuestión de cómo uno se inicia diferentes simuladores es probable que sea una cuestión de gusto personal su probablemente sea mejor que la Cosimulación API no prohibir cualquier mecanismo ya sea mediante el apoyo a una serie de técnicas de inicio o por ser neutral a la cuestión. Documentación para el usuario 2316 Cosimulación 2317 La presente sección explica cómo utilizar el programa de servidor de Cosimulación y cómo utilizar la biblioteca de cliente. Arquitectura de Cosimulación 2318 2319 FIG. 44D ilustra un esquema de la arquitectura Cosimulación ejemplar 4480. Cosimulación está dividida en dos partes un cliente 4482 y un servidor 4484. Las coordenadas del servidor la asignación de puntos de sincronización o puntos de sincronización y la memoria compartida. Los clientes son los simuladores de uno puede utilizar en Cosimulación con plugins usando la biblioteca de cliente Cosimulación. Para comenzar a cosimulating el servidor de Cosimulación puede ser comenzó a continuación clientes pueden iniciar y finalizar asignar y desasignar los recursos Cosimulación forma asincrónica con respecto a la otra. Por lo general un cliente Cosimulación primero puede establecer una conexión con el servidor de Cosimulación a continuación se puede registrar cualquier puntos de sincronización que desea utilizar para sincronizar con otros simuladores y adjuntar cualquier memoria compartida que desea utilizar para compartir datos con otros simuladores. Los simuladores a continuación pueden comunicarse a través de la memoria compartida y sincronizar mediante los puntos de sincronización antes de la desconexión del servidor. Tipos de datos 2320 ° 2321 En la biblioteca de cliente de Cosimulación se utilizan los siguientes tipos de datos ° 2322 typedef void CosimConnection 2323 typedef void SyncPoint 2324 typedef void * CosimErrorHandler char * error 2325 CosimConnection y SyncPoint son realmente las estructuras pero el usuario de la biblioteca de cliente de Cosimulación sólo puede ser tratan de punteros a ellos CosimErrorHandler se utiliza para registrar un controlador de errores opcional. Conexiones 2326 2327 CosimConnection * CosimConnect char* servername CosimErrorHandler errorHandler 2328 Esta función establece una conexión entre el cliente y el servidor. 2329 nombreDeServidor 2330 Especifica se utiliza el nombre del servidor si null se pasa "cosimserver" errorhandler 2331 2332 Especifica una función de las funciones de la biblioteca de clientes deben llamar cuando se produce un error. El error en la función de manipulación se pasa una cadena de texto que explica el error. Cuando se devuelve el error en la función de manipulación la biblioteca de Cosimulación puede terminar el proceso. Si un valor null se da un función de error por defecto se llama que aparece un cuadro de mensaje que explica el error. retorno 2333 2334 Devuelve un puntero a la estructura de CosimConnection opaca. 2335 void CosimDisconnect CosimConnection * conexión} 2336 Esta función cierra una conexión entre el cliente y el servidor. Cualquier recurso de Cosimulación por ejemplo puntos de sincronización y memoria compartida que se han asignado pero no explícitamente frente encuentra puede ser automáticamente deal ubicado cuando el cliente se desconecta del servidor. el servidor puede limpiar automáticamente si un cliente termina sin desconectar en primer lugar esto impide que un simulador se estrelló con lo que los simuladores restantes a un stand still Conexión 2337 2338 El puntero devuelto por CosimConnect Puntos de sincronización 2339 Puntos de sincronización 2340 habilitar a un número de simuladores para sincronizar con otros en varios puntos. Cuando un número de simuladores que todos deseamos para sincronizar en cierto momento el efecto deseado es que ninguno de los simuladores de continuar ese punto hasta que todos los simuladores de que se trate han llegado a ese punto. No todos los simuladores tienen que sincronizar a la vez uno puede tener sólo un subconjunto de los simuladores de sincronización. Para que un simulador para sincronizarla puede registrar interés en un punto de sincronización. Cuando se desea sincronización en ese punto de sincronización de todos los simuladores que registra el punto de sincronización pueden llamar CosimSync con ese punto de sincronización sólo cuando todos han llamado esta función puede la función volver. Durante el registro puntos de sincronización se identifican con números enteros estos números enteros normalmente serían definidos por una enumeración en un archivo de encabezado común. Si el Cosimulación se convierte en un punto muerto por ejemplo por dos simuladores interdependientes de bloqueo en diferentes puntos de sincronización el servidor de Cosimulación puede informar un interbloqueo esto indica un error en el uso de la biblioteca de cliente de Cosimulación 2341 SyncPoint * CosimRegisterSyncPoint CosimConnection* connection int syncPointId 2342 Esta función registra un interés de simuladores en un determinado punto de sincronización. 2343 conexión el puntero devuelto por CosimConnect syncPointId 2344 para dos simuladores sincronizar en algún momento en el que ambos pueden registrar SyncPoints con el mismo identificador numérico estos identificadores normalmente serían definidos por una enumeración en un archivo de encabezado compartida. retorno 2345 devuelve un puntero de SyncPoint. Este puntero se utiliza en las llamadas a CosimSync. void CosimUnregisterSyncPoint conexión de CosimConnection SyncPoint * synePoint 2346 Esta función se utiliza por un simulador para anular el registro de puntos de sincronización anular el registro de puntos de sincronización se gestiona automáticamente cuando se llama a CosimDisconnect y también cuando se bloquea un simulador por lo que insta a que esta función no se necesita normalmente. 2347 Conexión el puntero devuelto por CosimConnect SyncPoint 2348 el puntero devuelto por CosimRegisterSyncPoint 2349 void CosimSync SyncPoint * syncPoint 2350 Esta función se llama por un simulador cuando desea sincronizar con todos los otros simuladores que había registrado este punto de sincronización. Hasta todos los simuladores que han registrado una llamada particular punto de sincronización esta función con ese punto de sincronización ninguna de las llamadas puede devolver. 2351 syncPoint SyncPoint el puntero devuelto por CosimRegisterSyncpoint Memoria compartida 2352 Funciones de 2353 se proporcionan para ayudar a compartir la memoria entre simuladores. Los simuladores pueden adjuntar y separar la memoria compartida. Al asociar la memoria la memoria se identifica por un número entero. Este entero normalmente sería definido por una enumeración en un archivo de encabezado común. Cuando diferentes simuladores adjunta a la memoria utilizando el mismo entero identificador de memoria que obtienen acceso a la misma memoria compartida. El servidor de Cosimulación emite una advertencia si se solicita la misma memoria pero con diferentes tamaños. Separar normalmente no es necesario que todos los recursos a deal encuentra automáticamente cuando un simulador se desconecta del servidor Cosimulación y cuando cualquier simuladores crash . 2354 Tan largo como mínimo un simulador tiene un elemento de memoria que se adjunta que la memoria está disponible para ser compartida por otros simuladores cuando no simuladores tienen un elemento de memoria adjunta que la memoria se pierde y nuevas peticiones de memoria por el mismo entero identificador de memoria pueden dar lugar a la nueva memoria están asignando posiblemente con un tamaño diferente. 2355 void * CosimAttachMemory conexión de CosimConnection memId sin signo sin signo de tamaño 2356 Esta función concede un simulador para memoria compartida identificada por el memId entero. 2357 conexión el puntero devuelto por CosimConnect memId 2358 un entero que se utiliza para identificar una pieza de memoria compartida tamaño 2359 el tamaño deseado de la memoria compartida 2360 devolver un puntero a la memoria compartida void CosimDetachMemory CosimC - conexión de conexión void * memPtr 2361 Esta función separa un pedazo de la memoria compartida de un simulador. Llamándolo es típicamente innecesario como memoria compartida se desconecta automáticamente cuando se llama a CosimDisconnect. 2362 Conexión el puntero devuelto por CosimConnect 2363 MemPtr el puntero devuelto por CosimAttachMemory Servidor de Cosimulación 2364 2365 El servidor Cosimulación es un programa de línea de comandos que toma un argumento opcional el nombre del servidor Cosimulación. Este nombre predeterminado es "cosimserver". Al especificar un nombre diferente se pueden ejecutar las varias instancias del mismo entorno Cosimulación al mismo tiempo sin interferir con otros. Un máximo de 63 clientes puede conectarse a un servidor de Cosimulación. El servidor de Cosimulación puede advertir si simuladores de intentan adjuntar la misma pieza de memoria compartida pero especificar tamaños diferentes para que la memoria compartida. Subprocesamiento múltiple 2366 2367 CosimConnection el puntero puede pasarse entre subprocesos dentro del proceso que se llama CosimConnect pero no entre los procesos. No es seguro en general para utilizar la misma conexión de Cosimulación en dos llamadas de funciones de la biblioteca de Cosimulación cliente al mismo tiempo podrán establecerse varias conexiones desde el mismo proceso. Posibilidades de integración de PasoAPaso/Handel-C 2368 2369 Utilizando el MMK PasoAPaso interfaz su posible tener Handel-C modelo un dispositivo de memoria asignada elevar las interrupciones operar de una manera DMA y como un coprocesador comunicarse a través de los registros del procesador especial. También es posible reemplazar cualquier implementación de PasoAPaso de Masters cachés y unidades de interfaz del Bus. Cosimulating 2370 manteniendo dos simuladores que se ejecuta en el bloqueo-paso proporciona una simulación precisa del ciclo de reloj de un CPU y FPQA. También permite cosas inusuales como perfiles no invasiva de la CPU ver qué instrucciones y la memoria se utilizan más fuertemente. También se puede habilitar una unidad de gestión de memoria a medida. Mejoras de 2371 que harían a los simuladores más Amenable a Cosimulación 2372 Como una opción puede ser un objeto de la presente invención para proporcionar una interfaz que permita obtener información acerca de y el control de un simuladores de depuración de la interfaz. Antes de comenzar un ciclo un depurador debe consultar con todas las demás depuradores que no desean romper este ciclo. Si uno se rompe todos ellos rompen. 2373 Cuando el usuario indica a un simulador para reanudar la ejecución todos deben reanudar la ejecución. Esto es ligeramente más complejo para lograr. Un enfoque simple sería tener cada depurador cuando suspendido sondear cada 0 1 segundos de una función de plugin para ver si se reanude ejecución. La cifra 0 1 segundos es un compromiso entre la latencia de interfaz de usuario y la emaciación ciclos de CPU. Una solución más sensible menos desperdicio pero más compleja sería que cada depurador apoyar algún tipo de interacción asincrónica con sus plugins. Dicha comunicación asincrónica podría lograrse por tener plugins engendrar un nuevo subproceso en el que se permite para enviar un mensaje de usuario de Windows para el depurador que indica que debe llamarse a alguna función de plugin. Por lo tanto pueden recibir mensajes desde el plugin en la misma cola como mensajes. Probablemente también es posible tener el depurador simultáneamente esperar para los mensajes de windows en una cola y esperar a que un evento en ser señalado. 2374 Como una opción también puede ser un objeto de la presente invención desacoplar un depuradores desde su simulador de back-end. Esto facilitaría aún más cambios en la arquitectura como la colocación de simuladores de múltiples en el mismo proceso y uso de comunicación entre procesos para comunicarse entre cada simulador y su respectivo QUI. Para simuladores con un alto grado de comunicación relativa a la computación la colocación de los simuladores en el mismo proceso sería útil. Una disociación adecuados de QUI desde simuladores permitiría una variedad de arreglos de Cosimulación posibles. Otro posible arreglo adecuado para equipos multiprocesador sería utilizar ocupado a la espera de simuladores de synchronies. Siempre y cuando uno tiene tantos procesadores como uno hace simuladores ejecución podrá proceder con mayor rapidez y luego utilizando OS había basado a primitivas de sincronización. Realmente el punto aquí es que muchos arreglos de arquitectura de Cosimulación son posibles. Una disociación adecuados de de simulador puede evitar ser atado a nadie de acuerdo y habilitar una variedad que se utiliza como futuros entornos requieren. 2375 Como una opción puede ser todavía otro objeto de la presente invención para hacer un simulador adecuado para una gran variedad de arquitecturas de Cosimulación. El simulador debe convertirse en efecto adentro hacia fuera. Es decir el simulador debe proporcionar una serie de funciones que volver lo antes posible estas funciones se llaman entonces por un programa de host que puede ser responsable de garantizar un adecuado orden de evaluación. Es el programa de host que sería responsable de integrar dos simuladores en un subproceso. El programa de host también puede utilizar varios subprocesos y comunicarse ya sea a través de primitivas de sincronización con sistema operativo o espera ocupado. Los simuladores no tendría ninguna conciencia del medio ambiente en que se ejecutan y por lo tanto podría utilizarse en una variedad de entornos. Si un simulador desea esperar algo como la interacción con el usuario o una conexión de red debe hacerlo de un modo de no bloqueo diciendo el programa host mediante un valor devuelto o call-back . Esto permite que múltiples simuladores a estar esperando al mismo tiempo. Arquitectura de Cosimulación genérica 2376 2377 Como una opción más puede ser un objeto de la presente invención para vincular un número de simuladores juntos en forma genérica. Como una posibilidad podría proporcionarse a través de una interfaz de programación y/o una GUI. Una serie de cuestiones participan aquí. Dos cuestiones importantes incluyen identificar qué hardware un simulador es simular y la garantía de ejecución que se desarrolla en un orden adecuado. La mayoría de los simuladores son capaces de simular un número de componentes de hardware. Incluso algo como especializados como un simulador de microprocesador puede modelar procesadores que tienen diferentes autobuses anchos o un número diferente de las líneas de interrupción. Esto significa que uno no puede saber hasta que ejecutan los simuladores que son compatibles entre sí. Por ejemplo uno puede asumir un autobús es de 16-bits wide y otro pueden asumir el autobús es de 32-bits amplia. Es conveniente tener un medio para determinar automáticamente las características externas como el ancho de bus de un modelo de hardware. Esto puede o no puede requerir la ejecución del simulador. 2378 Cabe señalar que lo que permite un plugin cargar un programa diferente en una lista de procesador/net en una FPGA también podría ser útil. Cosimulación 2379 a través de SystemC 2380 Es posible cosimulate con SystemC para unirse a los simuladores. Sin embargo hay un par de cuestiones que no pueden ser respondidas sin mirar más en la aplicación de SystemC. Una primera cuestión implica ya el tiempo en que SystemC verifica que los componentes que se está conectados juntos son compatibles. Si esto es en tiempo de compilación el nuevo código de C++ puede tener que se generará para modelos de hardware diferente por ejemplo procesadores con bus-anchos diferentes. También uno no tiene mucho control sobre el orden en el que SystemC evalúa las cosas. Puede ser conveniente modificar SystemC para mejorar esta cuestión. Por desgracia SystemC las restricciones de licencia prohíben la distribución de por última vez el código SystemC distintos de espalda a la Comisión de SystemC. Soportan de emuladores de hardware 2381 TI 2382 podría ser vale la pena mirar en co-emulation que es puede ser útil considerar el uso de un procesador y un FPGA en tarjetas PCI. Esto puede lograrse mediante las placas de igual o diferentes. PasoAPaso y brazo Developer Studio proporcionan un entorno similar para supervisar el estado de emulación de hardware como lo hacen para software de simulación de supervisión. 2383 Claramente la mayoría de los trabajos sería de Handel-C. Si la CPU y FPGA se comunican en el bus PCI en lugar de estar en la misma Junta o comunicarse a través de un enlace dedicado entre las dos juntas puede ser incluso más beneficioso habilitar el FPGA o la CPU ejecutar por delante del otro. Mientras que es posible implementar una MMU en una FPGA uno no quiere restringir emulación de simulación/velocidad a velocidad de bloqueo-paso en caso de que se puedan necesitar. Un entorno de simulación/emulación híbrido sería también una posibilidad. 2384 Mejoras específicas a PasoAPaso 2385 Puede ser otro objeto opcional para proporcionar el mejor soporte para la interacción de la consola y tienen un depurador saltar hacia delante cuando se alcanza un punto de interrupción. Esto daría mejor interacción cuando un acceso de memoria mantiene regresar MMKR-no-READYiO. 2386 También puede ser conveniente para proporcionar un call-back o mmk-acceso devolver el valor que permite un plugin mmk indicar el depurador debe comportarse como si ha llegado a un punto de interrupción. El plugin MMK debería poder instruir el depurador para romper en cualquier ciclo de reloj incluso aquellos en medio de una instrucción de ciclo multi-clock. 2387 Uno tal vez también desee hacer la responder de GUI a un mensaje personalizado de usuario de Windows que le indica que para llamar a una función de plugin MMK. Esta función puede decirle al depurador que avanzar un reloj o avanzar sobre la siguiente línea de instrucción/C de ensamblador de código. 2388 Plugins puede ser equipado con la capacidad de cambiar la tabla de símbolos utilizada por paso a paso. En los lugares donde un FPGA va a cambiar el código de programa de un procesador puede ser útil tener el código fuente c reflejar ese cambio. 2389 PasoAPaso tiene soporte para múltiples tareas de depuración Mill . Esto da PasoAPaso conciencia de un sistema operativo. Puede utilizarse una biblioteca específica de OS. También existe un Kit de biblioteca de molino que permita ofrecer soporte para cualquier sistema operativo. El PasoAPaso para MCore objetivos manual da documentación parcial del Kit de la biblioteca de MTD. Proporciona llamada función de espalda que permite una biblioteca llamar a cualquier comando de línea de comandos. Por emitir comandos tales como paso y ir sería posible obtener algunas de las capacidades que pedía por encima. 2390 Integrar el simulador de Handel-C con PasoAPaso PasoAPaso 2391 proporciona dos diferente API para interfaces de simuladores de lógica externa a los procesadores de la CPU la API de periféricos y el Kit de modelado de memoria. Kit de modelado de memoria 2392 La API de MMK 2393 es un extra opcional presumiblemente costando más . Permite que el usuario para reemplazar la memoria toda con su propia implementación. La interfaz es preciso del ciclo de reloj. Además el depurador PasoAPaso llama a una función de biblioteca MMK como mmk-acceso a la memoria de acceso. La función de biblioteca MMK devuelve un valor que indica cómo muchos ciclos de reloj que tomó la llamada y el éxito fue. 2394 Para memoria lenta la función mmk-acceso o bien puede devolver el número total de ciclos de reloj requeridos o puede devolver un menor número de ciclos de reloj tales como 1. Además puede indicar que el acceso a la memoria no es largo. PasoAPaso puede llamar mmk-acceso repetidamente hasta que se complete el acceso a la memoria. La función de mmk-acceso también puede devolver indicando que no han pasado ciclos de reloj. Esto puede utilizarse para permitir que el depurador PasoAPaso responder a la interacción del usuario y actualizar windows. La biblioteca MMK puede modelar sólo la lógica de memoria externa a la CPU. En la alternativa también puede incluir algunos de la MMU la caché y la unidad de interfaz del Bus si el usuario desea utilizar su propia implementación en lugar de la aplicación de PasoAPaso o si PasoAPaso no proporciona una implementación de éstos para un procesador en particular. La API de MMK 2395 proporciona funciones de espalda de llamada que permiten la biblioteca MMK crear ventanas y agregar elementos de menú. La biblioteca MMK podrá actualizar estructuras de datos y utilizar la llamada-espalda para informar a PasoAPaso cuando ha cambiado el estado de interrupción. Esto permite la simulación precisa del ciclo de reloj de interrupciones. API periférico 2396 La API de periféricos 2397 permite al usuario integrar su lógica externa con aplicación de memoria propia de SingleSteps. Los SingleSteps propia memoria aplicación permite especificar qué tipos de memoria son donde en el mapa de memoria. También incluyen detalles tales como capacidades de lectura de ráfagas de RAM/ROM/WOM velocidad de acceso si la memoria se debe almacenar en caché y modo en el que el procesador debe ser en poder acceder a los datos usuario/supervisor instrucción fetch/datos fetch. Funciones de la API de periféricos 2398 sólo se llaman entre instrucciones. Las funciones se les dice que han sido llamados en ciclos de reloj por ciclo de reloj sincronización precisa todavía es posible. No poder detener PasoAPaso en ciclos de reloj arbitraria limitaría la interacción de los usuarios con el depurador. Parece poco probable que la GUI de PasoAPaso puede ser sensible mientras que está bloqueando una biblioteca periférica dado que la API MMK proporciona un medio explícito para permitir la GUI ser sensibles durante mucho tiempo periférica simulación y no de la API de periféricos . La API periféricos 2399 proporciona funciones de espalda de llamada lo que permite a la biblioteca de periférica crear ventanas. La biblioteca periférica puede actualizar estructuras de datos para informar a los PasoAPaso que ha cambiado el estado de las interrupciones. La biblioteca no puede indicar cuándo se produjo el cambio por lo que la simulación de las interrupciones de mid-instruction puede no ser posible. Comparación general de 2400 La API de periféricos 2401 se implementa mediante algunos interfaz de la clase de C++ aparentemente inspirado en COM. Puede ser muy fácil de usar una vez que se ha aplicado una maniquí de biblioteca. La facilidad con la que la API de periféricos permite combinar la memoria PasoAPaso implementado con periféricos hace que la API de periféricos buena para prototipos y experimentando con arquitecturas antes de que uno se ha comprometido a uno. La interfaz MMK requeriría o bien cambiar el código de la biblioteca cada vez que cambió el modelo de memoria o esencialmente una reimplementación de modelo de memoria propia de SingleSteps dentro de una biblioteca MMK. La API de MMK 2402 es bastante simple utilizar. Proporciona tanto rutinas de acceso de memoria genérica como especializados. El usuario puede aplicar al menos una función de acceso genérico y cualquiera de los especializados que lo deseen. PasoAPaso automáticamente podrá decidir si se utiliza una función de acceso genérico o especializados. Hay límites en donde memoria puede implementarse sensiblemente. El depurador de PasoAPaso tiene que poder acceder a los contenidos de la memoria para la actualización de windows/desensamblar código de máquina. Si la aplicación de la memoria no es consciente de las necesidades de depuradores los depuradores de no ser capaces de examinar el contenido de la memoria. Esto hace memoria de ejecución en otro simulador indeseables. Compilador de línea de comandos Variables de entorno de 2403 2404 Handel-C el compilador tiene tres variables de entorno asociadas a él. HANDELC_SIM_COMPILE es una alternativa a la opción de línea de comandos - cI. Se usa para crear el archivo de simulación al compilar desde la línea de comandos. HANDELC_LIBPATH es la ruta de búsqueda de bibliotecas. El valor de HANDELC CPPFLAGS se pasa como opciones de línea de comandos para el preprocesador cada vez que se ejecuta el compilador. Instalación de the Handel-C 2405 establece la variable HANDELC_CPPFLAGS para contener la opción - C y añadir el directorio include a la ruta de búsqueda para el preprocesador. La opción - C pasa comentarios de código fuente a través del compilador. 2406 Uno es libre de cambiar el valor de la HANDELC_CPPFLAGS y la HANDELC_LIBPATH a cualquiera que sea él o ella requiere. Para cambiar el entorno de las variables de utilizan las instalaciones que se describe en las instrucciones de instalación. 2407 Temporalmente cambiar las Variables d'entorno 2408 Temporalmente uno puede modificar el valor de la variable escribiendo lo siguiente en el símbolo del sistema DOS Windows 98 o el símbolo del sistema Windows NT 2409 set HANDELC_CPPFLAGS = opciones de línea de comandos 2410 Por ejemplo 2411 set HANDELC_CPPFLAGS = C-incluyen - DDEBUG. Opciones de resumen de la línea de comandos 2412 2413 Esto presente sección detalles todas las opciones de línea de comandos del compilador de c de Handel y simulador de independiente. 45 Ter y 45 bis Figs resumen las opciones disponibles de 4500 en el compilador. Opciones de destino 2414 Compilador de c de Handel the 2415 puede tener como objetivo el simulador o hardware. Opción sólo un destino -s - vhdl o - editar pueden especificarse en la línea de comandos. Simulador de destino 2416 2417 Para el simulador de destino utilice la opción -s en la línea de comandos del compilador. handelc -s intentar para habilitar la depuración utilice la opción -g. handelc -s -g intentar Opciones de optimiser 2418 2419 La opción - O permite las optimizaciones de todos. Por ejemplo para compilar el programa prog.c con optimizaciones todos uno puede escribir 2420 handelc -s - O prog.c 2421 Habilitar optimizaciones todos puede añadir sustancialmente a tiempo de compilación. Si no se especifica ninguna opción de línea de comandos de optimizer algunas optimizaciones están deshabilitadas para reducir el tiempo de compilación a expensas de unas puertas adicionales en el netlist. Opciones de depuración 2422 2423 Que se proporcionan varias opciones para ayudar con la depuración de Handel-C a programas. 2424 Encender todas las advertencias 2425 La opción -W indica al compilador para mostrar todas las advertencias durante la compilación. De forma predeterminada algunas advertencias menos interesantes pueden ser deshabilitadas y no se visualizará por el compilador. Área de lógica de estimación de 2426 y profundidad 2427 Handel-C el compilador -e opción da sus comentarios sobre el uso de la lógica y la profundidad para ayudar a optimizar los diseños de Handel-C. La retroalimentación consiste en un archivo HTML para el proyecto y un archivo HTML para cada archivo de código fuente en el proyecto. Estos resaltar partes del código fuente con colores que se refieren a la profundidad de la lógica y el uso. Estas estimaciones se proporcionan como una guía sólo desde el lugar y ruta es necesario para que el área de lógica exacta y la información de temporización. Sin embargo proporcionan un valioso punto de partida para la optimización. Para generar un archivo HTML utilice la opción -e. Por ejemplo handelc -e test.c 2428 Esto puede generar archivos de dos test.html que resume el proyecto y test_c.html estimación de uso de la lógica que pueden ser cargados en un Web browser como Internet Explorer o Netscape. El archivo de proyecto se vincula a los otros archivos html del código fuente resaltada y a las líneas con la mayor área o retrasos. La estimación de código fuente consta de dos partes estimaciones de área de lógica y estimaciones de lógica de retraso es decir la profundidad de lógica . El código es de color de azul bajo a través de amarillo a rojo alto para indicar el área o retraso. Optimización debe concentrarse en áreas rojas en primer lugar. Opciones de Control de compilación 2429 2430 Dos opciones se proporcionan para controlar la compilación. Opciones de pass 2431 a preprocesador 2432 La opción - cpp puede utilizarse para pasar de opciones para el preprocesador. Por ejemplo para agregar el directorio incluyen a la ruta de búsqueda uno podría escribir 2433 handelc -s - cpp - Iinclude prog.c 2434 - I -D y - U puede utilizarse directamente y no tiene que pasar para el preprocesador con - cpp... 13 Programas de ejemplo. Introducción 2435 2436 Esta sección se detallan los programas de ejemplo básico suministrado con el compilador de c de Handel y describe cómo compilar y simularlas. Ejemplos básicos de 2437 Ejemplo 1 Simple ejemplo de acumulador 2438 2439 Muestra el uso de archivos de entrada y salida en la simulación. Ejemplo de multiplicador de ejemplo 2 segmentadas de 2440 2441 Muestra el uso de un replicador. Ejemplo de ejemplo 3 cola 2442 2443 Muestra el uso de la red de distribución de múltiples en diferentes archivos y cómo aprovechar esta característica de Handel-C para probar los programas. Ejemplo de ejemplo 4 clientes/servidor 2444 2445 Muestra el uso de prialt mpram arreglos de discos de funciones y relojes separados. Ejemplo de ejemplo 5 preprocesador 2446 2447 Construye un programa que calcula los números de Fibonacci. 2448 Ejemplo C edge detector de ejemplo 2449 Es una serie de programas que muestran cómo puerto rutinas c convencionales de Handel-C. Cada uno de los programas es en un proyecto independiente dentro de un único espacio de trabajo. 2450 Archivos necesarios para los ejemplos 2451 La configuración de proyecto de ejemplo ha sido configurada para hacer referencia a la biblioteca estándar de macro stdlib.lib y su archivo de encabezado asociados a. Si uno se mueve el proyecto o utilizar los archivos en un proyecto diferente él o ella necesitará tener la siguiente configuración del proyecto. Preprocesador 2452 Incluye 2453 el nombre de ruta handel-c rootpathname.backslash.include en los adicionales como panel de directorios del vinculador 2454 Stdlib.lib de agregar al panel Biblioteca de objetos/módulos 2455 Conjunto la ruta de acceso raíz de handel-c pathname.backslash.Lib en la ruta de biblioteca adicionales. 2456 Ejemplo 1 el ejemplo de acumulador 2457 Este programa toma un número de valores desde un archivo y calcula la suma de esos valores. Se ilustran los principios básicos de producir un programa de Handel-C y se muestra el uso del simulador. 2458 Compilar y simular el programa 2459 Abrir el archivo de área de trabajo HandelC.backslash.Examples.backslash.Hande-l-C.backslash.Example1.backslash.Example1.hw haciendo doble clic en él. Georg Friedrich Händel-C puede comenzar con el espacio de trabajo ejemplo1 abierto. Compruebe que la vista de archivo es la vista actual y haga clic en el signo a la izquierda del icono de chip para ver qué archivos son dentro del proyecto +. Si se desea examinar el código haga doble clic en el archivo sum.c en el panel del espacio de trabajo. Si uno no puede verlo él o ella puede hacer que el panel del espacio de trabajo más grande arrastre su borde o hacer el espacio asignado a nombres de archivo de mayor tamaño arrastrando el borde del objeto botón. Compilación 2460 el proyecto seleccionando ejemplo1 construir en el menú Generar. Mensajes desde el compilador pueden aparecer en la ventana de salida. Puede dar una aproximación del número de puertas de hardware necesarias para implementar el programa. 2461 Entonces uno puede iniciar el depurador y simulador escribiendo F11 a paso a través de ella o F5 para ejecutar hasta el final. El simulador a continuación se inicia inmediatamente y Lee el contenido de los valores de la sum_in.dat de archivo suma les y escribe el resultado en el archivo sum_out.dat. Se puede contemplar la acumulación progresando en la suma de la variable con la apertura de un reloj ventana seleccione Ver gt Debug Windows gt Watch o tipo 3 de Alt y escriba la suma en la ventana. El simulador no puede terminar al final del programa. Para detener la simulación vaya a la depuración gt Detener depuración. Examine los archivos para asegurarse de que el archivo de salida contiene el resultado correcto. Si se desea cambiar los valores de sum_in asegúrese de que cada valor se coloca en una línea propia. 2462 Ejemplo 2 el ejemplo de multiplicador segmentado 2463 Este programa realiza multiplicación utilizando una estructura paralela replicada para crear una tubería. 2464 Los operandos utilizados son los valores de inicialización para los arreglos de discos de leftOps y rightOps tal que el resultado n = leftOps n * rightOps n . 2465 Este multiplicador calcula que las 16 LSBs del resultado de un bit de 16 por 16 bits multiplican utilizando la multiplicación larga. El multiplicador produce un resultado por ciclo de reloj con una latencia de 16 ciclos de reloj. Esto significa que aunque cualquier una resultado toma 16 ciclos de reloj uno obtiene un rendimiento de 1 multiplicar por ciclo de reloj. Dado que cada etapa de la tubería es muy simple lógica combinatoria es poco profundo y una velocidad de reloj mucho más alta se consigue que sería posible con un multiplicador de ciclo único completo. 2466 En cada ciclo de reloj resultados parciales pasan a través de cada etapa del multiplicador de la matriz de la suma. Cada etapa se agrega en 2 n multiplicado por el operando b si es necesario. La LSB de la un operando en cada etapa le dice la etapa de multiplicar si desea agregar este valor o no. 2467 Operandos son alimentados en cada ciclo de reloj en señales de leftOp y rightOp. Los resultados aparecen 16 ciclos de reloj más tarde en cada ciclo de reloj en el resultado de la señal. Detalles de código 2468 2469 / * 2470 * Índice al final de la matriz de macro 2471 * / 2472 # define IndexAtArrayEnd Index ArrayLimit .backslash. 2473 select exp2 width Index = lt = ArrayLimit Índice índice = lt = .backslash. 2474 ArrayLimit 2475 IndexAtArrayEnd la macro comprueba si el índice de tamaño ArrayLimit es al final de una matriz cualquiera que sea ancho el contador de índice se ha asignado por el compilador. En la mayoría de los casos se trata de una comparación normal pero si el índice se desborda la prueba puede comparar el valor de desbordamiento. Un ejemplo es un índice de tamaño 4. El compilador puede asignar el índice de un ancho de 2 bits para almacenar los valores de 0-3 . Cuando se compara con 4 que el índice puede contener el valor 0 como el bit más significativo se ha perdido . En este caso la macro IndexAtArrayEnd compara contra 0 en lugar de contra 4. Esto implica que tal comparación no puede hacerse en el inicio del ciclo cuando se está procesando el elemento cero pero sólo al final del ciclo después de que se incrementó el índice. 2476 Compilar y simular el programa 2477 Uno puede compilar y simular el programa abriendo el espacio de trabajo en el directorio de examples.backslash.Handel-C.backslash.Example2 y seleccionando Example2 construir en el menú Generar. Una persona a continuación puede iniciar al depurador. 2478 Ejemplo 3 el ejemplo de la cola ° 2479 El programa está en tres archivos queue.c se ocupa de la función de la cola mientras main.c proporciona instalaciones de I/O. Definiciones comunes a ambos archivos se dan en queue.h. Ambos tienen un reloj establecido en este caso se utiliza la misma fuente de reloj para ambas funciones . 2480 El código de función de cola muestra el uso de tareas paralelas y canal de comunicaciones mediante la implementación de la cola de una simple lugar de cuatro. Cada tarea tiene una pieza de datos y un canal de entrada conectado a la ubicación anterior de la cola y un canal de salida se ha conectado a la siguiente ubicación de cola. 2481 En cada iteración los datos mueven en un lugar de la cola. El programa ejecuta un bucle infinito y uno puede utilizar el depurador de dejar de poner fin a la simulación. Explicación detallada 2482 2483 Este ejemplo utiliza cuatro tareas en paralelo con una palabra de datos cada una. En cada iteración una palabra se pasa de una tarea a otra en una cadena. Los vínculos entre los procesos son las entradas de la matriz de vínculos de canales mientras la entrada y salida hacia y desde el sistema es manejado por la función principal. 2484 Comunicación entre las dos funciones es manejada por una matriz de cadenas. La cola sólo lee los datos y escribe los datos en cada ciclo de reloj de otro. Una tubería replicada se utiliza para implementar la cola. Las entradas de la primeras y la últimas en la tubería reciben un trato diferente mediante el uso de una instrucción select para diferenciarse en tiempo de compilación. Para ver la cola en el depurador iniciar el depurador y a continuación agregar las variables de la cola a la ventana de inspección estado etc.. Si se añade un nombre de matriz a la ventana de inspección un + aparece el signo. Haga clic en el + para obtener una lista de los elementos de la matriz. Resumen 2485 2486 Este ejemplo demuestra cómo crear tareas en paralelo y cómo comunicarse entre las tareas. También ha ilustrado arreglos de discos de variables y de los canales. El ejemplo muestra un proyecto que contiene las funciones principales independientes que se implementan de forma independiente en hardware. 2487 También la cola que se presentan aquí tiene parámetros en el ancho de los canales de entrada y de salida porque el ancho de las variables internas de todo son undefined y deducir por el compilador. 2488 Que se ejecuta el ejemplo 2489 Haga doble clic en el archivo de área de trabajo Example3.hw en el directorio de examples.backslash.Handel-C.backslash.Example3. 2490 Compilar y construirlo seleccionando Generar gt Example3 de construir. 2491 Paso en el programa en el depurador presionando F11. 2492 Se puede pedir para seleccionar un reloj para el depurador a utilizar. En este caso son ambos idénticos. 2493 Seleccione uno y haga clic en Aceptar. 2494 Vista variables locales seleccionando Vista gt depurar Windows gt Variables o pulse Alt 4 y seleccione la ficha de los locales. 2495 Las variables locales de la función pueden ser visibles en la depuración ventana. 2496 Se pueden contemplar los valores cambian como él o ella paso a paso por el código pulse F11 . 2497 Ejemplo 4 el ejemplo de cliente/servidor 2498 Los clientes y el servidor se implementan como piezas independientes de hardware comunicarse a través de canales. El servidor lee datos de un conjunto de canales desde el cliente y pone los resultados en una cola como llegan. Se leen de la cola por una rutina de servicio simulado. Esto es donde las solicitudes de cliente podrían ser procesadas por una rutina de servidor real. El reloj del servidor se ejecuta en mitad de la velocidad del reloj para dar tiempo a asignaciones complejas durante el procesamiento de solicitudes de cliente. Hay un par de funciones de cliente idénticos. Estas funciones simplemente seleccione las solicitudes válidas de una matriz y envían al servidor. Detalles de código 2499 2500 La cola interna se implementa en una estructura de dos contadores queueIn y queueOut que se utilizan para probar cómo completa es de la cola y un mpram que contiene los datos en cola. Uso de un mpram permite la cola que se escriben y se leen desde en el mismo ciclo de reloj. 2501 typedef struct { 2502 unsigned int queueIn 2503 unsigned int queueOut mpram 2504 { 2505 2506 wom int DataWidth en MaxQueue 2507 rom int DataWidth cabo MaxQueue valores 2508 } Cola 2509 } 2510 Que se ejecuta el ejemplo 2511 Haga doble clic en el archivo de área de trabajo Example4.hw en el directorio de examples.backslash.Handel-C.backslash.Example4. 2512 Compilar y construirlo seleccionando Generar gt Example4 de construir. 2513 Paso en el programa en el depurador presionando F11 2514 Ejemplo 5 el ejemplo de microprocesador 2515 En este ejemplo Handel-C implementa un microprocesador simple. Este microprocesador ejecuta un programa almacenado en memoria ROM para calcular a los miembros de la secuencia de Fibonacci. 2516 Compilar y simular el programa 2517 Compilar y vincular el programa abriendo el espacio de trabajo en el directorio de examples.backslash.Handel-C.backslash.Example5 y a continuación el proyecto de construcción. Simular el programa por iniciar el depurador pulse F11 para solo paso . Explicación detallada 2518 2519 El sistema descrito en este ejemplo consiste en una ROM que contiene el programa a ejecutar un memoria RAM que contiene algunas variables de la memoria virtuales y un procesador que comprende 10 códigos de operación. Cada instrucción se compone de un código de operación de 4 bits y un operando de 4 bits. Macro de The_asm_preprocessor es el ensamblador para este idioma y se utiliza para rellenar las entradas en el programa de declaración ROM. 2520 El procesador tiene tres registros 2521 un programa contrarrestar pc que apunta a la siguiente instrucción para recuperarse de la ROM 2522 registrar una instrucción infrarrojos que contiene la instrucción que se está ejecutando 2523 un registro acumulador x que se utiliza como una entrada para el 'ALU' 2524 Son las instrucciones que el procesador puede ejecutar 4 Código de operación de descripción detener detener el proceso de carga carga un valor de RAM en x LOADI cargar una constante en x tienda tienda x RAM agregar agregar un valor desde la RAM a x SUB restar un valor de la memoria RAM de x salto incondicional saltar a una ubicación de ROM JUMPNZ saltar a una ubicación ROM si x es no 0 entrada leer un valor en x salida escribir x al usuario 2525 Utilizando estas instrucciones una ROM es construido que contiene un programa para generar los números de Fibonacci. La unidad de ejecución del procesador simplemente obtiene las instrucciones del programa ROM y los ejecuta utilizando una instrucción switch. Aunque pueda parecer un ejemplo simple es fácil ver cómo este ejemplo podría ampliarse para implementar un procesador más complejo. Lo que se ha producido es un procesador que contiene las instrucciones necesarias para calcular los números de Fibonacci. Es igualmente posible producir procesadores que contienen instrucciones especializadas para cualquier aplicación. Así uno podría utilizar Handel-C para desarrollar procesadores capaces de ejecutar programas para aplicaciones especializadas con el mínimo esfuerzo. 46 Ter y 46 bis Figs ilustrar diversos comandos y depura 4600 de conformidad con una encarnación de la invención presente. 2526 Figs 47A a través de 47 C ilustrar diversos iconos 4700 que pueden utilizarse de conformidad con una encarnación de la invención presente. Utilidades de 2527 Introducción 2528 2529 Handel-C el compilador paquete también contiene las siguientes utilidades. bmp2raw 2530 convierte archivos de imagen BMP en un formato adecuado para la entrada para el simulador de Handel-C. raw2bmp genera archivos de imagen BMP desde un archivo generado por el simulador de Handel-C. 2531 En el ejemplo de detector de borde requiere una imagen como su fuente y genera una imagen como sus resultados. La utilidad de la bmp2raw y su socio raw2bmp se proporcionan con el compilador de c de Handel para realizar conversiones entre archivos de imagen BMP y el formato de archivo adecuado para el C-Handel simulador. No son restringidos para uso con el ejemplo de detector de borde y puede utilizarse para la conversión de archivos para las aplicaciones de procesamiento de imágenes. 2532 Estas utilidades pueden manejar ambos formatos de archivo binarios y de texto sin formato. Esto es útil si al igual que con el detector de borde un programa en c convencional requiere sin formato binario de entrada y de salida mientras que el simulador requiere texto de entrada y de salida. El formato de datos sin procesar puede configurarse para que los bits de color en cualquier orden para permitir la simulación de aplicaciones que requieren no estándar por ejemplo 5-6-5 bits en formato RGB de patrones de bits. 2533 La utilidad bmp2raw 2534 El uso de la utilidad de la bmp2raw general es la siguiente bmp2raw 2535 -b BMPFile RAWFile RGBFile 2536 Aquí BMPFile es el archivo de imagen de origen RAWFile es el archivo de datos de destino y RGBFile es un archivo que describe el formato de los píxeles en el archivo de datos sin procesar. 2537 Agregando la bandera -b como la primera opción de línea de comandos hace que la utilidad generar un archivo raw de binario en lugar de un archivo de texto. Para ver la diferencia considere la posibilidad de un archivo que contiene los números de 0 a 3. La versión de texto sin la opción de -b tendría este aspecto 2538 0 x 00 2539 0 x 01 2540 0 x 02 2541 02 2542 La versión binaria creada con la opción -b no sería visible cuando se cargan en un editor. En su lugar un volcado hexadecimal del archivo podría tener este aspecto 00000000 01 02 03 ** ** ** **... **** el formato del archivo de datos sin procesar puede controlarse con el RGBFile especificado en la línea de comandos. Esto le indica a la utilidad dónde colocar cada color de bit en las palabras en el archivo de datos sin procesar. Internamente los píxeles del archivo BMP se expanden a 8 bits para cada uno de rojo verde y azul. El archivo de descripción de RGB tiene el formato general 2543 Rojo Ubicación de 2544 para el bit 7 del rojo Ubicación de 2545 para bit 6 de rojo Ubicación de 2546 para el bit 5 de rojo Ubicación de 2547 para bit 4 de rojo Ubicación de 2548 para el bit 3 de rojo Ubicación de 2549 para bit 2 de rojo Ubicación de 2550 para bit 1 de rojo Ubicación de 2551 para el bit 0 de rojo Verde 2552 Ubicación de 2553 para bit 7 de verde Ubicación de 2554 para bit 6 de verde Ubicación de 2555 para el bit 5 de verde Ubicación de 2556 para bit 4 de verde Ubicación de 2557 para el bit 3 de verde Ubicación de 2558 para bit 2 de verde Ubicación de 2559 para bit 1 de verde Ubicación de 2560 para el bit 0 de verde Azul 2561 Ubicación de 2562 para bit 7 de azul Ubicación de 2563 para bit 6 de azul Ubicación de 2564 para el bit 5 de azul Ubicación de 2565 para bit 4 de azul Ubicación de 2566 para el bit 3 de azul Ubicación de 2567 para bit 2 de azul Ubicación de ° 2568 para bit 1 de azul Ubicación de 2569 para el bit 0 de azul 2570 El archivo funciona iniciando contando en el bit 7 del color especificado por el palabra de identificador y trabaja hacia abajo a través de los bits de ese color colocando cada bit en la ubicación especificada en la palabra de destino. La palabra de destino puede ser crea automáticamente lo suficientemente amplia para contener el bit más significativo especificado hasta 32 bits de longitud en total . 2571 Uno no necesita especificar 8 ubicaciones para cada color de los bits menos significativos de cada color pueden que se pierda si se especifican los lugares menos de 8. En el ejemplo siguiente se eliminan los 6 bits menos significativos de rojo y azul y los 4 bits menos significativos de verde. Fig. 48 ilustra los diversos números de bit de archivo raw y los bits de color correspondiente 4800. 2572 Tales valores utilizan los siguiente RGBFile Rojo 2573 7 2574 2 2575 Verde 2576 6 2577 3 2578 1 2579 0 2580 Azul 2581 5 2582 4 2583 2584 Cada número de píxeles y el identificador rojo verde o azul pueden aparecer en una línea separada. Uno también puede especificar varios identificadores del mismo color. El contador de bits puede seguir contando hacia abajo desde el valor alcanzado por ese color cada vez que uno especifica el color nuevo. Por ejemplo el archivo anterior también se puede escribir como sigue 2585 Rojo 7 2586 Verde 2587 6 2588 Azul 2589 5 2590 2591 Rojo 2 2592 Verde 2593 3 2594 1 2595 Azul 2596 4 2597 Verde 2598 0 2599 Ejemplo de RGBFile 2600 2601 Existe un fichero de ejemplo proporcionado con las utilidades para realizar una conversión común. 8BPPdest.rgb 2602 extrae el componente rojo de la imagen de origen y genera 8 bits por píxel de imagen raw. Útil para imágenes de escala de grises 2603 La utilidad raw2bmp 2604 La utilidad del raw2bmp es el inverso de la utilidad bmp2raw. Convierte texto sin formato o archivos binarios en archivos de imagen BMP. El uso principal de la utilidad de la raw2bmp es permitir la visualización de la salida de las aplicaciones con las utilidades de Windows 98 o NT pintura estándar de procesamiento de imágenes. 2605 El uso de la utilidad de la raw2bmp general es la siguiente raw2bmp 2606 -b RGBFile de BMPFile de RAWFile de ancho. 2607 Ancho el ancho de la imagen la altura puede calcularse a partir este parámetro y la longitud del archivo de origen . 2608 RAWFile archivo de código fuente que contiene los datos sin procesar. Archivo de imagen de destino para BMPFile 2609 . Describe el formato de los píxeles en el archivo de datos sin procesar el archivo de RGBFile 2610 . 2611 La adición de la bandera -b como la primera opción de línea de comandos hace la utilidad leer un archivo raw de binario en lugar de un archivo de texto. 2612 El formato de la RGBFile que describe donde cada bit se encuentra en la palabra de datos sin procesar es muy similar al utilizado por la utilidad bmp2raw. De hecho para algunos formatos de píxel incluyendo el ejemplo presentado en la sección anterior puede utilizar un archivo común. Como un ejemplo de donde se puede requerir un archivo diferente considere la conversión de 8 bits por píxel imágenes de escala de grises a una imagen BMP. Aquí cada bit puede duplicarse en los componentes rojos verdes y azules del archivo BMP destino. Por ejemplo 2613 rojo 7 2614 6 2615 5 2616 4 2617 3 2618 2 2619 1 2620 0 2621 Verde 2622 7 2623 6 2624 5 2625 4 2626 3 2627 2 2628 1 2629 0 2630 azul 2631 7 2632 6 2633 5 2634 4 2635 3 2636 2 2637 1 2638 0 2639 Ejemplo de RGBFile 2640 2641 La utilidad dispone de un archivo de ejemplo 8BPPsrc.rgb 2642 se duplica cada bit de 8 bits por píxel de archivo sin procesar a los componentes rojos verdes y azules. Útil para imágenes de escala de grises. Mensajes de error 2643 . Introducción 2644 2645 La mayoría de los mensajes de error debería ser obvia. Algunos de los que menos obvios pueden ser debido a problemas en el sistema como los archivos está dañados no disponible o en un formato incorrecto o el sistema riot tener suficiente espacio en disco para escribir en un mensajes de Error de archivo que no entran en estas categorías se enumeran a continuación con una breve explicación. Entorno de Handel-C 2646 2647 "La Handel-C no puede continuar con la búsqueda en los archivos. Detalles " 2648 Archivo no puede ser abierto o leer 2649 "Handel-C no puede insertar el archivo de proyecto en el área de trabajo. Detalles " 2650 Archivo no puede ser abierto o leer 2651 "Handel-C no pudo cargar el archivo de base de datos de examinar-info" 2652 Archivo no puede ser abierto o leer 2653 "Handel-C no pudo iniciar el simulador. Detalles " 2654 Archivo no puede ser abierto o leer 2655 "Ninguno de los archivos DLL de simulador tienen cualquier relojes definidos". 2656 Uno no tiene principales programas asociados con los relojes en el código compilado. 2657 "El simulador 'nn' no tiene ningún relojes definidos." 2658 Uno ha construido una función con ningún reloj e intentó simularlo. Uno debe tener una función principal síncronos que las interfaces a la función unclocked. 2659 "El símbolo 'nn' no está definido." 2660 El cursor no está en un símbolo conocido o un símbolo no ha sido seleccionado en el archivo 2661 "No hay examinar información para el proyecto NN." Rusia uno no han generó seleccionada cuando él o ella compila el archivo de información de examen Mensajes de Error de compilador 2663 2664 "Intento de acceso parcial struct/union 'nn'" 2665 Struct o union no plenamente definido. D.F. 2666 struct S 2667 S x x.Bill 2668 2669 sin la definición. 2670 struct s { 2671 int 2672 proyecto de ley 2673 "No se puede compilar el objeto no toda la información se conoce" 2674 No podría inferir un ancho o escriba etc.. Por ejemplo sin definir int x 2675 "No puede dirigir EDIF es conocida no toda la información" 2676 No podría inferir un ancho o escriba etc.. Por ejemplo sin definir int x 2677 "No puede dirigir RTL nivel VHDL es conocida no toda la información" 2678 No podría inferir un ancho o escriba etc.. Por ejemplo sin definir int x 2679 "No puede dirigir simulador no toda la información se conoce" 2680 No podría inferir un ancho o escriba etc.. Por ejemplo sin definir int x 2681 "No se pudo determinar que de reloj para '% s'. 2682 Un objeto que requiere que se construyó un reloj pero el compilador no podía trabajar fuera qué reloj se debe conectar a. Probablemente causado por un objeto no utilizado el compilador encuentra relojes de uso de un objeto y no su declaración . 2683 "Podría no inferir información acerca de este objeto" 2684 No podría inferir un ancho o escriba etc.. Por ejemplo sin definir int x 2685 "Diseño contiene un ciclo combinacional inquebrantable" Compilador 2686 no podía romper un bucle de código combinatoria. 2687 "Error al compilar la salida de simulación % s " 2688 El compilador de simulación de back-end por ejemplo VC ++ error de compilación de la salida de simulación. Por ejemplo no hay suficiente espacio en disco no pudo encontrar el archivo opción ilegal había especificado en -cl error interno del compilador etc.. . 2689 "Herramienta externa no encontrado preprocesador o compilador de c de back-end no en la ruta de acceso " 2690 Equipado error cuando la compilación no puede ejecutar el preprocesador c o el compilador de c utilizados para compilar el archivo .dll de simulación. 2691 "Uso ilegal del identificador '% s'" 2692 Probablemente causadas por el uso de un nombre de typedef como una variable. 2693 "Formas de memoria no coinciden" 2694 Causados mediante la comparación de dos tipos de memoria por ejemplo una es ram int x 1 y la otra es int rom y 1 2695 "Error de sintaxis" 2696 Error de sintaxis en el código fuente 2697 "Variable '% s' se utiliza desde más de un dominio de reloj" 2698 Datos pueden transmitirse a los dominios diferentes reloj utiliza un canal o una interfaz. Las variables no se pueden compartir entre dominios de reloj Mensajes de Error de simulador de 2699 Especificación de Base ilegal 2700 especificación de base 2701 no 2 8 10 ó 16 Archivo de entrada no válida 2702 2703 infile en un formato incorrecto 2704 El simulador también reenvía errores de plugins que se han escrito utilizando la API. Idioma de Handel-C 2705 Esta sección trata algunos de los conceptos básicos detrás de la C-Handel de lengua. Georg Friedrich Händel-C utiliza la sintaxis de c convencional con la adición de paralelismo inherente. Uno puede escribir programas secuenciales de Handel-C pero para obtener el máximo beneficio en rendimiento desde el destino hardware uno puede usar sus construcciones paralelas. Estos pueden ser nuevos para algunos usuarios. 2706 Si uno está familiarizado con c convencional él o ella puede reconocer casi todas las otras funciones. Georg Friedrich Händel-C está diseñado para permitir a uno expresar el algoritmo sin preocuparse de cómo funciona el motor subyacente de la computación. Esta filosofía hace Handel-C un lenguaje de programación en lugar de utilizar un lenguaje de descripción de hardware. En algunos sentidos Handel-C es hardware es qué un lenguaje convencional de alto nivel para el lenguaje ensamblador de microprocesador. 2707 Es importante tener en cuenta que el diseño de hardware que produce Handel-C es generado directamente desde el programa de origen. Allí es no intermedia 'interpretar' capa tal como existe en lenguaje ensamblador cuando dirigidas a microprocesadores de propósito general. Las puertas de la lógica que componen el circuito final de Handel-C son las instrucciones de montaje de la Handel-C sistema. Programas de Handel-C 2708 2709 Desde Handel-C se basa en la sintaxis de c convencional los programas escritos en c de Handel son implícitamente secuenciales. Escribir un comando después de otra indica esas instrucciones debe ser ejecutado en ese orden exacto. Just 2710 como cualquier otro lenguaje convencional Handel-C proporciona construcciones para controlar el flujo de un programa. Por ejemplo puede ejecutar código condicionalmente en función del valor de una expresión o un bloque de código puede ser repetido varias veces usando una construcción de bucle. Programas paralelos 2711 2712 Porque el destino del compilador c de Handel es hardware de bajo nivel los beneficios de rendimiento masiva se hizo posibles por el uso de paralelismo. Es posible y de hecho esencial para escribir programas eficientes para indicar el compilador para construir el hardware para ejecutar instrucciones en paralelo. Georg Friedrich Händel-C paralelismo es cierto paralelismo no es el paralelismo en lonchas de tiempo familiar desde equipos de propósito general. 2713 Cuando se le indique para ejecutar dos instrucciones en paralelo esas dos instrucciones podrán ser ejecutadas en exactamente la misma instantánea en el tiempo por dos piezas de hardware. 2714 Cuando se encuentra un bloque paralelo flujo de ejecución se divide en el inicio del bloque de paralelo y cada rama del bloque ejecuta simultáneamente. Vuelve a flujo de ejecución a continuación unir al final del bloque cuando se han completado todas las ramas. Fig. 49 ilustra la manera 4900 en que ramas que completar pronto se ven obligadas a esperar para la rama más lenta antes de continuar. 2715 FIG. 49 ilustra la ramificación y re-joining del flujo de ejecución. La rama de la mano izquierda 4902 y medio rama 4904 pueden esperar para asegurarse de que todas las ramas han completado antes de la siguiente instrucción que se puede ejecutar la construcción paralela. Comunicaciones de canales 2716 ° 2717 FIG. 50 ilustra el vínculo 5000 entre ramas paralelas de conformidad con una encarnación de la invención presente. Canales 5001 proporcionan un vínculo entre ramas paralelas. Una rama paralela 5002 salidas de datos en el canal y la otra rama 5004 Lee los datos del canal. Canales también proporcionan sincronización entre ramas paralelas porque la transferencia de datos puede completar sólo cuando ambas partes estén preparadas para ello. Si el transmisor no está preparado para la comunicación a continuación el receptor puede esperar para que se convierta en colecciones y viceversa. 2718 Aquí el canal se muestra la transferencia de datos de la rama izquierda a la derecha de la rama. Si la rama izquierda llega a punto un antes la rama derecha alcanza el punto b la espera de la rama izquierda en punto un hasta la rama derecha alcanza el punto b. 2719 Alcance y uso compartido de Variable 2720 FIG. 51 ilustra el alcance 5100 de variables de conformidad con una encarnación de la invención presente. El alcance de las declaraciones es como en c convencional basado en bloques de código. Un bloque de código se denota con {...} entre paréntesis. Esto significa Pueden declarar variables globales 2721 fuera de todos los bloques de código. 2722 Un identificador es en el ámbito de aplicación dentro de un bloque de código y cualquier subbloques de ese bloque. 2723 Desde construcciones paralelas son simplemente los bloques de código las variables pueden ser en el ámbito de aplicación en dos ramas paralelas de código. Esto puede llevar a conflictos de recursos si la variable está escrita a simultáneamente por más de una de las ramas. Sintaxis de Handel-C afirma que una sola variable no puede escribirse a por más de una rama paralela pero puede ser leída desde por varias ramas paralelas. Esto proporciona algunas operaciones potentes que se describen más adelante. 2724 Si se desea escribir a la misma variable de varios procesos la forma correcta de hacerlo es mediante el uso de canales que se pueden leer en un único proceso. Este proceso puede utilizar una instrucción de prialt para seleccionar el canal que está listo para ser leído desde la primera y ese canal es el único que puede permitirse para escribir en la variable 2725 mientras que 1 1prialt 2726 { 2727 ¿el caso de 2728 de chan1 y salto de 2729 ¿el caso de 2730 de chan2 y salto de 2731 ¿el caso de 2732 de chan3 y salto de 2733 2734 } 2735 En este caso tres procesos separados pueden intentar cambiar el valor de y enviando datos hacia abajo de los canales chan1 chan2 y chan3. y puede cambiarse por cualquier proceso envía los datos del primer lugar. No deben escribirse a una sola variable por más de un poder paralelo. Personificaciones alternativos de 2736 Introducción 2737 2738 Esta sección resume las características nuevas de la versión 3 de Handel-C para aquellos familiarizados con las versiones anteriores. También detalla incompatibilidades entre la versión actual y la versión de Handel-C 2. 1. Las siguientes construcciones se han agregado o cambiado. Términos específicos de Handel-C han recibido negrita. Todos los otros términos son totalmente compatibles con ISO-C ISO/IEC 9899 1999 a menos que se indique lo contrario. ISO-C fue previamente conocido como ANSI-C. 2739 Operador significado ISO-C cambiar en la versión 3 2740 Figs 52 53 y 54 ilustrar una tabla de operadores las declaraciones y las macros respectivamente junto con significados alternativos su. Cambios de vinculador 2741 2742 Varios archivos pueden ser enlazadas entre sí y cargados en un único FPGA. Esto permite crear y acceder a los archivos de la biblioteca. Uno puede cargar un solo chip con múltiples funciones principales. Esto significa que uno puede tener bloques de lógica independiente utilizando relojes diferentes que se ejecutan en el misma FPGA. El reloj puede ser internos o externos. Relojes externos pueden ser especificado por el usuario. Cambios en el lenguaje 2743 Extensiones de compatibilidad de ISO-C 2744 2745 Compatibilidad con ISO estándar c ha sido mayor por lo tanto más estándar de tipos y se admiten tipos derivados. Esto incluye punteros y estructuras pero no incluye carrozas Goto continuar y volver son compatibles. Tenga en cuenta que uno no puede utilizar el comando goto continuar o romper para entrar o salir de una declaración de par . Georg Friedrich Händel-C ahora soporta funciones. Pueden utilizarse en lugar de macros. 2746 Funciones pueden ampliarse inmediatamente con la palabra clave en línea. Apoyo al sistema de archivos múltiples prototipos son compatibles como son las palabras clave de ISO-C extern y estática. Uno puede enviar mensajes para el canal de error estándar usando la Directiva de assert. Cambios de macro 2747 2748 Ahora uno puede declarar variables locales dentro de una expresión de macro. Hay una nueva directiva ifselect que permite la compilación condicional de acuerdo con el resultado de una prueba en tiempo de compilación. Declaraciones de 2749 2750 Handel-C el lenguaje se ha ampliado para permitir código replicar mediante una construcción similar a un bucle for. Esto significa que uno puede generar múltiples copias idénticas del mismo bloque de código en secuencia o en paralelo. Arquitectura 2751 2752 Hay un nuevo tipo para representar las señales. Uno puede tener matrices multidimensionales de los RAMs y los RAMs de dos puertos. Las interfaces se han extendido para permitir uno para conectarse a la entrada no definido o puertos de salida. Uno puede también definir al tipo de interfaz y usarlos para vincular a los bloques de código externo actualmente VHDL o EDIF . Las declaraciones de interfaces han cambiado y el estilo anterior está en desuso. Ya no es necesitan asignar 2753 pins uno puede omitir la especificación de datos para dejar la asignación de pin no restringida. En este caso las herramientas de lugar y ruta pueden asignar los pines. Una persona puede tener varios relojes dentro de un sistema y consulte el reloj actual por using.sub. de reloj. Cambios en el compilador 2754 2755 55 FIG. ilustra un sistema 5500 incluyendo un compilador 5501 de conformidad con una encarnación de la invención presente. El nuevo compilador tiene un enlazador 5502 permitiendo que uno tener varios archivos de entrada 5504 y vínculos a los archivos de la biblioteca. Ahora se pueden vincular varios archivos en un módulo de salida único. Estos archivos pueden ser módulos del núcleo precompilados bibliotecas archivos de encabezado o trozos de código VHDL. La palabra clave extern permite hacer referencia a una función o variable en otro archivo. Vinculación entre 2756 se lleva a cabo durante una generación. 2757 Incompatibilidades con la versión 2.1 Símbolo de 2758 Scoping reglas 2759 Las reglas de ámbito para la macro expr y proc macro construcciones han cambiado entre versión 2.1 y 3.0. Versión 2.1 expande las macros en el alcance de su uso. Versión 3.0 expande las macros en el ámbito de su declaración. Esto es consistente con las reglas de ámbito C. Por ejemplo 2760 int x / / Versión 3.0 puede usar esta x 2761 macro expr un = x 2762 void main void 2763 int x / / Versión 2.1 puede usar esta x 2764 y = a 2765 } 2766 Esto puede conducir a errores de identificador no declaradas. Por ejemplo el siguiente código es válido en la versión 2.1 pero no en versión 3.0 2767 macro proc a x { 2768 b 2769 x 2770 } 2771 macro proc b y 2772 Y ++ 2773 } 2774 void main void { 2775 2776 int 4 z a z 2777 2778 } 2779 Macro usando expresiones en anchos 2780 Versión 3.0 requiere disambiguating macro expresiones utilizadas en ancho variable entre corchetes. Por ejemplo 2781 int log2ceil 64 x 2782 puede reescribirse como 2783 int log2ceil 64 x 2784 Nuevas palabras clave de enfrentamientos con los nombres de variables 2785 Versión 3.0 contiene un número de nuevas palabras clave que pueden entrar en conflicto con los nombres de variable en el código de la versión 2.1. 2786 Es la lista de nuevas palabras clave 2787 afirman auto const continuar enum doble extern float goto ifselect en línea permiten mpram registrar seq retorno señal sizeof estática. Struct typedef typeof Unión volátiles wom Bucles combinacionales adicionales 2788 2789 Versión 2.1 utiliza aproximaciones al comprobar de combinatorios bucles en la lógica generado. Versión 3.0 no utiliza tales aproximaciones y puede informar unbreakable bucles combinacionales en programas que compilación con versión 2.1. Reloj 2790 es necesario para simulación 2791 Versión 3.0 requiere que un reloj se especifica cuando se genera la salida de simulación. Un reloj ficticio como ' set reloj = externos "P1" ' es válido. Conceptos básicos de la lengua Introducción 2792 2793 Esta sección de la descripción actual aborda los conceptos básicos de producir programas de Handel-C Estructura del programa 2794 Estructura secuencial de 2795 2796 Como en un programa c convencional un programa de Handel-C consta de una serie de instrucciones que se ejecutan de forma secuencial. Estas declaraciones están contenidas dentro de una función principal de que indica al compilador que se inicia el programa. El cuerpo de la función principal puede dividirse en un número de bloques usando {...} entre paréntesis para romper el programa en trozos legibles y restringir el ámbito de las variables y los identificadores. 2797 Handel-C también tiene funciones variables y expresiones similares a C. convencional Hay restricciones donde las operaciones no son apropiadas para las extensiones y la implementación de hardware donde la implementación de hardware permite una funcionalidad adicional. Estructura paralela 2798 2799 A diferencia de c convencional Handel-C programas también pueden tener declaraciones o funciones que se ejecutan en paralelo. Esta característica es crucial cuando dirigidas a hardware porque el paralelismo es la principal forma de aumentar el rendimiento mediante el uso de hardware. Procesos paralelos pueden comunicarse mediante canales. Un canal es un vínculo de un sentido de punto a punto entre dos procesos. Estructura general de 2800 2801 La estructura general del programa consiste en una o más funciones principales cada uno asociado a un reloj. Uno sólo utilizaría más de una función principal si él o ella necesita partes del programa para ejecutar a diferentes velocidades y por lo tanto utilizar diferentes relojes . Una función principal se define como sigue Declaraciones globales 2802 Definición de reloj 2803 2804 void main void { ° 2805 Declaraciones locales 2806 Código de cuerpo 2807 2808 } 2809 La función principal de no toma ningún argumento y no devuelve ningún valor. Esto está en línea con una implementación de hardware donde hay sin argumentos de línea de comandos y no entorno para devolver valores a. El argc argv y envp de parámetros y el valor de retorno familiar de c convencional pueden reemplazarse con comunicaciones explícitas con un sistema externo por ejemplo un microprocesador de host dentro del cuerpo del programa. 2810 Utilizando el preprocesador 2811 Como con c convencional el código fuente de Handel-C se pasa a través de un preprocesador c antes de compilación. Por lo tanto la habitual # include y # define construcciones pueden utilizarse para realizar la manipulación de texto en el código fuente antes de compilación. 2812 Handel-C también soporta macros que son más poderosas que las gestionadas por el preprocesador. Comentarios 2813 2814 Handel-C utiliza el estándar / *... * / delimitadores de comentarios. Estos comentarios no pueden anidarse. Por ejemplo 2815 / * Válido comentario * / 2816 / * Esto es / * no * / válido * / 2817 Handel-C también proporciona el estilo C++ / / comentario de marcador que indica al compilador que ignorar todo hasta el siguiente salto de línea. Por ejemplo 2818 x = x + 1 / / Esto es un comentario Comentarios 2819 son manejados por el preprocesador. Declaraciones de 2820 . Introducción 2821 2822 Esta sección de la descripción del presente detallan los tipos de declaraciones que se pueden hacer y la forma en que el sistema de tipo de Handel-C difiere de la de C. convencional Valores de Handel-C 2823 y anchos 2824 A diferencia crucial entre Handel-C y c convencional es capacidad de Handel-C para controlar los valores de anchura arbitraria. Desde c convencional está dirigido a microprocesadores de propósito general maneja valores de 8 16 y 32 bits bien pero no pueden manejar fácilmente otros anchos. Al concentrarse en hardware no hay razón para estar vinculado a estos anchos de datos y tan Handel-C se ha ampliado para permitir a tipos de cualquier número de bits. Georg Friedrich Händel-C también se ha ampliado para hacer frente a la extracción de bits de los valores y unir a los valores de forma más amplios de valores. Estas operaciones no requieren ningún hardware y con el software pueden proporcionar mejoras de gran rendimiento. 2825 Al escribir programas en c de Handel debe procurar que los paths de datos son no más amplios que el necesario para minimizar el uso de hardware. Aunque puede ser válido utilizar valores de 32 bits para todos los elementos se produce una gran cantidad de hardware innecesarios si ninguno de estos valores superior de 4 bits. Puede también tener cuidado que los valores no desbordamiento de su anchura. Esto es más de un problema de Handel-C que con c convencional porque las variables deben ser suficientemente amplia como para contener el valor más grande necesario y no más amplio . Constantes de 2826 2827 Constantes pueden utilizarse en expresiones. Constantes decimales se escriben simplemente como el número mientras que pueden tener el prefijo constantes hexadecimales 0 x o 0 X octales constantes pueden ser precedidos por un cero y pueden ser el prefijo binarios constantes 0b o 0B. Por ejemplo 2828 w = 1234 / * Decimal * / x 2829 = 0x1234 / * Hexadecimal * / 2830 y = 01234 / * Octal * / z 2831 = 0b00100110 / * Binario * / 2832 El ancho de una constante podrá figurar explícitamente por 'casting'. Por ejemplo 2833 x = unsigned int 3 1 Casting 2834 puede ser necesario si el compilador es capaz de inferir el ancho de la constante de su uso. Tipos de 2835 2836 Handel-C utiliza dos tipos de objetos tipos de lógica y de arquitectura. Los tipos de lógica especifican variables. Los tipos de arquitectura especifican variables que requieren un tipo particular de la arquitectura de hardware por ejemplo ROMs RAMs y canales . Ambos tipos se especifican por su alcance estático o extern su tamaño y su tipo. También se especifican los tipos de arquitectura por el tipo de lógica que las utiliza. 2837 Ambos tipos se pueden utilizar en tipos derivados tales como estructuras arreglos de discos o funciones pero puede haber algunas restricciones sobre el uso de tipos arquitectónicos. Especificadores de 2838 2839 Los especificadores de tipo firmado sin firmar y sin definir definen si la variable está firmada y si tiene un ancho predeterminado definido. Uno puede utilizar el extern de especificadores de clase de almacenamiento y estática para definir el alcance de cualquier variable. Funciones 2840 pueden tener la clase de almacenamiento de información en línea para mostrar que ellos se expanden en línea en lugar de ser compartidos. Calificadores de tipo 2841 2842 Handel-C soporta los calificadores de tipo const y volátiles para aumentar la compatibilidad con ISO-C. Pueden utilizarse para calificar los tipos de lógica. Desambiguador 2843 2844 Handel-C admite lt gt de la extensión. Esto puede usarse para aclarar el complejas declaraciones de tipos arquitectónicos. Tipos de lógica 2845 2846 El tipo de lógica básica es un int. Puede ser calificado como firmado o sin signo. Números enteros pueden ser asignados de forma manual un ancho por el programador o el compilador puede intentar deducir un ancho de uso. Tipos de enumeración enum permite que se definan un conjunto especificado de valores que una variable de este tipo puede contener. Hay tipos derivados tipos que se derivan de los tipos básicos . Estos son los arreglos de discos punteros campos de bits de las estructuras y funciones. El tipo no se permite void uno para declarar el parámetro vacío listas o funciones que no devuelven que un valor el operador typeof de tipo permite el tipo de una variable de referencia. Int 2847 2848 Hay sólo un tipo fundamental para variables int. De forma predeterminada se firman enteros. El tipo int puede ser calificado con la palabra clave sin firmar para indicar que la variable contiene sólo números enteros positivos o 0. Por ejemplo 2849 int 5 x 2850 unsigned int 13 y 2851 Estas dos líneas declaran dos variables un entero con signo 5 bits x e y de un entero no negativo de 13 bits. En el segundo ejemplo la palabra clave int es opcional. Así las declaraciones de dos siguientes son equivalentes. 2852 unsigned int 6 x 2853 unsigned x 6 2854 Uno puede utilizar la palabra clave firmada para dejar claro que se utiliza el tipo predeterminado. Las declaraciones siguientes son equivalentes. 2855 int 5 x 2856 firmado int 5 x 2857 firmado x 5 2858 El rango de un entero de 8 bits con signo es -128 a 127 mientras que el rango de un entero sin signo de 8 bits es de 0 a 255. Esto es porque firmó en representación de complemento de uso de números enteros de 2. Uno puede declarar un número de variables del mismo tipo y ancho simultáneamente. Por ejemplo 2859 int 17 x y z 2860 Esto declara tres enteros de amplio firmados de 17 bits x y y z. 2861 Tipos admitidos por portar 2862 Handel-C proporciona soporte para porte de c convencional permitiendo que los tipos char corto y largo. Por ejemplo 2863 unsigned char w y corto de 2864 z largo sin signo 2865 2866 Los anchos asumidos para cada uno de estos tipos es el siguiente 5 Ancho de tipo char 8 bits corto firmado de 16 bits durante mucho tiempo de 32 bits 2867 Hardware más pequeños y más eficiente puede ser producida utilizando sólo las variables del ancho de la más pequeña posible. 2868 Más sobre anchos 2869 Handel-C el compilador puede inferir a veces el ancho de las variables de su uso. Por lo tanto no es siempre necesario para explícitamente definir el ancho de todas las variables y la palabra clave no definida puede utilizarse para indicar al compilador para intentar deducir el ancho de una variable. Por ejemplo 2870 int 6 x 2871 int indefinido y 2872 En este ejemplo la variable x ha sido declarada 6 bits de longitud y la variable y ha sido declarada con ningún ancho explícito. El compilador puede inferir que y puede ser de 6 bits de longitud de la operación de asignación más tarde en el programa y establece el ancho de y a este valor. Si el compilador no puede deducir todos los anchos no definidos puede generar errores detallando qué anchos no puede inferirse. La palabra clave no definida es opcional por lo que las dos definiciones siguientes son equivalentes 2873 int x Sin definir 2874 int x 2875 Handel-C proporciona una extensión para permitir uno anular este comportamiento para aliviar el porte de C. convencional Esto permite establecer un ancho para todas las variables que no se han asignado un ancho específico o declarado como no definido. Esto se hace de la siguiente manera 2876 set intwidth = 16 2877 int x 2878 unsigned int y . 2879 Esto declara un entero de 16 bits amplia con signo x e y de un ancho entero de 16 bits. Puede utilizarse cualquier ancho en la instrucción set intwidth incluyendo undefined. Todavía uno puede declarar variables que pueden tener su ancho inferida mediante el uso de la palabra clave no definida. Por ejemplo 2880 set intwidth = 27 2881 sin signo x sin firmar y no definido de 2882 2883 Este ejemplo declara una variable x con un ancho de 27 bits y una variable y que tiene su ancho inferida por el compilador. Este ejemplo también muestra que se puede omitir la palabra clave int al declarar enteros sin signo. Uno también puede establecer el ancho predeterminado para ser indefinido 2884 set intwidth = undefined Sintaxis 2885 int 2886 signed.vertline.unsigned undefined.vertline.n nombre Arreglos de discos ° 2887 2888 Uno puede declarar matrices de variables de la misma manera que los arreglos de discos se declaran en C. convencional Por ejemplo 2889 int 6 x 7 2890 Esto declara 7 registros cada una de ellas es de 6 bits de longitud. Acceso a las variables es exactamente como en C. convencional Por ejemplo para acceder a la variable quinta en la matriz 2891 x 4 = 1 2892 Nota que como en c convencional la primera variable tiene un índice de 0 y el último tiene un índice de n-1 donde n es el número total de variables en el arreglo de discos. Uno también puede declarar matrices multidimensionales de variables. Por ejemplo 2893 unsigned int 6 x 4 5 6 2894 Esto declara 4 * 5 * 6 = 120 variables cada una de ellas es de 6 bits de longitud. Acceso a las variables es como se esperaba desde C. convencional Por ejemplo 2895 y = x 2 3 1 Ejemplo de 2896 2897 Este bucle inicializa todos los elementos de la matriz de ax en el valor de índice. 2898 unsigned int 6 ax 7 índice sin signo de 2899 índice 2900 = 0 2901 hacer { 2902 ax 2903 índice = 0 @ índice índice 2904 ++ 2905 } tiempo 2906 índice lt = 6 2907 Tenga en cuenta que el ancho del índice tiene que ser ajustado en la asignación. Esto es porque su ancho puede inferirse que 3 de la dimensión de la matriz la matriz tiene 7 elementos por lo que "índice" sólo puede necesitar contar como 6 . Enum 2908 enum 2909 especifica valores de una lista de constante entero por ejemplo enum entre semana {MON TUES WED el jueves FRI} El primer nombre en este caso MON tiene un valor de 0 el próximo 1 y así sucesivamente a menos que se especifican valores explícitos. Si no se especifican todos los valores valores de incremento desde el último valor especificado. Para especificar enum valores enum entre semana {MON = 9 TUES WED el jueves FRI} En la versión beta uno no puede declarar una variable de tipo enum por ejemplo durante la semana enum x no está permitido . Uno puede asignar valores enum a una variable por ejemplo int x = MON 2910 struct 2911 struct define una estructura de datos un grupos de variables bajo un solo nombre. El formato de la estructura puede identificarse mediante un nombre de tipo. Los variables de los miembros de la estructura pueden ser de los mismos o diferentes tipos. Una vez que ha sido declarada una estructura su nombre de tipo puede utilizarse para definir otras estructuras del mismo tipo. Pueden tener acceso a miembros de la estructura individualmente mediante el nombre de struct_Name.member de construcción Sintaxis 2912 Tipo de estructura A 2913 se declara utilizando el formato struct 2914 type_Name { 2915 lista de miembros 2916 2917 } instance_Names 2918 miembros-lista es una lista de definiciones de variables de terminado por punto y coma el uso de instance_Names declara variables de ese tipo de estructura. Como alternativa uno puede declarar variables como sigue según 2919 struct type_Name instance_Name Almacenamiento de 2920 2921 Estructuras pueden transmitirse a través de canales y señales. Las estructuras pueden almacenarse en la memoria interna de elementos. Las estructuras no pueden almacenarse en offchip rams. Si una estructura contiene un elemento de memoria un canal o una señal no se puede almacenar en otro elemento de la memoria no se puede pasar a una función "por valor" se asignan a y no se pueden pasar a través de un canal o una señal. Si una estructura contiene un elemento de memoria con más de un miembro no puede ser asignado o asignado a otra estructura como la asignación no se puede realizar en un ciclo de reloj único. Estructuras toda no se pueden enviar directamente a las interfaces. Ejemplo de 2922 2923 struct humanos / / declarar el tipo de estructura humana { 2924 2925 unsigned int edad 8 / / Declare tipos de miembros 2926 int 1 sexo fue char nombre 25 2928 } / / Define el tipo humano 2929 struct humana hermana sister.age=25 2930 Campo de bits 2931 2932 Un campo de bits es un tipo de miembro de estructura que consiste en un número de bits especificado. La longitud de cada campo se separa del nombre del campo por dos puntos . Cada elemento puede tener acceso de forma independiente. Desde Handel-C permite especificar el ancho de enteros en bits un campo de bits es simplemente otra forma de especificar una estructura estándar. En ISO-C campos de bits se componen de palabras y sólo los bits especificados se accede a ellos el resto son rellenados. Relleno en ISO-C es dependiente de la aplicación. Nada puede suponerse acerca de relleno en Handel-C. Sintaxis 2933 2934 struct { 2935 partidas 2936 field_Type nombre_campo field_width 2937 ... 2938 } Ejemplo de 2939 2940 Este ejemplo define una matriz de indicadores denominado banderas como una estructura y un campo de bits estructura de struct 2941 { 2942 2943 unsigned int 1 llevó señal de unsigned int 1 2944 2945 unsigned int 1 conmutador salidas de 2946 } campo de bits 2947 struct { fue 2949 unsigned int LED 1 2950 unsigned int señal 1 conmutador de unsigned int 2951 1 señales de 2952 } 2953 Unión unida { 2954 chis de unsigned char 2955 2 2956 shis cortos sin signo 2957 } 2958 Unión unida a la unidad 2959 sin firmar un par 2960 2961 } unity.chis 0 =2 2962 unity.chis 1 =50 2963 2964 } ° 2965 unity.shis=33 . 2966 Punteros y direcciones 2967 Punteros en c de Handel son similares a los de la convencional C. Proporcionan la dirección de una variable o un fragmento de código. Esto permite acceder a las variables por referencia en lugar de hacerlo por valor. El operador de direccionamiento indirecto * es la misma que es en ISO-C. Se utiliza para declarar los punteros a objetos y a de-reference punteros es decir acceso a los objetos apuntados por punteros . 2968 El operador "dirección de" funciona que en ISO-C aunque técnicamente Handel-C variables no se almacenan generalmente en ubicaciones de memoria que deben abordarse . Punteros 2969 2970 Una declaración de puntero está conformado por el operador de direccionamiento indirecto * el nombre del puntero y el tipo de la variable que apunta a. tipo * nombre se utilizan para que apunte a variables junto con el operador unario que da la dirección de un objeto. Para establecer un puntero a una variable se puede asignar la dirección de la variable al puntero. Por ejemplo 2971 int 8 * ptr //declare un puntero a int 8 objeto 2972 int 8 x objeto 2973 = 6 2974 x = 10 ptr 2975 = //assigns de objetos de la dirección de 2976 / / objeto a puntero 2977 x = * puntero / / x es ahora 6 2978 * puntero = 12 //Object es ahora 12 2979 En Handel-C un mayo emitido sólo null punteros void * pointerName a un tipo diferente. Sólo se pueden emitir todos los punteros a otros para cambiar el signo de un objeto apuntado y si es const o volátiles. Estas restricciones son las restricciones de fundición estándar en Handel-C. Uno puede cambiar tipo de puntero nulo por la fundición la asignación o la comparación. Las operaciones de puntero válido 2980 incluyen 2981 Asignar un puntero a un puntero otro del mismo tipo 2982 Añadir o restar un puntero y un entero 2983 Restar o comparar un puntero a un miembro de la matriz con otro puntero a un miembro de la misma matriz 2984 Asignar o comparar un puntero a NULL. 2985 Punteros a funciones 2986 Si uno apunta al código una función el operador de la dirección no es necesario. La sintaxis es el tipo de valor devuelto * puntero.Nombre lista de parámetros los paréntesis al final de la declaración de declaran el puntero para ser el puntero a una función. El operador de direccionamiento indirecto antes de la pointerName declara que es una declaración de puntero. Existe el tipo estándar de c ambigüedad entre la declaración de una función que devuelve un puntero y un puntero a una función. Para asegurarse de que el operador direccionamiento indirecto está asociado con el nombre de puntero en lugar de utilizar el tipo de valor devuelto uno necesita utilizar paréntesis int 8 * functionName de //function regreso de puntero y int 8 * pointerName //pointer a la función operador de 2987 / operador 2988 El operador de direccionamiento indirecto * es la misma que es en ISO C. Se utiliza para declarar los punteros a objetos y a de-reference punteros es decir acceso a los objetos apuntado por punteros . El operador de dirección funciona que en ISO-C aunque técnicamente Handel-C variables no se almacenan generalmente en ubicaciones de memoria que deben abordarse . 2989 unsigned char cha chb * chp chp 2990 = cha cha 2991 = 90 chb 2992 = * chp chp 2993 = chb 2994 La primera línea declara dos variables sin signo cha y chb y un puntero a un sin signo chp . La segunda línea asigna la dirección de cha a chp de puntero. En otras palabras puntero chp apunta ahora a cha variable. La tercera línea simplemente asigna un valor a cha. La cuarta línea referencias chp de puntero que para tener acceso a lo que señala que es de cha. En otras palabras chb se asigna el valor del objeto apuntado por chp. La última línea asigna la dirección de chb al puntero chp. En otras palabras puntero chp apunta ahora a chb variable. También se puede utilizar la siguiente punteros a arreglos de discos punteros a canales punteros a las señales punteros a elementos de la memoria punteros a estructuras y uniones punteros a punteros arreglos de discos de punteros. Por ejemplo . 2995 struct s { 2996 2997 int 6 a b 2998 } s1 s2 * sp ** spp 2999 sp = s1 spp 3000 = sp 2 3001 ** spp 3002 Esto declara dos variables de tipo struct S s1 y s2 un puntero a una variable de este tipo sp y un puntero a un puntero a una variable de este tipo spp . La línea siguiente asigna la dirección de la estructura s1 a puntero sp sp del puntero para que apunte a la estructura s1 . La siguiente línea asigna la dirección del puntero sp a puntero spp puntero spp para apuntar al puntero sp . La última línea referencias spp de puntero dos veces y le asigna el valor dereferenciado que es s1 s2 de estructurar es decir s2 equivale ahora a s1 . 3003 De punteros de estructura 3004 El operador de puntero de estructura - gt puede utilizarse como en la ISO-C. Se usa para tener acceso a los miembros de una estructura o Unión cuando se hace referencia a la estructura/Unión a través de un puntero. 3005 struct s { 3006 3007 int 18 a b 3008 } s * sp 3009 sp = s 3010 s.a 26 3011 sp - gt b = sp - gt un 3012 La última línea tiene acceso a las variables miembro de estructura s a través del puntero sp. Debido a que el puntero se utiliza para tener acceso a la estructura el - gt operador se utiliza para hacer referencia a las variables miembro. 3013 sp - gt un .ident. * sp .q 3014 Uno puede convertir punteros de estructura entre estructuras con los mismos tipos de miembros. Por ejemplo 3015 struct S1 { 3016 3017 int 6 x 3018 } 3019 struct S2 { 3020 3021 int 6 y 3022 } 3023 struct S1 * strctptr = 1 s 3024 S2. y = struct S2 * strctPtr - gt y. Tipos de arquitectura 3025 3026 Los tipos de arquitectura son canales utilizados para la comunicación entre procesos paralelos interfaces utilizadas para conectar a los pines o emitir señales para comunicarse con código externo memorias rom ram wom y mpram y señal declara un cable . Se ha proporcionado la lt gt desambiguador para ayudar a clarificar las definiciones de recuerdos canales y señales. Canales 3027 Georg Friedrich Händel-C 3028 proporciona canales para la comunicación entre ramas paralelas de código. Una rama que se escribe en un canal y una segunda rama Lee de ella. La comunicación sólo se produce cuando ambas tareas están listas para la transferencia de momento en el que un elemento de datos se transfiere entre las dos ramas. Canales se declaran con la palabra clave de chan. Por ejemplo chan 3029 int 7 enlace 3030 Como con variables el compilador de c de Handel puede inferir el ancho de un canal de su uso si se declara con la palabra clave no definida. Canales también pueden declararse con ningún tipo explícito. El compilador infiere el tipo y el ancho del canal de su uso. Por ejemplo intwidth set 3031 = undefined 3032 chan int Link1 chan 3033 unsigned Link2 indefinido chan 3034 él Sintaxis 3035 chan 3036 logicType nombre Arreglos de discos 3037 de canales Georg Friedrich Händel-C 3038 permite matrices de canales para declararse. Por ejemplo chan 3039 unsigned int 5 x 6 3040 Es equivalente a declarar de 6 canales cada uno de los cuales es 5 bits de longitud. Un canal puede tener acceso mediante la especificación de su índice. Como con los arreglos de discos de variable el índice del elemento enésimo es n-1. Por ejemplo 3041 x 4 3 / / Salida de canal en 3 x 4 ¿ 3042 x 3 y / / Entrada a y desde el canal x 3 3043 También es posible declarar matrices multidimensionales de canales. Por ejemplo . chan 3044 unsigned int 6 x 4 5 6 3045 Esto declara 4 * 5 * 6 = 120 canales de cada uno de los cuales es de 6 bits de longitud. Acceso a los canales es similar al acceso a los arreglos de discos en C. convencional Por ejemplo 3046 x 2 3 1 4 / / Salida de canal en 4. Interfaces 3047 3048 Se puede usar una interfaz para comunicarse con un dispositivo externo o un componente. Una interfaz consta de los puertos de datos junto con información acerca de cada puerto. Una definición de puerto consiste en el tipo de datos que utiliza definido o inferida a partir de su primer uso un nombre opcional y la especificación para ese puerto por ejemplo entrada de pines para un autobús si es necesario. Hardware de destino 3049 3050 Las distintas variedades de interfaces son conocidas como tipo. Georg Friedrich Händel-C proporciona a tipos predefinidos bus_in bus_latch_in bus_clock_in bus_out bus_ts latch_in de _ts de bus bus_ts_clock_in port_in y port_out. El tipo de bus de Handel-C bus_ * genera el hardware para autobuses conectado a los pines. El puerto y el tipo de port_out genera el hardware para flotante de puertos autobuses que no están conectados a los pines . Estos pueden ser de cualquier ancho y pueden llevar a cabo las señales entre diferentes secciones del código de Handel-C o a software o hardware más allá del programa de Handel-C. También se puede definir la interfaz para conectarse a los objetos no-Handel-C PC nativo de código de objeto utilizado en la simulación. Programas que se ejecutan en el PC para simulación y conectan a una interfaz de Handel-C se conocen como plugins. Hay especificaciones de puerto especial para habilitar uno conectar interfaces definidas por el usuario con un plugin para la simulación. Estos son extlib extfunc extpath y extinst. Descripciones de hardware escritas en otro idioma. Actualmente se admiten sólo VHDL y EDIF. Para una interfaz de código VHDL el tipo de interfaz sería el nombre de la entidad VHDL. 3051 El estilo de la declaración de interfaz utilizada en la versión 2 de Handel-C es obsoleto pero sigue siendo para compatibilidad con versiones anteriores. El estilo recomendado es declarar un tipo de interfaz y a continuación definir instancias de ese tipo. La declaración de interfaz da los nombres de puerto y tipos pero no más detalles acerca de ellos. La definición de interfaz da el puerto. Especificaciones si es necesario y asigna los datos de transmitirse a los puertos de salida. Declaración de interfaz 3052 interfaz 3053 Sort {data_TO_hc} 3054 {send_FROM_hc} Tipo 3055 puede ser un nombre definido por el usuario o uno de los predefinidos ordena bus_in latch_in de bus bus_clock_in bus_out bus_ts bus_ts_latch_in bus_ts_clock_in port_in y port_out . data_TO_hc es opcional. Consta de uno o más prototipos de puertos de poner los datos a la Handel-C código desde el mundo exterior. Un prototipo del puerto consiste en el tipo de puerto y la send_FROM_hc de nombre de puerto es opcional. Consiste en una o más definiciones de puertos portar datos desde el código de Handel-C para el mundo exterior puerto de la definición como anteriormente . Puede declarar al menos un puerto ya sea a Georg Friedrich Händel-C o de Handel-C . Definición de la interfaz de 3056 3057 interfaz tipo {hc_ port_TO con {portSpec} } Nombre 3058 {port_FROM_hc = outputDataItem 3059 con {portSpec} } 3060 con {generalSpecs} Tipo 3061 es un tipo de interfaz pre-declared como arriba . port_TO_hc 3062 consiste en las definiciones de los puertos de poner los datos a Georg Friedrich Händel-C que fueron prototipo en la declaración de interfaz. Estos puertos pueden tener el tipo dado en el prototipo pero también pueden tener las especificaciones de puerto. El uso más probable de una especificación de puerto es si uno fueron de interfaz con un archivo DLL externo biblioteca vinculado dinámico y es necesario especificar la función externa que este puerto requerido extfunc . Nombre es un identificador definido por el usuario para esa instancia de la interfaz de port_FROM_hc consiste en definiciones de puertos de envío de datos desde el código de Handel-C que fueron prototipo en la declaración de tipo. Estos puertos pueden tener el tipo dado en el prototipo pero también pueden tener las especificaciones de puerto. Debe asignarse a cada puerto de port_FROM_hc un outputDataItem de expresión. El valor de outputDataItem puede enviarse a dicho puerto. 3063 con {generalspecs} es opcional. Consiste en una o más especificaciones de puerto que se aplican a todos los puertos en la interfaz. Uno podría desear especificar el simulador externo que maneja este tipo de puerto genera la entrada y salida de recibe usando la Directiva de extlib. 3064 56 FIG. ilustra las varias especificaciones de 5600 para las interfaces de la invención presente. 3065 Nota que preceden a los puertos para el código de la interfaz de nombre y puertos de él seguirla. Ejemplo de 3066 3067 Los ejemplos adicionales de las interfaces de autobús se dan más adelante. El presente ejemplo muestra una declaración de interfaz que se utiliza para conectar a una pieza de código extranjero y la definición que utiliza esta declaración. 3068 / / Declaración de interfaz ttl7446 de interfaz 3069 sin signo de 7 segmentos unsigned 1 rbon 3070 sin signo 1 ltn 1 rbin sin signo sin signo de 4 dígitos 3071 sin signo 1 bin 3072 / / Definición de interfaz ttl7446 de interfaz 3073 sin signo de 7 segmentos unsigned 1 rbon 3074 descodificar unsigned 1 ltn = ltnVal sin signo 1 rbin = rbinVal 3075 sin signo de 4 dígitos = digitVal 1 bin sin signo = binVal 3076 con {extlib="PluginModelSim.dll" 3077 extinst = "descodificar modelo = ttl7446_wrapper demora = 1 "} . 3078 RAMs internos y ROMs 3079 RAMs y ROMs pueden ser construidas desde la lógica en el FPGA mediante las palabras clave de ram y rom. Por ejemplo 3080 ram int 6 43 3081 int rom 16 b 4 = {23 46 69 92} 3082 Este ejemplo construye un RAM formado por 43 entradas cada uno de los cuales es de 6 bits de longitud y una ROM que consta de 4 entradas en cada una de ellas es de 16 bits de longitud. 3083 Para inicializar una ROM global o estática uno puede utilizar el formato 3084 int rom 16 b 4 = {23 46 69 92} 3085 La ROM se inicializa con las constantes habida cuenta de la lista siguiente de la misma manera como una matriz sería inicializarse en C. En este ejemplo las entradas ROM se dan los valores siguientes 6 Valor de entrada ROM de b 23 0 b l 46 b 2 69 b 92 3 Compilador de c de Handel the 3086 también puede inferir los anchos tipos y el número de entradas en los RAMs y ROMs de su uso. Por lo tanto no siempre es necesario declarar explícitamente estos atributos. Por ejemplo 3087 ram int undefined 123 ram 3088 int 6 b c ram 3089 43 3090 ram d 3091 RAMs y ROMs son accesibles en gran parte del mismo modo que los arreglos de discos. Por ejemplo ram 3092 int 6 b 561 b 3093 7 = 4 3094 Esto establece la octava entrada de la RAM en el valor 4 Nota que como en c convencional la primera entrada en la memoria tiene un índice de 0 y el último tiene un índice de n-1 donde n es el número total de entradas en la memoria. 3095 Nota que los RAMs difieren de arreglos de discos en los una matriz equivale a declarar un número de variables. Cada entrada en una matriz puede utilizarse exactamente como una variable individual con mayor número de lecturas y escrituras en un reloj de ciclo según sea necesario. Sin embargo los rAMs son normalmente más eficientes para implementar en términos de recursos de hardware que arreglos de discos. Por lo tanto se debe usar una matriz cuando él o ella desea tener acceso a los elementos más de una vez en paralelo y él o ella debe utilizar un RAM cuando él o ella necesita eficiencia. Acceso a los RAMs internos sólo puede hacerse en la forma descrita en dispositivos Altera o Xilinx con sincrónicos los RAMs en el chip. Esto incluye Altera Flex 10 K y APEX Xilinx 4000E 4000EX 4000L 4000XL 400OXV Spartan II espartana y dispositivos de la serie de Virtex 10 K. Otros recuerdos pueden requerir especificaciones de temporización. 3096 RAMs y ROMs sólo pueden tener una entrada visitada en cualquier ciclo de reloj. Esta restricción se explica con más detalle más adelante. Matrices multidimensionales 3097 3098 Es posible crear matrices multidimensionales simples de memoria utilizando la memoria ram rom y wom de palabras clave. Las definiciones pueden hacerse más claras utilizando la lt gt desambiguador opcional. Sintaxis 3099 entry_width de logicType de ram.vertline.rom.vertline.worn 3100 nombre { const_expression } 3101 = {cadenas de inicialización} Tipos de lógica posible 3102 son enteros estructuras punteros y matrices. La última expresión constante es el índice de la RAM. Los otros índices dan el número de copias de ese tipo de RAM. Ejemplo de 3103 3104 ram lt int 6 gt 15 43 b de rom lt int 16 gt 3105 2 2 4 = 3106 {{{1 2} 3107 {3 4} 3108 } 3109 {{5 6} 3110 {7 8} 3111 } 3112 {{9 10} 3113 {11 12} 3114 } 3115 {{13 14} 3116 {15 16} 3117 } 3118 } 3119 Este ejemplo construye 15 RAMs cada uno formado por 43 entradas de 6 bits de ancho y 4 * 2 ROMs cada uno formado por 2 entradas de 16 bits de longitud. La ROM se inicializa con las constantes de la lista siguiente de la misma manera como una matriz multidimensional podría ser inicializada en C. El último índice la de la entrada de RAM cambia más rápido. 57 Fig. ilustra una tabla 5700 que muestra las entradas ROM de conformidad con una encarnación de la invención presente. 3120 Debido a su arquitectura RAMs y ROMs están restringidas a realizar operaciones de forma secuencial. Sólo uno de los elementos de una memoria RAM o ROM puede abordarse en cualquier ciclo de reloj dado y de resultas de ello las declaraciones de aspecto familiares son a menudo no permitidas. Por ejemplo 3121 ram lt unsigned int s gt x 4 3122 x 1 = x + 1 3 3123 Este código es ilegal porque la asignación intenta leer desde el tercer elemento de x en el mismo ciclo como escribe en el primer elemento. En una matriz multidimensional uno puede acceder a elementos individuales de los arreglos de discos siempre y cuando él o ella no accede a la misma RAM el índice de la matriz penúltimo . Por ejemplo 3124 x 2 1 = x 3 1 es válido 3125 x 2 1 = x 2 0 no es válido 3126 Nota que arreglos de discos de variables no tienen estas restricciones pero pueden requerir hardware sustancialmente más a implementar que RAMs dependiendo de la arquitectura de destino. 3127 mpram multiples RAMs 3128 Uno puede crear múltiples puertos RAMs MPRAMs mediante la construcción de algo como una Unión de ISO-C. Uno puede usar la palabra clave de mpram. mprams puede utilizarse para conectar dos bloques de código independiente. El reloj del puerto de mpram se toma de la función en la que se utiliza. La declaración normal de un MPRAM sería crear un RAM de dos puertos declarando dos puertos de igual anchura para Altera un puerto podría ser de sólo lectura y uno de sólo escritura para un puerto de 4000 Xilinx sería de lectura/escritura y uno de sólo lectura y Virtex ambos puertos sería de lectura/escritura. Sintaxis 3129 3130 mpram MPRAM_name { 3131 3132 ram_Type variable_Type RAM_Name ancho 3133 ram_Type variable_Type RAM_Name ancho Ejemplo de 3134 3135 Utilizando un mpram para la comunicación entre los dos bloques de lógica independiente Aplicación archivo 1 º 3137 mpram Fred { 3138 ram 3139 lt sin signo de 8 gt ReadWrite 256 / / Puerto de lectura y escritura 3140 rom lt sin signo de 8 gt lectura 256 / / Lee único puerto 3141 } 3142 mpram Fred Joan / * Declara Joan como un mpram como Fred * / reloj set 3143 = "f8m" interno 3144 void main void { 3145 3146 datos sin signo de 8 Joan.ReadWrite 7 =data 3147 3148 } 3149 Archivo 2 3150 mpram Fred ram 3151 lt sin signo de 8 gt ReadWrite 256 / / Puerto de lectura y escritura 3152 rom lt sin signo de 8 gt lectura 256 / / Lee único puerto 3153 } 3154 extern mpram Fred Joan reloj set 3155 = externos "P2" 3156 void main void { 3157 3158 datos sin signo de 8 data=Joan.Read 7 3159 3160 Asignación de diferentes puertos de ancho 3161 Si los puertos de la mpram son de diferentes anchos pueden asignarse a cada uno de los otros conforme a las especificaciones del chip es mediante una persona. Si los puertos que utiliza son de diferentes anchos los anchos deben tener valores de 2 puertos n. diferente anchura no están disponibles con Altera dispositivos. Asignación de bits de Xilinx 3162 3163 Para encontrar los bits que un elemento de la matriz se ocupa en un Xilinx Virtex o 4000 serie RAM uno puede usa la fórmula RAM matriz ram y nombre un pueden tener un poco de inicio de y+1 * un -1 y el fin de bits de y * una. Asignación de Xilinx es little-endian. Esto significa que los puntos de dirección a la LSB. Los bits entre las declaraciones de RAM se asignan directamente a través por lo que el bit 27 en una declaración puede tener el mismo valor que el bit de 27 en otra declaración a pesar de que los bits pueden ser en elementos de la matriz diferentes en las distintas declaraciones. 3164 mpram Joan { 3165 ram 3166 lt 4 sin signo gt Readwrite 256 / / Puerto de lectura y escritura 3167 rom lt sin signo de 8 gt lectura 256 / / Lee único puerto 3168 } Joan.ReadWrite 100 3169 puede ser de 400 a 403. Joan.Read 100 3170 puede ser de 800 a 807. Joan-lectura 3171 50 puede ser de 400 a 407. Joan.ReadWrite 100 3172 es equivalente a Joan.Read 50 0 3 Inicialización de 3173 de Mprams 3174 Se puede inicializar el primer miembro de la mpram. 3175 mpram Fred { 3176 ram 3177 lt sin signo de 8 gt ReadWrite 256 / / Puerto de lectura y escritura 3178 rom lt sin signo de 8 gt lectura 256 / / Lee único puerto Mary 3179 } = {10 11 12 13} 3180 Esto tendría el efecto 3181 Fred.ReadWrite 0 =10 Fred.ReadWrite 1 =1 1 3182 Fred.ReadWrite 2 =12 Fred.ReadWrite 3 =13 No se pueden inicializar 3183 los otros elementos de Fred.ReadWrite. En este caso ya que Fred.Read es del mismo tamaño que la Fred.ReadWrite 0-3 de Fred.Read podría ser inicializado con los mismos valores de elementos. wom 3184 memoria de sólo escritura 3185 Uno puede declarar una memoria de sólo escritura usando el gusano de la palabra clave. El único uso de una memoria de sólo escritura sería declarar un elemento dentro de un memoria RAM multiples. Desde woms sólo existen dentro de los rams multipuerto es ilegal para declarar uno fuera de una declaración de mpram. Sintaxis 3186 variable_Size de variable_Type de wom 3187 WOM_Name ancho = initialise_Values con {especificaciones} Ejemplo de 3188 3189 mpram conectar { 3190 wom 3191 lt sin signo de 8 gt Writeonly 256 / / Escritura único puerto fue rom lt sin signo de 8 gt lectura 256 / / Lee único puerto ° 3193 } Señal 3194 3195 57A FIG. ilustra un método 5740 para utilizar un objeto dinámico es decir señal en un lenguaje de programación. En general en la operación 5742 se define un objeto es decir señal con un valor asociado de primer y segundo valor. El primer valor se utiliza en asociación con el objeto durante un ciclo de reloj predeterminado. Véase operación 5744. El segundo valor se utiliza en asociación con el objeto antes o después del ciclo de reloj predeterminado como se indica en la operación 5746. 3196 En un aspecto de la invención presente el objeto puede utilizarse para dividir una expresión en subexpresiones. Como alternativa se pueden reutilizar las subexpresiones. En otro aspecto el primer valor puede ser asignado a y lee desde el objeto durante el ciclo de reloj predeterminado. Más información sobre el concepto anterior ahora ser establecido en mayor detalle. 3197 A señal es un objeto que tenga el valor asignado a la misma pero sólo para ese ciclo de reloj. El valor asignado puede leerse atrás durante el mismo ciclo de reloj. En los demás veces tarda en su valor de inicialización. El valor de inicialización por defecto es 0. El lt gt desambiguador opcional puede utilizarse para aclarar las definiciones de señal compleja. Sintaxis 3198 signal_Name de señal 3199 lt tipo-ancho de datos gt Ejemplo de 3200 3201 int 15 a b señal 3202 lt int gt sig 3203 un = 7 par 3204 { 3205 sig 3206 = un b 3207 = sig 3208 } 3209 sig es asignado a y leer en el mismo ciclo de reloj por lo que b se le asigna el valor de una. Dado que la señal sólo contiene el valor asignado a un ciclo de reloj único si se lee desde justo antes o justo después de que se asigna a uno obtiene su valor inicial. Por ejemplo 3210 int 15 a b 3211 static de señal lt Ant gt sig = 690 3212 un = 7 par 3213 { 3214 sig 3215 = un b 3216 = sig 3217 } 3218 un = sig 3219 Aquí b se le asigna el valor de una a través de la señal como antes. Ya hay una señal de reloj antes de la última línea un finalmente se asigna la señal valor de 690 inicial. 3220 Señales utilizando expresiones complejas de Split Up 3221 Uno puede dividir por expresiones complejas. Por ejemplo b = a * 2 -55 lt lt 2 + 100 También se puede escribir 3222 int 17 a b 3223 señal s1 s2 s3 s4 par 3224 { 3225 3226 s1 = un 3227 s2 = s1 * 2 3228 s3 = s2-55 s4 3229 = s3 lt lt 2 b 3230 = s4 = 100 3231 } 3232 Rompiendo las expresiones también permite reutilizar subexpresiones 3233 15 sin firmar a b sig1 de señal 3234 par 3235 { 3236 sig1 3237 = x + 2 3238 un = sig1 * 3 b 3239 = sig1/2 Calificadores de tipo 3240 Georg Friedrich Händel-C 3241 soporta los calificadores de tipo const y volátil para aumentar la compatibilidad con ISO-C. Pueden utilizarse para calificar los tipos de lógica. Const 3242 const 3243 define una variable o una matriz de variables que no se puede asignar a. Esto significa que mantienen el valor de inicialización en todo. Puede inicializar la en la instrucción de declaración. La palabra clave const puede utilizarse en lugar de # definir para declarar valores constantes. También puede utilizarse para definir los parámetros de la función que nunca se modifican. El compilador puede realizar la comprobación de tipos en las variables const y evitar que el programador de modificarlo. Ejemplo de 3244 3245 int const i = 5 3246 i = 10 / / Error 3247 i ++ / / Error 3248 volátil 3249 En ISO-C volátil se utiliza para declarar una variable que puede ser modificada por algo más que el programa. Se utiliza principalmente para la optimización de controles volátiles de cableado registros obligando a un re-read de la variable. Es sólo una guía y puede ser ignorada. El valor inicial de variables volátiles no está definido. Georg Friedrich Händel-C no hace nada con volátil. Es aceptado para fines de compatibilidad. Declaraciones de complejas 3250 3251 Es posible tener declaraciones extremadamente complejas en Handel-C. Uno puede combinar arreglos de discos de funciones estructuras arreglos de discos y punteros con tipos arquitectónicos. Para aclarar esas expresiones es aconsejable usar typedef. 3252 De macro de expresiones en anchos 3253 Si uno utiliza una expresión de macro para proporcionar el ancho en una declaración de tipo uno puede escríbala entre paréntesis. Esto asegura que se puede ser analizado correctamente como una macro. 3254 int mac x y 3255 Para declarar un puntero a una función que devuelve que tipo uno obtiene int 3256 mac x * f 3257 tipo clarifier lt gt 3258 es una extensión de Handel-C que se utiliza para eliminar la ambigüedad complejas declaraciones de tipos arquitectónicos. Uno no puede utilizarlo en tipos de lógica. Es recomendable utilizar siempre una persona declara canales recuerdos o señales para aclarar el formato de datos pasaron o almacenan en estas variables. Ejemplo de ° 3259 3260 struct peceras { 3261 3262 int 4 koi Carpa de int 8 3263 3264 int 2 guppy 3265 } bowl señal 3266 lt struct peceras gt goteo chan 3267 lt int 8 *runwater gt aprovechar 3268 Es necesario eliminar la ambigüedad una declaración tales como 3269 de chan int * x //pointer al canal o ¿ 3270 //channel de punteros 3271 Esto debe declararse como chan 3272 lt int * gt x //channel de punteros 3273 o chan 3274 lt int gt * x //pointer al canal. Especificadores de clase de almacenamiento 3275 Especificadores de clase de almacenamiento 3276 definen cómo se accede a las variables. Para la compatibilidad con ANSI-C el auto de especificadores y registro pueden usarse pero no tienen ningún efecto. El ámbito de una variable es declarado por el extern especificadores y estático. La expansión de una función es definida por el especificador inline. El especificador de typedef permite declarar nuevos nombres para los tipos existentes. Auto fue auto 3278 define una variable automática local. En variables de Handel-C todo local predeterminada para automáticamente. Uno no puede inicializar la variable de una auto pero puede asignarle un valor. El estado de inicialización de variables de auto no está definido. Ejemplo de 3279 3280 auto cerdo cerdo 3281 = 15 extern 3282 extern 3283 declara una variable que se puede tener acceso por nombre de cualquier función. Extern variables pueden definirse una vez fuera de todas las funciones. De forma predeterminada cualquier variable declarada fuera de una función se supone que extern. 3284 Si la variable se utiliza en varios archivos de código fuente es una buena práctica para recopilar todos las extern declaraciones en un archivo de encabezado incluidas en la parte superior de cada archivo de código fuente utilizando el # incluyen la Directiva headerFileName. Tenga en cuenta que uno no puede acceder a la misma variable de reloj diferentes dominios. Ejemplo de 3285 ° 3286 extern int 16 global_fish global_frog de int 3287 = 1234 principal de ° 3288 { 3289 3290 global_fish = global_frog 3291 ... 3292 } Sintaxis 3293 Declaración de variables de extern 3294 functionName parameter-type-list 3295 en línea 3296 en línea 3297 hace que una función de ampliarse a donde se le llama. La lógica se puede generar cada vez que se invoca. Esto garantiza que la función no se tiene acceso al mismo tiempo por ramas paralelas de código. De forma predeterminada se asumen funciones de para ser compartido no en línea . Ejemplo de 3298 3299 en línea int4 tejer aguja int int stitch { 3300 aguja 3301 = aguja + stitch return needle 3302 3303 } 3304 int 4 puente 100 par 3305 aguja = 1 agujas lt 100 aguja = aguja + 2 { 3306 puente 3307 aguja = tricotar aguja 1 3308 } Sintaxis 3309 function_Declaration en línea de 3310 registro de 3311 registro 3312 se ha implementado por razones de compatibilidad con ISO-C. registro define una variable que tiene un ámbito local. Su valor inicial está definido. Ejemplo de 3313 registro 3314 int 16 peces fish=f plop 3315 3316 static 3317 static ofrece un almacenamiento de variables estático sus valores se mantienen en todo momento . Esto garantiza que se conserve el valor de una variable a través de llamadas de función. También afecta el alcance de una variable o una función. Funciones estáticas y variables estáticas declaran fuera de funciones sólo pueden utilizarse en el archivo en que aparecen. estáticas de las variables declaradas dentro de una función inline o un conjunto de funciones sólo pueden utilizarse en la copia de la función en que aparecen. las variables estáticas son las variables sólo locales excepto consts que se pueden inicializar. Ejemplo de 3318 3319 int estática 16 local_function agua int int maleza local_fish de estática int 16 3320 = 1234 principal de 3321 { 3322 3323 int fresca pasto 3324 local_fish = local_function fresco pasto 3325 ... 3326 } Sintaxis 3327 Declaración de variables estática 3328 staticfunctionName parameter-type-list 3329 typedef 3330 typedef 3331 define otro nombre para un tipo de variable. Esto permite aclarar el código. El nuevo nombre es un sinónimo para el tipo de variable. 3332 typedef int 4 SMALL_FISH 3333 Si la typedef se utiliza en varios archivos de código fuente es una buena práctica para recoger todo el tipo de definiciones en un archivo de encabezado incluidas en la parte superior de cada archivo de código fuente utilizando el # incluyen la Directiva headerFileName. Es convencional para diferenciar typedef nombres de nombres de variables estándar para que sean fácilmente reconocibles. Ejemplo de 3334 3335 typedef int 4 SMALL_FISH extern 3336 SMALL_FISH_stickleback typeof 3337 El operador typeof de tipo 3338 permite que el tipo de un objeto que se determinen en tiempo de compilación. El argumento typeof puede ser una expresión. Utilizando typeof asegura que variables relacionadas mantengan su relación. Eso hace que fácil modificar código al simplificar el proceso de ordenación de los conflictos de tipo y ancho. Una construcción typeof-puede utilizarse en cualquier lugar que se podría utilizar un nombre de tipo. Por ejemplo se puede usar en una declaración en moldes o dentro de typeof. Sintaxis 3339 3340 typeof expresión Ejemplo de 3341 3342 9 sin signo ch 3343 typeof ch @ ch q 3344 struct { 3345 3346 typeof ch cha chb si 3347 } 3348 typeof s1 s2 ch=s1.cha+s2.chb 3349 3350 q=s1.chb@ s2.cha 3351 Si el ancho de ch variable se cambiaron en este ejemplo no habría ninguna necesidad de modificar cualquier otro código. Esto también es útil para pasar parámetros a macro procs. El código siguiente muestra cómo utilizar una definición typeof para hacer frente a varios tipos de parámetro. 3352 macro proc swap a b { 3353 3354 typeof a t 3355 t = un 3356 un = b b 3357 = t Inicialización de variable 3358 Pueden inicializar variables globales 3359 es decir los declarados fuera de todos los bloques de código con su declaración. Por ejemplo 3360 int 15 x = 1234 3361 Las variables declaradas dentro de funciones se pueden inicializar sólo si han de almacenamiento estático o son consts. Todas las otras variables no se pueden inicializar esta forma. En su lugar se puede usar una lista secuencial o paralela explícita de asignaciones tras las declaraciones para lograr el mismo efecto. Por ejemplo { 3362 int4x 3363 3364 5 sin firmar y x 3365 = 5 3366 y = 4 fue } 3368 Global y variables estáticas sólo pueden ser inicializadas con constantes. Declaración Introducción 3369 3370 Como con c convencional el flujo de ejecución de un programa de Handel-C se expresa como una serie de instrucciones tales como la asignación la ejecución condicional y la iteración. Georg Friedrich Händel-C incluye la mayoría de las declaraciones de c convencional y de estos arco detallada a continuación. Ejecución secuencial y paralela de 3371 3372 FIG. 57A-1 muestra un método 5730 para utilizar extensiones para ejecutar comandos en paralelo. En general en la operación 5732 se designan una pluralidad de comandos para ejecutar en paralelo. 3373 Esta designación se replica en operación 5734 y los comandos se ejecutan en paralelo de forma recursiva. Nota de operación 5736. En un aspecto los comandos se ejecutará en paralelo de forma recursiva utilizando un FOR loop. 3374 Como una opción primero ejecutar un comando puede ser simultáneamente con un segundo comando. Además el primer comando se ejecutará simultáneamente con el segundo comando en un ciclo de reloj único. 3375 Handel-C implícitamente ejecuta las instrucciones de forma secuencial pero cuando dirigidas a hardware es extremadamente importante hacer mayor uso posible de paralelismo. Por esta razón Handel-C tiene también un par de palabra clave composición paralelo para permitir las declaraciones en un bloque a ejecutarse en paralelo. 3376 El siguiente ejemplo ejecuta tres asignaciones secuencialmente x 3377 = 1 3378 y = 2 Grupo z = 3 3380 en contraste el siguiente ejemplo ejecuta todas las asignaciones de tres en paralelo y en el mismo ciclo de reloj par 3381 { 3382 x 3383 = 1 3384 y = 2 3385 } z 3386 = 3 TI 3387 debe señalarse que el segundo ejemplo ejecuta todas las asignaciones literalmente en paralelo. Este no es el paralelismo de pseudo-cortada a tiempo de implementación del microprocesador convencional pero tres piezas específicas de hardware construido para realizar estas tres asignaciones. Detallado análisis de temporización podrán ser tratadas más adelante pero por ahora es suficiente para que el primer ejemplo se ejecuta en ciclos de reloj de 3 mientras que la segunda genera una cantidad similar de hardware pero se ejecuta en el ciclo de reloj de 1. Por lo tanto es evidente que el paralelismo es una construcción muy importante para la selección de hardware. En bloques paralelos de código pueden agregarse ramas secuenciales mediante el uso de un bloque de código que se identifican con el {...} entre paréntesis en lugar de una sola instrucción. Por ejemplo par 3388 { 3389 x 3390 = 1 { 3391 3392 y = 2 z 3393 = 3 3394 } 3395 } Lugar en este ejemplo la primera rama de la declaración paralela ejecuta la asignación a x mientras que la segunda rama secuencialmente ejecuta las asignaciones a y y z. Las asignaciones de x e y se producen en el mismo ciclo de reloj la asignación a z se produce en el próximo ciclo de reloj. La instrucción siguiente el par {...} no podrán ser ejecutadas hasta completar todas las ramas del bloque paralela. Seq 3397 ° 3398 Para permitir la replicación existe la palabra clave seq. Declaraciones secuenciales pueden escribirse con o sin la palabra clave. En el siguiente ejemplo se ejecuta tres asignaciones secuencialmente x 3399 = 1 3400 y = 2 3401 2 = 3 3402 como lo hace seq 3403 { 3404 x 3405 = 1 3406 y = 2 z 3407 = 3 3408 } 3409 Par replicada y seq 3410 Uno puede replicar par y seq bloques mediante un bucle contado una construcción similar a un bucle for . El recuento se define con un punto de inicio index_Base a continuación un punto final index_Limit y a un paso de tamaño index_Count . El cuerpo del bucle se replica tantas veces como hay pasos entre los puntos inicial y final. Si es un bucle de par los procesos replicados pueden funcionar en paralelo si un seq pueden ejecutar secuencialmente. Sintaxis 3411 7 par.vertline.seq index_Base index_Limit index_Count {. Cuerpo} index_Base index_Limit y index_Count son exprs de macro que se declaran implícitamente. No necesitan ser expresiones única por ejemplo uno podría declarar par i = 0 j = 23 yo = 76 i ++ j . Ejemplo de 3412 par 3413 i = 0 i lt 3 i ++ { 3414 3415 i = b i 3416 } 3417 se expande para par 3418 { 3419 3420 a 0 = b 0 músico a 1 = b 1 3422 2 = b 2 3423 } Tubería de replicado 3424 init sin signo 3425 q sin signo 3426 149 31 sin signo 3427 3428 init = 57 par 3429 r = 0 i lt 16 i ++ { 3430 ifselect r==0 3431 q 3432 r = init ifselect r==15 otra cosa 3433 q fuera 3434 r-1 3435 else q 3436 r = q r-1 3437 } ifselect 3438 comprueba para el inicio de la tubería las reglas de replicator crean las secciones medias y ifselect comprueba el final. Este código se expande para par 3439 { 3440 q 3441 0 = init q 3442 1 = q 0 q 3443 2 = q 3444 etc.... q 3445 14 = q 13 q fuera 3446 14 Assert 3447 3448 afirman permitirá generar mensajes en tiempo de compilación si se cumple una condición. Pueden utilizarse para comprobar constantes de tiempo de compilación y ayudar a protegerse contra código problemático posibles alteraciones. El usuario utiliza una expresión para comprobar el valor de una constante de tiempo de compilación y si la expresión se evalúa como false se envía un mensaje de error para el canal de error estándar en el formato column number Assertion de line number de nombre de archivo 3449 error definidos por el usuario cadena de error 3450 Sintaxis 3451 3452 assert condición de cadena con formato de especificaciones {argument s } Si la condición es falsa cadena puede enviarse al canal de error estándar con cada especificación de formato sustituido por un argumento. Afirmar cuando se encuentra con la primera especificación de formato si existe convierte el valor del primer argumento en ese formato y lo envía. El segundo argumento es formateado según la especificación de formato de segunda y así sucesivamente. Si hay más expresiones que las especificaciones de formato se omiten las expresiones extras. Los resultados son undefined si no hay suficientes argumentos para todas las especificaciones del formato. 3453 La especificación de formato es uno de %c 3454 Mostrar como un personaje de visualización como una cadena de %s %d 3455 Mostrar como un número decimal %f visualización como un punto flotante 3456 % De visualización como un % de x octal de visualización como un hexadecimal ° 3457 Ejemplo 3458 int f int x { 3459 3460 assert ancho x == 3 "Ancho de x no es 3 es % d " width x 3461 x retorno 3462 + 1 3463 } 3464 void main void { 3465 3466 int 4 y y=f y 3467 3468 } x 3469 puede inferirse tiene un ancho de 4 así que puede aparecer el siguiente mensaje. F .backslash.proj.backslash.test.c 4 2 Error de aserción ancho de x no es 3 es 4 . Continuar 3470 3471 continuar movimientos directamente a la siguiente iteración de un mientras o bucle. DO o mientras esto significa que la prueba se ejecuta inmediatamente. En una declaración se ejecuta el paso de incremento. Esto permite evitar profundamente anidadas if... else declaraciones dentro de bucles Ejemplo de 3472 3473 para i = 100 i gt 0 i { 3474 x=f i 3475 Si 3476 x = 1 3477 continuar 3478 y += * x 3479 } 3480 Uno no se puede utilizar continuar saltar fuera de o en bloques de par Goto 3481 etiqueta de goto 3482 se mueve directamente a la declaración especificada por la etiqueta la etiqueta tiene el mismo formato que el nombre de una variable y puede estar en la misma función que el goto. Las etiquetas tienen el ámbito de la función. Formalmente goto nunca es necesario. Puede ser útil para extraer de niveles profundamente anidados de código en caso de error. Ejemplo de 3483 3484 para ... { 3485 3486 para ... 3487 } if disaster 3488 3489 goto Error { 3490 3491 } 3492 Error salida de ° 3493 codigo_error 3494 Uno no puede utilizar el comando goto para saltar fuera de o en bloques de par retorno de 3495 expresión 3496 La sentencia return se utiliza para recuperar de una función a su llamador. retorno termina la función y devuelve el control a la función de llamada. Ejecución se reanuda en la línea inmediatamente después de la llamada de función. retorno puede devolver un valor a la función de llamada. El valor devuelto es del tipo declarado en la declaración de función. Funciones que no devuelven un valor deben ser declaradas de tipo void. Ejemplo de 3497 generadores int poder base de int int n { 3499 3500 int i p p 3501 = 1 3502 para i = 1 i lt = n ++ i 3503 p = p * base return p 3504 3505 } 3506 Uno no puede utilizar retorno para saltar fuera de los bloques de par Asignaciones 3507 Asignaciones de Handel-C 3508 son de la forma Variable 3509 = expresión 3510 Por ejemplo 3511 x = 3 3512 y = a + b 3513 La expresión en el lado derecho puede ser de la misma anchura y escriba firmado o unsigned como la variable en el lado izquierdo. El compilador genera un error si no es el caso. El lado izquierdo de la asignación puede ser cualquier variable elemento de matriz o elemento de RAM. El lado derecho de la asignación puede ser cualquier expresión que se describe más adelante. Georg Friedrich Händel-C también proporciona una serie de instrucciones de asignación de atajo. Tenga en cuenta que estos no pueden utilizarse en expresiones como les sea posible en c convencional pero sólo en los Estados independientes. Estos atajos son Expansión de declaración 3514 3515 Variable ++ Variable = Variable + 1 3516 Variable Variable = Variable -1 3517 ++ Variable Variable = Variable + 1 3518 Variable Variable = Variable-1 3519 += Variable expresión Variable = Variable + expresión Expresión de la variable 3520 Variable = Variable-expresión 3521 Variable-= expresión Variable = Variable-expresión 3522 Variable-= expresión Variable=variable.vertline.Expression 3523 % Variable = expresión Variable = expresión Variable % Variable 3524 lt lt = expresión Variable = Variable lt lt expresión Variable 3525 gt gt = expresión Variable = Variable gt gt expresión Variable 3526 = expresión Variable = Variable expresión Variable.vertline.=Expression 3527 Variable=variable.vertline.expressio-n Variable 3528 = expresión Variable = expresión Variable 3529 Canal de comunicación Canales 3530 son una forma de comunicación entre procesos. Cuando uno escribe en un canal se envía una copia de los datos que él o ella escribe para el proceso de recepción. Esto permite compartir entre los procesos de la información. Dado que una variable no puede escribirse en varios procesos uno puede escribir a la variable en un único proceso mediante la lectura de canales que envían los datos de otros procesos. Cada canal puede escribirse en una final y leer en el otro. El ancho y el tipo de datos enviados por el canal pueden ser el mismo de la anchura y el tipo del canal. El canal puede ser una entrada en una matriz de canales o ser apuntado por el puntero de un canal. 3531 Como con otras variables si ningún ancho o tipo es dado a un canal o si se establece como undefined el compilador puede inferir el ancho del canal y el tipo de su uso. Lectura de un canal se realiza como sigue ¿ 3532 Canal Variable 3533 Esto asigna el valor leído desde el canal a la variable. La variable puede ser también una señal un elemento de la matriz elemento de RAM o WOM elemento. 3534 Escrito a un canal es el siguiente 3535 Canal Expresión 3536 Esto escribe el valor de la expresión en el canal. La expresión puede ser cualquier expresión que se describe más adelante. No dos declaraciones pueden escribir simultáneamente en o leer simultáneamente desde un único canal. par 3537 { 3538 3539 out 3 / / escritura paralelo a un canal 3540 out 4 3541 } Sellers este código es ilegal al intentar escribir simultáneamente en un único canal. Del mismo modo el código siguiente es ilegal porque se intenta leer simultáneamente desde el mismo canal par 3543 { 3544 ¿ 3545 en x .backslash...barra invertida.Paralelo leer de un canal ¿ 3546 en y 3547 } Ejemplo de 3548 reloj set 3549 = externos 3550 void main void { 3551 3552 señal Fred 3553 Res sin signo de 8 chan 3554 proyecto de ley par 3555 { 3556 Bill 3557 23 ¿Bill 3558 Fred Res 3559 = Fred 3560 } 3561 } prialt 3562 3563 La instrucción de prialt selecciona el primer canal preparado para la comunicación. La sintaxis es similar a una instrucción switch c convencionales. prialt 3564 { 3565 3566 case CommsStatement Declaración de 3567 salto de 3568 3569 ... 3570 case CommsStatement Declaración de 3571 salto de 3572 3573 predeterminado Declaración de 3574 salto de 3575 3576 }. prialt 3577 selecciona entre las comunicaciones en varios canales dependiendo de la disponibilidad del otro extremo del canal. CommsStatement 3578 puede ser uno de los siguientes ¿ 3579 Canal Variable 3580 Canal Expresión 3581 El caso cuya declaración de comunicación es el primero en estar listo para la transferencia de datos pueden ejecutar y los datos puede ser transferido por el canal. Las declaraciones hasta la siguiente instrucción break a continuación pueden ser ejecutadas. La construcción de prialt no permite el mismo canal aparezca dos veces en sus casos y caída a través de los casos está prohibido. Esto significa que cada caso puede tener su propia instrucción break. Si dos canales simultáneamente están dispuestos a continuación la primera de ellas se enumeran en el código tiene prioridad. Predeterminado 3582 3583 prialt con ningún caso predeterminado ejecución 3584 se detiene hasta que uno de los canales esté preparado para la comunicación. Declaración de prialt 3585 con el caso predeterminado 3586 si ninguno de los canales está listo para comunicar inmediatamente a continuación ejecuta las declaraciones de rama predeterminada y la declaración de prialt termina. 3587 Ejecución condicional if... else Georg Friedrich Händel-C 3588 proporciona la construcción estándar de ejecución condicional c como sigue if Expression 3589 Declaración de 3590 3591 else Declaración de 3592 3593 Como en c convencional la otra parte puede ser omitida si no necesarios. Por ejemplo 3594 if x == 1 3595 x = x + 1 ° 3596 Aquí y el resto de la presente descripción declaración podrá ser sustituido con un bloque de instrucciones por que encierra el bloque en {.. . } entre paréntesis. Por ejemplo Si 3597 x gt y { 3598 3599 un = b c 3600 = d 3601 } 3602 else { 3603 3604 un = d c 3605 = b 3606 } 3607 La primera sucursal de la condicional se ejecuta si la expresión es verdadera y la segunda rama se ejecuta si la expresión es false. Georg Friedrich Händel-C trata los valores cero como valores falsos y cero como true. Como puede verse más tarde los operadores relacionales de lógicos devolución valores para que coincida con este significado pero también es posible utilizar variables como las condiciones. Por ejemplo Si 3608 x 3609 un = b 3610 else c 3611 = d 3612 Esto se expande por el compilador para Si 3613 x = 0 3614 un = b 3615 else c 3616 = d 3617 Cuando se ejecuta si x no es igual a 0 a continuación b se asigna a una. Si x es 0 d es asignado a c. 3618 mientras bucles Georg Friedrich Händel-C 3619 proporciona mientras bucles exactamente como en C convencionales 3620 mientras expresión Declaración de 3621 3622 El contenido del tiempo bucle puede ser ejecutado cero o más veces en función del valor de la expresión. Mientras que la expresión es verdadera a continuación se ejecuta instrucción repetidamente. Una vez más la declaración podrá ser sustituido con un bloque de instrucciones. Por ejemplo x 3623 = 0 tiempo 3624 x = 45 { 3625 3626 y = y + 5 3627 x = x + 1 3628 } 3629 Este código agrega 5 a y 45 veces equivalentes a la adición de 225 a y . 3630 hacer bucles while... 3631 Handel-C proporciona do... while bucles exactamente como en C convencionales 3632 Hacer Declaración de 3633 3634 mientras expresión 3635 El contenido del do... bucle while se ejecuta al menos una vez porque la expresión condicional es evaluada al final del bucle en lugar de hacerlo al principio como es el caso con bucles while. Una vez más La declaración podrá ser sustituido con un bloque de instrucciones. Por ejemplo hacer 3636 { 3637 3638 un = a + b 3639 x = x-1 3640 } while x gt y 3641 para bucles Georg Friedrich Händel-C 3642 proporciona para bucles similares a los de la convencional C. 3643 para inicialización Prueba Iteración Declaración de 3644 3645 El cuerpo de la de bucle puede ser ejecutado cero o más veces de acuerdo con los resultados de la prueba de condición. Hay una correspondencia directa entre para bucles y bucles while. 3646 init Prueba Inc Cuerpo de 3647 3648 Equivale directamente a { 3649 3650 Init 3651 mientras prueba { 3652 Cuerpo de ° 3653 Fue Inc 3655 } 3656 } 3657 a menos que el cuerpo incluye una instrucción continue. En un bucle for continuar salta al antes el incremento en un tiempo bucle continuar saltos a tras el incremento. Cada una de las declaraciones de inicialización la prueba y la iteración es opcional y se omite si no requiera. Como todas las otras construcciones Handel-C declaración podrá ser reemplazada con un bloque de instrucciones. Por ejemplo 3658 para x gt y x ++ 3659 un = b c 3660 = d 3661 La diferencia entre una convencional de bucle y la Handel-C versión es en las fases de inicialización y la iteración. En c convencional estos dos campos contienen expresiones y mediante el uso de efectos secundarios de expresión tales como ++ y y el operador secuencial ' ' C convencional permite operaciones complejas llevar a cabo. Desde Handel-C no permite efectos secundarios en expresiones de las expresiones de inicialización y la iteración han sido reemplazadas con declaraciones. Por ejemplo 3662 para x = 0 x lt 20 x = x + 1 { 3663 3664 y = y + 2 3665 } 3666 Aquí la asignación de 0 a x y agregar uno a x son declaraciones y no de expresiones. Estas declaraciones de inicialización y la iteración pueden sustituirse con bloques de declaraciones por que encierra el bloque en {...} entre paréntesis. Por ejemplo 3667 para {x = 0 y = 23 } x lt 20 {x += 1 x * = 2 } { 3668 3669 y = y + 2 3670 } conmutador 3671 Georg Friedrich Händel-C 3672 proporciona conmutador declaraciones similares a las de C. convencional 3673 conmutador expresión { 3674 3675 caso constante Declaración de 3676 salto de 3677 3678 ... 3679 predeterminado Declaración de 3680 salto de 3681 3682 } 3683 La expresión de switch se evalúa y se comprueba cada una de las constantes de tiempo de compilación de casos. Las sentencias vigilada por la constante coincidente se ejecutan hasta que encuentra una instrucción break. Si no se encuentra ninguna coincidencia se ejecuta la instrucción de forma predeterminada. Si no se proporciona ninguna opción predeterminada instrucciones no se ejecutan. 3684 Cada una de las líneas de la declaración anteriores podrá ser sustituida con un bloque de instrucciones por que encierra el bloque en {...} entre paréntesis. Como con c convencional es posible hacer la ejecución paralela a través de sucursales casos omitiendo una instrucción break. Por ejemplo 3685 conmutador x { 3686 caso 3687 10 3688 un = b 3689 caso 11 c 3690 = d salto de 3691 3692 caso 12 e 3693 = f. salto de 3694 3695 } 3696 Aquí si x es 10 b se asigna a un y d se asigna a c si x es 11 d es asignar a c y si x es 12 f es a e. 3697 Los valores después de cada rama de caso pueden ser constantes de tiempo de compilación. Salto de 3698 Georg Friedrich Händel-C 3699 proporciona la declaración de saltos de c normal tanto para la terminación de bucles y separación de casos sucursales en declaraciones del conmutador y prialt. 3700 Cuando se utiliza dentro de un tiempo ... mientras o bucle for el bucle termina y la ejecución continúa de la instrucción que sigue el bucle. Por ejemplo 3701 para x = 0 x lt 32 x ++ { 3702 Si 3703 a x ==0 salto de 3704 b 3705 x = x 3706 } 3707 / / Ejecución continúa aquí 3708 Cuando se utiliza en una instrucción switch finaliza la ejecución de la rama de caso y se ejecuta la instrucción tras el conmutador. Por ejemplo conmutador 3709 x { 3710 3711 caso 1 3712 caso 2 3713 Y ++ salto de 3714 3715 caso 3 3716 z ++ salto de 3717 3718 } 3719 / / Ejecución continúa aquí 3720 Cuando se utiliza dentro de una instrucción de prialt finaliza la ejecución de la rama de caso y se ejecuta la instrucción tras la prialt. Por ejemplo prialt 3721 { Ministerial 3722 ¿caso 3723 un x x ++ salto de 3724 3725 caso b y salto de 3726 3727 } 3728 / / Ejecución continúa aquí Ejemplo de 3729 3730 int poder base de int int n { 3731 3732 int i p p 3733 = 1 3734 para i 1 i lt = n ++ i 3735 p = p * base return p 3736 3737 } 3738 Uno no puede utilizar retorno para saltar fuera de los bloques de par Retraso de 3739 Georg Friedrich Händel-C 3740 proporciona una declaración de demora que no se encuentra en c convencional que no hace nada pero tiene un ciclo de reloj para hacerlo. Esto puede ser útil para evitar conflictos de recursos por ejemplo evitar los dos accesos a una RAM en un ciclo de reloj único o para ajustar el tiempo de ejecución. Demora también puede utilizarse para romper los ciclos de lógica combinatoria. Dirección 3741 y direccionamiento indirecto 3742 Es utilizar el operador de dirección para acceder a la dirección de una variable. El operador de direccionamiento indirecto * es la misma que es en ISO-C. Se utiliza para declarar los punteros a objetos y a de-reference punteros es decir acceso a los objetos apuntado por punteros . Operadores de miembros 3743 3744 Se utiliza el operador de miembros de estructura . para tener acceso a miembros de una estructura o mpram o acceder a un puerto dentro de una interfaz. El operador de puntero de estructura - gt puede utilizarse como en la ISO-C. Se usa para tener acceso a los miembros de una estructura o mpram cuando se hace referencia a la estructura/mpram a través de un puntero. 3745 mpram Fred { 3746 ram 3747 lt sin signo de 8 gt ReadWrite 256 / / Puerto de lectura y escritura 3748 rom lt sin signo de 8 gt lectura 256 / / Lee único puerto Joan 3749 } mpram 3750 Fred * mpramPtr 3751 mpramPtr = Joan x 3752 = mpramPtr - gt lectura 56 3753 Si una memoria se compone de las estructuras el operador de miembros de la estructura puede utilizarse para hacer referencia a los miembros de la estructura dentro de la memoria. ram 3754 struct s compRAM 100 ram 3755 struct S * ramStructPtr 3756 ramStructPtr = compRAM 3757 x= *ramStructPtr 10 .un . Las expresiones Introducción 3758 Expresiones 3759 en Handel-C no toman ciclos de reloj para ser evaluados y así no tener ninguna influencia sobre el número de ciclos de reloj de un programa dado que se tarda en ejecutar. Que afectan a la máxima velocidad posible para un programa más compleja una expresión el hardware más participa en su evaluación y más tiempo es probable que tomar debido a retrasos combinatorias en el hardware. El período de reloj para el programa completo de hardware está limitado por la más larga tal evaluación en todo el programa. Más detalles sobre el calendario y consideraciones de eficiencia se establecerá en adelante adelante con mayor detalle. Porque las expresiones no pueden tomar cualquier ciclos de reloj expresiones con efectos secundarios no están permitidas en Handel-C. Por ejemplo 3760 un = b ++ / * NO PERMITE * / 3761 Esto no está permitido porque la ++ operador tiene el efecto secundario de la asignación de b + 1 a b que requiere un ciclo de reloj. Tenga en cuenta que incluso la expresión de c más larga y más compleja con muchos - efectos secundarios pueden ser escritos en términos de un mayor número de expresiones más simples. El código resultante es normalmente más fácil de leer. Por ejemplo 3762 = b++ + c d ++ e f 3763 puede reescribirse como 3764 un = b + f 3765 b = b + 1 Si 3766 c 3767 d = d + 1. 3768 else e 3769 = e-1 c 3770 = c-1 3771 Nota que Handel-C proporciona el prefijo y postfix ++ y operaciones como declaraciones en lugar de expresiones. Por ejemplo 3772 un ++ b 3773 3774 ++ c 3775 d 3776 Este ejemplo es directamente equivalente a 3777 un = a + 1 b 3778 = b-1 c 3779 = c + 1 3780 d = d-1 . 3781 Restricciones sobre los RAMs y ROMs 3782 Debido a su arquitectura RAMs y ROMs están restringidas a realizar operaciones de forma secuencial. Sólo uno de los elementos de una memoria RAM o ROM puede abordarse en cualquier ciclo de reloj dado y de resultas de ello las declaraciones de aspecto familiares son a menudo no permitidas. Por ejemplo ram 3783 unsigned int 8 x 4 3784 x 1 = x + 1 3 3785 Este código es ilegal porque la asignación intenta leer desde el tercer elemento de x en el mismo ciclo como escribe en el primer elemento. Tenga en cuenta que los puertos dentro de un memoria RAM multipuerto están en los mismos elementos de la memoria por lo que sólo se puede hacer un acceso único a cualquier puerto de un mpram en un ciclo de reloj único. También no se permite el siguiente código ram 3786 unsigned int 8 x 4 Si 3787 x 0 =0 3788 x 1 = 1 3789 Esto es debido a la evaluación de la condición puede leer desde el elemento 0 de la RAM en el mismo ciclo de reloj como escribe la asignación al elemento 1. Se aplican restricciones similares mientras bucles hacer... mientras bucles de bucles y declaraciones de conmutador. Tenga en cuenta que arreglos de discos de variables no tienen estas restricciones pero pueden requerir hardware sustancialmente más a implementar que RAMs dependiendo de la arquitectura de destino. Operadores 3790 Operadores de manipulación de bits 3791 3792 En Handel-C se proporcionan los siguientes operadores de manipulación de bits 8 Significado de operador de lt lt Mayús izquierda gt gt Mayús derecha lt -tomar menos significativo bits .backslash...barra invertida. Colocar los bits menos significativos @ concatenar bits selección de Bit 3793 width Expression ancho de expresión Operadores de desplazamiento 3794 3795 Los operadores de desplazamiento cambiar un valor de izquierda o derecha por un número variable de bits lo que resulta en un valor de la misma anchura que el valor de ser desplazado. Cualquier bit desplazado fuera de este ancho se pierden. Cuando cambio de valores sin signo las pastillas de desplazamiento a la derecha los bits superiores con ceros. Desplazamiento de la derecha la firma valores los bits superiores son copias del bit superior del valor original. Así un desplazamiento derecha por 1 el valor divide por 2 y preserva el signo. Por ejemplo 3796 unsigned int 8 x 3797 int 8 y 3798 x = 192 y = a 3799 -8 3800 y = x gt gt 1 3801 y = y gt gt 1 3802 Esto da como resultado x se establece en el 96 y y se establece en -4. Operador de tomar 3803 3804 El operador take lt - devuelve los n bits menos significativos de un valor. El operador de la gota .backslash...barra diagonal inversa. devuelve todo excepto los n bits menos significativos de un valor. n puede ser una constante de tiempo de compilación. Por ejemplo 3805 macro expr cuatro = 8/2 3806 unsigned int 8 x 3807 unsigned int 4 y z 3808 unsigned int 4 3809 x = 0xC7 3810 y = x lt -cuatro z=x.backslash 3811 ...backslash.4 3812 Resultado y se establece en 7 y z se establece en 12 o 0xC en hexadecimal . Operador de concatenación de 3813 3814 El operador de concatenación @ se une a dos conjuntos de bits juntos en un resultado cuyo ancho es la suma de los anchos de los dos operandos. Por ejemplo 3815 unsigned int 8 x 3816 unsigned int 4 y z 3817 unsigned int 4 y 3818 = 0xC 3819 z = 0 x 7 3820 x = y @ z 3821 Esto da como resultado x se establece en 0xC7. El operando izquierdo del operador de concatenación de forma los bits más significativos del resultado. Selección de bits 3822 3823 Bits individuales o un intervalo de bits puede seleccionarse desde un valor mediante el operador . Bit 0 es el bit menos significativo y bit n-1 es el bit más significativo donde n es el ancho del valor. 3824 Por ejemplo 3825 unsigned int 8 x 3826 unsigned int 1 y z 3827 unsigned int 5 x 3828 = 0b01001001 3829 y = x 4 z 3830 = x 7 3 3831 Resultado y se establece en 0 y z se establece en 9. Tenga en cuenta que el rango de bits es de la forma MSB LSB y es inclusivo. Por lo tanto la gama 7 3 es 5 bits de longitud. También es posible la selección de bits 3832 en RAM ROM y matriz de elementos. Por ejemplo ram 3833 int 7 w 23 3834 int 5 x 4 3835 int 3 y z 3836 unsigned int 1 3837 y = w 10 4 2 3838 z-x 2 0 . 3839 Aquí el 10 es la entrada en la RAM y las 4 2 selecciona tres bits desde la mitad del valor en la memoria RAM. Del mismo modo z se establece el bit menos significativo en la x variable 2 . Operador de ancho 3840 3841 El operador de ancho devuelve el ancho de una expresión. Es una constante de tiempo de compilación. Por ejemplo 3842 x = y lt -width x E Esto toma los bits menos significativos de y y les asigna a x. El operador de ancho garantiza que el número correcto de bits es tomado de y para que coincida con el ancho de x. Operadores aritméticos 3844 3845 Que se proporcionan los siguientes operadores aritméticos en Handel-C 9 Significado de operador de + suma - resta * multiplicación / División % aritmética de módulo 3846 Cualquier intento para realizar una de estas operaciones en dos expresiones de diferentes anchos o tipos provoca un error del compilador. Por ejemplo 3847 int 4 w 3848 int 3 x 3849 int 4 y 3850 z 4 sin signo 3851 y = w + x / / ILEGAL z 3852 = w + y / / ILEGAL Conocido la primera instrucción es ilegal porque w y x tienen anchos diferentes. La segunda declaración es ilegal porque w y y son enteros con signo y z es un entero sin signo. Todos los operadores devuelven resultados de la misma anchura como sus operandos. Por lo tanto todos los bits de desbordamiento se pierden. Por ejemplo . 3854 unsigned int 8 x 3855 unsigned int 8 y z 3856 unsigned int 8 3857 x = 128 3858 y = 192 z 3859 = 2 3860 x = x + y z 3861 = z * y 3862 Este ejemplo da como resultado x se establece en 64 y z se establece en 128. Mediante el uso de los operadores de la manipulación de bits para expandir los operandos es posible obtener información adicional de las operaciones aritméticas. Por ejemplo el bit de acarreo de una adición o los bits de desbordamiento de una multiplicación pueden obtenerse mediante la primera ampliación de los operandos a la anchura máxima debe contener esta información adicional. Por ejemplo 3863 unsigned int 8 u 3864 unsigned int 8 v 3865 unsigned int 9 w 3866 unsigned int 8 x 3867 unsigned int 8 y z 3868 unsigned int 16 3869 = 0@ u w + 0 @ v z 3870 = 0 @ x * 0 @ y 3871 En este ejemplo w y z contienen toda l'información que puede obtenerse de las operaciones d'adición y multiplicación. Tenga en cuenta que los ceros constantes no requieren una especificación de ancho porque el compilador puede deducir que sus anchos de forman el uso. Los ceros en la primera asignación pueden ser de 1 bit de amplia porque el destino es 9 bits de ancho mientras que los operandos de origen son sólo de 8 bits de ancho. En la segunda asignación las constantes de cero pueden ser de 8 bits de ancho porque el destino es de 16 bits de longitud mientras que los operandos de origen son sólo de 8 bits de ancho. Precedencia de operadores 3872 3873 Precedencia de operadores es como se esperaba desde C. convencional Por ejemplo 3874 x = x + y * z 3875 Esto realiza la multiplicación antes de la adición. Soportes pueden utilizarse para garantizar el orden de cálculo correcto que en C. convencional Operadores relacionales 3876 3877 Que se proporcionan los siguientes operadores relacionales en Handel-C 10 Significado de operador == igual a = no igual a lt menos de gt mayor que lt = menor o igual gt = igual o mayor que 3878 Estos operadores comparar los valores de la misma anchura y devolver un único bit amplia unsigned int valor de 0 para falso o 1 para verdadero. Esto significa que el siguiente código c convencional no es válido 3879 int 8 w x y z w 3880 = x + y gt z / / NO PERMITIDO 3881 En su lugar se debe escribir w 3882 = x + 0 @ y gt z 3883 Signed/Unsigned compara 3884 Compara firmado/firmado y compara unsigned/unsigned se gestiona automáticamente. Compara de signo y sin signo mixto no se gestiona automáticamente. Por ejemplo 3885 sin signo de 8 x ° 3886 int 8 y Si 3887 x gt y / / no permitido 3888 ... 3889 Comparar firmado y valores sin signo uno puede firmar ampliación cada uno de los parámetros. El código anterior puede reescribirse como 3890 sin signo de 8 x 3891 int 8 y Si 3892 int 0@x gt y 7 @y Compara implícito 3893 3894 Handel-C el compilador inserta implícita se compara con cero si se utiliza un valor como condición para su propia. Por ejemplo 3895 mientras que 1 { 3896 3897 ... tiempo 3898 1 = 0 { 3899 3900 ... 3901 } Operadores lógicos 3902 3903 Que se proporcionan los siguientes operadores lógicos en Handel-C 11 Significado de operador de lógico y .parallel. Lógica o Not lógico 3904 Estos operadores se proporcionan para combinar condiciones como en C. convencional Cada operador toma 1-bit operandos sin signo y devuelve un resultado de 1 bit sin signo. Tenga en cuenta que los operandos de estos operadores no tienen que ser los resultados de los operadores relacionales. Por ejemplo Si 3905 x.parallel.y gt z w 3906 = 0 3907 En este ejemplo la variable x no necesita ser amplia si es más amplio el compilador de c de Handel inserta una comparación con 0 1 bit. Como en c convencional la condición de la si declaración es true si x no es igual a 0 o y es mayor que la z. Esta característica permite que algunos familiar buscando construcciones c convencionales. Por ejemplo 3908 x.parallel.y mientras que { 3909 3910 ... 3911 } 3912 Bitwise operadores lógicos 3913 Que se proporcionan los siguientes operadores lógicos bit a bit en Handel-C 12 Operador de que significa bit a bit y .vertline. BitWise o exclusiva bit a bit de {circunflejo sobre } o .sobre. Bit a bit no 3914 estos operadores realizan operaciones lógicas a nivel de bit en valores. Ambos operandos pueden ser del mismo tipo y ancho el valor resultante también puede este tipo y el ancho. Por ejemplo 3915 unsigned int 6 w 3916 unsigned int 6 x 3917 unsigned int 6 y z 3918 unsigned int 6 w 3919 = 0b101010 x 3920 = 0b011100 3921 y = w x 3922 z w.vertline.x 3923 w = w. about.x 3924 En este ejemplo el resultado y tener el valor 0b0010000 z tiene el valor 0b11110 y w tener el valor 0b001001. Operador condicional 3925 Georg Friedrich Händel-C 3926 proporciona la construcción de la expresión condicional familiar de C. convencional ¿Su formato es expresión Expresión expresión 3927 La primera expresión se evalúa y si es true la expresión entera se evalúa como el resultado de la segunda expresión. Se evalúa si la primera expresión es false el todo como el resultado de la expresión tercero. Por ejemplo ¿ 3928 x = y gt z y z 3929 Esto establece x hasta el máximo de y y z. Este código es directamente equivalente a 3930 if y gt Z 3931 x = y 3932 else 3933 x = z 3934 La ventaja de utilizar esta construcción es que el resultado es una expresión por lo que se puede incrustar en una expresión más compleja. Por ejemplo x 3935 = y gt z y z + 4 3936 Fundición de tipos de expresión 3937 La siguiente pieza de Handel-C no es válida 3938 int 4 x / Rango de x -8... 7 3939 unsigned int 4 y / / Rango de y 0... 15 3940 x = y / / No permitido 3941 Esto es porque la x es un entero con signo mientras que y es un entero sin signo. Al generar el hardware no está claro lo que el compilador debe hacer aquí. Simplemente podrían asignar los 4 bits de y a los 4 bits de x o podría extender y con un cero extra como su bit más significativo para preservar su valor y a continuación asignar estos 5 bits para x asumiendo x fue declarada 5 bits de longitud. Para ver la diferencia considere el caso cuando y es 10. Asignando simplemente estos 4 bits a un entero con signo un resultado de -6 se pondría en x. Una solución mejor podría ser extender y a un valor de cinco bits mediante la adición de un bit 0 como su MSB para preservar el valor de 10. La solución adoptada por Handel-C es no permitir conversiones automáticas entre valores sin signo y firmados para evitar esta confusión. En su lugar los valores se pueden 'emitir' entre tipos para asegurarse de que el programador es consciente de que está produciendo una conversión que puede alterar el significado de un valor. El ejemplo anterior a continuación se convierte en 3942 int 4 x 3943 unsigned int 4 y 3944 x = int 4 y 3945 Ahora está claro que el valor de x es el resultado del tratamiento de los 4 bits extraídos y como un entero con signo. Uno puede también convertirse en un tipo de ancho sin definir. Por ejemplo int4x 3946 3947 unsigned int indefinido y 3948 x = int undefined y 3949 Aquí el compilador puede inferir que y puede ser 4 bits de longitud. Fundición no se puede utilizar para cambiar el ancho de valores. Por ejemplo 3950 Esto no está permitido 3951 unsigned int 7 x 3952 int 12 y 3953 y = int 12 x //Not permitido 3954 En su lugar la conversión puede hacerse explícitamente 3955 y = int 12 0 @ x 3956 Aquí la operación de concatenación produce un valor de 12 bits sin signo. El casting a continuación esto cambia a un entero de 12 bits con signo de asignación a y. Una vez más esto es asegurar que el programador es consciente de estas conversiones. Para ilustrar por qué es importante considere el siguiente ejemplo int dufgw 7 x 3958 unsigned int 12 y 3959 x =-5 y 3960 = unsigned int 12 x . 3961 Aquí el compilador de c de Handel podría tomar dos rutas igualmente viables. Una sería firmar ampliar el valor de x y producir el resultado 4091. La segunda sería en cero el valor de x de pad y producir el valor de 123. Ya ni método puede preservar el valor de x en y Handel-C ni realiza automáticamente. Más bien se deja hasta el programador para decidir qué enfoque es correcto en una situación particular y escribir la expresión en consecuencia Función Introducción 3962 Funciones 3963 son similares a las funciones en ISO-C. Georg Friedrich Händel-C se ha ampliado para proporcionar arreglos de discos de funciones y funciones en línea. Arreglos de discos de funciones proporcionan varias copias de una función. Uno puede seleccionar qué copia se usa en cualquier momento. Funciones en línea son similares a las macros se expanden dondequiera que se utilizan. Funciones aceptan argumentos y valores devuelven. Una función que devuelve un valor es de tipo void. El tipo de valor devuelto predeterminado es int undefined. 3964 Cuando una función declara o definida tiene una lista de parámetros que describe el tipo de argumentos que espera recibir. Funciones que no tienen argumentos tienen nula como su lista de parámetros. Por ejemplo void main void 3965 Como en ISO-C argumentos que se pasan por valor de función. Esto significa que se crea una copia local que está sólo en el ámbito dentro de la función. Producen cambios en esta copia. Para acceder a una variable fuera de la función uno puede pasar la función de un puntero a la variable. Puede hacerse una copia local del puntero pero todavía puede señalar a la misma variable. Esto se conoce como pasar por referencia. Tipos de arquitectura construcciones de hardware pueden ser pasadas por referencia un puntero a o la dirección de la construcción . El tipo de sólo arquitectura que puede ser pasado a o devuelto por una función por valor es una señal. Todos los demás y las estructuras o sindicatos que las contengan pueden ser pasados por referencia. Matrices y funciones también sólo pueden ser pasados por referencia. Declaraciones y definiciones de función 3966 Funciones 3967 se definen como en ISO-C. La declaración de función consiste en el nombre de la función y los nombres y tipos de sus parámetros y devolver el valor. La definición de una función consiste en su declaración más el cuerpo del código que realiza cuando se le llama. 3968 returnType Name parameterList { USA declaraciones 3970 declaraciones 3971 3972 } 3973 Si la declaración es seguida por un punto y coma es un prototipo de función. Esto indica al compilador de los tipos de argumentos que la función espera por lo que puede comprobar que la función se utiliza correctamente en el resto del archivo. 3974 returnType Name parameterList 3975 Los nombres en un prototipo de función son sólo en el ámbito de aplicación en el prototipo. Uno puede utilizar nombres diferentes en la definición de la función y las llamadas a funciones. Funciones pueden declararse prototipo en cada archivo que se utilizan en aunque ellos sólo deben definirse una vez. Es común para poner prototipos de función en un archivo de encabezado y # incluir en cada archivo donde se utilizan. Ámbito de aplicación de 3976 No se pueden definir funciones 3977 dentro de otras funciones. De forma predeterminada las funciones son extern se pueden utilizar en cualquier lugar . Funciones también pueden definirse como estática que pueden ser utilizados en el archivo en el que se han definido . Arreglos de discos 3978 de funciones 3979 Una matriz de funciones es una colección de funciones idénticas. No es lo mismo que una matriz de punteros a función cada uno de cuyos elementos puede apuntar a una función diferente . Arreglos de discos de función permitan funciones copiar y compartir perfectamente. Aquí es una declaración de una función simple matriz func sin signo 3980 2 y sin signo x sin signo 3981 retorno x + y 3982 } 3983 La sintaxis es una declaración de la función normal con corchetes agregado para especificar que se trata de una declaración de matriz así como una declaración de la función. La forma general de una declaración de arreglo de discos de la función es 3984 returntype nombre tamaño parameterList 3985 También uno puede declarar una matriz de función en un prototipo. Esto significa que uno puede declarar una función func en un archivo y una matriz de funciones de tipo func en otro archivo 3986 void func n void Matriz de función A 3987 permite ejecutar diferentes copias de la función en paralelo. Sin esta construcción forma sólo segura de ejecutar una función en paralelo con la misma sería declarar explícitamente dos funciones con nombres diferentes. Esto no sería tan limpia e intuitiva. Ejemplo de 3988 reloj set 3989 = "P1" externos 3990 / / Función matriz prototipo unsigned func 2 y sin signo x sin signo 3991 / / Principal programa 3992 void main void 3993 } 3994 unsigned a b c d e f 3995 r1 corto sin signo r2 r3 r4 resultado sin signo 3996 par 3997 { 3998 3999 un = 12 b 4000 = 22 c 4001 = 32 d 4002 = 42 e 4003 = 52 f 4004 = 62 4005 } par 4006 { 4007 4008 r1 = func 0 a b 4009 r2 = func 1 c d 4010 } par 4011 4012 } 4013 r3 = func 0 e f r4 4014 = func 1 r1 r2 resultado 4015 = func 0 r3 r4 4016 / / Función de definición de matriz func sin signo 4017 2 y sin signo x sin signo { 4018 4019 retorno x + y Punteros a función 4020 4021 Son una característica muy potente pero potencialmente confusa. En situaciones donde se puede llamar una de una serie de funciones en un momento determinado es limpia y concisa para utilizar un puntero a función donde la alternativa puede ser una cadena larga if-else o una instrucción switch largo. Por ejemplo considere la posibilidad de este programa 4022 de verificación 1 sin signo short int * un short int * b 4023 1 sin signo * chk short int * short int * 4024 addeven 1 sin signo const short int * x const short int * y 4025 multeven 1 sin signo const short int * x const short int * y 4026 diveven 1 sin signo const short int * x const short int * y 4027 modeven 1 sin signo const short int * x const short int * y 4028 void main void { 4029 4030 short int m n elección de 2 sin signo 4031 1 resultado sin signo 4032 4033 1 sin signo * p corto const * const corto * par 4034 { 4035 m 4036 = 19 4037 n = 47 hacer 4038 { 4039 4040 conmutador opción { 4041 4042 caso 0 p 4043 = addeven salto de 4044 4045 caso 1 p 4046 = multeven salto de 4047 4048 caso 2 p 4049 = diveven salto de 4050 caso 4051 3. p 4052 = modeven salto de 4053 4054 } 4055 predeterminado salto de 4056 4057 } par 4058 { 4059 resultado 4060 = verificación m n p opción ++ 4061 }.Idioma de Handel-C 4062 } 4063 mientras opción demora 4064 4065 } 4066 de verificación 1 sin signo short int * un short int * b 4067 1 sin signo * chk short int * short int * { 4068 retorno 4069 * chk a b 4070 } 4071 adeven 1 sin signo const short int * x const short int * y { 4072 retorno 4073 sin signo * x + * y 0 4074 multeven 1 sin signo const short int * x const short int * y { 4075 retorno 4076 sin signo * x * * y 0 4077 } 4078 diveven 1 sin signo const short int * x const short int * y { 4079 retorno 4080 sin signo * x / * y 0 4081 } 4082 modeven 1 sin signo const short int * x const short int * y 4083 } retorno 4084 sin signo * x % * y 0 4085 La addeven de la función comprueba si la suma de dos números es incluso. Verificaciones similares se llevan a cabo por multeven producto de dos números diveven División y modeven módulo . La comprobación de la función simplemente llama a la función cuyo puntero que recibe con los argumentos que recibe. Esto proporciona una interfaz coherente a las funciones de xxxeven. Preste atención a la declaración de verificación y de la función de puntero p. Los paréntesis * p y * chk en la declaración de verificación son necesarias para que el compilador hacer la interpretación correcta. Punteros a función de técnicas de direccionamiento indirecto 4086 pueden ser asignado con o sin el operador de dirección similar a la asignación de direcciones de la matriz . Se pueden llamar funciones apuntados con o sin el operador de direccionamiento indirecto. En el código anterior el nombre de la función fue asignado al puntero sin la p 4087 = addeven 4088 Uno tal vez desee utilizar la formato para mayor claridad 4089 p = adeven Compruebe el interior 4090 se llama a la función apuntada por p escribiendo. 4091 * cbk a b 4092 Esto podría también haber escrito en forma abreviada chk a b 4093 4094 La primera forma es preferible ya que consejos frente a cualquiera que lea el código que se está utilizando un puntero a función. Interior 4095 el cuerpo principal del programa verificación fue llamado como este. 4096 verificación m n p 4097 Se podría haber escrito como este 4098 verificación m n xxxeven 4099 eliminando así la necesidad de una variable puntero adicionales. Aquí es la sección principal escrita usando esta forma de expresión 4100 void main void { 4101 4102 short int m n elección de 2 sin signo 4103 1 resultado sin signo 4104 par 4105 { 4106 m 4107 = 19 4108 n = 47 4109 } 4110 hacer { 4111 4112 conmutador opción 4113 caso 0 resultado 4114 = verificación m n adeven salto de 4115 4116 caso 1 resultado 4117 = verificación m n multeven salto de 4118 4119 caso 2 resultado 4120 = verificación m n diveven salto de 4121 4122 caso 3 resultado 4123 = verificación m n modeven salto de 4124 4125 predeterminado salto de 4126 4127 opción ++ 4128 } elección mientras que 4129 demora 4130 4131 Restricciones en funciones Código compartido 4132 Funciones 4133 no pueden ser compartidas por las dos partes diferentes del programa en el mismo ciclo de reloj. Por ejemplo 4134 int func x y par 4135 { 4136 4137 un = func b c { 4138 b 4139 = foo d 4140 = func e f / / NO PERMITIDO 4141 } 4142 } 4143 int func int x int y 4144 } 4145 if x == y demora de 4146 4147 else { 4148 4149 x = x % y 4150 } 4151 x * = 10 4152 retorno x 4153 } 4154 Esto no está permitido porque parte de la única función es utilizar dos veces en el mismo ciclo de reloj. Este uso superpuesto no es detectado por el compilador ya que es un error de tiempo de ejecución. Por lo tanto es responsabilidad del programador para garantizar que el uso de código no se superponen. Esto se puede hacer por declarar funciones a estar en línea se expanden cuando se utilizan o declarar una matriz de funciones uno que se utiliza en cada rama paralela. 4155 en línea int func x y par 4156 { 4157 tecnologías un = func b c { 4159 b 4160 = foo d 4161 = func e f 4162 } 4163 } 4164 o 4165 int func 3 x y par 4166 { 4167 4168 un = func 0 b c { ° 4169 b 4170 = foo d 4171 = func 1 e f 4172 } 4173 } 4174 Más detalles sobre el calendario de programas de Handel-C y más detalles de cómo uno puede decir que se realizan las operaciones de ciclo de reloj se establecerá sucesivamente más tarde. Recursividad 4175 4176 Debido a la ausencia de una pila de Handel-C funciones no pueden ser recursivo. Si una persona llama a una función dentro de cuerpo la función de ese el compilador genera un error Macros Introducción 4177 4178 Como se menciona en las secciones anteriores el código de origen de Handel-C compilador pasadas a través de un estándar c preprocesador antes de compilación lo que permite el uso de # definir definir constantes y macros de la forma habitual. Existen algunas limitaciones a este enfoque. Desde el preprocesador sólo se puede realizar la sustitución textual no se pueden expresar algunas construcciones de macro útiles. Por ejemplo no hay ninguna manera de crear macros de recursiva mediante el preprocesador. 4179 Handel-C proporciona soporte adicional de macro para permitir más potente de las macros a ser definido por ejemplo las expresiones de macro recursiva . Además Handel C soporta macros compartidas para generar una pieza de hardware que es compartida por un número de partes del programa general similar a la forma en que procedimientos permiten c convencional compartir una pieza de código entre muchas partes de un programa convencional. Esta sección de la presente descripción detalla cómo definir macros y hardware compartidos. Expresiones de macro 4180 Macros 4181 pueden usarse para reemplazar expresiones para evitar la repetición tedioso. Georg Friedrich Händel-C proporciona que algunos poderoso macro construye para permitir expresiones complejas a generarse simplemente. 4182 Expresiones constantes de Macro 4183 Las expresiones de la constante de macro son de dos tipos 4184 equivalente constante simple a # definir 4185 una expresión constante Constante de 4186 4187 Esta primera forma de la macro es una expresión simple. Por ejemplo 4188 macro expr DATA_WIDTH = 15 int 4189 DATA_WIDTH x 4190 Esta forma de la macro es similar a la # definir macros. Siempre DATA_WIDTH aparece en el programa la constante 15 se inserta en su lugar. Expresión constante 4191 4192 Para proporcionar una solución más general uno puede utilizar una expresión real. Por ejemplo 4193 macro expr sum= x+y @ y + z v 4194 = suma 4195 w = suma Expresiones de Macro con parámetros 4196 4197 FIG. 57A-2 ilustra un método 5750 para expresiones parametrizadas d'acuerdo con diversos personificaciones de l'invención presente. En general una pluralidad de primeras variables se definen en relación con anchuras variables. Véase operación 5752. Una pluralidad de variables de segunda también se definen sin referencia a la variables anchos como se indica en la operación 5754. En un aspecto de la presente invención las variables de la primeras y la segunda pueden incluirse en una biblioteca. 4198 Equipo código se compila a continuación incluyendo las variables primeras y segunda. Nota de operación 5756. Como tal el ancho variable de las variables de segundo puede inferirse de los variables anchos de las variables primeras. Véase operación 5758. En una encarnación de la presente invención puede deducirse el ancho variable de las variables de segundo durante una rutina que concilie las variables de primeras con las variables de segunda en la biblioteca. Como una opción se puede definir una relación entre las variables de la primeras y las segunda de las variables. 4199 En otro aspecto las primeras de las variables pueden definirse aún más con referencia a los tipos de datos pueden definir las variables de segunda sin referencia a los tipos de datos y los tipos de datos de las variables de segundo pueden inferirse de los tipos de datos de las variables primeras. En incluso otro aspecto de la invención presente las primeras de las variables pueden definirse aún más en relación con el tamaño de la matriz pueden definir las variables de segunda sin referencia al tamaño de la matriz y el tamaño de la matriz de las variables de segundo puede inferirse del tamaño de la matriz de las variables de la primeras. En otro aspecto las primeras de las variables pueden definirse aún más con referencia a la profundidad de la tubería pueden definir las variables de segunda sin referencia a la profundidad de la tubería y la profundidad de la canalización de las variables de segunda puede inferirse de la profundidad de la canalización de las variables de la primeras. 4200 Cabe señalar que el concepto anterior puede aplicarse en contextos más generales por los deseos del usuario. Por ejemplo una aplicación puede definirse con una primera variable donde el ancho de la primera variables es sin resolver. A partir de entonces la aplicación puede ser almacenada en una biblioteca y código informático puede ser compilado incluyendo la primera variable. En una encarnación de la presente invención una pluralidad de bibliotecas puede utilizarse para organizar los componentes funcionales de funciones predefinidas. 4201 Como tal el ancho variable de la primera variable puede resolverse como se utiliza la aplicación de cualquier manera deseada. Por ejemplo el ancho variable de la primera variable puede ser resueltas reglas predefinidas utiliza durante la compilación. Todavía una pluralidad de variables puede resolverse de forma dinámica durante la compilación. Todavía otra opción puede cambiar el ancho variable de la primera variable en respuesta a la compilación de una primera aplicación o una segunda aplicación. Como alternativa puede definirse la primera variable con ninguna referencia a un tipo de datos. En consecuencia el tipo de datos de la primera variable se resuelve dinámicamente como procede de la compilación. De forma similar puede definirse la primera variable sin referencia al tamaño de la matriz. Además el tamaño de la matriz de las variables de segundo puede resolverse dinámicamente durante la compilación como la primera variable es utilizada por una aplicación. 4202 Más información con respecto al concepto anterior ahora ser establecido en mayor detalle. Handel-C 4203 también permite que las macros con parámetros. Por ejemplo 4204 macro expr add3 x = x + 3 y=add3 z 4205 4206 Esto equivale al código siguiente 4207 y = z + 3 4208 Una vez más esta forma de la macro es similar a la # definir macros en que cada vez que se hace referencia a la macro de add3 se expande en la manera en que se muestra arriba. En otras palabras en este ejemplo una víbora se genera en hardware cada vez que se utiliza la macro de add3 . 4209 El operador Select Georg Friedrich Händel-C 4210 proporciona un operador seleccione ... que se utiliza en el sentido de 'Seleccione en tiempo de compilación'. Su uso general es seleccione la expresión la expresión la expresión aquí la primera expresión puede ser una constante de tiempo de compilación. Si la primera expresión se evalúa como true a continuación la Handel-C compilador reemplaza la expresión entera con la segunda expresión. Si la primera expresión se evalúa como false el compilador de c de Handel reemplaza la expresión entera con la segunda expresión. La diferencia entre esto y el los operadores se ilustra mejor con un ejemplo. 4211 w = ancho x == 4 y z 4212 Este ejemplo genera hardware para comparar el ancho de la variable x con w 4 y establecer el valor de y o z dependiendo de si este valor es igual a 4 o no. Esto es probablemente no lo que pretendía en este caso porque width x y 4 son constantes. Probablemente lo que se pretendía era para que el compilador comprobar si el ancho de x era 4 y a continuación simplemente sustituya la expresión toda arriba con y o z de acuerdo con el valor. Esto puede escribirse de la siguiente manera 4213 w = seleccione ancho x == 4 y z 4214 En este ejemplo el compilador evalúa la expresión primera y reemplaza toda la línea con cualquiera w = y o w = z . No se genera ningún hardware para el condicional. 4215 Un ejemplo más útil puede verse cuando las macros se combinan con esta característica. Por ejemplo ajustar 4216 macro expr n x = select width x 4217 lt n 0 @ x x lt -n 4218 4 sin firmar un 4219 5 sin signo b c de 6 sin signo 4220 b 4221 = ajustar un width b b 4222 = ajustar c width b 4223 Este ejemplo es de una macro que ecualiza anchos de variables en una asignación. Si el lado derecho de una asignación es más estrecho que el lado izquierdo del lado derecho puede rellenado con ceros en sus bits más significativos. Si el lado derecho es más amplio que la izquierda los bits menos significativos de la derecha pueden ser tomados y asignados a la izquierda. 4224 El operador seleccione ... se utiliza aquí para indicar al compilador para generar expresiones diferentes dependiendo de la anchura de uno de los parámetros a la macro. Las dos últimas líneas del ejemplo podrían haber escrito a mano lo siguiente b 4225 = 0 @ un b 4226 = c lt -5 4227 Sin embargo la macro viene en su propia si el ancho de uno de los cambios de variables. Por ejemplo supongamos que durante la depuración se descubre que la variable de un no basta amplia y debe ser de 8 bits de ancho para contener algunos valores utilizados durante el cálculo. Mediante el uso de la macro sería el único cambio necesario modificar la declaración de la variable una. El compilador luego reemplazaría la declaración b = 0 @ un con la b = un lt -5 automáticamente. 4228 Esta forma de macro también viene en útil es cuando se utilizan variables de ancho sin definir. Si se utiliza el compilador para inferir anchos de variables puede ser tedioso trabajar a mano que se forman de la asignación se requiere. Usando el operador seleccione ... de esta manera se genera la expresión correcta sin una necesidad de saber los anchos de las variables en cualquier etapa. 4229 Si select Sintaxis 4230 Declaración de ps de ifselect condición 4231 1 4232 else 4233 Declaración 2 ifselect 4234 comprueba el resultado de una expresión constante de tiempo de compilación en tiempo de compilación. Si la condición es verdadera se compila el siguiente bloque de código o declaración. Si es false se descarta y una condición de otra cosa puede ser compilada si existe. Así declaraciones toda pueden ser seleccionadas o descartadas en tiempo de compilación dependiendo de la evaluación de la expresión. 4235 La construcción de ifselect permite crear macros recursiva de forma similar para seleccionar. También es útil dentro de bloques replicadas de código como el índice de replicator es una constante de tiempo de compilación. Por lo tanto uno puede utilizar ifselect para detectar los elementos de la primeros y la últimos en un bloque replicado de código y construir oleoductos. Ejemplo de 4236 4237 int 12 un 4238 int 13 b c 4239 int undefined ifselect width a 4240 gt =width b c 4241 = un 4242 else c 4243 = b c 4244 está asignado a ya sea por un o b dependiendo de su relación de ancho. Ejemplo de tubería 4245 init sin signo 4246 q sin signo 4247 151 31 sin signo 4248 4249 init = 57 par 4250 r = 0 i lt 16 i ++ { 4251 ifselect r==0 4252 q 4253 r = init ifselect r==15 otra cosa 4254 ° 4255 out = q r-1 ° 4256 else q 4257 r = q r-1 4258 } Expresiones de Macro recursiva 4259 4260 A una seria limitación con macros preprocesador definen los definidos con # es su incapacidad para generar expresiones recursivas. Mediante la combinación de las macros de Handel-C los que se definen con macro expr y el operador seleccione ... ha señalado anteriormente las macros recursiva pueden utilizarse para simplemente expresar hardware compleja. Este tipo de macro es particularmente importante en Handel-C donde la forma exacta de la macro puede depender de la anchura de un parámetro a la macro. Por ejemplo se tiene una extensión de signo de una variable. Al asignar una variable firmada estrecha a una variable más amplia los bits más significativos de la variable amplia deben ser rellenados con el bit de signo MSB de la variable estrecha. Por ejemplo la representación de 4 bits de -2 es 0b 1110. Cuando se asigna a una variable amplia de 8 bits esto debería convertirse en 0b11111110. En contraste la representación de 4 bits de 6 es 0b0110. Cuando se asigna a una variable amplia de 8 bits esto debería convertirse en 0b00000110. En este ejemplo basta con el siguiente código int 4261 8 x 4262 int 4 y 4263 x = y 3 @ y 3 @ y 3 @ y 3 @ y 4264 Como se puede ver esto puede convertirse rápidamente en tedioso para las variables que difieren en un número significativo de bits. También ¿qué sucede si el ancho exacto de las variables no se conoce Lo que se necesita es una macro para firmar extender una variable. Por ejemplo 4265 macro expr copia n x = Seleccione 4266 n == 1 x x @ copia x n-1 4267 macro expr extender y m = 4268 copia y ancho y -1 m-width y @ y int 4269 4270 int b / / Donde b sabe que es más amplio que un b 4271 = extender un width b 4272 Aquí la macro de copia genera copias n de la expresión x concatena juntos. La macro es recursiva y utiliza el operador seleccione ... para evaluar si está en su última iteración en el que caso sólo evalúa la expresión o si debe continuar a efectuar recursividad por un mayor nivel. La macro extend concatena simplemente el bit de signo de sus tiempos de m-k de parámetro en los bits más significativos del parámetro. Aquí m es el ancho requerido de la expresión y y k es el ancho real de la expresión y. La asignación final correctamente signo extiende al ancho de b para cualquier ancho variable donde width b es mayor que width a . Expresiones de Macro recursiva 4273 un ejemplo más 4274 A segundo ejemplo del uso de las expresiones de macro recursiva se da ahora para ilustrar la generación de grandes cantidades de hardware de macros simples. El ejemplo utilizado es que de un multiplicador cuya anchura depende de los parámetros de la macro. Aunque Handel-C incluye un operador de multiplicación como parte de la lengua este ejemplo sirve como punto de partida para generar estructuras de hardware regular gran uso de macros. 4275 El multiplicador genera el hardware para un único ciclo de operación de multiplicación larga desde una macro única. El código fuente es 4276 macro expr multiplicar x y = Seleccione 4277 ancho x == 0 0 multiply x.backslash.. 4278 barra invertida. 1 y lt lt 1 + 4279 x 0 == 1 y 0 4280 un = multiplicar b c 4281 En cada etapa de la recursividad el multiplicador comprueba si el bit de la parte inferior del parámetro x es 1. Si es y se agrega a la 'ejecución total'. A continuación el multiplicador recurses colocando la LSB de x y multiplicar y por 2 hasta que no hay ningún bit dejaron en x. El resultado global es una expresión que es la suma de cada bit en x multiplicado por y. Se trata de la estructura familiar de multiplicación larga. Por ejemplo si ambos parámetros son 4 bits de ancho la macro se expande para 4282 un = b .backslash...barra invertida. ¿3 0 == 1 c lt lt 3 0 + 4283 b .backslash...barra invertida. ¿2 0 == 1 c lt lt 2 0 + 4284 b .backslash...barra invertida. ¿1 0 == 1 c lt lt 1 0 + 4285 b 0 == 1 c 0 4286 Este código equivale a 4287 un = b 8 == 8 c * 8 0 + ¿ 4288 b 4 == 4 c * 4 0 + 4289 b 2 == 2 c * 2 0 + 4290 b 1 == 1 c 0 4291 que es un cálculo de multiplicación larga estándar. Expresiones compartidas 4292 4293 De forma predeterminada Handel-C genera todo el hardware necesario para cada expresión en todo el programa. En muchos programas esto significa que gran parte del hardware puede estar inactivo durante largos períodos. La expresión compartida permite hardware compartirse entre las diferentes partes del programa para disminuir el uso de hardware. La expresión compartida tiene el mismo formato que la expresión de una macro pero no permite recursividad. Un programa de ejemplo donde expresiones compartidas son extremadamente útiles es 4294 un = b * c d 4295 = e * f g 4296 = h * i 4297 Aquí se pueden generar tres multiplicadores pero cada uno sólo pueden utiliza una vez y ninguno de ellos simultáneamente. Esto es una pérdida masiva de hardware. La forma de mejorar este programa es 4298 mult de expr compartida x y = x * y 4299 un = mult b c d 4300 = mult e f g 4301 = mult h i 4302 En este ejemplo sólo un multiplicador se construye y se utiliza en cada ciclo de reloj que es un mejor uso del hardware. De hecho el ejemplo anterior podría construirse como tres multiplicadores de la ejecución en paralelo el rendimiento máximo se requiere . 4303 No es siempre el caso que se genera menos hardware mediante el uso compartido expresiones porque multiplexores deba ser construido para enrutar las rutas de acceso de datos. Algunas expresiones utilizan menos hardware que los multiplexores asociada a la expresión compartida. 4304 Utilizando la recursividad para generar comparte las expresiones 4305 Aunque expresiones compartidas no pueden utilizar directamente recursión expresiones de macro pueden utilizarse para generar el hardware que puede ser compartido a continuación utilizando una expresión compartida. Por ejemplo para compartir el ejemplo de macro de multiplicador recursiva por encima de uno podría escribir 4306 macro expr multiplicar x y = Seleccione 4307 ancho x == 0 0 4308 multiplicar x .backslash...barra invertida. 1 y lt lt 1 + 4309 x 1 0 y 0 4310 mult de expr compartida x y = multiplicar x y 4311 un = mult b c d 4312 = mult e f 4313 Aquí la expresión de la macro construye un multiplicador y la expresión compartida permite ese hardware para ser compartida entre las dos asignaciones. 4314 Restricciones sobre expresiones compartidas 4315 A limitación a expresiones compartidas es que puede no ser compartidas por dos diferentes partes del programa en el mismo ciclo de reloj. Por ejemplo 4316 mult de expr compartida x y = x * y par 4317 { 4318 4319 un = mult b c d 4320 = mult e f / / no permitido 4321 } 4322 Esto no está permitido porque el multiplicador único se usa dos veces en el mismo ciclo de reloj. Esto se convierte en una habilidad importante al utilizar expresiones compartidas. let 4323 .. .en Construcciones de la Handel-C 4324 permiten y en permitan uno declarar las expresiones macro dentro de las expresiones de macro. De esta manera las macros complejas pueden desglosarse en más simples mientras que todavía se agrupan juntos en un solo bloque de código. También proporcionan fácil intercambio de macros recursiva. La palabra clave que inicia la declaración de una macro local la palabra clave en termina la Declaración y define su ámbito de aplicación. Ejemplo de 4325 4326 macro expr Fred x = 4327 macro que expr y = x * 2 en 4328 y + 3 //Returns x * 2 + 3 4329 La línea superior define el nombre de la macro y parámetros. La segunda línea define y dentro de la definición de la macro. La última línea expresa el valor de la macro en su totalidad. Let independiente 4330 .. .en definiciones 4331 macro expr op a b = 4332 macro que expr t2 x = x * 2 en 4333 macro que expr d3 x = x / 3 en 4334 macro que expr t4 x = x * 4 en 4335 t2 a +d3 b + t4 a - b + t2 b-a versión 4336 es equivalente a la escritura 4337 macro expr op a b = a * 2 + + a-b b /3 * 4 + 4338 b-a * 2 Let relacionados 4339 .. .en definiciones 4340 macro expr op a b = 4341 suma de expr macro let x y = x + y en 4342 mult de expr macro let x y = x * suma x y en 4343 mult a b - b * b 4344 suma se define dentro de la definición de la macro y a continuación mult se define mediante suma de 4345 . Este ejemplo es equivalente a 4346 macro expr op a b = un * un + b - b * b Macro de recursiva compartido 4347 4348 A recursiva multiplicador que ilustra la forma en que puede utilizarse let... en compartir las macros recursiva. 4349 mult de expr compartida p q = expr 4350 de macro permiten multiplicar x y = Seleccione 4351 ancho x == 0 0 multiplicar x .backslash...barra invertida. 1 y lt lt 1 4352 + x 0 == 1 y 0 en 4353 multiplicar p q . Procedimientos de macro 4354 Macros 4355 puede utilizarse para reemplazar las declaraciones para evitar la repetición de tediosa. Georg Friedrich Händel-C proporciona macro simple construye para ampliar el único declaraciones en complejos de bloques de código. La sintaxis general de los procedimientos de la macro es 4356 macro proc declaración de Name Params 4357 Por ejemplo 4358 macro proc salida x y { 4359 4360 out x 4361 out y 4362 } salida 4363 a + b c * d salida 4364 a + b c * d 4365 Este ejemplo escribe las dos expresiones a + b y c * d dos veces al canal de salida. Este ejemplo también muestra que la declaración puede ser un bloque de código en este caso dos instrucciones ejecutadas secuencialmente. Macro procedimientos generan el hardware para su declaración cada vez se hace referencia. El ejemplo anterior se expande a declaraciones de salida de canal 4. Procedimientos de macro difieren de las macros de preprocesador en que no son reemplazos de texto simple. La sección de la declaración de la definición puede ser una declaración de Handel-C válida. Por ejemplo 4366 # define test x y si x = y lt lt 2 test a b 4367 { 4368 4369 un ++ 4370 } 4371 else { 4372 4373 b ++ 4374 } 4375 Es una definición de macro de preprocesador válida. Sin embargo no está permitido el siguiente código 4376 macro proc test x y si x = y lt lt 2 test a b 4377 / / no permitido { 4378 4379 un ++ 4380 } else { 4381 4382 b ++ 4383 } 4384 Aquí el procedimiento de macro no se define como una declaración completa por lo que el compilador de c de Handel genera un error. Esta restricción proporciona protección contra escritura de código como estos ejemplos que generalmente es ilegible y difícil de mantener. Prototipos de macro 4385 4386 Como con funciones macros pueden ser prototipo. Esto permite declararlos en un solo archivo y utilizarlos en otro. Un prototipo de macro consiste en el nombre de la macro más una lista de los nombres de sus parámetros. Por ejemplo 4387 macro proc trabajo x y expr compartido 4388 mult p q .Calendario 10 y la información de eficiencia. Información de temporización Introducción 4389 Programa de Handel A-c 4390 se ejecuta con una fuente de reloj para cada declaración principal. Es importante saber exactamente qué partes del código que ejecutan ciclos de reloj. Esto no sólo es importante para la escritura de código que se ejecuta en menos ciclos de reloj pero puede significar la diferencia entre código correcta e incorrecta al utilizar el paralelismo de Handel-C. Saber acerca de ciclos de reloj también se convierte en importante cuando se considera interfaces de hardware externo. Este tema está cubierto con mayor detalle más adelante pero es importante comprender los problemas de sincronización antes de pasar a la implementación de dichas interfaces porque es probable que el dispositivo externo puede colocar restricciones acerca de cuándo señales debe cambiar. 4391 Esta sección de la presente descripción también trata el tema de rendimiento general. Se deberá observar que evitar ciertas construcciones ha una influencia dramática en el reloj de la máxima velocidad que la Handel-C puede ejecutar el programa en y se dan algunas pautas para mejorar el rendimiento de hardware. Se da un ejemplo que cubre las consideraciones para las limitaciones de tiempo real en un sistema. Construcciones de temporización de ciclo de reloj 4392 de idioma 4393 Esta sección trata sobre el análisis de un programa en términos del número de ciclos de reloj que se tarda en ejecutar. El lenguaje de Handel-C ha sido diseñado para que un programador experimentado puede decir inmediatamente qué instrucciones se ejecutan en el que los ciclos de reloj. Esta información se vuelve muy importante cuando el programa contiene múltiples procesos paralelos de interacción. Temporización de declaración 4394 4395 La regla básica para trabajar el número de ciclos utilizados en un programa de Handel-C es Asignación 4396 y demora toman 1 ciclo de reloj. 4397 Todo lo demás es libre. 4398 Lo que esto significa es que cada vez que uno escribe una instrucción de asignación o una declaración de demora uno utilizar un ciclo de reloj pero uno puede escribir cualquier pieza de código y no utilizar cualquier ciclos de reloj para ejecutarlo. La única excepción es el canal de comunicación que tiene un ciclo de reloj sólo si ambas partes están listas para comunicarse en el mismo dominio de reloj. Esto significa que si una rama paralela está listo para cuando otra rama está lista para recibir a continuación toma un reloj de salida en un canal de ciclo que asignar a la variable en la instrucción de la entrada de los datos. En caso de que una de las ramas no está lista para la transferencia de datos después de la ejecución de la otra rama espera hasta que ambas ramas se convierten en listos. Incluso si ambas ramas están listos para la transferencia de un ciclo de reloj se utiliza porque canal de entrada es una forma de la cesión. A continuación se muestran algunos ejemplos simples con sus tiempos. Declaraciones 4399 4400 x = y 4401 x = y * z + w *v lt lt 2 lt -7 4402 Cada una de estas declaraciones toma un ciclo de reloj. Observe que incluso los más complejo expresión se puede evaluar en un ciclo de reloj único. Georg Friedrich Händel-C simplemente construye el hardware combinatorio para evaluar tales expresiones no necesitan desglosarse en instrucciones de montaje más simples como sería el caso de C. convencional Declaraciones paralelas 4403 par 4404 { 4405 4406 x = y 4407 un = b * c 4408 Este código se ejecuta en un único ciclo porque cada rama de la declaración paralela toma sólo un ciclo. Este ejemplo ilustra los beneficios de paralelismo. Uno puede tener tantas instrucciones no interdependientes como él o ella desea en las ramas de una declaración paralela. El tiempo total de ejecución es la longitud de tiempo que tarda la rama más larga en ejecutar. Por ejemplo par 4409 { 4410 4411 x = y { 4412 4413 un = b c 4414 = d 4415 } 4416 } 4417 Este código tiene dos ciclos de reloj para ejecutar. En el primer ciclo x = y y un = b tendrá lugar. En el segundo ciclo de reloj c = d tiene lugar. Dado que ambas ramas de la declaración de par pueden completar antes de que pueda completar el bloque de par los retrasos de rama primeros para un reloj ciclo mientras se ejecuta la instrucción de segunda en la segunda rama. 4418 Mientras que el bucle x 4419 = 5 tiempo 4420 x gt 0 { 4421 4422 x 4423 } 4424 Este código tiene un total de 6 ciclos de reloj para ejecutar. Un ciclo es tomado por la asignación de 5 x. Cada iteración del mientras el bucle toma 1 ciclo de reloj para la asignación de x-1 x y el cuerpo del bucle se ejecuta 5 veces. La condición del mientras el bucle no toma ningún reloj ciclos como ninguna asignación está involucrada. 4425 Bucle for pequeño para x = 0 x lt 5 x ++ { 4427 4428 una b += b 4429 * = 2 4430 } 4431 Como se explicó anteriormente este código tiene un equivalente casi directo { 4432 x 4433 = 0 tiempo 4434 x lt 5 { 4435 4436 una b += b 4437 * = 2 4438 x ++ 4439 } 4440 Este código tiene 16 ciclos de reloj para ejecutar. Es necesario para la inicialización de x y tres para cada ejecución del cuerpo. Dado que el cuerpo se ejecuta 5 veces esto da un total de 16 ciclos de reloj. Decisión 4441 Si 4442 un lt b . { 4443 4444 x = a 4445 } 4446 else { 4447 4448 x = b 4449 } 4450 Este código tiene exactamente un reloj ciclo a ejecutar. Sólo una de las ramas de la si se ejecuta la instrucción o bien x = un o x = b. Cada una de estas asignaciones toma un ciclo de reloj. Observe otra vez que no hay tiempo se toma para la prueba porque no se realiza ninguna asignación. Es un ejemplo ligeramente diferente Si 4451 un gt b . { 4452 x 4453 4454 } 4455 Aquí si una es no es mayor que b no hay ninguna otra rama. Este código tiene por lo tanto cada ciclo de 1 reloj si una es mayor que b o no ciclos de reloj si una no es mayor que b. Canales 4456 4457 De comunicaciones de canal son más complejas. El ejemplo más simple es par 4458 { 4459 4460 enlace x / / transmitir ¿ 4461 vínculo y / / recibir 4462 } 4463 Este código tiene un ciclo de reloj solo ejecutar porque las ramas transmisoras y receptoras están listas para transferir al mismo tiempo. Todo lo que se requiere es la asignación de x a y que como todas las asignaciones toma 1 ciclo de reloj. Un ejemplo más complejo es par 4464 { 4465 4466 {/ / Paralelo rama 1 4467 un = b c 4468 = d 4469 enlace x 4470 } ¿ 4471 vínculo y / / paralelo de la rama 2 4472 Aquí la primera rama de la declaración de par toma tres ciclos de reloj para ejecutar. Sin embargo la segunda rama de la declaración de par también toma tres ciclos de reloj para ejecutar porque puede esperar para dos ciclos antes de la rama de transmisión esté lista. El uso de ciclos de reloj es como sigue Rama de ciclo 13 1 subdivisión 2 1 un = b demora 2 c = d retraso entrada de canal de salida de canal 3 4473 Este enfoque se extiende a todas las declaraciones de Handel-C. HIGOS. 58A y 58B ilustran un resumen 5800 de intervalos de la declaración de conformidad con una encarnación de la invención presente. 4474 Evitar bucles combinatorios 4475 Considere el siguiente ejemplo tiempo 4476 x = 3 / / advertencia 4477 Si x es modificado en un proceso paralelo a continuación este bucle debe esperar para que x para convertirse en 3 antes de permitir que el programa para continuar. Sin embargo este código no se permite en Handel-C porque genera un bucle combinatorio en la lógica debido a la forma en que las expresiones de Handel-C se construyen para evaluar en ciclos de reloj de cero. Esto es más fácil de ver si uno escribe como tiempo 4478 x = 3 { 4479 4480 / / esperar hasta x == 3 4481 } 4482 Este bucle puede ser roto por cambiar el código para tiempo 4483 x = 3 { 4484 demora de 4485 4486 Este bucle ya no tarda en ejecutar que el otro pero no contiene un bucle combinatorio a causa de la demora de ciclo de reloj en el cuerpo del bucle. El compilador de c de Handel puede manchas esta forma de error insertar la declaración de demora y generar una advertencia. Se considera una mejor práctica para incluir la declaración de la demora en el código para que sea explícito. Tenga cuidado de código que puede tener un aspecto correcto pero tiene el mismo error. Por ejemplo tiempo 4487 x = 3 { 4488 Si 4489 y gt z { 4490 4491 un ++ 4492 } 4493 } 4494 Como visto anteriormente esto si declaración puede tener cero reloj ciclos a ejecutar si y no es mayor que z por lo que a pesar de que este cuerpo del bucle no parece vacío un bucle combinatorio todavía se genera. Una vez más esto es más obvio escrito como tiempo 4495 x = 3 { 4496 Si 4497 y gt Z { 4498 4499 un ++ 4500 } 4501 else { 4502 4503 / / no hacer nada 4504 } 4505 } 4506 La solución en este ejemplo es agregar a la otra parte de la si construir como sigue tiempo 4507 x = 3 { 4508 Si 4509 y gt z { 4510 4511 un ++ 4512 } 4513 else { 4514 demora de 4515 4516 } 4517 } 4518 Problemas similares se producen con los bucles while y cambiar de declaraciones en circunstancias similares. Además para bucles con ninguna iteración paso puede causar bucles combinatorios. Acceso en paralelo a las Variables 4519 4520 Como se explicó anteriormente alcance y uso compartido de variable las normas del Estado de paralelismo que no pueda accederse a la misma variable de dos separan ramas paralelas. Esta regla está allí para evitar conflictos de recursos sobre las variables. Sin embargo si se tiene cuidado a continuación esta regla puede estar relajada al Estado que la misma variable no puede estar asignada a más de una vez en el mismo ciclo de reloj pero se podrá leer tantas veces como sea necesario. El análisis presentado en esta sección de la descripción actual permite al programador determinar precisamente cuando una asignación puede tener lugar y evitar esos conflictos. 4521 Esta relajación permite algunas técnicas de programación poderosos y útiles. Por ejemplo par 4522 { 4523 4524 un = b b 4525 = un 4526 } 4527 Este código intercambia los valores de un y b en un ciclo de reloj único. Dado que tiempo exacta de ejecución puede ser dependiente de tiempo de ejecución la Handel-C compilador no puede determinar cuando se realizan las dos asignaciones a la misma variable en el mismo ciclo de reloj. Por lo tanto uno debe comprobar el código para asegurarse de que el estado relajado de paralelismo es todavía obedecía. Mediante esta técnica se puede escribir una cola de cuatro lugar while 1 4528 { 4529 par 4530 { 4531 4532 int x 3 4533 x 0 = en 4534 x 1 = x 0 4535 x 2 = x 1 a = 4536 x 2 4537 } 4538 } 4539 Aquí el valor de salida es el valor de en retrasado por 4 ciclos de reloj. En cada ciclo de reloj valores pueden mover un solo lugar a través de la matriz de x. 59 Fig. ilustra diversos de I/O de 5900 basado en los ciclos de reloj con arreglo a una encarnación de la invención presente. Utilizar 4540 múltiples simultáneos de los RAMs y ROMs 4541 Beware del código siguiente ¿ 4542 x = y gt z RamA 1 RamA de 2 4543 Este código no se ejecuta correctamente debido a la utilización múltiple de la RAM en la expresión. 4544 La solución es volver a escribir el código como sigue 4545 x = RamA y gt z 1 2 4546 Aquí hay sólo un único acceso a la RAM por lo que el problema no se produce. Ejemplo de calendario detallado de 4547 4548 Aquí es un ejemplo analizado que genera señales atadas a las restricciones del mundo real. El ejemplo utilizado es la generación de señales para un reloj de tiempo real. Las señales necesarias arco para microsegundos segundos minutos y horas. El hardware generado eventualmente puede ser expulsado de un reloj externo. Para escribir el programa la tasa de este reloj puede ser conocida por lo que se supone un valor de 5 MHz. El programa de Handel-C se muestra a continuación. 4549 El cuerpo del bucle tiene un ciclo de reloj para ejecutar. La variable de recuento se utiliza para dividir el reloj por 5 para generar incrementos microsegundo. Como cada variable se ajusta ronda a cero se incrementa el siguiente paso de tiempo arriba. 4550 void main void { 4551 4552 sin signo 20 microsegundos 4553 sin signo 6 segundos 4554 sin signo 6 minutos . 16 horas sin signo 4555 4556 3 sin signo contar par 4557 { 4558 Conde 4559 = 0 Microsegundos 4560 = 0 4561 Segundos = 0 Minutos 4562 = 0 Horas de 4563 = 0 4564 } 1 mientras que 4565 { 4566 Si 4567 conde = 4 4568 Conde ++ 4569 else par 4570 { 4571 Conde 4572 = 0 Si 4573 microsegundos = 999999 4574 Microsegundos ++ 4575 else par 4576 { smás Microsegundos 4578 = 0 Si 4579 segundos = 59 4580 Segundos ++ 4581 else par 4582 { 4583 4584 Segundos = 0 Si 4585 minutos = 59 4586 Minutos ++ 4587 else par 4588 { 4589 Minutos 4590 = 0 4591 Horas ++ 4592 } 4593 } 4594 } 4595 } 4596 } 4597 Tiempo eficiencia de Hardware de Handel-C Georg Friedrich Händel-C 4598 requiere que el período de reloj para un programa es más largo que la ruta más larga a través de la lógica combinatoria en todo el programa. Esto significa que por ejemplo una vez que se completó la ruta y el lugar FPGA el máximo rango de tiempo para que el sistema puede calcularse a partir el recíproco de la demora de ruta más larga en el circuito. Por ejemplo supongamos que el lugar FPGA y ruta herramientas calcular que la demora de ruta más larga entre los biestables en un diseño es de 70 ns. El máximo rango de tiempo que se debe ejecutar en ese circuito es entonces {fracción 1/70 } ns = 14 3 MHz. Pero ¿qué pasa si este calculado tasa no es lo suficientemente rápido como para las restricciones de rendimiento o en tiempo real del sistema En esta sección se ocupa de las optimizaciones que pueden hacer que el programa para reducir el retraso más largo de la ruta y aumentar la velocidad máxima posible. Profundidad de reducción de la lógica de 4599 4600 Al diseñar programas de Handel-C es importante recordar que las operaciones que se combinan para producir lógica profunda. Lógica profunda como resultado retrasos de larga trayectoria en el circuito final para que la reducción de la profundidad de la lógica debería ayudar a aumentar la velocidad de reloj. Ahora se dará algunas directrices para la reducción de la profundidad de la lógica. 1 4601 . Operador de división y módulo produce la lógica más profunda. Multiplicación también produce lógica profunda. Un único ciclo de brecha mod o multiplicador produce una gran cantidad de hardware y largas demoras a través de la lógica profunda por lo que uno debe evitar usarlos siempre que sea posible. 2 4602 . División y multiplicaciones más comunes se pueden hacer con los operadores de desplazamiento. También considere el uso de una multiplicación larga con un bucle cambiar y añadir la rutina o un multiplicador segmentado. 3 4603 . Las operaciones más comunes de módulo se pueden hacer con el y operador. 4 4604 . Las víboras de la amplia requieren lógica profunda para el rizo de acarreo. Considere el uso de ciclos de reloj más con las víboras más cortas. Por ejemplo para reducir una víbora amplia único de 8 bits a 3 víboras más estrechas 4605 sin signo de 8 x 4606 8 sin firmar y 4607 temp1 5 sin signo 4608 temp2 4 sin signo par 4609 { 4610 temp1 4611 = 0 @ x lt -4 + 0 @ y lt -4 temp2 4612 = x.backslash..backslash.4 + y .backslash...backslash.4 4613 } x= temp2+ 0@temp1 4 4614 @ temp1 3 0 4615 5. Evitar mayor y menos de comparaciones que producen profunda lógica. Por ejemplo tiempo 4616 x lt y { 4617 4618 ...... 4619 x ++ 4620 } 4621 se pueden reemplazar con tiempo 4622 x = y { 4623 4624 ...... 4625 x ++ 4626 } 4627 El = lt = y lt = comparaciones producen mucho menos profunda lógica aunque en algunos casos es posible eliminar la comparación por completo. Considere el siguiente código 4628 sin signo de 8 x x 4629 = 0 4630 hacer { 4631 4632 ..... 4633 x = x + 1 4634 } while x = 0 4635 Este código repite el cuerpo del bucle 256 veces pero puede ser reescrita como sigue 4636 unsigned x 9 x 4637 = 0 hacer 4638 { 4639 4640 ...... 4641 x = x + 1 4642 } while x 8 4643 Por ampliación x por un único bit y sólo compruebe el bit superior uno puede quitar una comparación de 8 bits. 4644 6. Reducir las expresiones complejas en una serie de etapas. Por ejemplo 4645 x = un + b + c + d + e + f + g + h 4646 reduce a par 4647 { 4648 temp1 4649 = un + b temp2 4650 = c + d 4651 temp3 = e + f 4652 temp4 = g + h 4653 } par 4654 { 4655 4656 temp1 = temp1 + temp2 4657 temp3 = temp3 + temp4 4658 } 4659 x = temp1 + temp3 4660 Este código toma tres ciclos de relojes frente a uno pero cada ciclo de reloj es mucho más corto y por lo tanto debe acelerarse el resto del circuito por la más rápida velocidad permitida. 7 4661 . Evitar cadenas largas de declaraciones vacías. Declaraciones vacías como resultado de por ejemplo otra falta condiciones desde si declaraciones. Por ejemplo Si 4662 un gt b . 4663 x ++ 4664 if b gt c 4665 x ++ Si 4666 c gt d 4667 x ++ Si 4668 d gt e 4669 x ++ Si 4670 e lt f 4671 x ++ 4672 Si ninguna de estas condiciones se cumple entonces todas las comparaciones podrán realizarse en el ciclo de reloj. Rellenando las instrucciones else con retrasos el largo camino a través de todos estos si declaraciones pueden dividirse a costa de tener cada uno si declaración toma un ciclo de reloj si la condición es verdadera o no. Pipelining 4673 4674 Forma clásica para aumentar la velocidad de reloj de hardware es a la tubería. Un circuito canalizado toma más de un ciclo de reloj para calcular cualquier resultado pero puede producir un resultado en cada ciclo de reloj. El comercio fuera es una latencia mayor para un mayor rendimiento por lo que sólo es eficaz si hay una gran cantidad de datos que se procesarán no es práctico para los cálculos de solo el fraccionamiento. A continuación se da un ejemplo de un multiplicador segmentado. Resumen de 8 sin signo 4675 8 8 sin signo 4676 a 8 8 sin signo 4677 b 8 4678 chanin inputa 4679 chanin inputb 4680 chanout de salida par 4681 { 4682 while 1 4683 ¿ 4684 inputa 0 while 1 4685 ¿ 4686 inputb b 0 while 1 4687 salida de 4688 suma 7 while 1 4689 { 4690 par 4691 { 4692 4693 macro proc level x par 4694 { 4695 suma 4696 x = suma x -1 + 4697 a x 0 ==0 0 b x 4698 un x = un x -1 gt gt 1 b 4699 x = b x -1 lt lt 1 4700 } sum 0 = a 0 0 ==0 4701 0 b 0 level 1 4702 level 2 4703 level 3 4704 level 4 4705 level 5 4706 level 6 4707 level 7 4708 4709 } 4710 } 4711 } 4712 Este multiplicador calcula los 8 LSBs del resultado de un 8 bits por 8 bits multiplicar utilizando multiplicación larga. El multiplicador produce un resultado por ciclo de reloj con una latencia de 8 ciclos de reloj. Esto significa que aunque cualquier una resultado toma 8 ciclos de reloj uno obtiene un rendimiento de 1 multiplicar por ciclo de reloj. Dado que cada etapa de la tubería es muy simple lógica combinatoria es poco profundo y una velocidad de reloj mucho más alta se consigue que sería posible con un multiplicador de ciclo único completo. En cada ciclo de reloj resultados parciales se pasan a través de cada etapa del multiplicador de la matriz de la suma. Cada etapa se agrega en 2 n multiplicado por el operando b si es necesario. La LSB de la un operando en cada etapa le dice la etapa de multiplicar si desea agregar este valor o no. Las etapas se generan con un procedimiento de macro para evitar la tediosa repetición de código. 4713 Operandos son alimentados en cada ciclo de reloj a través de un 0 y b 0 . Los resultados aparecen 8 ciclos de reloj más tarde en cada ciclo de reloj a través de suma 7 ...11 De Targeting hardware. Introducción 4714 4715 Las secciones anteriores han cubierto la mayoría de los aspectos de los programas de escritura Handel-C. Lo que aún no ha sido examinado es cómo obtener datos dentro y fuera de esos programas. Una importante ventaja del hardware personalizado que se puede producir con Georg Friedrich Händel-C es su capacidad para interactuar directamente con componentes externos como la RAM autobuses personalizados y no personalizados. Esta sección de la descripción actual se ocupa de obtener datos en entrada y salida desde el programa de Handel-C. Comienza con una discusión de utilizar el simulador con el compilador de c de Handel para que el programa es correcto y a continuación describe interactuar con dispositivos de hardware real conectados a los pines del chip que contiene el hardware. El simulador ejecuta programas de Handel-C en la compilación de la máquina sin necesidad de ningún hardware adicional. Permite la salida a la pantalla o en un archivo y entrada desde el teclado o un archivo. Es una poderosa herramienta que permite que los programas a ser prueban cuidadosamente antes de que se fabrica hardware personalizado. Mientras que ninguna plataforma de hardware específico se detalla aquí se dan varios ejemplos de interconexión con hardware teórico. 4716 Interactuar con el simulador 4717 Esta sección de la descripción actual cubre la forma en que el programa se comunica con el simulador. Esto permite depurar con datos reales. Ejemplos de código se establecen en el presente documento. Comunicación con el simulador tiene lugar a través de canales. Se declaran utilizando las palabras clave chanin y chanout. Se supone que los canales de simulación nunca bloquean y siempre pueden completar la transferencia de un ciclo de reloj. 4718 De canales de simulador se declaran utilizando chanin y chanout en lugar de chan Canales de más de transferencias 4719 4720 La chanin canales especiales y chanout pueden definirse para introducir la información del simulador y salida de información hacia el simulador. Estos canales normalmente están conectados a los archivos aunque un canal inconexos que salidas de datos para el simulador puede mostrarse en la ventana de depuración. Por ejemplo chanin 4721 unsigned entrada con {infile = ".../ Data/source.dat "} chanout 4722 sin signo de salida ¿ 4723 entrada x salida de 4724 y 4725 Este ejemplo declara dos canales uno para la entrada del simulador y uno para la salida para el simulador. El canal de entrada se conecta a un archivo administrado por el simulador el canal de salida se conecta con salida estándar la ventana de depuración en la GUI de Handel-C estándar de canal comunicación del simulador declaraciones pueden utilizarse para transferir datos. Uno puede declarar múltiples canales de entrada y salida. Por ejemplo 4726 chanin int 8 input.sub. 1 con 4727 {infile = ".../ Data/source.sub. 1.dat "} 4728 chanin int 16 input.sub. 2 con 4729 {infile = ".../ Data/source.sub. 2.dat "} sin signo 4730 chanout 3 output.sub. 1 4731 chanout char output.sub. 2 ¿ 4732 input.sub. 1 un ¿ 4733 input.sub. 2 b 4734 output.sub 1. 3 sin signo 0 @ un + b lt - 3 4735 output.sub. 2 un 4736 Cuando simulado dicho programa muestra el nombre de canales antes de la salida de su valor en la pantalla del ordenador simulación. Formato de archivo de entrada de simulador de 4737 4738 El archivo de entrada de datos debe tener un número por línea separado por caracteres de nueva línea pueden utilizar archivos de texto de formato DOS o Unix . Cada número puede estar en cualquier formato que se utiliza normalmente para las constantes Handel-C. Por ejemplo 56 4739 4740 0x34 0654 4741 0b001001 4742 Transferencias de datos de bloque 4743 Simulador de la Handel-C 4744 tiene la capacidad de leer datos de un archivo y escribir los resultados en otro archivo. Por ejemplo 4745 chanin int 16 de entrada con {infile="in.dat}" 4746 chanout int 16 salida con {outfile="out.dat"} 4747 void main void { 4748 1 mientras que 4749 { 4750 valor de int 4751 ¿ 4752 entrada valor salida de 4753 valor + 1 4754 } 4755 } 4756 Este programa lee los datos de la in.dat de archivo y escribe sus resultados en el archivo out.dat. Si el archivo de in.dat se compone de 56 4757 4758 0x34 0654 4759 0b001001 4760 4761 la out.dat puede contener los resultados decimales como sigue 57 4762 53 4763 429 4764 10 4765 4766 Esta función permite algoritmos depurado y probarse sin necesidad de construir el hardware real. Por ejemplo una aplicación de procesamiento de imágenes pueden almacenar una imagen de origen en un archivo y sus resultados en un segundo archivo. Todo lo que necesita ser hecho fuera el compilador de c de Handel es una conversión de la imagen por ejemplo un archivo JPEG en el archivo de texto adoptado por el simulador y una conversión desde el archivo de salida a un formato de imagen. A continuación se pueden ver los resultados y el correcto funcionamiento del programa Handel-C confirmado. 4767 Dirigida a dispositivos FPGA Idioma de la Handel-C 4768 está diseñado para dispositivos de hardware real de destino. Uno puede suministrar algunas piezas importantes de información para el compilador para que pueda hacerlo. Estos son la familia FPGA y la parte que el diseño puede ser implementado en la ubicación de un detalles de la pieza de la fuente FPGA el reloj se suministran a través del proyecto gt cuadro de diálogo de configuración en la GUI interfaz gráfica de usuario . También se puede suministrar para el compilador de línea de comandos mediante la instrucción set. En última instancia esta información se pasa a la ruta y el lugar FPGA herramienta que le comunique el dispositivo debe de destino. La fuente de reloj se especifica mediante el comando 'set'. 4769 Localizar el reloj 4770 Ya que cada bloque de código de Handel-C principal genera hardware sincrónica una fuente única de reloj se requiere para cada uno. El reloj se proporciona normalmente en uno de los pines externos de FPGA pero también puede ser generado internamente en dispositivos de 4000 Xilinx. La sintaxis general de la especificación de reloj es reloj set 4771 = ubicación 4772 FIG. 60 ilustra una tabla 6000 mostrando los distintos lugares de conformidad con una encarnación de la invención presente. Ejemplos 4773 de relojes de pines de dispositivo externo son conjunto 4774 de reloj externo "P35" reloj set 4775 = external_divide "p35" 3 reloj set 4776 = external_divide 3 . 4777 El primero de estos ejemplos especifica un reloj de pin P35. El segundo de estos ejemplos especifica un reloj de pin P35 que se divide en el FPGA por un factor de 3. La tercera opción muestra un reloj dividido por 3 con ningún número de pin especificado. Cuando se omite el número de pin los lugar y la ruta herramientas pueden elegir un pin adecuado. Omitiendo las especificaciones de pin puede acelerar el diseño. Ejemplos de relojes tomados desde el generador de reloj interno de Xilinx 4000 series son reloj set 4778 = "F8M" interno reloj set 4779 = "f8m" de internal_divide 3 4780 En la actualidad la frecuencia del reloj interno puede tomar uno de los siguientes valores 14 Frecuencia de cadena de la especificación de "f15" 15 Hz "f490" 490 Hz "f16k" 16 kHz "f500k" 500 kHz "f8m" de 8 MHz 4781 Tenga en cuenta que la tolerancia de estos valores es -50% a + 25% por lo que uno no debe confiar en el reloj interno en exactamente estas frecuencias. Relojes internos sólo se admiten en partes de serie 4000 de Xilinx. La División de reloj especificada con las palabras clave de internal_divide y external_divide puede ser un entero constante. 4782 Dispositivos específicos dirigidos a través del comando de línea 4783 Si uno no está usando la GUI para especificar el dispositivo de destino él o ella puede insertar líneas en el código para especificarla. Con el fin de una FPGA específico de destino el compilador puede ser suministrado con el número de pieza FPGA. En última instancia esta información se pasa a la ruta y el lugar FPGA herramienta que le comunique el dispositivo debe de destino. Dirigidas a dispositivos consta de dos partes especifica la familia de destino y el dispositivo de destino. La sintaxis general es familia set 4784 lt = familia piezas set 4785 lt = número de Chip 4786 61 FIG. ilustra los diferentes nombres de familia 6100 de conformidad con una encarnación de la invención presente. 4787 La parte de cadena es la cadena completa de Xilinx o Altera dispositivo. Por ejemplo familia set 4788 lt = Xilinx4000E piezas set 4789 = "4010EPC84-1" 4790 Esto indica al compilador que un dispositivo de XC4010E en un PLCC84 de destino paquete. También especifica que el dispositivo es un grado de velocidad-1. Esta última pieza de información es necesaria para el análisis de la temporización del diseño que las herramientas de Xilinx. 4791 La familia se usa para informar el compilador de qué bloques especiales puede generar. 4792 Para Altera Flex 10 K de dispositivos de destino familia set 4793 = Altera10K piezas set 4794 "epf10k20rc240-3" 4795 Esto indica al compilador que 20 dispositivos de destino un Altera Flex 10 K en un paquete de RC240. También especifica que el dispositivo es un grado de velocidad-3. Esta última pieza de información es necesaria para el análisis de la temporización del diseño que las herramientas de Quartus o Altera Max Plus II. Tenga en cuenta que al realizar el lugar y la ruta en el diseño resultante el paquete y el dispositivo pueden también seleccionar mediante los menús en el software de Max Plus II. Uso de 4796 de los RAMs y ROMs con Georg Friedrich Händel-C Georg Friedrich Händel-C 4797 proporciona soporte para interfaces en el chip y off-chip RAMs y ROMs mediante las palabras clave de ram y rom. Uno puede especificar RAMs y ROMs externas para el código de Handel-C mediante el uso de la palabra clave de especificación de puertos. Uno puede controlar el momento para ciclos de lectura/escritura con las palabras clave de la especificación que define la relación entre la RAM luz estroboscópica y el reloj de Handel-C. 4798 La técnica habitual para especificar el momento en RAM sincrónico y asincrónico es tener un reloj rápido externo dividido abajo para proporcionar el reloj de Handel-C que se emplea directamente a proporcionar los impulsos a la RAM RAMs asincrónicos 4799 4800 Hay tres técnicas para temporización RAMs asincrónicos dependiendo el reloj disponible 1 4801 . Reloj rápido externo. Utilizar las especificaciones de westart y welength de Handel-C para colocar la luz estroboscópica de escritura 4802 2. Reloj externo a la misma velocidad que el reloj de Handel-C. Utilizar varias lecturas para darle a la memoria RAM suficiente tiempo para responder. 4803 3. Uso de la especificación de wegate para posicionar la escritura habilitar señal en el reloj de Handel-C Reloj de rápido externo 4804 4805 Si el reloj externo es más rápido que el reloj interno es decir la ubicación del reloj es internal_divide o external_divide con un factor de división mayor que 1 entonces Handel-C puede generar una luz estroboscópica de escritura para la RAM que se coloca dentro del ciclo de reloj de Handel-C. Esto se hace con las especificaciones de westart y welength. Por ejemplo reloj set 4806 = external_divide "p78" 4 lluvia 4807 unsigned 6 x 34 con {westart = 2 welength 4808 = 1} 4809 La luz estroboscópica de escritura puede ser sitúa en relación con el ciclo de reloj de Handel-C por la mitad la duración del ciclo del reloj externo indivisa . El ejemplo anterior el pulso inicia ciclo de reloj de 2 ciclos de reloj externo toda la Handel-c y da de sí un duración de ciclo de reloj externo 1. Dado que el reloj externo se divide por un factor de 4 esto es equivalente a una luz estroboscópica que comienza a mitad de camino a través del ciclo de reloj interno y tiene una duración de una cuarta parte del ciclo del reloj interno. Fig. 62 muestra un diagrama de calendario que muestra una señal 6200 de conformidad con una encarnación de la invención presente. Diagrama de temporización 4810 coloca la luz estroboscópica de escritura 4811 Este calendario permite la mitad un reloj del ciclo para el tiempo de preparación de la RAM en las líneas de dirección y datos y una cuarta parte de un ciclo de reloj para la RAM mantenga veces. Esta es la forma recomendada para acceder a los RAMs asincrónicos. 4812 Misma velocidad de reloj externo 4813 Este método utiliza múltiples accesos de RAM de Handel-C para cumplir con el programa de instalación y mantener los tiempos de la RAM. ram 4814 unsigned 6 x 34 Maniquí 4815 = x 3 4816 x 3 = datos Maniquí 4817 = x 3 4818 Este código tiene la constante de la dirección de todo el ciclo de escritura de la memoria RAM lo que permite una escritura a un RAM asincrónica. Reloj externo indivisa de 4819 4820 El tercer método de acceso a los RAMs asincrónicos es un compromiso entre los dos métodos anteriores. wegate se utiliza con un reloj externo indiviso y mantiene la luz estroboscópica de escritura en la primera o segunda mitad del ciclo del reloj. Sigue siendo necesario contener la constante de dirección en el reloj del ciclo antes o en el ciclo de reloj después el acceso. Por ejemplo ram 4821 unsigned 6 x 34 con {wegate = 1} 4822 x 3 = datos Maniquí 4823 = x 3 4824 Esto coloca la luz estroboscópica de escritura en la segunda mitad del ciclo del reloj utilice un valor de -1 para ponerlo en la primera mitad y suspensiones de la dirección para el reloj del ciclo después de la escritura. La memoria RAM por tanto tiene la mitad de un ciclo de reloj de tiempo de configuración y un ciclo de reloj de celebrar el tiempo sobre sus líneas de dirección. RAMs sincrónicos 4825 Semántica de temporización de Handel-C 4826 requiere que cualquier asignación toma un ciclo de reloj. SSRAMs tiene una latencia de ciclo de al menos un reloj. Para habilitar los intervalos de SSRAM encajar con las limitaciones de tiempo de Handel-C Handel-C utiliza un reloj rápido independiente RAMCLK . La generación de este reloj requiere el uso de un reloj rápido externo CLK dividido para proporcionar el reloj de Handel-C HCLK . 4827 Pulsos de reloj rápido a continuación pueden colocarse a la SSRAM dentro de una sola señal de reloj de Handel-C de reloj. La RAMCLK puede llevar a un SSRAM externo mediante la especificación de clk. 4828 Handel-C admite dispositivos de salida dinámico y canalización de ZBT-compatible vuelco de autobús de cero . DDR doble velocidad de datos y dispositivos QDR velocidad de datos cuádruple no son compatibles. Compilador de c de Handel the 4829 comprueba la especificación de bloque para averiguar qué tipo de RAM se está construyendo y genera la señal apropiada para habilitar escritura por ejemplo activo bajo para dispositivos de SSRAM de ZBT y activo-alto para bloque RAMs dentro de los chips de Xilinx Virtex . 4830 SSRAM de lectura y escritura de ciclos 4831 Más entradas a SSRAMs se capturan en el borde de aumento del entrada de reloj. Durante un ciclo de lectura hay una latencia de reloj al menos un ciclo entre una dirección ser capturada en la entrada y a estar disponibles en la salida de datos. Esto también es cierto para el ciclo de escritura en muchos dispositivos una dirección es capturada el ciclo de reloj y los datos en el siguiente. 4832 FIG. 63 ilustra una muestra de diagrama de momento un SSRAM de lectura y escritura de 6300 de conformidad con una encarnación de la invención presente. 4833 Especifica la temporización 4834 Uno puede colocar los pulsos de reloj de RAM en diferentes puntos en el reloj de Handel-C de la misma manera que se pueden especificar luces estroboscópicas Habilitar escritura asincrónica de RAM de dispositivos. El reloj SSRAM RAMCLK se genera desde el reloj rápido CLK conforme a las especificaciones de Handel-C rclkpos wclkpos y clkpulselen. Estas especificaciones pueden ser en su totalidad o en la mitad de ciclos del reloj externo. rclkpos 4835 especifica que las posiciones de los ciclos de reloj de reloj RAMCLK para una lectura del ciclo. Estas posiciones se especifican en términos de ciclos y mitad-ciclos de CLK contando hacia delante de un HCLK de borde en aumento. wclkpos 4836 especifica las posiciones de los ciclos de reloj de RAMCLK para una escritura del ciclo. Estos se también cuentan con interés desde un HCLK aumento de borde. clkpulselen 4837 especifica la longitud de la RAMCLK ciclos de pulsos en CLK. Esto se especifica una vez por RAM. Se aplica a los relojes de lectura y escritura. Diagrama de temporización 4838 SSRAM leer utilizando el ciclo generado RAMCLK 4839 FIG. 64 muestra un diagrama de calendario que muestra que un SSRAM Lee utilizando el ciclo generado RAMCLK 6400 de conformidad con una encarnación de la invención presente. Las posiciones de pulso y longitudes se especifican en ciclos y mitad-ciclos de CLK. Las especificaciones de westart y welength se utilizan para colocar la luz estroboscópica habilitar de escritura donde sea necesario. Ejemplos 4840 4841 Dinámico SSRAM 4842 Este código de ejemplo genera el hardware que se muestra a continuación. También es aplicable para la lectura del bloque RAMs en Xilinx y Altera FPGAs. ram 4843 unsigned 18 FlowBank 1024 con {bloque = 1 4844 westart = 2 4845 welength = 1 rclkpos 4846 = {1.5} wclkpos 4847 = {2.5 3.5 } 4848 clkpulselen = 0 5} 4849 FIG. 65 ilustra un lectura-ciclo de temporización diagrama mostrando desde un SSRAM dinámico dentro de un diseño de Handel-C 6500 de conformidad con una personificación de la invención de la presente. 4850 El borde HCLK creciente en t0 inicia el ciclo de lectura. Algún tiempo después la dirección es configurar A1 que se muestrea en algún lugar en medio del ciclo HCLK t0 + 1.5 en este caso. Por el momento la siguiente HCLK borde en aumento se produce en t1 los datos están disponibles para su lectura. El ciclo se completa dentro de un ciclo de reloj de Handel-C. Ciclo de escritura 4851 para una SSRAM dinámico 4852 Dinámico SSRAMs realizan un ciclo de escritura "tarde" los datos es desplazados en el ciclo de reloj después de que se muestree la dirección. Fig. 66 ilustra un diagrama de calendario que muestra el ciclo de escritura completa 6600 de conformidad con una encarnación de la invención presente. 4853 De HCLK the rising borde en t0 inicia el ciclo de escritura causando las señales de dirección y causar a cambiar. Se necesitan dos ciclos de RAMCLK a los nuevos datos de reloj en la RAM en la dirección especificada la primera para muestrear la dirección el segundo a los datos de muestra. Sin embargo dado que no se espera para leer desde la salida de la RAM uno puede esperar hasta el último momento posible. En este caso los dos bordes de aumento de RAMCLK se producen en t0 + 2.5 y t0 + 3.5. 4854 La señal de Habilitar escritura puede ser baja durante el borde aumento de RAMCLK que la dirección de muestras pero no durante la que muestras de los datos. Esto puede hacerse mediante el establecimiento de westart y welength como se muestra. El ciclo se completa dentro de un único ciclo de reloj de Handel-C. SSRAM de salida segmentadas 4855 4856 Este código de ejemplo genera el hardware que se muestra a continuación ram 4857 unsigned 18 PipeBank 1024 con {bloque = 1 4858 westart = 1.5 4859 welength = 1 rclkpos 4860 = {1.5 2.5 } wclkpos 4861 = {2 3 4 } 4862 clkpulselen = 0 5} 4863 FIG. 67 ilustra un calendario diagrama mostrando ciclo completo de lectura 6700 de conformidad con una encarnación de la invención presente. Este ciclo de lectura es muy similar de un flujo a través de la RAM. El alzamiento Borde HCLK en t0 inicia el ciclo de lectura. Algún tiempo después la dirección está configurado A1 que se muestrea en algún lugar cerca de la mitad del ciclo de la HCLK t0 + 1.5 en este caso . El contenido de la RAM en dirección A1 a continuación se canaliza al registro de salida de RAM se podrá ponerse a disposición en la salida de RAM. Un segundo pulso RAMCLK en t0 + 2.5 en este caso se utiliza para ello. Por el momento la siguiente HCLK borde en aumento se produce en t1 los datos están disponibles para su lectura por el diseño de Handel-C. El ciclo se completa dentro de Handel-C de un ciclo de reloj. Ciclo de escritura 4864 para una SSRAM de salida segmentadas 4865 Pipelined-salida SSRAMs realizan un ciclo de escritura de "finales finales". Esto significa que los datos se escriben en reloj de memoria dos ciclos después de que se muestree la dirección. Fig. 68 ilustra un calendario diagrama mostrando ciclo completo 6800 de conformidad con una encarnación de la invención presente. El HCLK rising borde en t0 inicia el ciclo de escritura causando las señales de dirección y causar a cambiar. Se necesitan tres ciclos de RAMCLK a los nuevos datos de reloj en la RAM en la dirección especificada el primero en probar la dirección y el tercero a los datos de ejemplo. Ya que uno no puede leer desde la RAM en una luz estroboscópica de escritura él o ella puede muestrear los datos lo más tarde posible dar el tiempo máximo de circuito para configurar los datos. En este caso las tres aristas de aumento de la RAMCLK se producen en t0 2.0 t0 + 3.0 y t0 + 4.0. La señal de Habilitar escritura puede ser baja durante el borde aumento de RAMCLK que la dirección de muestras pero no durante la que muestras de los datos. Esto puede hacerse mediante el establecimiento de westart y welength como se muestra. El ciclo se completa dentro de un único ciclo de reloj de Handel-C. 4866 Utilizando en el chip RAMs en dispositivos de Xilinx Dispositivos de la serie de Xilinx 4000 4867 pueden implementar RAMs y ROMs en el look up tables en el dispositivo. Handel-C soporta los RAMs sincrónicos en el 4000E 4000EX 4000L 4000XL 4000XV y partes de la serie Virtex directamente simplemente declarando una RAM o la ROM de la manera descrita anteriormente. Por ejemplo ram 4868 sin signo 6 x 34 . 4869 Esto podrá declarar un RAM con 34 entradas cada una de ellas es de 6 bits de longitud. 4870 Utilizando en el chip RAMs en Altera dispositivos 4871 Los RAMs en el chip en dispositivos Altera Flex10K utilizan las estructuras EAB. Estos bloques se pueden configurar en un número de combinaciones de anchura de ancho/dirección de datos. Al escribir programas de Handel-C se puede tener cuidado de no exceder el número de bloques EAB en el dispositivo de destino o el diseño no puede colocar y enrutar correctamente. Mientras que es posible utilizar los RAMs que no coinciden con una de las combinaciones de anchura de ancho/dirección de datos puede desperdiciar espacio EAB por tal un RAM. Como con dispositivos de Xilinx los bloques de memoria RAM en partes de Flex 10 K pueden configurarse para ser sincrónica o asincrónica. Acceso sincrónico 4872 4873 De forma predeterminada Handel-C puede utilizar un acceso sincrónico al utilizar el borde caído del reloj como la señal de entrada de reloj en la RAM. Este es el método recomendado para el uso de RAMs. Acceso asincrónico 4874 4875 Si uno usa uno de las especificaciones de westart welength o wegate que se describe en la sección anterior el compilador de c de Handel puede generar un RAM asincrónico. Esto puede ayudar con las características de tiempo de diseño. Inicialización de 4876 Archivos de inicialización de RAM/ROM 4877 con una extensión de .mif pueden generarse en la compilación para alimentarse en el software de Max Plus II. Este proceso es transparente mientras están en el mismo directorio que el archivo EDIF extensión .edf generado por el compilador de c de Handel. 4878 RAMs externo utilizando RAMs asincrónicos 4879 Georg Friedrich Händel-C 4880 proporciona soporte para acceder a los RAMs estáticos de off-chip de la misma manera como uno acceso internos RAMs. La sintaxis para un RAM externo es la declaración {Nombre de tipo tamaño 4881 ram 4882 offchip = 1 datos 4883 = Pins 4884 addr = Pins 4885 nos = Pins oe 4886 = Pins cs 4887 = Pins} 4888 Por ejemplo para declarar un 16Kbyte por RAM de 8 bits ram 4889 sin signo de 8 ExtRAM 16384 con { 4890 offchip = 1 datos 4891 = {"p1" "p2" "p3" "p4" 4892 "P5" "P6" "P7" "P8"} 4893 addr = {"p9" "p10" "P 11" "p12" 4894 "P13" "P14" "P 15" "P 16" 4895 "P 17" "P 18" "P 19" "P20" 4896 "P21" "P22"} nosotros 4897 = {"P23"} oe 4898 = {"P24"} Cs 4899 = {"P25"}} 4900 Tenga en cuenta que las listas de direcciones y datos de pines están en el orden de más significativos a menos significativo. Es posible que el compilador inferir el ancho de la RAM 8 bits en este ejemplo y el número de líneas de dirección utilizado 14 en este ejemplo de uso de la RAM. Sin embargo esto no se recomienda ya que esta declaración se ocupa de hardware real externo que tiene una definición fija. Acceso a la memoria RAM es el mismo que para tener acceso a RAM interna. Por ejemplo ExtRAM 4901 1234 = 23 4902 y = ExtRAM 5678 4903 Similares restricciones como con RAM interna solo acceso puede hacerse en la RAM en cualquier ciclo de reloj. El hardware compilado genera el siguiente ciclo de una escritura en RAM externo. 69 Fig. ilustra un diagrama de calendario que muestra un ciclo para una escritura a externos de RAM de 6900 de conformidad con una encarnación de la invención presente. Fig. 70 ilustra un diagrama de calendario que muestra un ciclo para una lectura de externos de RAM de 7000 con arreglo a una encarnación de la invención presente. 4904 Este ciclo puede no ser adecuado para el dispositivo de memoria RAM en uso. En particular asincrónico RAM estático no puede trabajar con el ciclo anterior debido a la instalación y mantenga las violaciones de temporización. Por esta razón las especificaciones de westart welength y wegate también pueden utilizarse con RAM externo declaraciones. Ejemplo de reloj externo rápido 4905 4906 Por ejemplo para declarar un 16Kbyte por RAM de 8 bits reloj set 4907 = external_divide "p99" 4 ram 4908 sin signo de 8 ExtRAM 16384 con { 4909 offchip = 1 4910 westart = 2 4911 welength = 1 datos 4912 = {"p1" "p2" "p3" "p4" 4913 "P5" "P6" "P7" "P8"} 4914 addr = {"p9" "p10" "p11" "p12" 4915 "P13" "P14" "P15" "16" 4916 "P17" "P18" "P19" "P20" 4917 "P21" "P22"} nosotros 4918 = {"P23"} oe 4919 = {"P24"} cs 4920 = {"P25}} 4921 FIG. 71 muestra un diagrama de calendario que muestra un ciclo para una escritura a 7100 externo de RAM de conformidad con una encarnación de la invención presente. 72 Fig. ilustra un diagrama de calendario que muestra un ciclo para una lectura de externos de RAM de 7200 de conformidad con una encarnación de la invención presente. 4922 El hardware compilado genera el siguiente ciclo de una escritura en RAM externo. 4923 El hardware compilado genera el siguiente ciclo para una lectura de la memoria RAM externo 4924 Acceso a la memoria RAM es el mismo que para tener acceso a RAM interna. Por ejemplo ExtRAM 4925 1234 = 23 4926 y = ExtRAM 5678 4927 Similares restricciones como con RAM interna solo acceso puede hacerse en la RAM en cualquier ciclo de reloj. Ejemplo de Wegate 4928 especificación de wegate 4929 puede utilizarse cuando un reloj multiplicado no está disponible. 4930 Por ejemplo para declarar un 16 KB de memoria RAM de 8 bits ram 4931 sin signo de 8 ExtRAM 16384 con { 4932 offchip = 1 4933 wegate = 1 datos 4934 "P" "p2" "p3" "p4" 4935 "P5" "P6" "P7" "P8"} 4936 addr = {"p9" "p10" "p11" "p12" 4937 "P13" "P14" "P15" "P16" 4938 "P17" 37 P18 " "P19" "P20" 4939 "P21" "P22"} nosotros 4940 = {"P23"} oe 4941 = {"P24"} cs 4942 = {"P25"}} 4943 FIG. 73 ilustra un diagrama de calendario que muestra un ciclo para una escritura a externos de RAM de 7300 de conformidad con una encarnación de la invención presente. 74 Fig. ilustra un diagrama de calendario que muestra un ciclo para una lectura de externos de RAM de 7500 de conformidad con una encarnación de la invención presente. 4944 Acceso a la memoria RAM es el mismo que para tener acceso a RAM interna. Por ejemplo ExtRAM 4945 3 = datos Maniquí latitud = ExtRAM 3 4947 Similares restricciones como con RAM interna solo acceso puede hacerse en la RAM en cualquier ciclo de reloj. Nota que el diagrama de calendario anterior puede violar el tiempo de espera para algunos RAM asincrónico dispositivos. Si habilita la demora entre aumento de borde de reloj y aumento de escritura es más largo que el retraso entre el aumento de borde de reloj y el cambio en los datos o la dirección a continuación pueden producirse daños en la escritura en estos dispositivos. El acceso de dos ciclo no resuelve este problema ya que no es posible celebrar la constante de las líneas de datos más allá del final del ciclo del reloj. Si esto causa un problema a continuación un reloj externo multiplicado puede utilizarse como se describió anteriormente. 4948 Mediante la especificación de wegate puede violar el tiempo de espera para algunos dispositivos de RAM asincrónicas. RAMs sincrónicos 4949 4950 SRAMs sincrónicas de off-chip pueden especificarse en exactamente la misma manera que SRAMs sincrónicas en el chip con la adición de la especificación de clk. CLK especifica el pin en el que puede aparecer la RAMCLK generado cuando el SSRAM en cuestión es externo offchip = 1 . Ejemplo de 4951 4952 macro expr addresspins = {lista de Pin...} 4953 macro expr datapins = {lista de Pin...} 4954 macro expr cspins = {lista de Pin...} 4955 macro expr wePins = {lista de Pin...} 4956 macro expr oepins = {lista de Pin...} 4957 macro expr clkpins = {lista de Pin...} ram 4958 sin signo de 32 ExtBank 1024 con {offchip = 1 4959 addr = addressPins datos 4960 = datapins cs 4961 = csPins 4962 nos = wepins oe 4963 = oePins 4964 westart = 2 4965 welength = 1 rclkpos 4966 = {1.5 2.5 } wclkpos 4967 = {1.5 2.5 3.5 } 4968 clkpulselen = 0 5 clk 4969 = clkPins} 4970 ROMs externo utilizando 4971 Un ROM externa se declara como un RAM externo con una escritura vacía habilitar la lista de pin. Por ejemplo ram 4972 sin signo de 8 ExtROM 16384 con { 4973 offchip = 1 datos 4974 = {"p1" "p2" "p3 p4 " 4975 "P5" "P6" "P7" "P8" 56 4976 addr = {"p9" "p10" "p11" "p12" 4977 "P13" "P14" "P15" "P16" 4978 "P17" "P18" "P19" "P20" 4979 "P21" "P22"} nosotros 4980 = {} oe 4981 = {"P24"} cs 4982 = {P25}} 4983 Nota que ninguna especificación de westart welength o wegate es necesaria ya que no hay una luz estroboscópica de escritura de señal en un dispositivo de ROM. Conexión 4984 a los RAMs en código extranjero 4985 Uno puede crear puertos para conectar a un RAM mediante los puertos = 1 especificación a la definición de la memoria. Esto puede generar alambres VHDL o EDIF que se pueden conectar a un componente creado en otros lugares. La especificación de puertos no se puede utilizar junto con el offchip = 1 especificación pero todas las demás especificaciones pueden aplicar. La interfaz generada puede tener lectura separada salida y escribir puertos datos activar datos de escritura habilitar y cables de reloj. Esto asegura que se puede conectar a cualquier dispositivo. Nombres de PIN en la addr datos cs que oe y especificaciones de clk pueden pasarse a través de la EDIF generado. No se pasan a través de a VHDL ya que se generan VHDL interfaces como autobuses amplia de n bits en lugar de cables de ancho de 1 bit n. Esto significa que es ambiguo para especificar un identificador separado para cada cable si se utilizan cuando se compila a VHDL el compilador emite una advertencia. Siempre se puede generar el puerto de reloj A 4986 . 4987 Si uno utiliza la especificación de puertos con un MPRAM se puede generar una interfaz independiente para cada puerto. Ejemplos 4988 4989 Ejemplo 1 generar una interfaz a un código extranjero RAM. 4990 / / Pin nombre especificaciones han sido comentadas familia set 4991 = Xilinx4000XV piezas set 4992 = "v1000bg560-4" reloj set 4993 = "C1" externos 4994 macro expr dataPins = {"d1" "d2" "d3" "d4"} 4995 macro expr addrPins = {"A1" "a2"} 4996 macro expr wePins = {"WE1"} 4997 macro expr csPins = {"CS1} 4998 macro expr oePins = "{OE1} 4999 4 sin firmar un ram 5000 unsigned rax 4 4 con {puertos = 1 / * datos = dataPins addr = addrPins nos = wePins 5001 Cs = csPins oe = oePins * /} 5002 void main void { 5003 5004 static sin signo 2 i = 0 while 1 5005 { 5006 par 5007 { 5008 5009 i ++ 5010 un ++ rax 5011 i = un 5012 } 5013 un = rax i 5014 } 5015 } 5016 La declaración de rax produciría cables 5017 rax_SPPort_addr lt 0 gt //Address 5018 rax_SPPort_addr lt 1 gt 5019 rax_SPPort_data_in lt 0 gt //Data en 5020 rax_SPPort_data_in lt 1 gt 5021 rax_SPPort_data_in lt 2 gt 5022 rax_SPPort_data_in lt 3 gt 5023 rax_SPPort_data_out lt 0 gt //Data Out 5024 rax_SPPort_data_out lt 1 gt 5025 rax_SPPort_data_out lt 2 gt 5026 rax_SPPort_data_out lt 3 gt rax_SPPort_data_en 5027 / / habilitar datos rax_SPPort_clk 5028 / / reloj rax_SPPort_Cs 5029 / / Chip Select rax_SPPort_oe 5030 / / habilitar salida rax_SPPort_we 5031 / / datos en. 5032 Ejemplo 1 generar una interfaz a un código extranjero MPRAM. Especificaciones de nombre //Pin 5033 han sido comentadas familia set 5034 = Xilinx4000XV piezas set 5035 = "v1000bg560-4" reloj set 5036 = "C1" externos 5037 macro expr dataPins = {"d1" "d2" "d3" "d4"} 5038 macro expr addrPins = {"A1" "a2"} 5039 macro expr wePins = {"WE1"} 5040 macro expr csPins = {"CS1"} 5041 macro expr oePins {"OE1"} 5042 4 sin firmar un 5043 mpram Mpaz { 5044 wom 5045 unsigned 4 wox 4 5046 rox 4 sin signo rom 4 5047 } mox con {puertos = 1 / * datos = dataPins addr = addrPins nos = wePins cs = 5048 csPins oe = oePins * /} 5049 void main void { 5050 5051 static sin signo 2 i = 0 while 1 5052 { 5053 par 5054 { 5055 5056 i ++ 5057 un ++ mox.wox i =a 5058 5059 } a=mox.rox i 5060 5061 } 5062 } 5063 Utilizando otros RAMs 5064 La interfaz a otros tipos de memoria RAM como DRAM debe ser escrita a mano utilizando las declaraciones de la interfaz se describe en las secciones siguientes. Pueden escribir procedimientos de macro para realizar complejos o incluso modos de accesos al dispositivo externo. 5065 Interactuar con Hardware externo y lógica 5066 Mientras que el simulador permite la depuración de programas de Handel-C el destino real del compilador es el hardware. Por lo tanto es esencial que el compilador puede generar hardware que interactúa con componentes externos. Estas secciones siguientes detallan los elementos básicos de dichas interfaces de hardware. Todos los accesos a off-chip se basan en la idea de un bus que es simplemente una colección de pines externos. Georg Friedrich Händel-C proporciona la capacidad de leer el estado de pines para la entrada del mundo exterior y establecer el estado de pines para escribir en el mundo exterior. Autobuses de Tri-state también son compatibles para permitir las transferencias de datos bidireccional a través de los pines del mismos. Los clavos utilizados pueden definirse de Handel-C mediante el uso de la especificación de datos. Si esto se omite pueden ser los pines de izquierda no restringida y se pueden asignar mediante las herramientas de lugar y de la ruta. Tenga en cuenta que Handel-C no proporciona ninguna información acerca de la sincronización de los cambios de estado de una señal dentro de un ciclo de reloj de Handel-C. Análisis de momento están disponible desde herramientas de lugar y ruta del fabricante FPGA. Programas de Handel-C pueden también interfaz lógica externa otros programas de Handel-C los programas escritos en VHDL etc. mediante el uso de interfaces definidas por el usuario o puertos de Handel-C. Interfaces 5067 5068 Todas las interfaces distintas de los RAMs se declaran con la palabra clave interface. La sintaxis general de interfaces es el siguiente la interfaz de Name Args de Sort Types con {especificaciones} Aquí el campo de ordenación especifica qué tipo de interfaz se requiere tipos describe los tipos de valores asociados con objetos procedentes de la interfaz nombre especifica un identificador de la interfaz Args especifica los parámetros que puede requerir la interfaz y especificaciones dan detalles del hardware de la interfaz como números de pin de chip. Anteriormente se proporcionaron detalles adicionales de la sintaxis de la interfaz. 5069 FIG. 75 es que una tabla de interfaz predefinido ordena 7500 de conformidad con una encarnación de la invención presente. 5070 Lectura de pines externos 5071 El tipo de interfaz bus_in permite que los programas de Handel-C leer de pines externos. Su uso general es bus_in typeportName de la interfaz 5072 Name 5073 con {datos = {lista de Pin}} Es el ejemplo concreto de A 5074 interfaz 5075 bus_in int 4 A InBus con {datos = {"p1" "p2" "p3" "p4"}} 5076 Esto declara un autobús conectado a los pines P1 P2 P3 y P4 pines donde P1 es el bit más significativo y pin P4 es el bit menos significativo. Leyendo el bus se realiza mediante el acceso al identificador NameportName como una variable que puede devolver el valor de los pines en ese borde de reloj. Por ejemplo 5077 int 4 x x=InBus.To 5078 5079 Esto establece la variable x con el valor de los pines externos. El tipo de InBus.To es int 4 tal como se especifica en la lista tipo después de la palabra clave bus_in. 5080 Si no se da el nombre de ningún puerto de entrada el nombre del puerto predeterminado en. 5081 Lectura registrados de pines externos 5082 El tipo de interfaz bus_latch_in es similar al tipo de interfaz de bus_in pero permite la entrada a registrarse en una condición. Esto puede ser necesario para muestrear la señal en determinado momento. Su uso general es bus_latch_in typeportName de interfaz 5083 Nombre 5084 escriba conditionPortName = condición con {datos = Pin List}} . 5085 Su uso es exactamente igual que el tipo de interfaz de bus_in excepto en que condición especifica una señal que se utiliza para la entrada que se registra en el FPGA de reloj. El borde aumento de esta señal relojes la señal externa en el valor interno. Por ejemplo Obtenga el int 5086 1 int4 5087 x 5088 interfaz bus_latch_in int 4 A InBus 5089 condición de int 1 = get 5090 con {datos = {"p1" "p2" "p3" "p4"}} get 5091 = 0 get 5092 = 1 //Register el valor externo x=InBus.To 5093 //Read el valor registrado 5094 Lectura síncronos de pines externos 5095 El tipo de interfaz bus_clock_in es similar al tipo de interfaz de bus_in pero permite la entrada de reloj continuamente de la C-Handel reloj mundial. Esto puede ser necesario para sincronizar la señal del reloj de Handel-C. Su uso general es 5096 interfaz bus_clock_in typeportName de nombre 5097 con {datos = {lista de Pin}} 5098 Su uso es exactamente igual que el tipo de interfaz de bus_in. El borde aumento del reloj Handel-C relojes la señal externa en el valor interno. Por ejemplo interfaz 5099 bus_clock_in int 4 en InBus con 5100 {datos = {"p1" "p2" "p3" "p4"}} x=InBus.InTo 5101 / / Lee el valor de biestable 5102 Escrito a los pines externos 5103 El tipo de interfaz bus_out permite que los programas de Handel-C a escribir a los pines externos. Su uso general es 5104 interfaz bus_out Name typeportName=Expression 5105 con {datos = {lista de Pin}} Es el ejemplo concreto de A 5106 5107 interfaz bus_out OutBus int 4 OutPort = x + y 5108 con {datos = 5109 {"P1" "P2" "P3" "P4"}} 5110 Esto declara que un autobús conectado a los pines 1 2 3 y 4 donde el pin 1 es el bit más significativo y pin 4 es el bit menos significativo. El valor que aparece en los pines externos es el valor de la expresión x + y en todo momento. Transferencia de datos de bidireccional 5111 5112 El tipo de interfaz bus.sub.13 ts permite que los programas de Handel-C realizar comunicaciones de off-chip bidireccional a través de los pines externos. Su uso general es bus_ts de interfaz 5113 tipo inPortName Nombre 5114 escriba outPortName = valor tipo 5115 conditionPortName = condición 5116 con {datos = {lista de Pin}} 5117 Aquí valor y condición son dos expresiones. Se trata del valor a los pines de salida y condición se refiere a la condición para la conducción de los pines. Cuando la segunda expresión es cero es decir true el valor de la primera expresión es impulsado en los pines. Cuando el valor de la segunda expresión es cero los pines son tri-declaró y el valor del bus externo puede leerse mediante el identificador Name.inPortName en gran parte del mismo modo que se leen las interfaces de bus_in. Si inPortName no está definido el nombre del puerto predeterminado en. Es el ejemplo concreto de A 5118 5119 int 1 condición 5120 int 4 x bus_ts de interfaz 5121 int 4 leer BiBus 5122 int escritura = x + 1 Habilitar int 5123 1 = condición 5124 con {datos = {"p1" "p2" "p3" "p4"}} condición 5125 = 0 / / Tri-state los pines x=BiBus.read 5126 / / Lee el valor condición 5127 = 1 / / Unidad x + 1 en los pines 5128 Este ejemplo lee el valor del bus externo en la variable x y a continuación impulsa el valor de x + 1 en los pines externos. Tenga cuidado cuando se conduce en autobuses de tri-state que FPGA y otro dispositivo del bus no pueden conducir simultáneamente como esto puede resultar en daños a uno o a ambos. De transferencia de datos de bidireccional 5129 con entrada registrado 5130 El tipo de interfaz bus_ts_latch_in permite que los programas de Handel-C realizar comunicaciones de off-chip bidireccional a través de los pines externos con entradas registradas en una condición. Su uso general es 5131 interfaz bus_ts_latch_in tipo inPortName Nombre 5132 escriba outPortName = valor tipo 5133 conditionPortName = condición reloj de tipo Omar -PortName = reloj 5135 {datos {lista de Pin}} 5136 Aquí valor condición y reloj son todas las expresiones. Se trata del valor a la salida en los pines condición se refiere a la condición para la conducción de los pines y el reloj se refiere a la señal de reloj a la entrada de los pines. Cuando la segunda expresión es cero el valor de la primera expresión es impulsado en los pines. Cuando el valor de la segunda expresión es cero los pines son tri-declaró y el valor registrado del bus externo puede leerse mediante el identificador Name.inPortName de la misma manera que se leen las interfaces de bus_in. Si inPortName no está definido el nombre del puerto predeterminado en. El borde de aumento del valor de la expresión tercera relojes los valores externos a través de los valores internos en el chip. Por ejemplo Obtenga el int 5137 1 5138 int 1 condición 5139 int 4 x 5140 interfaz bus_ts_latch_in int 4 leer BiBus 5141 int escritura = x + 1 Habilitar int 5142 1 = condición reloj de int 1 5143 = get 5144 con {datos = {"p1" "p2" "p3" "p4"}} condición 5145 = 0 / / Tri-state pines externos get 5146 = 0 get 5147 = 1 / / Registro de valor externo x=BiBus.read 5148 / / Lectura registrado el valor condición 5149 = 1 / / Unidad x + 1 en pines externos 5150 Este ejemplo muestrea el bus externo y Lee el valor registrado en la variable x y unidades a continuación el valor de x + 1 en los pines externos. Tenga cuidado al conducir bases de tri-state que FPGA y otro dispositivo del bus no pueden conducir simultáneamente como esto puede resultar en daños a uno o a ambos. De transferencia de datos de bidireccional 5151 con entrada síncronos 5152 El tipo de interfaz bus_ts_clock_in permite que los programas de Handel-C realizar comunicaciones de off-chip bidireccional a través de los pines externos con una velocidad de forma continua con el reloj de Handel-C de entradas. Su uso general es como interfaz bus_ts_clock_in tipo inPortName Nombre 5154 escriba outPortName = valor tipo 5155 conditionPortName = condición 5156 con {datos = {lista de Pin} 5157 Aquí condición y valor son expresiones. Se trata del valor a los pines de salida y condición se refiere a la condición para la conducción de los pines. Cuando la condición es cero es decir true el valor de valor es impulsado en los pines. Cuando el valor de la condición es cero los pines son tri-declaró y el valor del bus externo puede leerse mediante el identificador Name.InPortName de la misma manera que se leen las interfaces de bus_in. 5158 _La aumentando el borde del reloj Handel-C Lee los valores externos en los biestables internos en el chip. Por ejemplo 5159 int 1 condición int4 5160 x 5161 interfaz bus_ts_clock_in int 4 leer BiBus 5162 int 4 writePort = x + 1 Habilitar int 5163 1 = condición 5164 con {datos = {"p1" "p2" "p3" "p4"}} condición 5165 = 0 / / Tri-state pines externos 5166 x=BiBus.read // leer el valor registrado condición 5167 = 1 / / unidad x + 1 en pines externos 5168 Este ejemplo lee el valor de la flip-flop en la variable x y a continuación impulsa el valor de x + 1 en los pines externos. Tenga cuidado cuando se conduce en autobuses de tri-state que FPGA y otro dispositivo del bus no pueden conducir simultáneamente como esto puede resultar en daños a uno o a ambos. Pines de fusión 5169 5170 Es posible combinar pines 5171 pines de entrada de combinación con dobles declaraciones de interfaces de entrada bus pines de tri-estado de combinación 5172 Pines de entrada 5173 se pueden combinar para que los pines pueden leer simultáneamente en múltiples variables. Esto puede hacerse mediante la especificación de las interfaces múltiples bus_in bus_clock_in bus_latch_in que tienen algunos pines en común. Si es necesario puede especificarse un subconjunto diferente de pines para cada instancia de la interfaz. Por ejemplo interfaz 5174 bus_in int 8 amplia wideDataBus con 5175 {datos = {"p1" "p2" "p3" "p4" "p5" ¡ 5176 "P6" "P7" "P8"}} bus.sub.13 de interfaz 5177 de thinDataBus int 3 delgado con 5178 {datos = {"p3" "p4" "p5"}} wideDataBus.in 5179 daría a los valores de pines 1-8 mientras que thinDataBus.in le daría el valor del bit tres pines 3 4 y 5. Pines de Tri-state bus se pueden combinar aunque hacerlo así que puede generar una advertencia del compilador como el compilador no puede detectar si existe un conflicto en el uso de los pines del combinado. Uno podría combinar los pines de salida para un autobús de tri-state si él o ella desea cambiar las conexiones de circuito de una sola pieza externa de la lógica a otra. Por ejemplo 5180 int 1 en1 en2 5181 int 4 x y 5182 interfaz de bus ts_clock_in int 4 leer 5183 BiBus1 int 4 writePort = x + 1 en1 == 1 5184 con {datos = {"p1" "p2" "p3" "p4"}} 5185 interfaz bus_ts_clock_in int 4 leer 5186 BiBus2 int 4 writePort = y + 1 en2 == 1 5187 con {datos = {"p1" "p2" "p3" "p4"}} 5188 Tomar cuidado cuando se conduce en autobuses de tri-state que FPGA y otro dispositivo del bus no pueden conducir simultáneamente como esto puede ocasionar daños a uno de ellos o ambos. Autobuses 5189 y el simulador Simulador de la Handel-C 5190 no puede simular autobuses directamente. El proceso recomendado para la depuración es utilizar el método de canal descrito anteriormente en esta sección de la descripción del presente. Esto es porque no puede determinar la simulación de autobuses cuando entrada y salida debe ocurrir. 5191 Mediante el uso de la # define y # ifdef... # endif construcciones del preprocesador es posible combinar la simulación y el hardware de las versiones del programa en uno solo. Por ejemplo 5192 # define SIMULAR 5193 # ifdef SIMULAR ¿ 5194 entrada valor 5195 # else value=BusIn.in 5196 # endif 5197 5198 Referir a la sección de preprocesador de C-Handel para obtener detalles de compilación condicional. Simulación de autobuses puede ser importante al depurar la interfaz con el mundo exterior. En este caso uno puede utilizar la interfaz de los programadores de aplicaciones API para escribir un plugin que puede ser co-simulated. Por ejemplo para simular un bus de tri-state 5199 # ifdef SIMULAR bus_ts de interfaz 5200 uint 32 de con 5201 {extlib="cosim_hc.dll" extinst="1" extfunc="DataBusIn}" DataBus 5202 DataOut con {extlib="cosim_hc.dll" 5203 extinst = "1" extfunc = "databusout"} 5204 WriteBus.in con {extlib="cosim_hc.dll" 5205 extinst = "1" extfunc = "databusenable"} 5206 5207 # else 5208 bus_ts de interfaz uint 32 con {datos = pinList} 5209 DataBus DataOut WriteBus.in 5210 con {datos = pinList} 5211 # endif 5212 En este caso las funciones DataBusIn DataBusOut y DataBusEnable serían proporcionadas en la cosim_hc.dll del plugin y llamadas por el simulador. En el presente documento se dan detalles de la utilización de la API para escribir plugins. Situado consideraciones de temporización para autobuses 5214 A veces es importante ser consciente de la temporización de las interfaces externas. Mientras Handel-C sin bibliotecas de hardware no permite uno controlar los intervalos exactos algunos cuidado cuando escribir código puede permitir control suficiente hacer esas interfaces que funcione. La primera consideración es para las interfaces de bus_in. Esta forma de autobús está construida con ningún registro entre el pin externo y los puntos dentro de la FPGA donde los datos se utilizan. Por lo tanto si el valor en los cambios de pin externos asincrónicamente con el Handel-C de reloj retrasos enrutamiento dentro de FPGA pueden causar el valor a leerse de manera diferente en distintas partes del circuito. Por ejemplo 5215 interfaz bus_in int 1 leer un con 5216 {datos {"P1"}} par 5217 { 5218 x=a.read 5219 y=a.read 5220 5221 } 5222 A pesar de que a.read está asignado a x e y en el mismo ciclo de reloj si el retraso de pin 1 para el biestable de implementación de la variable x es significativamente diferente de la que entre el pin 1 y el biestable aplicar a continuación la variable y x y y puede terminar con valores diferentes. Esto puede verse considerando la temporización de algunas señales. 5223 Aquí el retraso entre el pin 1 y la entrada de y es ligeramente más largo que el retraso entre el pin 1 y la entrada a x. Como resultado cuando el borde aumento del reloj registra los valores de x e y hay un ciclo de reloj cuando x e y tienen valores diferentes. 76 Fig. ilustra un diagrama de temporización 7600 de conformidad con una encarnación de la invención presente. 5224 Este efecto puede ocurrir también en lugares que son más oscuros. Por ejemplo 5225 interfaz bus_in int 1 leer un con 5226 {datos = {"P1"}} 5227 mientras a.read==1 { 5228 5229 x = x + 1 5230 } 5231 En este ejemplo aunque a.read aparentemente sólo se utiliza una vez la aplicación de un tiempo bucle requiere la señal para enrutarse a dos lugares diferentes dando el mismo problema que antes. La solución a este problema es utilizar un bus_latch_in o un tipo de interfaz de bus_clock_in. 5232 Existe también un problema de sincronización con la salida de autobuses que necesita atención al diseñar la interfaz de hardware. En este caso el salida de valor en los pines no puede garantizarse excepto en bordes de reloj de Handel-C aumento. Entre bordes de reloj puede ser el valor en el proceso de cambio. 5233 Debido a los retrasos de enrutamiento a través de diferentes partes de la lógica de la expresión de salida son diferentes algunos pines pueden cambiar antes que otros dando lugar a valores intermedios que aparecen en los pines. Esto es especialmente evidente en la lógica combinatoria profundo. Por ejemplo int 5234 8 x 5235 int 8 y 5236 interfaz bus_out salida escribir = x * y 5237 con {datos = "p1" "p2" "p3" "p4" ¡ 5238 "P5" "P6" "P7" "P8"}} 5239 Aquí un multiplicador contiene lógica profunda para que algunos de los 8 pines pueden cambiar antes de otros líderes a valores intermedios. Es posible minimizar este efecto aunque no eliminar completamente mediante la adición de una variable antes de la salida. Efectivamente esto agrega un biestable a la salida. El ejemplo anterior a continuación se convierte en int 5240 8 x 5241 int 8 y 5242 int 8 z bus_out output write=z de interfaz de 5243 5244 con {datos = {"p1" "p2" "p3" "p4" ¡ 5245 "P5" "P6" "P7" "P8"}} z 5246 = x * y 5247 Puede ahora ser cuidado porque el valor de z puede ser actualizado cada vez que puede cambiar el salida de valor en el bus. Condiciones de carrera dentro de la lógica combinatoria pueden llevar a problemas técnicos en los pines de salida entre los bordes de reloj. Cuando esto sucede pines pueden fallo de 0 a 1 y volver a cero o viceversa como las señales que se propagan a través de la lógica combinatoria. Agregar un biestable en la salida en la forma descrita más arriba elimina estos efectos. Estas consideraciones también deben tenerse en cuenta al utilizar autobuses de tri-state bidireccional ya que efectivamente se trata de una combinación de un bus de entrada y un bus de salida. Metaestabilidad 5248 5249 La salida de una puerta lógica digital es un nivel de voltaje que normalmente representa '0' o '1'. Si el voltaje es inferior al umbral bajo representa 0 y si es por encima del umbral alto representa el 1. Sin embargo si el voltaje de entrada a un registro o cierre entre estos umbrales en el borde de reloj entonces la salida de ese registro puede ser indeterminada durante un tiempo antes de volver a un estado normal. El estado al que vuelve y no se puede predecir el tiempo en el que vuelve. Esto se llama metaestabilidad y puede ocurrir cuando se sincroniza datos en un registro durante el tiempo cuando cambia los datos entre los niveles de voltaje normal dos representantes de 0 y 1. Por lo tanto es una consideración importante para programas de Handel-C que puede de reloj en datos cuando los datos está cambiando de Estado. Las características de metaestabilidad de dispositivos de lógica digital varían enormemente. Para una discusión de FPGA Xilinx consulte la hoja de datos de FPGA Xilinx referencia 2 . Esta sección pone el problema en perspectiva. Por ejemplo un dispositivo de XC4000E una señal de datos de 1 MHz de sincronización con un reloj de 10 MHz se espera que sólo una vez en un millón de años más de 3 ns para recuperarse de un estado metaestable a un estado estable. Cuando se diseña un sistema examinar las características de la metaestabilidad de los dispositivos en las condiciones en que pueden ser utilizados para determinar si necesitan tomar precauciones. 5250 Está diseñado el sistema ideal tal que cuando es una velocidad de datos en un registro se garantiza que sea estable. Esto puede lograrse mediante el uso de intermedio un búfer de almacenamiento de información entre los dos sistemas que transfiere datos entre sí. Este almacenamiento podría ser un registro único de doble puerto memoria de doble puerto FIFO o memoria compartida. Indicadores de handshaking se utilizan para indicar que los datos están listos y que los datos se ha leído. Sin embargo incluso en esta situación muestreo de las banderas podría causar metaestabilidad. La solución es de reloj la bandera en el programa de Handel-C más de una vez por lo que se corre en un registro y la salida de ese registro es desplazada a continuación en otro registro. En el primer reloj la bandera podría estar cambiando Estado por lo que el resultado podría ser metaestable por un corto tiempo después el reloj. Sin embargo siempre que el período de reloj es largo relación con el período metaestable posible el segundo reloj puede reloj datos estables. Incluso más relojes además reducen la posibilidad de Estados metaestables entrar en el programa sin embargo el paso de un reloj a dos relojes es el más importante y debe ser adecuado para la mayoría de los sistemas. 5251 En el ejemplo siguiente tiene 4 relojes. La primera es en el procedimiento de bus_clock_in y el próximo 3 son en las asignaciones a las variables x y y z. 5252 int 4 x y z 5253 interfaz bus_clock_in int 4 lectura InBus con 5254 {datos = {"p1" "p2" "p3" "p4"}} par 5255 { 5256 while 1 5257 x=InBus.read 5258 while 1 5259 5260 y = x { 5261 5262 ...... z 5263 = y 5264 } 5265 } 5266 Recuerde mantener el problema en perspectiva mediante el examen de los detalles del sistema para estimar la probabilidad de metaestabilidad. En primer lugar a diseñar el sistema para minimizar el problema por disociación FPGA de hardware externo de sincrónica mediante el uso de almacenamiento externo de búfer. 5267 Metaestabilidad en todos los dominios de reloj 5268 Hay cuestiones de metaestabilidad particular cuando se trata con las comunicaciones en todos los dominios de reloj. Los canales que conectan entre dominios de reloj son unidireccional de punto a punto. La sincronización entre dominios no está especificada pero se garantiza que la transmisión se producen y ambas partes pueden esperar hasta que la transmisión ha finalizado. Por ejemplo 5269 / / Archivo transmit.c chan 5270 8 c / / canal puede tener alcance global 5271 void main void { 5272 int 5273 8 x y c 5274 x //program puede esperar hasta los datos 5275 //successfully transmitida c 5276 y 5277 } 5278 / / Archivo receive.c 5279 extern chan c 5280 void main void { 5281 5282 int 8 p q ¿c 5283 p ¿c 5284 q { 5285 Puertos 5286 5287 Si uno es lidiar con componentes de hardware en los dominios de reloj separada puede ser necesario insertar resynchronising hardware si no se incluye en los componentes. Por ejemplo si los datos se envía desde port_out a en dominio bbA y recibió de port_in b en bbB de dominio se pueden sincronizar los datos del reloj en el dominio de bbB. Esto puede hacerse mediante el uso de los datos al menos una vez en el archivo del contenedor de Handel-C. 5288 En el ejemplo siguiente muestra los tres archivos necesarios para conectar dos bloques EDIF bbA y bbA que utilizan diferentes relojes. Los pequeños archivos bbA.c y bbB.c conectan con el código EDIF mediante la port_out de y port_in a las interfaces. El archivo metastable.c genera un biestable que vuelve a sincronizar los datos por leer el valor de bbA en una variable. 5289 Del archivo metastable.c 5290 / * 5291 * Código de caja negra para volver a sincronizar 5292 * Tiene que ser una velocidad de reloj del lectura 5293 * es decir bbB-segunda de reloj 5294 * / int 5295 1 x interfaz 5296 bbA int 1 desde A B el bbB de interfaz del 5297 int 1 a = x principal de 5298 { 5299 while 1 5300 { 5301 5302 / * estabilizar los datos mediante la adición de 5303 * resincronización FF 5304 * / x=A.from 5305 { 5306 { 5307 Archivo 5308 bbA.c 5309 / * 5310 * Dominio bbA 5311 * Se conecta a bbA.edf 5312 * / 5313 void main void { 5314 5315 int 1 y 5316 interfaz port_out de int 1 de y { 5317 5318 Del archivo bbB.c 5319 / * 5320 * BbB de dominio 5321 * Se conecta a bbB.edf 5322 * / 5323 void main void { 5324 p de int 1 5325 interfaz 5326 puerto en int 1 a demasiado par 5327 { 5328 while 1 5329 { 5330 q=to.to 5331 / / leen datos 5332 } 5333 } 5334 } 5335 De forma alternativa el biestable resynchronising puede colocarse en el archivo que lee los datos del bloque de código extranjeros. 5336 Del archivo toplevel.c 5337 / * 5338 * Código para conectar los datos entre dos núcleos 5339 * / interfaz 5340 bbA int 1 desde A B int 1 to=A.from del bbB interfaz 5341 Archivo 5342 bbA.c 5343 / * 5344 * Dominio bbA 5345 * Compila a bbA.edf 5346 * / 5347 void main void { 5348 5349 int 1 y 5350 interfaz port_out de int 1 de = y 5351 }.Handel = lenguaje c 5352 Del archivo bbB.c 5353 / * 5354 * BbB de dominio 5355 * Complies a bbB.edf 5356 * / 5357 void main void { 5358 5359 int 1 q y Puerto de interfaz 5360 en int 1 a a while 1 5361 { 5362 par 5363 { 5364 q=to.to 5365 / / Volver a sincronizar datos 5366 y = q 5367 } 5368 } 5369 } 5370 Interactuar con lógica externa Georg Friedrich Händel-C 5371 proporciona que la interfaz ordena port_in y port_out. Estos permiten tener un conjunto de cables no conectados a los pines que él o ella puede utilizar para conectarse a un dispositivo simulado o a otra función dentro de la FPGA. Se supone que Handel-C ha suministrado una declaración de interfaz para este tipo y una oferta de una definición de instancia. port_in 5372 5373 Para una port_in define los puertos de datos del código de Handel-C y cualquier especificación asociado. port_in de la interfaz 5374 data_TO_hc de tipo con {port_specs} De nombre 5375 con {Instance_specs} 5376 Por ejemplo 5377 interfaz port_in int 4 signals_to_HC leer 5378 Uno a continuación puede leer los datos de entrada de la variable Name.data_TO_hc en este caso read.signals_to_HC port_out 5379 5380 Para una port_out uno definir los puertos de datos desde el código de Handel-C la expresión a ser salida a través de los puertos y cualquier asociado de especificaciones. interfaz de la 5381 port_out Name Type data_FROM_hc= output_Expr 5382 con {port_specs} 5383 con {Instance_specs} 5384 Por ejemplo 5385 int X_out interfaz de la 5386 port_out unidad 5387 int 4 signals_from_HC = X_out 5388 En este caso el ancho de X_out podría deducirse ser 4 ya es el ancho del puerto que se envían los datos a. Especificación de la interfaz 5389 5390 76A FIG. es un diagrama de flujo 7650 mostrando un método para proporcionar una interfaz versátil. En primer lugar en la operación 7652 código informático está escrito en un lenguaje de programación de primero. El primer código de equipo incluye referencia al segundo código de equipo en un segundo idioma de programación. Véase operación 7654. En uno de los aspectos de la presente invención la referencia al segundo código de equipo puede incluir un comando predeterminado en el primer equipo de código. En todavía otro aspecto el segundo lenguaje de programación puede ser EDIF o VDHL. 5391 Se simula el segundo código de equipo en el segundo lenguaje de programación para su uso durante la ejecución del primer equipo código en un lenguaje de programación. Nota de operación 7656. En un aspecto de la invención presente el segundo código de equipo puede ser simulado por un primer módulo simulador. En un aspecto tan el primer módulo de simulador puede un segundo simulador de módulo de interfaz. Como una opción más el primer módulo de simulador puede el segundo simulador de módulo de interfaz a través de un módulo plugin. 5392 FIG. 77 ilustra la manera en la que se especifica una interfaz 7700 de conformidad con una encarnación de la invención presente. Uno puede especificar cualquier formato de interfaz en particular. Esto permite a él o a ella para comunicarse con el código escrito en otro idioma 7702 como VHDL o EDIF y el simulador de Handel-C 7704 para comunicarse con un programa de plugin externo 7706 por ejemplo una conexión con un simulador VHDL . El uso esperado para esto es permitir a uno incorporar la compró en o artesanales piezas de código de bajo nivel en el programa de Handel-C de alto nivel. También permite incorporar el código de programa de Handel-C dentro de un gran programa EDIF o VHDL. Uno también puede utilizarlo para comunicarse con los programas que se ejecutan en un PC que simulan los dispositivos externos. 5393 Para utilizar como una pieza de código requiere que uno incluye una declaración de interfaz en el código de Handel-C para conectarlo al bloque de código externo. Esta declaración también dice que el simulador para llamar a un plugin que a su vez puede invocar un simulador para el código de extranjero . 5394 Handel-C código necesario 5395 El código necesario en el programa de Handel-C consta de dos partes. En primer lugar una persona necesita una declaración de interfaz en la forma más simple se trata del formato tipo de interfaz 5396 {extern_to_HC_ort { extern_to_HC_port}} {HC_to_extern_port { HC_to_extern_port}} donde 5397 tipo 5398 es el nombre que se da a este tipo de interfaz extern_to_HC_port 5399 es el prototipo tipo y nombre de un puerto de entrada utilizado para comunicarse desde el código externo a la Handel-C. HC_to_extern_port 5400 es el prototipo tipo y nombre de un puerto de salida que se utiliza para comunicarse con el código externo desde la Handel-C. Puede declarar al menos un puerto de entrada o de salida . A continuación hay que definir una instancia de la interfaz en el formato sort {extern_to_HC_port} de interfaz 5401 Nombre 5402 {HC_to_extern_port = data_from_HC_to_extern 5403 con {portSpec} { HC_to_extern_port = data_from_HC_to_extern 5404 5405 con {portSpec} }} 5406 con {extlib = "simulator_plugin" especificaciones} donde 5407 tipo 5408 es el nombre que se da a este tipo de interfaz extern_to_HC_port 5409 es la definición del puerto previamente declarada. Esta definición puede incluir un opcional con la especificación. 5410 con {portSpec} es opcional. Consta de una o más especificaciones de puerto para un único puerto en la interfaz nombre 5411 es el nombre que se da a esta definición de la interfaz HC_to_extern_port 5412 es la definición del puerto previamente declarada. Esta definición puede incluir una con la especificación. data_from_HC_to_extern 5413 es una expresión que se puede enviar al código externo desde la Handel-C. simulator_plugin 5414 es el nombre de un archivo en el PC que administra la Cosimulación. Proporciona las entradas y los datos desde el código externo. Este archivo de plugin puede a su vez invocar otro simulador. . Su presencia es opcional. Especificaciones 5415 son especificaciones de instancia requeridas algunos de estos pueden depender el plugin de archivo cosimulator . 5416 Herramientas específicas destinadas a 5417 Cuando se compila a EDIF Handel-C tiene la capacidad para dar formato a los nombres de los cables a la lógica externa de acuerdo con las diferentes sintaxis usado por las herramientas de lugar y de la ruta. Uno puede hacer esto mediante la especificación de busformat a un puerto. Esto le permite especificar cómo se da formato al número de nombre y alambre de autobús. 5418 Para especificar un formato uno utiliza la sintaxis puerto 5419 con {busformat = "formatString"}. formatstring 5420 puede ser una de las siguientes cadenas. B representa el nombre de autobús y 1 representa el número de alambre. 5421 B1 5422 B.sub 1. B 5423 1 B 1 5424 B 5425 lt 1 gt Ejemplo de 5426 5427 interfaz port_in int 4 signals_to_HC con 5428 {busformat="B 1 leer 5429 produciría cables 5430 signals_to_HC 0 5431 signals_to_HC 1 5432 signals_to_HC 2 5433 signals_to_HC 3 ram 5434 unsigned rax 4 4 con {puertos 1 busformat.DELTA".B lt 1 gt "} 5435 produciría cables //Address de rax_SPPort_addr lt 0 gt 5436 5437 rax_SPPort_addr lt 1 gt 5438 rax_SPPort_data_in lt 0 gt //Data en 5439 rax_SPPort_data_in lt 1 gt 5440 rax_SPPort_data_in lt 2 gt 5441 rax_SPPort_data_in lt 3 gt 5442 rax_SPPort_data_out lt 0 gt //Data Out 5443 rax_SPPort_data_out lt 1 gt 5444 rax_SPPort_data_out lt 2 gt 5445 rax_SPPort_data_out lt 3 gt rax_SPPort_data_en 5446 / / habilitar datos rax_SPPort_elk 5447 / / reloj rax_SPPort_cs 5448 / / Chip Select rax_SPPort_oe 5449 / / habilitar salida rax_SPPort_we 5450 / / datos en. Especificaciones de objeto 5451 Georg Friedrich Händel-C 5452 proporciona la capacidad para agregar 'etiquetas' a ciertos objetos variables canales puertos autobuses RAMs ROMs mprams y señales para controlar su comportamiento. Estas etiquetas o especificaciones aparecen después de la declaración de que el objeto utilizando el con la palabra clave. Esta palabra clave toma uno o más de los siguientes atributos. 5453 78 Bis Figs a través de 78 C ilustra una tabla que muestra la especificación de palabras clave diferentes 7800 de conformidad con una encarnación de la invención presente. Las secciones anteriores ya han mostrado brevemente cómo usar algunas de estas especificaciones pero esta sección trata esto con más detalle y describe también las otras especificaciones en la tabla anterior. Especificaciones 5454 pueden ser agregadas a los objetos como sigue 5455 sin signo 4 w con {mostrar = 0} 5456 int 5 x con {mostrar = 0 base = 2} 5457 chanout char y con {outfile="output.dat"} 5458 chanin int 8 z con {infile="input.dat"} interfaz 5459 bus_clock_in int 4 en InBus con 5460 {extracción = 1 datos 5461 = "p1" "p2" "p3" "p4"} 5462 } 5463 Al declarar varios objetos la especificación puede darse al final de la línea y se aplica a todos los objetos declarados en dicha línea. Por ejemplo 5464 sin signo x y con {mostrar = 0} 5465 Esto concede la especificación de espectáculo con un valor de 0 a variables x e y. 5466 De cada una de las especificaciones se detalla a continuación. 5467 La especificación de Show 5468 La especificación de espectáculo puede prestarse a variable canal bus de salida y las declaraciones de autobuses de tri-state. Cuando se establece en 0 esta especificación indica el simulador de Handel-C no a este objeto en su salida de la lista. Esto significa que no puede aparecer en la ventana de depuración de las Variables en la GUI. 5469 El valor predeterminado de esta especificación es 1. 5470 Reducir el número de elementos que se muestran en la lista de salida desde el simulador produce una notable velocidad hasta en la simulación. 5471 La especificación Base 5472 La especificación base puede prestarse a variable canal de salida autobús de salida y declaraciones de autobuses de tri-state. El valor que esta especificación se establece en dice la Handel-C compilador que basar para mostrar el valor del objeto. Bases válidas son 2 8 10 y 16 para binario octal decimal y hexadecimal respectivamente. El valor predeterminado de esta especificación es 10. 5473 La Infile y Outfile especificaciones 5474 La especificación infile puede prestarse a chanin bus_in bus_latch_in bus_clock_in bus_ts bus_ts_latch_in y bus_ts_clock_in de las declaraciones. La especificación outfile puede concederse a las declaraciones de chanout bus_out bus_ts bus_ts_latch_in y bus_ts_clock_in. Las cadenas que estas especificaciones se establecen a podrán informar el simulador del archivo que se deben leer datos desde infile o el archivo de datos se deben escribir a outfile . Cuando se aplica a una variable el estado de esa variable en cada ciclo de reloj se coloca en ese archivo cuando la simulación lleva a cabo. Tenga en cuenta que al aplicar la especificación outfile no se preste a múltiples variables o canales. Por ejemplo no se permiten las siguientes declaraciones 5475 int x y con {outfile="out.dat"} chanout 5476 a b con {outfile="out.dat"} 5477 Para obtener más detalles de la conexión de canales a archivos. De forma predeterminada no se utiliza ningún archivo de entrada o de salida. 5478 La especificación de advertir 5479 La especificación de advertir puede prestarse a una variable RAM ROM canal o autobús. Cuando se establece en cero pueden desactivar ciertas advertencias no cruciales para ese objeto. Cuando se establece en uno el valor predeterminado pueden habilitar todas las advertencias para ese objeto. advertir de 5480 = 0 la especificación de velocidad 5481 La especificación de velocidad puede prestarse a una salida o autobuses de tri-state. El valor de esta especificación controla el slew rate del búfer de salida para los pines en el bus. Para dispositivos de Xilinx 0 es lento 3 es rápido y a continuación el valor por defecto es 3. Altera dispositivos 0 es lento 1 es rápido y a continuación el valor predeterminado es 1. Consulte las hojas de datos de Xilinx o Altera FPGA de detalles de slew rate control 5482 a 1.600 Especificaciones de la Intime y Outtime 5483 5484 La especificación intime puede darse a un puerto de entrada o autobús autobús de tri-state o off-chip de memoria. La especificación de outtime puede darse a un puerto de salida o autobús autobús de tri-state o off-chip de memoria. Cuando se aplica a los chips de Xilinx estas especificaciones causan Handel-C generar un archivo de restricciones de Netlist NCF para el diseño. Las herramientas del lugar ruta y a continuación utilizan este archivo para restringir las rutas de acceso pertinentes. 5485 intime especifica el retardo máximo en ns permitidas entre una interfaz o memoria y los elementos que se alimenta. outtime 5486 especifica el retardo máximo en ns permitidas entre una interfaz o de memoria y de los elementos es alimentado desde. Pueden ser números de punto flotante. Por ejemplo 5487 macro expr memoryPins = {"p6" "p7" "p8" 5488 "P9" "P10" "P11" "P12" "P13 "} 5489 macro expr dataPins = {"p1" "p2" "p3" "p4"} 5490 interfaz bus_in 4 sin signo hword con {datos = dataPins 5491 intime = 5} interfaz de la 5492 port_out 5493 out=hword.in+1 4 sin signo 5494 con {outtime = 5.2} 5495 ram int 8 15 43 con {outtime = 5.2 5496 offchip = 1 datos 5497 = memorypins} 5498 La especificación de Busformat 5499 La especificación de busformat puede prestarse a una interfaz el puerto o la memoria que reside en la lógica externa. Cuando se compila a EDIF la cadena de busformat define el formato de los nombres de alambre. Los valores válidos para la cadena de busformat son 5500 B1B.sub. 1 B 1 de B 1 B 5501 representa el nombre de bus y 1 el número de alambre. 5502 El formato predeterminado es B.sub. - 1 5503 La especificación de extracción 5504 La especificación de extracción puede concederse a un bus de entrada o tri-state. Cuando se establece en 1 un pull up resistor se agrega a cada uno de los pines del bus. Cuando se establece en 0 un pull-down resistor se agrega a cada uno de los pines del bus. Se utiliza cuando esta especificación no se da para un autobús no extracción o tire hacia abajo de la resistencia. Altera dispositivos no tienen pull-up o resistencias de pull-down. Consulte la hoja de datos de FPGA Xilinx para obtener detalles de extracción hasta y tire hacia abajo de resistencias. Por no predeterminado pull up o tire hacia abajo resistencias están conectados a los pines. 5505 La especificación de datos 5506 La especificación de datos puede prestarse a una interfaz externa o la memoria. Consiste en una lista de números de pin separados por comas. Si se omite la especificación de datos las herramientas de lugar y ruta pueden asignar los pines. 5507 macro expr memoryPins = {"p6" "p7" "p8" 5508 "P9" "P10" "P11" "P12" "P" DE 13} 5509 macro expr dataPins = {"p1" "p2" "p3" "p4"} 5510 interfaz bus_in 4 sin signo hword con {dataPins de datos 5511 intime = 5} 5512 ram int 8 15 43 con {datos = memoryPins} 5513 La especificación de Offchip 5514 La especificación de offchip puede prestarse a una memoria RAM o declaración de ROM. Cuando establece en 1 el compilador de c de Handel construye una interfaz de memoria externa para la RAM o ROM utilizando los pines enumerados en la dirección datos cs que y oe especificaciones véase más abajo . Cuando se establece en 0 el compilador de c de Handel construye la RAM o el ROM en el FPGA y omite cualquier pines con otras especificaciones. 5515 intime y outtime especificaciones pueden aplicarse también a los RAMs off-chip. Si no les han dado el compilador intenta construir desde la tasa westart y especificaciones de welength. Si falta alguno de estos el compilador no calcula el especificaciones de tiempo para la memoria. 5516 ram int 8 15 43 con {offchip = 1} 5517 La especificación de puertos 5518 La especificación de puertos puede prestarse a una memoria RAM o declaración de ROM. Cuando se establece en 1 el compilador de c de Handel basa en una interfaz de memoria externa para la RAM o ROM mediante los puertos definición en la dirección datos Cs que y oe especificaciones véase más abajo . Esto le permite conectarse a los RAMs en código externo. El compilador genera un error si los puertos y la especificación de offchip se establecen a 1 para la misma memoria. Todas las otras especificaciones pueden aplicarse. Si la especificación de puertos se aplica a un MPRAM se puede generar una interfaz independiente para cada puerto. 5519 La especificación de bloque de Xilinx 5520 La especificación de bloque puede prestarse a una memoria RAM o declaración de ROM. Uno puede especificar que un bloque de memoria RAM se crea en un chip de Xilinx Virtex con el bloque de especificación = 1. Por ejemplo 5521 ram int 8 15 43 con {bloque = 1} 5522 La especificación de bloque por defecto es 0 no en el bloque de memoria . 5523 La especificación de Wegate 5524 La especificación de wegate puede darse a RAM interno o externo declaraciones para forzar la generación de una RAM asincrónica. Cuando se establece en 0 la luz estroboscópica de escritura puede aparecer durante todo el ciclo de reloj de Handel-C. Cuando se establece en -1 la luz estroboscópica de escritura puede aparecer sólo en la primera mitad del ciclo del reloj de Handel-C. Cuando se establece en 1 la luz estroboscópica de escritura puede aparecer sólo en la segunda mitad del ciclo del reloj de Handel-C. 5525 Las especificaciones de Welength y Westart 5526 Las especificaciones de westart y welength pueden darse a las declaraciones de RAM internas o externas. Sólo se pueden usar estas especificaciones junto con los tipos de reloj de external_divide o internal_divide con un factor de división mayor que 1. 5527 Las especificaciones de westart y welength posición de la luz estroboscópica habilitar de escritura dentro del ciclo de reloj de Handel-C. 5528 Las especificaciones de rclkpos wclkpos clkpulselen y clk 5529 La rclkpos wclkpos y clkpulselen pueden darse a las declaraciones de SSRAM internas o externas. La especificación de alce se utiliza para las declaraciones de SSRAM externas. Para utilizar estas especificaciones uno puede utilizar los tipos de reloj de external_divide o internal_divide con un factor de división de 2 o más. rclkpos 5530 especifica las posiciones de los ciclos de reloj del nuevo reloj ram RAMCLK para un ciclo de lectura. Estas posiciones podrían especificarse en términos de ciclos de un reloj rápido externo CLK contando hacia adelante desde el borde de aumento del reloj Handel-C HCLK aumento de borde. wclkpos 5531 especifica que las posiciones de los ciclos de reloj del nuevo reloj ram RAMCLK para una escritura del ciclo. clkpulselen 5532 especifica la longitud de los impulsos de la RAM nuevo reloj RAMCLK términos de ciclos de CLK. Esto se especifica sólo una vez para un RAM. Por lo tanto se aplica a los relojes de lectura y escritura. clk 5533 especifica el pin s que llevar el nuevo reloj de RAM RAMCLK a la SSRAM externa. 5534 Especificar Outs de Pin 5535 La addr datos que cs y especificaciones oe cada uno tener una lista de pines del dispositivo y se utilizan para definir las conexiones entre el FPGA y dispositivos externos. Fig. 78D ilustra la manera en que abarca un pin son especificado 7850 de conformidad con una encarnación de la invención presente. 5536 De listas de PIN se dan siempre en el orden más significativo a menos significativo. Múltiples de habilitar de escritura pines de salida y seleccione Activar chip pueden darse para permitir externos RAMs y ROMs a construirse a partir de múltiples dispositivos. Por ejemplo cuando se utilizan dos chips amplio de 4 bits para hacer un RAM amplio de 8 bits podría usarse la siguiente declaración ram 5537 sin signo de 8 ExtRAM 256 con {offchip = 1 5538 addr = {"p1" "p2" "p3" "p4" 5539 "P5" "P6" "P7" "P8"} datos 5540 = {"p9" "p10" "p11" "p12" nosotros 5541 = {"P17" "p18"} cs 5542 = {"P19" "p20"} oe 5543 = {"P21" "p22"}} 5544 Las especificaciones de la tasa 5545 La especificación de la tasa puede darse a un reloj para especificar el retraso máximo en ns permitidas entre componentes alimentados desde ese reloj. Esta especificación causa Handel-C generar un archivo de restricciones de Netlist NCF para el diseño. Las herramientas de lugar ruta y a continuación utilizan este archivo para restringir las rutas de acceso pertinentes para que el reloj la parte del diseño conectado al reloj en cuestión a la velocidad especificada. tasa puede ser un número de punto flotante. Por ejemplo reloj set 5546 = external_divide "d17" 4 con 5547 {tasa = 1 4} . Interfaz de Hardware de ejemplo 5548 5549 Por ejemplo interfaz teórica es ahora descrito para ilustrar el uso de autobuses. El escenario es de un dispositivo externo conectado al FPGA que puede leerse desde o escrito a. El dispositivo tiene una serie de señales que se conecta al FPGA. 79 Fig. ilustra las diferentes señales 7900 empleadas por la invención de la presente. 5550 A leer desde un dispositivo se realiza por esperando a que ReadRdy a ser activos alta . La señal de lectura entonces es tomada alta por ciclo de reloj y los datos que se muestra en el borde de caída de la luz estroboscópica. 80 Fig. ilustra a un representante de lectura de forma de onda de un ciclo de 8000 de conformidad con una encarnación de la invención presente. 5551 A escritura al dispositivo se realiza por esperando a que WriteRdy a ser activos alta . La señal de escritura entonces es tomada alta por ciclo de reloj mientras está impulsados los datos al dispositivo por el FPGA. El dispositivo de muestras de los datos en el borde de caída de la señal de la escritura. 81 Fig. ilustra una forma de onda representativo de una escritura ciclo 8100 de conformidad con una encarnación de la invención presente. 5552 La primera etapa del código podrá declarar los autobuses asociados a cada una de las señales externas. Esto hace en el código siguiente 5553 int 4 datos int 5554 1 En = 0 5555 interfaz bus_ts_clock_in int 4 dataB 5556 datos En == 1 con 5557 {datos = {"p1" "p2" "p3" "p4"}} Escribir 5558 int 1 = 0 interfaz de 5559 bus_out writeB Write con 5560 {datos = {"P5"}} Lee 5561 int 1 = 0 interfaz de 5562 bus_out readB Read con 5563 {datos = {"P6"}} 5564 interfaz bus_clock_in int 1 5565 De WriteReady con {datos = {"P7"}} 5566 interfaz bus_clock_in int 1 ReadReady con 5567 {datos = {"P8"}} 5568 Los valores en los buses de salida ahora se cambiará por definir los valores de las variables de datos la escritura y la lectura. Además uno puede conducir el bus de datos con el contenido de datos estableciendo En 1. Tenga en cuenta que las variables que autobuses de la unidad se ha inicializado a 0 por lo que estas variables pueden ser estática o global. Esto puede ser importante cuando conducción escribir luces estroboscópicas como en el presente caso. Debe tenerse cuidado durante la configuración que los pines FPGA están desconectados de alguna forma de los dispositivos externos porque los pines FPGA convertido en tri-state durante este tiempo. 5569 El programa principal lee una palabra de dispositivo externo antes de volver a escribir una palabra. 5570 void main void { 5571 5572 int 4 datos 5573 / / Lee la palabra de dispositivo externo ReadReady 0 mientras que 5574 demora de 5575 Lectura 5576 1 / / Establecer la lectura de luz estroboscópica par 5577 { 5578 Data=dataB.in 5579 / / Leer el bus Lectura 5580 0 / / Desactive la lectura de luz estroboscópica 5581 } 5582 / / Escribir una palabra en el dispositivo externo Reg 5583 = datos + 1 tiempo 5584 WriteReady == 0 demora revertir par 5586 { 5587 En 5588 = 1 / / Unidad el bus Escritura 5589 = 1 / / Establecer la luz estroboscópica de escritura negra } Escritura 5591 = 0 / / Desactive la luz estroboscópica de escritura En 5592 = 0 / / Dejar de conducir el autobús 5593 Tenga en cuenta durante la fase de escritura el bus de datos está impulsado por ciclo de reloj después de la luz estroboscópica escritura va baja para garantizar que los datos son estables en el borde de caída de la luz estroboscópica. Expresiones de Macro estándar 5594 Introducción 5595 5596 Handel-C el compilador está provisto de un archivo de encabezado estándar que contiene una colección de expresiones de macro útiles. Puede utilizar este archivo de encabezado simplemente lo incluido en el programa de Handel-C con la siguiente línea 5597 # include lt stdlib.h gt 5598 Nota que este archivo de encabezado no es el mismo que el archivo de cabecera stdlib.h c convencionales pero que contiene una colección estándar de definiciones útiles para el programador de c de Handel. 5599 Las definiciones propias están incluidas en la biblioteca de stdlib.lib que se suministra en el directorio de Handel-C.backslash.Lib. Uno puede asegurarse de que él o ella ha incluido este directorio en la biblioteca incluye la ruta de acceso si él o ella utiliza las definiciones de macro. Las siguientes secciones describen cada macro en detalle. Definiciones de constantes 5600 5601 El archivo de cabecera stdlib.h contiene las siguientes definiciones de constantes Definición de nombre constante 5602 1 CIERTO 5603 0 FALSO 5604 5605 Estas definiciones a menudo conducen a código más limpio y más legible por ejemplo int 5606 8 x con {mostrar = FALSE} 5607 while TRUE { 5608 5609 ...... 5610 } if a==TRUE 5611 { 5612 5613 ...... Macros de manipulación de bits 5614 5615 El archivo de cabecera stdlib.h contiene un número de macro expresiones utilizadas para manipular los bits y bits de campos que se indican a continuación. Adjs 5616 Uso de 5617 adjs expresión ancho 5618 Parámetros Expresión de expresión 5619 ajustar puede ser entero con signo 5620 Ancho ancho para ajustar a Devuelve 5621 5622 Firmado entero de ancho ancho. Descripción 5623 5624 Ajusta ancho de expresión firmado hacia arriba o hacia abajo. Signo extiende MSBs de expresión al ampliar el ancho. Cuando se reduce el ancho de las gotas MSBs de expresión. Ejemplo de 5625 5626 int 4 x 5627 int 5 y 5628 int 6 z 5629 y = 15 x 5630 = adjs y width x //x=7 y = a 5631 -4 z 5632 = adjs y width z / / z =-4. Adju 5633 Uso de 5634 adju expresión ancho 5635 Parámetros Expresión de expresión 5636 ajustar puede ser entero sin signo 5637 Ancho ancho para ajustar a Devuelve 5638 5639 Entero sin signo de ancho ancho. Descripción 5640 5641 Ajusta ancho de expresión sin signo arriba o abajo. Cero almohadillas MSBs de expresión al ampliar el ancho. Cuando se reduce el ancho de las gotas MSBs de expresión. Ejemplo de 5642 5643 sin signo de 4 x 5644 5 sin firmar y 5645 z 6 sin signo 5646 y = 14 5647 x = adju y width x //x=14 z 5648 = adju y width z / / z = 14. Copia de 5649 Uso de 5650 copia expresión Count 5651 Parámetros Expresión de expresión 5652 para copiar 5653 Número de veces para copiar Devuelve 5654 Expresión 5655 había duplicado Count veces. 5656 De expresión de devuelto es del mismo tipo que la expresión 5657 De ancho devuelto es Conde * ancho expresión . Descripción 5658 Duplicados 5659 un poco de campo varias veces. Ejemplo de 5660 5661 sin signo de 32 x 5662 4 sin firmar y 5663 y = 0xA 5664 x = copiar y 8 / / x = 0xAAAAAAAA. Lmo 5665 Uso de 5666 lmo expresión 5667 Parámetros Expresión de expresión 5668 para calcular dejó una mayoría de. Devuelve 5669 Bit 5670 posición de izquierda más uno en la expresión o width Expression si la expresión es cero. El valor devuelto es log2 width Expression + 1 bits amplia. Descripción 5671 5672 Encuentra la posición de 1 bit más significativo en una expresión. Ejemplo de 5673 5674 int 4 x 5675 int 3 y 5676 x = 3 y=lmo x 5677 / / y = 1 x 5678 = 0 y=lmo x 5679 / / y = 4 lmz 5680 Uso de 5681 lmz expresión 5682 Parámetros Expresión de expresión 5683 para calcular dejó la mayoría cero de. Devuelve 5684 Bit 5685 posición de izquierda mayoría cero en la expresión o width Expression si la expresión es todos los. El valor devuelto es log2 width Expression + 1 bits amplia. Descripción 5686 5687 Encuentra la posición de bit 0 más significativo en una expresión. Ejemplo de 5688 5689 int 4 x 5690 int 3 y 5691 x = 3 y=lmz x 5692 / / y = 2 5693 x = 15 y=lmz x 5694 / / y4 . Población de 5695 Uso de 5696 población expresión 5697 Parámetros Expresión de expresión 5698 para calcular la población de. Devuelve 5699 5700 Valor del mismo tipo que la expresión Descripción 5701 5702 Cuenta el número de 1 bit población en la expresión. 5703 Ejemplo 5704 int 4 x 5705 int 3 y x 5706 = 0b1011 y=population x 5707 // 3. Rmo 5708 Uso de 5709 rmo expresión 5710 Parámetros Expresión de expresión 5711 para calcular la noche mayoría uno de. Devuelve 5712 Bit 5713 posición de derecho una mayoría en la expresión o width Expression si la expresión es cero. El valor devuelto es log2 width Expression + 1 bits amplia. Descripción 5714 5715 Encuentra la posición de la 1 bit menos significativo en una expresión. Ejemplo de 5716 5717 int 4 x 5718 int 3 y 5719 x = 3 y=rmo x 5720 //y=0 x 5721 = 0 y=rmo x 5722 / / y = 4 . Rmz 5723 Uso de 5724 rmz Expression 5725 Parámetros Expresión de expresión 5726 para calcular el derecho más cero de. Devuelve 5727 Bit 5728 posición de derecho cero la mayoría en la expresión o width Expression si la expresión es todos los. El valor devuelto es log2 width Expression + 1 bits amplia. Descripción 5729 5730 Encuentra la posición de la 0 el bit menos significativo en una expresión. Ejemplo de 5731 5732 int 4 x 5733 int 3 y 5734 x = 3 y=rmz x 5735 / / y = 2 5736 x = 15 y=rmz x 5737 / / y = 4 . Top 5738 Uso de 5739 parte superior expresión ancho 5740 Parámetros Expresión de expresión 5741 para extraer bits de. Número de bits para extraer de ancho. Devuelve 5742 5743 Valor del mismo tipo que la expresión. Descripción 5744 Extractos 5745 los bits más significativos de la anchura de una expresión. Ejemplo de 5746 5747 int32 x 5748 int 8 y x 5749 = 0x2345678 5750 y = top x width y / / y = 0x12. Macros de aritméticas 5751 5752 El archivo de cabecera stdlib.h contiene una serie de expresiones de macro para cálculos matemáticos que se enumeran a continuación. Abs 5753 Uso de 5754 abs Expression 5755 Parámetros 5756 Firmado de expresión expresión para obtener el valor absoluto de. Devuelve 5757 5758 Firmado valor del mismo ancho que la expresión. Descripción 5759 5760 Obtains el valor absoluto de una expresión. 5761 Ejemplo int 5762 8 x 5763 int 8 y 5764 x = 34 y = a 5765 -18 x=abs x 5766 / / x = 34 y=abs y 5767 / / y = 18. Addsat 5768 Uso de 5769 addsat Expression1 Expression2 5770 Parámetros 5771 Operando sin signo de Expression1 1. Operando sin signo de Expression2 5772 2. Puede ser de la misma anchura como expresión 1. Devuelve 5773 5774 Valor sin signo del mismo ancho que la expresión y Expression2. Descripción 5775 5776 Devuelve suma de expresión y la expresión 2. Además está saturado y el resultado no puede ser mayor que el valor máximo representable en el ancho del resultado. 5777 Ejemplo 5778 sin signo de 8 x 5779 8 sin firmar y 5780 z sin signo de 8 5781 x = 34 5782 y = 18 z 5783 = addsat x y / / z = 52 5784 x = 34 5785 y = 240 z 5786 = addsat x y z = 255. Decode 5787 Uso de 5788 decode Expression 5789 Parámetros Operando de expresión sin signo 5790 . Devuelve 5791 5792 Valor sin signo de ancho 2 ancho expresión Descripción 5793 Expresión de devuelve 2 5794 . Ejemplo de 5795 5796 sin signo de 4 x 5797 16 sin firmar y 5798 x = 8 y=decode x 5799 / / y = 0b100000000. div 5800 Uso de 5801 div Expression1 Expression2 5802 Parámetros 5803 Operando sin signo de Expression1 1. Operando sin signo de Expression2 5804 2. Puede ser de la misma anchura como Expression1. Devuelve 5805 5806 Valor sin signo del mismo ancho que Expression1 y expresión 2. Descripción 5807 5808 Devuelve un valor entero de Expression1 y Expression2. 5809 Ejemplo 5810 sin signo de 8 x 5811 8 sin firmar y 5812 z sin signo de 8 5813 x = 56 5814 y = 6 z 5815 = div x y / / z = 9 5816 Advertencia División requiere una gran cantidad de hardware y debe evitarse a menos que sea absolutamente necesario. exp2 5817 Uso de 5818 exp2 Constant 5819 Parámetros 5820 Constante operando. Devuelve 5821 5822 Constante de ancho ancho + 1 constante . Descripción 5823 5824 Se utiliza para calcular la constante de 2. Similares a descodificar pero puede utilizarse con constantes de ancho sin definir. Ejemplo de 5825 5826 sin signo de 4 x 5827 sin signo exp2 width x y / / y de ancho 16 incwrap 5828 Uso de 5829 incwrap Expression1 Expression2 5830 Parámetros 5831 Expression1 operando 1. 5832 Expression2 operando 2. Puede ser el mismo ancho que Expression1. Devuelve 5833 5834 Valor del mismo tipo y ancho como Expression1 y Expression2. Descripción 5835 5836 Se utilizan para incrementar un valor con ceñido alrededor de un segundo valor. Devuelve Expression1 + 1 o 0 si Expression1 + 1 es igual a Expression2. 5837 Ejemplo 5838 sin signo de 8 x 5839 x = 74 x 5840 = incwrap x 76 / / x = 75 x 5841 = incwrap x 76 / / x = 0 x 5842 = incwrap x 76 / / x = 1 log2ceil 5843 Uso de 5844 log2ceil Constant 5845 Parámetros 5846 Constante operando. Devuelve 5847 5848 Valor constante de ceiling log2 Constant . Descripción 5849 5850 Permite calcular log2 de un número y el resultado se redondea. Es útil para determinar el ancho de una variable debe contener un valor determinado. Ejemplo de 5851 5852 sin signo log2ceil 5768 x / / x 13 bits de anchura 5853 8 sin firmar y y=log2ceil 8 5854 / / y = 3 y=log2ceil 7 5855 / / y = 3 log2floor 5856 Uso de pico log2floor Constant 5858 Parámetros 5859 Constante operando. Devuelve 5860 5861 Valor constante de floor log2 Constant . Descripción 5862 5863 Se utiliza para calcular el log2 de un número y redondea el resultado. Ejemplo de 5864 5865 8 sin firmar y y=log2floor 8 5866 / / y = 3 y=log2floor 7 5867 / / y = 2. Mod 5868 Uso de 5869 mod Expression1 Expression2 5870 Parámetros 5871 Operando sin signo de Expression1 1. Operando sin signo de Expression2 5872 2. Puede ser de la misma anchura como Expression1. Devuelve 5873 Formulación valor sin signo del mismo ancho que Expression1 y Expression2. Descripción 5875 5876 Devuelve resto de Expression1 dividido por Expression2 Ejemplo de 5877 5878 sin signo de 8 x 5879 8 sin firmar y 5880 z sin signo de 8 5881 x = 56 5882 y = 6 z 5883 = mod x y / / z = 2 5884 Advertencia Módulo aritmético requiere una gran cantidad de hardware y debe evitarse a menos que sea absolutamente necesario. Signo 5885 Uso de 5886 sign Expression 5887 Parámetros Operando de expresión firmado 5888 . Devuelve 5889 Entero sin signo 5890 todo de 1 bit. Descripción 5891 5892 Se utiliza para obtener el signo de una expresión. Devuelve cero si la expresión es positivo o uno si la expresión es negativo. Ejemplo de 5893 5894 int 8 y 5895 z 1 sin signo 5896 y = 53 z=sign y 5897 / / z = 0 5898 y = 53 z=sign y 5899 / / z = 1 subsat 5900 Uso de 5901 subsat Expression1 Expression2 5902 Parámetros 5903 Operando sin signo de Expression1 1. Operando sin signo de Expression2 5904 2. Puede ser el mismo ancho que Expression1. Devuelve 5905 5906 Valor sin signo del mismo ancho que Expression1 y Expression2. Descripción 5907 5908 Devuelve diferencia entre Expression1 y Expression2. Resta está saturado y el resultado no puede ser menor que 0. Ejemplo de 5909 5910 sin signo de 8 x 5911 8 sin firmar y 5912 z sin signo de 8 5913 x = 34 5914 y = 18 z 5915 = subsat x y / / z = 16 5916 x = 34 5917 y = 240 z 5918 = subsat x y / / z = 0 13 relojes Relojes de múltiples 5919 5920 Uno puede tener varios relojes de interfaz con el diseño. Cada principal función puede asociarse con un reloj. Relojes internos 5921 5922 Uno puede configurar el reloj para ser cualquier expresión o cualquier expresión que se divide por un factor determinado. Para chips de la serie 4000 de Xilinx él o ella puede establecer el reloj para ser un valor leído desde el generador de reloj en el chip. reloj set 5923 = lt Expression gt interno reloj set 5924 = factor de internal_divide lt Expression gt Haps Esto permite configurar el reloj a un valor leído desde una interfaz. Ejemplo de 5926 interfaz 5927 port_in 1 alce sin signo puerto de reloj reloj set 5928 = ClockPort.clk interno Relojes externos 5929 Relojes externos 5930 pueden accederse al asociar el reloj con un pin específico utilizando el conjunto de reloj externo = "nombre de pines" o establecer el reloj external_divide = factor de "pin_Name". 5931 La cadena de pin_Name es opcional. Si se omite los pines están libres y las herramientas de lugar y ruta pueden asignar el pin. También se puede definir una interfaz que lee un reloj externo. Si el reloj está asociado con un pin específico uno puede utilizar la interfaz de tipo bus_in. Uno sólo tendrían que hacer esto si se ha dividido el reloj externo de lo contrario él o ella puede utilizar la .sub intrínseco. f reloj véase más abajo . Ejemplo de 5932 5933 interfaz bus_in sin signo 1 en InputBus 5934 con {datos = {"Pin1"}} reloj set 5935 = internal_divide InputBus.in 3 5936 Ahora uno puede utilizar InputBus.in para obtener un reloj externo indiviso. Puede ser más eficiente para omitir la especificación de pin y permitir que las herramientas de lugar y ruta asignar el pin. 5937 interfaz bus_in sin signo 1 en InputBus reloj set 5938 = internal_divide InputBus.in 3 . Reloj actual 5939 5940 El reloj actual utilizado una función se puede hacer referencia usando la keyword.sub. reloj. Esto permite la función pasar el reloj actual a una interfaz externa. El valor de la variable_clock del sistema puede ser el valor después de dividir por cualquiera. El reloj puede ser interno o un reloj externo. Ejemplo de 5941 5942 El código siguiente muestra el reloj actual en una interfaz. interfaz de la 5943 reg32x1k registra dirección data_in _clock escritura 5944 con {extlib="PluginModelSim.dll" 5945 extinst = "1 modelo = reg32x1k_wrapper reloj = ck 25 "} 5946 Comunicación entre dominios de reloj 5947 No es legal para acceder a la misma variable de reloj diferentes dominios. En su lugar uno puede transmitir datos entre dominios de reloj utiliza un canal o un puerto. Canales 5948 5949 Canales que conectan entre dominios de reloj pueden ser unidireccional de punto a punto. Esto significa que su primer uso define su dirección y los dominios en los que transmitir y recibir. Si uno intenta reutilizar el canal en una dirección diferente o desde un dominio de reloj diferentes o el compilador genera un error. Canales utilizados entre dominios de reloj pueden ser declarados en un archivo y a continuación se hace referencia como extern en otro. La sincronización entre dominios no está especificada pero se garantiza que la transmisión se producen y ambas partes pueden esperar hasta que la transmisión ha finalizado. Por ejemplo 5950 / / Archivo transmit.c chan 5951 8 c / / canal puede tener alcance global principal de 5952 { 5953 int 5954 8 x y c 5955 x //Program puede esperar hasta los datos 5956 //successfully transmitida c 5957 y 5958 } 5959 / / Archivo receive.c 5960 extern chan c principal de 5961 5962 int 8 p q ¿c 5963 p ¿c 5964 q Varios archivos de proyectos Introducción 5965 5966 Uno puede combinar varios archivos en un solo proyecto. El proyecto puede tener una sola función principal o varios. Si hay múltiples funciones principales dentro d'un mismo proyecto se cargadas en el mismo chip. Cada función principal puede estar asociado con un reloj diferente. El proyecto puede incluir bibliotecas código de Handel-C precompilado y bloques de código extranjero por ejemplo VHDL . EDIF y VHDL vinculación se realiza mediante herramientas de síntesis. Uno puede referirse a funciones macros y expresiones compartidas que se han definido en otro archivo por prototipos les. Prototipo al declarar un objeto en la parte superior del archivo en el que se utiliza. Prototipos de función 5967 son en el siguiente formato 5968 returnType functionName parameterTypeList 5969 Prototipos de macro son como esto 5970 macro expr Name parameterList 5971 macro proc Name parameterList 5972 Funciones y macros pueden ser estáticos o extern. macros y funciones estáticas sólo podrán utilizarse en el archivo donde se definen. 5973 Uno puede recopilar todos los prototipos en un archivo de encabezado único y a continuación el # incluirlo dentro de los archivos de código. 5974 Se pueden acceder a las variables declaradas en otros archivos mediante el uso de la palabra clave extern. 5975 Uno no puede utilizar las variables para la comunicación entre dominios de reloj. Las variables están restringidas a un dominio único de reloj. Sólo los elementos que se pueden conectar a través de dominios de reloj separada son canales y MPRAMs Resumen de idioma Introducción 5976 5977 Esta sección resume las secciones anteriores listando todas las Handel-C tipos instrucciones y operadores. Resumen de tipos de 5978 5979 FIG. 82 ilustra una tabla que enumera los tipos más comunes que pueden estar asociados con una variable 8200 de conformidad con una encarnación de la invención presente. 83 Fig. ilustra una tabla que enumera todos los prefijos a los tipos anteriores para los tipos de objeto arquitectónico diferente 8300 de conformidad con una encarnación de la invención presente. Resumen de declaración 5980 5981 FIG. 84 ilustra una tabla que enumera todas las declaraciones en el idioma de Handel-C 8400 de conformidad con una encarnación de la invención presente. La tabla siguiente enumeran todas las instrucciones de la Handel-C idioma. Tenga en cuenta que el grupo de asignación de operaciones y las operaciones de incremento y decremento se incluyen como instrucciones para reflejar el hecho de que las expresiones de Handel-C no pueden contener efectos secundarios. Resumen de operador 5982 5983 Figs 85A y vendió ilustran una tabla que enumera todos los operadores en el lenguaje de Handel-C 8500 de conformidad con una encarnación de la invención presente. En esta tabla entradas en la parte superior tienen la prioridad más alta y entradas en la parte inferior tienen la prioridad más baja. Entradas dentro del mismo grupo tienen la misma precedencia. Tenga en cuenta que las llamadas a funciones y asignaciones no son operadores true en Handel-C. Completar la sintaxis del lenguaje Introducción 5984 5985 En esta sección de la descripción actual el C-Handel completa en notación BNF-como podrán figurar la sintaxis del lenguaje. Resumen de palabras clave 5986 86A de Figs 5987 a través de 86E ilustrar una tabla que muestra las palabras clave 8600 de conformidad con una encarnación de la invención presente. Las palabras clave siguientes están reservadas y no pueden utilizarse para ningún otro fin. Palabras clave no en ISO-C está en negrita. También se reservan las secuencias de caracteres siguientes * * / / / # "'. Completar la sintaxis del lenguaje 5988 Las convenciones utilizadas en este referencia de idioma son Símbolos de terminales 5989 se establecen en la fuente de la máquina de escribir como este. 5990 De no-terminal símbolos se establecen en esta fuente en cursiva. Corchetes 5991 ... denotan componentes opcionales. 5992 Llaves {...} denota cero una o más repeticiones de los componentes cerrados. 5993 Llaves con un signo más al final {...} + denotar repeticiones de uno o varios de los componentes cerrados. Paréntesis 5994 ... denotan la agrupación. Identificadores 5995 5996 Identificadores son secuencias de letras dígitos y _ empezando con una letra. Todos los caracteres de un identificador son significativos y todos los identificadores distinguen mayúsculas de minúsculas. identificador 5997 = Carta {letra .vertline. 0... 9} Carta 5998 = A... .Vertline Z. un... z .vertline. . sub. Constante de número entero 5999 integer_constant 6000 = - {1... 9 }+{0 . . . 9} 6001 .vertline. - 0 x .vertline. 0 X {0 . . . .vertline 9. A . . . F .vertline. a . . . f}+ 6002 .vertline. - 0 {0 . . . 7} .vertline 6003 . - 0b .vertline. 0B {0 . . . }+ Constantes de caracteres 6004 6005 87A FIG. ilustra los códigos de escape y sus significados asociados 8700 de conformidad con una encarnación de la invención presente. Carácter es cualquier carácter imprimible o cualquiera de los siguientes códigos de escape. Cadenas 6006 cadena 6007 = "carácter {}" 6008 Constantes de punto flotante constante de float 6009 = 6010 {0... 9}+ . {0 . . . 9} + e.vertline. E + .vertline.- {0... 9}+ f.vertline.F.vertline.I.vertline.L .vertline 6011 . {0 . . . 9} +. e .vertline. E + .vertline.- {0... 9}+ f.vertline. F.vertline. I.vertline. L .vertline 6012 . {0 . . . 9} + e .vertline. E + .vertline.- {0... 9}+ f.vertline. F.vertline. I.vertline. L Información general de 6013 external_declaration 6014 function_definition .vertline 6015 . Declaración .vertline 6016 . set_statement Funciones 6017 y declaraciones function_definition 6018 = declaration_specifiers declarador compound_statement con initialiser .vertline 6019 . compound_statement declarador con initialiser declaración 6020 = declaration_specifiers init_declarator_list con initialiser .vertline 6021 . interface_declaration .vertline 6022 . macro_declaration declaration_specifiers 6023 = storage_class_specifier declaration_specifiers 6024 .vertline. type_specifier declaration_specifiers .vertline 6025 . type_qualifier declaration_specifiers storage_class_specifier 6026 = auto .vertline 6027 . registro .vertline 6028 . en línea .vertline 6029 . typedef .vertline 6030 . extern .vertline 6031 . estática type_specifier 6032 = void .vertline 6033 . Char .vertline 6034 . corto .vertline 6035 . int .vertline 6036 . largo .vertline 6037 . float .vertline 6038 . doble .vertline 6039 . firmado. .vertline 6040 . sin firmar .vertline 6041 . typeof expresión .vertline 6042 . signal_specifier .vertline 6043 . channel_specifier .vertline 6044 . ram_specifier 6045 .vertline. struct_or_union_specifier .vertline 6046 . enum_specifier .vertline 6047 . typedef_name type_qualifier 6048 = const .vertline. volátiles typedef_name 6049 = identificador init_declarator_list 6050 = declarador = initialiser { declarador = initialiser } Exprs/procs macro/compartido 6051 macro_declaration 6052 = macro_proc_decl 6053 . vertline.macro_expr_decl macro_proc_decl 6054 = identificador de macro_proc_spec extern estático .vertline. 6055 macro_param { macro_param} Declaración de 6056 6057 con initialiser macro_expr_decl 6058 = identificador de macro_expr_spec extern estático .vertline. 6059 macro_param { macro_param} 6060 .vertline 6061 .identificador de macro_expr_spec extern estático .vertline. 6062 macro_param { macro_param} = let_initialiser 6063 con initialiser 6064 macro_proc_spec = macro proc .vertline 6065 . comparte proc macro_expr_spec = expr macro .vertline 6066 . expr compartida initialiser let 6067 = initialiser 6068 let macro_expr_decl en let_initialiser macro_param 6069 = identificador Interfaces 6070 interface_declaration 6071 = identificador de interfaz int_parameter_declaration 6072 { int_parameter_declaration} identificador 6073 assignment_expr_spec { 6074 assignment_expr_spec} con initialiser 6075 type_declarator de interfaz 6076 6077 . vertline.old_style_interface_declarator declarador de tipo de interfaz 6078 = interface_identifier int_parameter_proto 6079 { int_parameter_proto} identificador 6080 int_init_parameter_declaration { int_init_parameter_declaration 6081 } 6082 6083 Este formato es obsoleto pero conservó para compatibilidad con motivos old_style_interface_declarator = identificador de interfaz int_parameter_declaration 6084 6085 { int_parameter_declaration} identificador 6086 assignment_expr_spec { 6087 assignment_expr_spec} 6088 con initialiser interfaz 6089 = interfaz extern estático .vertline. int_parameter_proto 6090 = declaration_specifiers .vertline 6091 . declarador de especificadores de declaración .vertline 6092 . declaration_specifiers abstract_declarator .vertline 6093 . ancho de especificadores de declaración 6094 int.sub. parameter_declaration = declaration_specifiers con initialiser .vertline 6095 . declaration_specifiers declarador con initialiser .vertline 6096 . declaration_specifiers abstract_declarator con initialiser .vertline 6097 . ancho de declaration_specifiers con initialiser int_init_parameter_declaration 6098 = int_parameter_declaration .vertline 6099 . declarador de declaration_specifiers = initialiser con initialiser assignment_expr_spec 6100 = assignment_expression con initialiser 6101 De estructuras y uniones 6102 struct_or_union_specifier aggregate_form identificador { 6103 {struct_declaration} +} 6104 .vertline. identificador de aggregate_form aggregate_form 6105 = struct 6106 .vertline. Unión 6107 .vertline. mpram struct_declaration 6108 = {type_specifier .vertline. type_qualifier} + 6109 {struct_declarator} + con initialiser struct_declarator 6110 = declarador 6111 .vertline. declarador constant_expression Tipos enumerados 6112 enum_specifier 6113 = enum identificador {enumerador { enumerador }} .vertline 6114 . identificador de enum enumerador 6115 = identificador 6116 .vertline. identificador = constant_expression Especificadores de señal 6117 signal_specifier 6118 = señal lt type_name gt .vertline 6119 . señal Especificadores de canal 6120 channel_specifier 6121 chan lt type_name gt .vertline 6122 . Chanin lt type_name gt .vertline 6123 . chanout lt type_name gt Especificadores de Ram 6124 ram_specifier 6125 = ram lt type_name gt .vertline 6126 . ROM lt type_name gt .vertline 6127 . WOM lt type_name gt Declarators 6128 declarador 6129 = ancho puntero direct_declarator ancho 6130 = undefined .vertline 6131 . primary_expression direct_declarator 6132 = identificador .vertline 6133 . puntero direct_declarator 6134 .vertline. direct_declarator constant_expression .vertline 6135 . direct_declarator {parameter_declaration} + puntero 6136 = * .vertline 6137 . * type_qualifier .vertline 6138 . * el puntero .vertline 6139 . * puntero de type_qualifier Parámetros de la función 6140 parameter_declaration 6141 = declaration_specifiers 6142 .vertline. ancho de declaration_specifiers .vertline 6143 . declaration_specifiers abstract_declarator .vertline 6144 . declarador de declaration_specifiers Nombres de tipo 6145 y Declarators abstractos .vertline 6146 . type_name ={type_specifier .vertline. type_qualifier} + .vertline 6147 . {type_specifier .vertline. type_qualifier} + abstract_decl-arator .vertline 6148 . {type_specifier .vertline. type_qualifier} + ancho abstract_declarator 6149 = ancho puntero directa abstract_declarator direct_abstract_declarator = pointer direct_abstract_declarator 6150 .vertline 6151 . direct_abstract_declarator constant_expression .vertline 6152 . direct_abstract_declarator {parameter_declaration} + 6153 Declaraciones 6154 declaración 6155 = semi_statement .vertline 6156 . non_semi_statement semi_statement 6157 = expression_statement .vertline 6158 . hacer la declaración mientras expresión .vertline 6159 . jump_statement .vertline 6160 . Assert constant_expression assignment_expression { 6161 assignment_expression} .vertline 6162 . demora .vertline 6163 . channel_statement .vertline 6164 . set_statement non_semi_statement 6165 = labeled_statement .vertline 6166 . compound_statement .vertline 6167 . selection_statement .vertline 6168 . iteration_statement. 6169 Las declaraciones siguientes pueden aparecer en las condiciones de inicio/fin for_statement 6170 = non_semi_statement .vertline 6171 . expression_statement .vertline 6172 . hacer statement_while expresión .vertline 6173 . Assert constant_expression assignment_expression { 6174 assignment_expression .vertline 6175 . demora .vertline 6176 . channel_statement 6177 Estas son las declaraciones que pueden aparecer en bloques de prialt / prialt_statement 6178 = semi_statement .vertline 6179 . non_semi_prialt_statement non_semi_prialt_statement 6180 = prialt_labeled_statement 6181 .vertline. compound_statement .vertline 6182 . selection_statement .vertline 6183 . iteration_statement labeled_statement 6184 = identificador declaración .vertline 6185 . Declaración de caso constant_expression .vertline 6186 . por defecto declaración prialt_labeled_statement 6187 = identificador prialt_statement .vertline 6188 . caso channel_statement prialt_statement .vertline 6189 . por defecto prialt_statement expression_statement 6190 = expresión channel_statement 6191 = unary_expression expresión .vertline 6192 . ¿logical_or_expression expresión jump_statement 6193 = identificador de goto .vertline 6194 . continuar .vertline 6195 . salto 6196 .vertline. volver .vertline 6197 . devolver la expresión selection_statement 6198 = si expresión declaración % prec si .vertline 6199 . Si la declaración de expresión instrucción else 6200 .vertline. ifselect constant_expression declaración % prec si 6201 .vertline. Declaración de ifselect constant_expression instrucción else. 6202 .vertline. instrucción switch expresión 6203 .vertline. prialt { {prialt_statement} + } set_statement 6204 = piezas set = cadena .vertline 6205 . set de reloj = reloj .vertline 6206 . establecer la familia = identificador .vertline 6207 . Set intwidth = constant_expression .vertline 6208 . Set intwidth = undefined reloj = expresión interna con initialiser 6209 .vertline. expresión externa con initialiser 6210 .vertline. internal_divide expresión expresión con initialiser 6211 .vertline. external_divide expresión expresión con initialiser iteration_statement 6212 = expresión sentencia while .vertline 6213 . para for_statement expresión for_statement Declaración de 6214 6215 Declaraciones compuestas con replicadores .vertline 6216 . compound_statement = seq .vertline. par {{declarations} {declaración}} .vertline 6217 . seq .vertline. par.vertline. repl macro param { repl_macro_param} constant_expression 6218 6219 repl_update_param { repl_update_param} 6220 {{Declaración} {declaración}} Reglas de replicator 6221 Definiciones de inicialización de replicator 6222 .vertline 6223 . repl_macro_param = repl_param = initialiser 6224 .vertline. repl_param = initialiser Replicator 6225 actualizar definiciones repl_update_param 6226 = repl_update_param_body .vertline 6227 . repl_update_param repl_update_param_body 6228 = initialiser de assignment_operator de repl_param .vertline 6229 . ++ repl_param .vertline 6230 . repl_param ++ .vertline 6231 . repl_param .vertline 6232 . repl_param repl_param 6233 = identificador .vertline 6234 . repl_param . Expresiones 6235 constant_expression 6236 = assignment_expression expresión 6237 = assignment_expression .vertline 6238 . expresión assignment_expression} assignment_expression 6239 = conditional_expression 6240 .vertline. unary_expression assignment_operator assignment_expression assignment_operator 6241 == .vertline. *=.vertline./=.vertline.%=.vertl-ine += .vertline.-= .vertline. lt lt = .vertline. gt gt = .vertline. = .vertline 6242 . X.vertline.=.vertline. .vertline. = initialiser 6243 = assignment_expression conditional_expression 6244 = logical_or_expression .vertline 6245 . ¿logical_or_expression expresión conditional_expression logical_or_expression 6246 = lógico y de expresión 6247 . vertline.logical_or_expression. parallel.logical_and_expression logical_and_expression 6248 = inclusive_or_expression en 6249 . vertline.logical_and_expression inclusive_or_expression inclusive_or_expression 6250 = exclusive_or_expression .vertline 6251 . inclusive_or_expression .vertline. exclusive_or_expression 6252 exclusiva o expresión = and_expression .vertline 6253 . exclusive_or_expression and_expression and_expression 6254 = equality_expression .vertline 6255 . and_expression equality_expression equality_expression 6256 = relational_expression .vertline 6257 . equality_expression == relational_expression .vertline 6258 . equality_expression = relational_expression relational_expression 6259 = cat_expression 6260 .vertline. relational_expression lt cat_expression .vertline 6261 . relational_expression gt cat_expression 6262 .vertline. relational_expression lt = cat_expression 6263 . vertline.relational_expression gt = cat_expression cat_expression 6264 = shift_expression. 6265 . vertline.cat_expression @ shift_expression shift_expression 6266 = additive_expression .vertline 6267 . shift_expression lt lt additive_expression 6268 . expresión de vertline.shift gt gt additive_expression expresión aditivo 6269 = expresión multiplicativo 6270 . vertline.additive_expression+multiplicative_expression 6271 .vertline.additive_expression-multiplicative_expression multiplicative_expression 6272 = take_drop_expression 6273 . vertline.multiplicative_expression*take_drop_expression 6274 . vertline.multiplicative_expression take_drop_expression .vertline 6275 . multiplicative_expression % toma drop_expression take_drop_expression 6276 = cast_expression 6277 . vertline.take_drop_expression lt = cast_expression .vertline 6278 . take_drop_expression .backslash...barra invertida. cast_expression cast_expression 6279 = unary_expression .vertline 6280 . cast_expression type_name unary_expression 6281 = postfix_expression .vertline 6282 . ++ unary_expression .vertline 6283 . unary_expression .vertline 6284 . cast_expression de operador unario .vertline 6285 . sizeof unary_expression .vertline 6286 . sizeof type_name 6287 . vertline.width expresión unary_operator 6288 = .vertline. + .vertline. -.vertline. …sobre...vertline. .vertline. * postfix_expression 6289 = select_expression 6290 . vertline.postfix_expression expresión 6291 . vertline.postfix_expression expresión expresión 6292 . vertline.postfix_expression expresión 6293 . vertline.postfix_expression expresión 6294 . vertline.postfix_expression 6295 . vertline.postfix_expression assignment_expression 6296 { assignment_expression} .vertline 6297 . postfix_expression. identificador .vertline 6298 . postfix_expression - gt identificador 6299 . vertline.postfix_expression ++...vertline. postfix_expression- select_expression 6300 = primary_expression 6301 . vertline.select expresión constante constant_expression constant_expression 6302 primary_expression 6303 = identificador .vertline 6304 . constante .vertline 6305 . expresión .vertline 6306 . { } .vertline 6307 . { initialiser { initialiser} } constante 6308 = integer_constant 6309 . vertline.character_constant 6310 . vertline.string_constant integer_constant 6311 = número character_constant 6312 = carácter string_constant 6313 = cadena Programa 6314 6315 La sintaxis general del programa es programa 6316 = {global_declaration} 6317 void main void { 6318 {Declaración} 6319 {Declaración} Preprocesador Introducción 6320 6321 Handel-C es un lenguaje de programación diseñado para permitir que la compilación de programas en hardware de sincrónica. Georg Friedrich Händel-C no es un lenguaje de descripción de hardware sin embargo más bien es un lenguaje de programación encaminado a algoritmos expresando desde un alto nivel. 6322 Este segundo describe el preprocesador de c de Handel. El C-Handel compilador puede invocar el preprocesador automáticamente cada vez que compila un programa. 6323 El preprocesador de GNU 6324 Handel-C no utiliza su propio preprocesador. Más bien utiliza el preprocesador de GNU escrito por la Free Software Foundation para el compilador de c gcc. Desde esta sección simplemente contiene el texto para el preprocesador de c de GNU no todas las declaraciones pueden ser pertinentes a la Handel-C compilador. Por ejemplo la sección detallando las macros predefinida de CPU no se aplica porque el programa de Handel-C no se puede ejecutar en un procesador a todos. Preprocesador c Introducción 6325 6326 El preprocesador de c es un procesador de macro que se utiliza automáticamente por el compilador de c para transformar el programa antes de compilación actual. Se llama un procesador macro porque permite que se definan las macros que son abreviaturas breves para construcciones más largas. 6327 El preprocesador de c proporciona cuatro instalaciones separadas que uno puede utilizar como él o ella lo considere oportuno 6328 Inserción de archivos de encabezado. Estos son los archivos de las declaraciones que pueden ser sustituidos en el programa. Expansión de macro 6329 . Uno puede definir macros que son abreviaturas para arbitrarias de fragmentos de código C y a continuación el preprocesador de c puede reemplazar las macros con sus definiciones en todo el programa. Compilación condicional 6330 . Utilizar directivas de preprocesamiento especiales uno puede incluir o excluir partes del programa de acuerdo a diversas condiciones. Control de línea de 6331 . Si uno usa un programa para combinar o reorganizar los archivos de código fuente en un archivo intermedio que luego se compila él o ella puede utilizar la línea de control para informar el compilador de donde cada línea de código fuente procedía originalmente. 6332 Preprocesadores c varían en algunos detalles. Esta segunda discute el GNU preprocesador C el preprocesador c de compilador Compatible. 6333 The GNU preprocesador de c proporciona que un superconjunto de las características de ANSI estándar C. ANSI C estándar requiere el rechazo de muchas construcciones inofensivos usada por los programas c de hoy. Dicha incompatibilidad sería inconveniente para los usuarios por lo que el preprocesador de c de GNU está configurado para aceptar estas construcciones por defecto. Estrictamente hablando para obtener ANSI C estándar uno puede usar las opciones '-trígrafo '-undef' y '-pedante ' pero en la práctica las consecuencias de tener estricto ANSI estándar c hacen indeseables para ello. 6334 Las transformaciones hechas a nivel mundial Características de preprocesador de c de más 6335 están inactivos a menos que uno da directivas específicas para solicitar su uso. Pero hay tres transformaciones que el preprocesador siempre se hace en todas la entrada que recibe incluso en ausencia de directivas. Comentarios de todos C 6336 se reemplazan con espacios único. 6337 De barra diagonal inversa-nueva línea secuencias se eliminan no importa dónde. Esta característica permite romper líneas largas para fines cosméticos sin cambiar su significado. 6338 Nombres de macro predefinida se reemplazan con sus expansiones. 6339 Las dos primeras transformaciones se realizan antes de casi todos otros análisis y antes de directivas de preprocesamiento son reconocidas. Así por ejemplo uno puede dividir una línea estéticamente con barra invertida-nueva línea en cualquier lugar excepto cuando trígrafo está en uso consulte a continuación . 6340 / * 6341 * / # / * 6342 * defi.backslash. 6343 ne FO.backslash. 6344 O 10.vertline. 20 6345 6346 es equivalente a '# define 1020 FOO'. Uno puede dividir incluso una secuencia de escape con una barra diagonal inversa-salto de línea. Por ejemplo uno puede dividir "foo.backslash.bar" entre el '.backslash.' y la 'b' para obtener 6347 "foo.backslash...barra invertida. barra de 6348 " 6349 Este comportamiento es sucio en todos los contextos una barra diagonal inversa puede insertarse en una constante de cadena como un carácter ordinario escribiendo una barra diagonal inversa doble y esto crea una excepción. Pero el estándar ANSI C lo requiere. Estricta ANSI C no permite saltos de línea en las constantes de cadena por lo que no consideran esto un problema. 6350 Pero hay son algunas excepciones para todas las transformaciones de tres. 6351 C comentarios y nombres de macros predefinidas no son reconocidos dentro de una directiva de '# include' en el que el nombre de archivo está delimitado con ' lt ' y ' gt '. Comentarios c 6352 y los nombres de macros predefinidas nunca son reconocidos dentro de un carácter o cadena constante. Estrictamente hablando la regla no es una excepción pero es importante señalar aquí de todos modos. Con seguridad 6353 barra invertida-nueva línea no podrá utilizarse dentro de un ANSI "trígrafo". Trígrafo se convierte en antes de que se elimina la barra diagonal inversa-salto de línea. Si uno escribe lo que parece un trígrafo con una barra diagonal inversa-nueva línea interior la barra invertida-salto de línea se elimina como de costumbre pero entonces es demasiado tarde para reconocer la trígrafo. 6354 Esta excepción es relevante sólo si uno utilizar el '-opción de trígrafo para habilitar el procesamiento de trígrafo. Directivas de preprocesamiento 6355 Las características más preprocesador 6356 están activas sólo si uno usa directivas de preprocesamiento para solicitar su uso. Directivas de preprocesamiento son líneas en el programa que comienzan con '#'. El '#' es seguido de un identificador que es el nombre de la Directiva. Por ejemplo '# define' es la Directiva que define una macro. Espacio en blanco también está permitido antes y después de la '#'. 6357 Se fija el conjunto de nombres válidos de la Directiva. Programas no pueden definir nuevas directivas de preprocesamiento. 6358 Algunos nombres de la Directiva requieren argumentos Estos conforman el resto de la línea Directiva y pueden ser separados del nombre de la Directiva por espacios en blanco. Por ejemplo '# define' puede ser seguido por un nombre de la macro y la expansión prevista de la macro. 6359 A Directiva de preprocesamiento no puede ser más de una línea en circunstancias normales. Puede dividirse estéticamente con barra invertida-salto de línea pero no tiene ningún efecto sobre su significado. Comentarios que contiene saltos de línea también pueden dividir la Directiva en varias líneas pero los comentarios se cambian a espacios antes de que la Directiva se interpreta. La única forma que puede producirse un importante salto de línea en una directiva de preprocesamiento es dentro de una constante de cadena o constante de caracteres. Tenga en cuenta que más compiladores de c que se podrían aplicar a la salida del preprocesador no aceptan constantes de cadena o caracteres que contiene saltos de línea. 6360 El '#' y el nombre de la Directiva no pueden provenir de una expansión de macro. Por ejemplo si 'foo' se define como una macro ampliar ' definir ' no tiene '#foo' una directiva de preprocesamiento válida. Archivos de encabezado Introducción 6361 6362 Un encabezado de archivo es un archivo que contiene las declaraciones de c y las definiciones de macro a compartirse entre varios archivos de código fuente. Una persona puede solicitar el uso de un archivo de encabezado en el programa con la Directiva de preprocesamiento C '# include'. 6363 Los usos de los archivos de encabezado Los archivos de encabezado 6364 son dos tipos de efectos. Archivos de encabezado de sistema 6365 declaran las interfaces a las partes del sistema operativo. Una persona puede incluirlos en el programa para suministrar las definiciones y las declaraciones que él o ella necesita invocar las llamadas del sistema y las bibliotecas. 6366 Los archivos de encabezado contienen declaraciones para las interfaces entre los archivos de código fuente del programa. Cada vez que una persona tiene un grupo de declaraciones relacionadas y las definiciones de macro todos o la mayoría de los que se necesitan en varios archivos de origen diferente es una buena idea para crear un archivo de encabezado para ellos. 6367 Incluyendo un archivo de encabezado produce los mismos resultados en la compilación c como copiar el archivo de encabezado en cada archivo de origen que lo necesite. Pero esa copia sería lento y propenso a errores. Con un archivo de encabezado las declaraciones relacionadas aparecen en un único lugar. Si tienen que cambiarse se pueden cambiar en un solo lugar y programas que se incluyen en el archivo de encabezado pueden utilizar automáticamente la nueva versión cuando a continuación vuelve a compilar. El archivo de encabezado elimina el trabajo de buscar y cambiar todas las copias así como el riesgo de que un fracaso para encontrar una copia puede provocar incoherencias dentro de un programa. 6368 La Convención habitual es dar nombres de archivos de encabezado que terminan con '. ' h . Evitar inusuales caracteres en los nombres de archivo de encabezado como reducen la portabilidad. 6369 El '# include' Directiva 6370 Tanto archivos de encabezado de sistema y de usuario se incluyen usando la Directiva de preprocesamiento '# include'. Tiene tres variantes 6371 # include lt file gt 6372 Esta variante se utiliza para los archivos de encabezado de sistema. Busca un archivo con el nombre en una lista de directorios especificados por el usuario y a continuación en una lista estándar de los directorios de sistema de archivo. Uno puede especificar directorios para buscar archivos de encabezado con la opción de comando '-I'. La opción '-nostdinc' inhibe la búsqueda de los directorios de sistema estándar en este caso se buscan sólo los directorios uno especifica. El análisis de esta forma de '# include' es un poco especial porque los comentarios no son reconocidos dentro de la '...'. Así en ' # include lt x / * y gt ' el ' / *' does no inicio un comentario y la Directiva especifica la inclusión de un archivo de encabezado de sistema llamado ' x / * y'. Por supuesto un archivo de encabezado con estos nombres es poco probable que existen en Unix donde shell comodín características sería difícil de manipular. El archivo de argumento no puede contener un ' lt ' carácter. Puede sin embargo contener un ' gt ' carácter. 6373 # include "archivo" 6374 Esta variante se utiliza para los archivos de encabezado del programa. Busca un archivo denominado archivo primero en el directorio actual y a continuación en los mismos directorios utilizados para sistema de archivos de encabezado. El directorio actual es el directorio del archivo de entrada actual. Se intenta en primer lugar porque se presume que la ubicación de los archivos que el archivo de entrada actual se refiere a. Si la '-I-' se utiliza la opción se inhibe el tratamiento especial del directorio actual. 6375 Del archivo de argumento no puede contener "" caracteres. Si las barras invertidas se producen en el archivo se consideran caracteres de texto ordinario no escapar caracteres. Ninguna de las secuencias de escape de caracteres apropiadas para las constantes de cadena en c se procesan. Por lo tanto ' # include "x.backslash.n.backslash...backslash.y"' especifica un nombre de archivo que contiene tres barras diagonales inversas. No está claro por qué este comportamiento es siempre útil pero lo especifica el estándar ANSI. 6376 # incluyen cualquier cosa 6377 Esta variante se llama un # calculadas incluyen. Cualquier directiva de '# include' cuyo argumento no ajusta a las anteriores dos formas es un include calculado. El texto de que cualquier otra cosa está marcada para las llamadas de la macro que se expanden. Cuando esto esté hecho el resultado puede ajustarse a una de las dos variantes anteriores - en particular el texto ampliado al final puede ser rodeado por cualquiera entre comillas o llaves de ángulo. 6378 Esta función permite definir una macro que controla el nombre del archivo que se utiliza en un momento posterior en el programa. Una aplicación de esto es permitir que un archivo de configuración específica del sitio para el programa especificar que los nombres del sistema incluyen archivos que se utiliza. Esto puede ayudar a portar el programa para varios sistemas operativos en los que se encuentran los archivos de encabezado de sistema necesarios en diferentes lugares. ¿Cómo '# include' funciona 6379 6380 La Directiva '# include' trabaja por dirigir el preprocesador de c para analizar el archivo especificado como entrada antes de continuar con el resto del archivo actual. La salida desde el preprocesador contiene la salida ya generada seguido por la salida resultante del archivo incluido seguido por la salida que viene desde el texto después de la Directiva '# include'. Por ejemplo dado un archivo de encabezado 'header.h' de lo siguiente 6381 char * probar 6382 y un programa principal llamado 'program.c' que utiliza el archivo de encabezado como este 6383 int x 6384 # include "header.h" principal de 6385 { 6386 6387 printf prueba 6388 } 6389 sería la salida generada por el preprocesador para 'program.c' como entrada c 6390 int x 6391 char * probar principal de 6392 { 6393 6394 printf probar 6395 } Los archivos incluidos 6396 no se limitan a las declaraciones y definiciones de macro Estos son simplemente los usos típicos. Cualquier fragmento de un programa c pueden incluir desde otro archivo. El archivo de inclusión incluso podría contener el principio de una declaración en la que se concluye en el archivo que lo contiene o el final de una instrucción que se inició en el archivo incluido. Sin embargo un comentario o una cadena o constante de caracteres no puede iniciar en el archivo incluido y terminar en el archivo incluido. Un comentario no terminada la constante de cadena o la constante de caracteres en un archivo incluido se considera terminar con un mensaje de error en el en d del archivo. 6397 Es posible que un archivo de encabezado iniciar o terminar una unidad sintáctica como la definición de una función pero que sería muy confuso por lo que no lo haga. 6398 La línea que sigue la Directiva '# include' siempre trata como una línea separada por el preprocesador de c incluso si el archivo incluido carece de un salto de línea final. Una vez 6399 -sólo incluir archivos 6400 Muy a menudo un archivo de encabezado incluye otro. Fácilmente puede provocar que un determinado archivo de encabezado se incluye más de una vez. Esto puede conducir a errores si el archivo de encabezado define los tipos de estructura o typedefs y es sin duda un despilfarro. Por lo tanto a menudo se desea evitar la inclusión de múltiples de un archivo de encabezado. 6401 La manera estándar de hacer esto es incluir todo el contenido real del archivo en un condicional como este 6402 # ifndef FILE_FOO_SEEN 6403 # define FILE_FOO_SEEN 6404 todo el archivo # endif 6405 / * FILE_FOO_SEEN * / 6406 La macro FILE_FOO_SEEN indica que el archivo se ha incluido una vez ya. En un archivo de encabezado de usuario el nombre de la macro no debe empezar con '_'. En un archivo de encabezado del sistema este nombre debe empezar con '_' evitar conflictos con los programas de usuario. En cualquier tipo de archivo de encabezado el nombre de la macro debe contener el nombre del archivo y el texto adicional para evitar conflictos con otros archivos de encabezado. 6407 The GNU preprocesador de c está programado para el aviso cuando un archivo de encabezado usa esta construcción particular y gestionar de manera eficiente. Si un archivo de encabezado está enteramente en # un 'ifndef' condicional registra este hecho. Si un posterior '# include' especifica el mismo archivo y ya se ha definido la macro en el '# ifndef' y a continuación el archivo se omite totalmente sin siquiera leerla. 6408 Existe también una directiva explícita para indicar el preprocesador que no necesita incluir un archivo de más de una vez. Esto se llama '# pragma una vez' y se utilizó además de # el 'ifndef' condicional alrededor del contenido del archivo de encabezado. 'una vez # pragma' ya está obsoleto y no debe utilizarse en absoluto. 6409 En el objetivo c lenguaje existe una variante de '# include' llamado '# import' que incluye un archivo pero lo hace en más de una vez. Si uno usa '# import' en lugar de '# include' entonces él o ella no necesita las condicionales dentro del archivo de encabezado para evitar la ejecución de varios de los contenidos. '# import' es obsoleto porque no es una característica bien diseñada. Requiere que los usuarios de un archivo de encabezado los programadores de aplicaciones saber que un determinado archivo de encabezado sólo se incluya una vez. Es mucho mejor para implementador del archivo de encabezado escribir el archivo para que los usuarios no necesitan saber esto. Usando '# ifndef' logra este objetivo. Herencia 6410 y los archivos de encabezado Herencia 6411 es lo que ocurre cuando un objeto o un archivo se deriva a algunos de sus contenidos por copia virtual de otro objeto o archivo. En el caso de los archivos de cabecera de C herencia significa ese archivo una cabecera incluye otro archivo de encabezado y a continuación reemplaza o añade algo. 6412 Si el archivo de encabezado heredada y el archivo de encabezado base tienen nombres diferentes y luego la herencia es sencilla simplemente escriba '# include "de base" ' en el archivo heredado. 6413 A veces es necesario dar el archivo heredando el mismo nombre que el archivo de la base. Esto es menos directo. 6414 Por ejemplo supongamos que un programa de aplicación utiliza el archivo de encabezado del sistema 'sys/signal.h' pero la of'usr/include/sys/signal.h de la versión ' en un determinado sistema no hace lo que espera que el programa de aplicación. Podría ser conveniente definir una versión "local" tal vez bajo el nombre de ' / usr/local/include/sys/signal.h' para reemplazar o agregar al suministrado por el sistema. 6415 Se puede hacer esto mediante la opción '-i. ' para la compilación y escribir un archivo 'sys/signal.h' que hace lo que espera que el programa de aplicación. Pero no es tan fácil escribir '# include lt sys/signal.h gt ' en ese archivo no funciona ya que incluye la versión del archivo no la versión del sistema estándar de hacer este archivo incluyen el estándar 'sys/signal.h'. Utilizado en ese archivo en sí mismo esto conduce a una recursividad infinita y un error fatal en la compilación. 6416 '# include lt /usr/include/sys/signal.h gt ' encontraría el archivo adecuado pero que no es limpio ya que hace una suposición acerca de donde se encuentra el archivo de encabezado del sistema. Esto es malo para el mantenimiento ya que significa que cualquier cambio en donde se guardan los archivos de cabecera del sistema requiere un cambio en otro lugar. 6417 El modo limpio para resolver este problema es utilizar '# include_next' que significa "Incluir el siguiente archivo con este nombre." Esta directiva funciona como '# include' excepto en la búsqueda de archivo especificado se inicia la búsqueda en la lista de directorios de archivos de encabezado después el directorio en el que se encontró el archivo actual. 6418 Supongamos que uno especificar '-yo muy ' y la lista de directorios para buscar también incluye '/ usr/include' y supongamos que ambos directorios contienen un archivo denominado 'sys/signal.h'. Ordinario de '# include lt sys/signal.h gt ' buscará el archivo bajo '/ usr/local/include'. Si ese archivo contiene '# include_next lt sys/signal.h gt ' comienza la búsqueda después de ese directorio y busca el archivo en '/ usr/include'...4. Macros Introducción 6419 6420 A macro es una especie de abreviatura que uno puede definir de una vez y a continuación usar más adelante. Existen muchas características complicadas asociadas con las macros en el preprocesador de C. Macros simples 6421 6422 A simple macro es una especie de abreviatura. Es un nombre que significa un fragmento de código. Algunas personas se refieren a ellos como constantes de manifiestos. 6423 Antes de que uno puede utilizar una macro él o ella puede definir explícitamente con la Directiva '# define'. '# define' es seguido por el nombre de la macro y a continuación el código debería ser una abreviatura. Por ejemplo 6424 # define BUFFER_SIZE 1020 6425 define una macro llamada 'BUFFER_SIZE' como una abreviatura para el texto '1020'. Si en algún momento después de que esta directiva '# define' ahí viene una declaración c del formulario 6426 foo = char * xmalloc BUFFER_SIZE 6427 a continuación el preprocesador c puede reconocer y expandir la macro 'BUFFER_SIZE' lo que resulta en 6428 foo = char * xmalloc 1020 6429 El uso de todas las mayúsculas para los nombres de macro es una Convención estándar. Los programas son fáciles de leer cuando es posible ver rápidamente qué nombres son las macros. Normalmente una definición de macro puede ser una sola línea. como todos los c directivas de preprocesamiento. Uno puede dividir una definición de macro largo estéticamente con barra invertida-salto de línea . Hay una excepción saltos de línea puede incluirse en la definición de la macro Si dentro de una cadena o constante de caracteres. Esto es porque no es posible para una definición de macro contener un carácter desequilibrado de cotización la definición se extiende automáticamente para incluir la oferta de coincidencia carácter de fin de la cadena o constante de caracteres. Comentarios dentro de una definición de macro pueden contener saltos de línea que no hacen ninguna diferencia ya que los comentarios son totalmente sustituidos con espacios independientemente de su contenido. 6430 Aparte de la anterior allí no es ninguna restricción sobre lo que puede ir en un cuerpo de macro. Entre paréntesis se necesitan no equilibrio. El cuerpo no necesita parecerse a código c válido. Pero si no lo hace uno puede obtener mensajes de error del compilador c cuando uno utiliza la macro . Preprocesador de C 6431 la analiza el programa secuencialmente para que las definiciones de macro efecto en el lugar de escribirlos. Por lo tanto la siguiente entrada para el preprocesador C foo 6432 = X 6433 # define 4 X 6434 barra = X 6435 produce como salida foo = X 6436 barra = 4 6437 Después de que el preprocesador expande a un nombre de la macro cuerpo de definición de la macro se anexa al frente de la entrada restante y continúa la verificación para llamadas de macro. Por lo tanto el cuerpo de macro puede contener llamadas a otras macros. Por ejemplo después de 6438 # define BUFSIZE 1020 6439 # define BUFSIZE TABLESIZE 6440 el nombre 'TABLESIZE' cuando se utiliza en el programa iría a través de dos etapas de expansión lo que en última instancia en '1020'. Esto no es en la misma como la definición de 'tablesize' ser '1020'. El '# define' para 'tablesize' usos exactamente el cuerpo uno especifica en este caso 'bufsize' y no comprueba para ver si también es el nombre de una macro. Es sólo cuando uno usa 'tablesize' que se comprueba el resultado de su expansión más nombres de macro. 6441 Macros con argumentos 6442 A simple macro siempre significa exactamente el mismo texto cada vez que se utilice. Las macros pueden ser más flexibles cuando aceptan argumentos. Los argumentos son fragmentos de código que uno suministra cada vez que se utiliza la macro. Estos fragmentos se incluyen en la expansión de la macro de acuerdo con las instrucciones de la definición de la macro. Una macro que acepta argumentos se llama una macro de función similar porque la sintaxis para utilizarlo que se ve como una llamada de función. Para definir una macro que utiliza argumentos uno escribe una directiva '# define' con una lista de nombres de los argumentos entre paréntesis después del nombre de la macro. Los nombres de argumento pueden ser cualquier identificadores válidos de C separados por comas y opcionalmente el paréntesis de apertura de espacios en blanco pueden seguir el nombre de la macro inmediatamente sin ningún espacio en el medio. 6443 Por ejemplo aquí es una macro que calcula el mínimo de dos valores numéricos tal como se define en muchos programas C ¿ 6444 # define min X Y X lt Y X Y 6445 Para utilizar una macro que espera argumentos se escribe el nombre de la macro seguido de una lista de argumentos reales entre paréntesis separados por comas. El número de argumentos reales uno da puede coincidir con el número de argumentos que se espera de la macro. Ejemplos de uso de la macro 'min' 'min 1 2 ' y ' min x + 28 * p '. 6446 El texto de la expansión de la macro depende de los argumentos que se utiliza de una persona. Cada uno de los nombres de los argumentos de la macro se sustituirá a lo largo de la definición de la macro con el argumento real correspondiente. ¿Utilizando el misma macro 'min' definido anteriormente 'min 1 2 ' se expande en 1 lt 2 1 2 donde '1' ha sido sustituido por 'X' y '2' para 'Y'. Del mismo modo ' min x + 28 * p ' se expande en. ¿ 6447 x+28 lt *p x+28 * p Pueden equilibrar entre paréntesis 6448 en los argumentos reales una coma entre paréntesis no termina un argumento. Sin embargo no existe obligación de corchetes o llaves para equilibrar y no impiden una coma separa los argumentos. Por lo tanto macro matriz x = y x + 1 pasa dos argumentos macro ' matriz x = y' y ' x + 1 '. Si uno quiere suministrar ' matriz x = y x + 1 ' como argumento se puede escribir como ' matriz x = y x + 1 ' que es el código c equivalente. 6449 Después de que los argumentos reales son sustituidos en el cuerpo de la macro todo el resultado se anexa al frente de la entrada restante y continúa la verificación para llamadas de macro. Por lo tanto los argumentos reales pueden contener llamadas a otras macros con o sin argumentos o incluso a la macro de la misma. El cuerpo de macro puede contener también llamadas a otras macros. Por ejemplo 'min min a b c ' se expande en este texto ¿ 6450 a lt b a b lt c . ¿ 6451 ¿ a lt b a b 6452 c 6453 Saltos de línea se muestra a continuación para que realmente no se genera claridad. Si una macro foo toma un argumento y uno quiere proporcionar un argumento vacío él o ella puede escribir al menos algunos espacios en blanco entre los paréntesis como este 'foo '. Sólo 'foo ' no es proporcionar ningún argumento que es un error si foo espera un argumento. Pero ' de foo' es la forma correcta de llamar a una macro definida para tener cero argumentos como este 6454 # define de foo 6455 Si uno usa el nombre de la macro seguido por algo más que un paréntesis de apertura después de ignorar cualquier espacios tabulaciones y comentarios que siguen no es una llamada a la macro y el preprocesador no cambia lo que él o ella ha escrito. Por lo tanto es posible que el mismo nombre que una variable o función en el programa así como una macro y uno puede elegir en cada instancia si desea hacer referencia a la macro si se sigue una lista de argumentos reales o la variable o función si no sigue una lista de argumentos . 6456 Tal uso dual de un nombre podría ser confuso y debe evitarse excepto cuando los dos significados son efectivamente sinónimos es decir cuando el nombre es una macro y la función y los dos tienen efectos similares. Uno puede pensar en el nombre simplemente como una función Utilice el nombre para fines distintos de llamarlo tales como a tomar la dirección puede referirse a la función mientras llamadas pueden expandir la macro y generar mejor pero equivalente código. Por ejemplo uno puede utilizar una función denominada 'min' en el mismo archivo de origen que define la macro. Si uno escribe ' min' con ninguna lista de argumentos uno se refiere a la función. Si uno escribe 'min x bb ' con una lista de argumentos la macro se expande. Si uno escribe ' min un bb ' donde el nombre de 'min' no es seguido por un paréntesis de apertura la macro no se expande por lo que uno termina con una llamada a la función 'min'. 6457 No se puede definir el mismo nombre como una macro sencilla y una macro con argumentos. En la definición de una macro con argumentos la lista de nombres de argumento puede seguir el nombre de la macro inmediatamente sin ningún espacio entre. Si hay un espacio después del nombre de la macro la macro se define como no teniendo argumentos y el resto de la línea es tomado como la expansión. La razón de esto es que a menudo es útil definir una macro que toma sin argumentos y cuya definición comienza con un identificador entre paréntesis. Esta regla sobre espacios hace posible que uno para ello o bien 6458 # define FOO -1 x / x 6459 que define 'foo' para tomar un argumento y ampliar en menos el recíproco de ese argumento o esto 6460 # define BAR -1 x / x . 6461 que define 'Barra' para no tomar ningún argumento y siempre se expanda en ' x -1 / x ' . 6462 Tenga en cuenta que el uso de una macro con argumentos puede tener espacios antes del paréntesis de apertura es la definición donde importa si hay un espacio. Macros predefinidas 6463 6464 Varias macros simples están predefinidas. Uno puede utilizarlos sin dar definiciones para ellos. Caen en dos clases las macros estándar y las macros específicas del sistema. 6465 Estándar predefinidos de Macros 6466 Las macros predefinidas estándar están disponibles con el mismo significado independientemente de la máquina o el sistema operativo en el que uno es mediante GNU C. Sus nombres todos empiezan y terminan con caracteres de subrayado dobles. Los preceding_GNUC_in de esta tabla está estandarizada por ANSI C el resto son GNU C extensiones. _FILE_ 6467 6468 Esta macro se expande al nombre del archivo de entrada actual en la forma de una constante de cadena de C. El nombre preciso devuelto es el que se especificó en '# include' o como el argumento de nombre de archivo de entrada. _LINE_ 6469 6470 Esta macro se expande para el número actual de la línea de entrada en la forma de una constante de número entero decimal. Uno puede llamar una macro predefinida pero es una macro bastante extraña desde sus cambios de "definición" con cada nueva línea de código fuente. Esto y '_FILE_' son útiles en la generación de un mensaje de error para informar de una incoherencia detectada por el programa el mensaje puede indicar la línea de origen en el que se detectó la incoherencia. Por ejemplo 6471 fprintf stderr "error interno " "la longitud de cadena negativa 6472 " % 6473 "d a % s línea % d." 6474 longitud _FILE_ _LINE_ Directiva de '# include' 6475 cambia las expansiones de '_FILE_' y '_LINE_' que se correspondan con el archivo incluido. Al final de ese archivo cuando se reanuda el procesamiento en el archivo de entrada que contiene la Directiva '# include' las expansiones de '_FILE_' y '_LINE_' volverán a los valores que tenían antes de la '# include' pero '_LINE_' a continuación se incrementa en uno como procesamiento se desplaza a la línea después de la '# include' . 6476 Se modifiquen las expansiones de '_FILE_' y '_LINE_' si se utiliza una directiva '# line'. _DATE.sub 6477 . 6478 Esta macro se expande a una constante de cadena que describe la fecha en que se ejecuta el preprocesador. La constante de cadena contiene once caracteres y ve como '"29 de enero de 1987" ' o '"1 de abr. de 1905" '. _TIME.sub 6479 . 6480 Esta macro se expande a una constante de cadena que describe el momento en el que se ejecuta el preprocesador. La constante de cadena contiene ocho caracteres y parece 6481 '"23 59 01" '. _STDC.sub 6482 . 6483 Esta macro se expande a la constante 1 para indicar que se trata de C. estándar de ANSI si esto es realmente verdad dependen qué compilador c puede operar en la salida desde el preprocesador. _STDC_VERSION.sub 6484 . 6485 Esta macro se expande al número de versión del estándar de C una constante de entero largo de forma 'yyyymmL' donde aaaa y mm son el año y el mes de la versión estándar. Esto significa qué versión del estándar c cumple el preprocesador. Como '_STDC_' si este número de versión es preciso para toda la implementación depende de qué compilador c puede operar en la salida desde el preprocesador. _GNUC.sub 6486 . 6487 Esta macro se define sólo si se trata de GNU C. Esta macro se define sólo cuando el compilador de c de GNU todo está en uso Si uno invoca el preprocesador directamente '_GNUC_' no está definido. 6488 El valor identifica el número de versión principal de CC de GNU '1 ' para CC de GNU versión 1 que ahora es obsoleto y ' 2' para la versión 2 . _GNUC_MINOR.sub 6489 . 6490 La macro contiene el número de versión secundaria del compilador. Esto puede usarse para solucionar las diferencias entre las diferentes versiones del compilador por ejemplo si se sabe que admite una característica gcc 2.6.3 uno puede probar _GNUC.sub. gt .parallel 2. _GNUC.sub. = = 2 _GNUC_MINOR.sub. gt = 6 . El último número '3' en el ejemplo anterior indica el nivel de corrección del compilador ninguna macro contiene este valor. _GNUG.sub 6491 . Compilador de c de GNU the 6492 define esto cuando el idioma de compilación es C++ utilizar '_GNUG_' para distinguir entre GNU de c y C++ de GNU. _cplusplus 6493 6494 El proyecto ANSI estándar de C++ solía requieren predefining esta variable. Aunque ya no es obligatorio GNU C++ continúa para definirla como lo hacen otros compiladores de C++ populares. Se puede usar '_cplusplus' para comprobar si un encabezado es compilado por un compilador de c o un compilador de C++. _STRICT_ANSI.sub 6495 . 6496 Esta macro es definido si y sólo si el '-ansi' conmutador se especificó cuando se invocó el c de GNU. Su definición es la cadena nula. Esta macro existe principalmente para dirigir algunos archivos de encabezado de GNU no para definir ciertas construcciones tradicionales de Unix que sean incompatibles con ANSI C. _BASE_FILE.sub 6497 . 6498 Esta macro se expande al nombre del archivo de entrada principal en forma de una constante de cadena de C. Éste es el archivo de origen que se ha especificado como argumento cuando se invocó el compilador de C. _INCLUDE_LEVEL.sub 6499 . 6500 Esta macro se expande a una constante de número entero decimal que representa el nivel de anidamiento en archivos de inclusión. El valor de esta macro es incrementado en cada directiva '# include' y disminuye en cada final del archivo. Para archivos de entrada especificados por los argumentos de línea de comandos el nivel de anidamiento es cero. _VERSION.sub 6501 . 6502 Esta macro se expande a una cadena que describe el número de versión de GNU C. Normalmente la cadena es una secuencia de números decimales separados por puntos como '"2.6.0" '. 6503 El uso sólo razonable de esta macro es incorporarlo a una constante de cadena. _OPTIMIZE.sub 6504 . 6505 Esta macro se define en la optimización de compilaciones. Hace que determinados archivos de encabezado de GNU definir las definiciones de macro alternativos para algunas funciones de la biblioteca de sistema. Es imprudente referirse a o la definición de este macro de prueba a menos que uno hace muy seguro de que pueden ejecutar programas con el mismo efecto independientemente. _CHAR_UNSIGNED.sub 6506 . 6507 Esta macro se define sólo si el tipo de datos char es sin firmar en el equipo de destino. Existe para hacer que el archivo de encabezado estándar 'limit.h' para que funcione correctamente. Es una mala práctica para referirse a esta macro en su lugar es mejor para referirse a las macros estándar definidas en 'limit.h'. El preprocesador utiliza esta macro para determinar si o no a constantes de gran carácter escritas de ampliación signo en octal. _REGISTER_PREFIX 6508 6509 Esta macro se expande a una cadena que describe el prefijo que se aplica a la cpu que se registra en código ensamblador. Se puede utilizar para escribir código ensamblador que es utilizable en múltiples entornos. Por ejemplo en el entorno de 'm68k-Adel' que se expande para la cadena ' ""' pero en el entorno de 'm68k-coff' que se expande para la cadena "%". _USER_LABEL_PREFIX.sub 6510 . 6511 Esta macro se expande a una cadena que describe el prefijo que se aplica a las etiquetas de usuario generado en código ensamblador. Se puede utilizar para escribir código ensamblador que es utilizable en múltiples entornos. Por ejemplo en el entorno de 'm68k-Adel' que se expande para la cadena '"_" ' pero en el entorno de 'm68k-coff' que se expande para la cadena ' ""'. 6512 Macros predefinidas no estándares 6513 El preprocesador de c normalmente tiene varias macros predefinidas que varían entre máquinas porque su propósito es indicar qué tipo de sistema y de la máquina está en uso. Esta descripción siendo para todos los sistemas y equipos uno no puede decir exactamente lo que sus nombres son en su lugar una lista de algunos típicos se ofrece uno puede utilizar 'cpp -dM' para ver los valores de macros predefinidas. 6514 Algunas macros predefinidas no estándares describen el sistema operativo en uso con más o menos de especificidad. Por ejemplo unix 'unix' es normalmente predefinidos en todos los sistemas Unix. BSD 6515 6516 'BSD' está predefinido en recientes versiones de Unix de Berkeley. Otras macros predefinidas no estándares describen el tipo de CPU con especificidad más o menos. Por ejemplo vax 6517 6518 'vax' está predefinido en equipos Vax. mc68000 6519 6520 'mc68000' está predefinido en la mayoría de los equipos cuya CPU es un Motorola 68000 68010 o 68020. m68k 6521 6522 'm68k' también está predefinido en la mayoría de los equipos cuya CPU es un 68000 68010 o 68020 Sin embargo algunos fabricantes utilizan 'mc68000' y algunos utilizan 'm68k'. Algunos predefinición ambos nombres. Lo que sucede en GNU C depende del sistema uno lo está utilizando en. 6523 M68020 6524 'M68020' se ha observado que estarán predefinidas en algunos sistemas que utilizan la 68020 CPU además de 'mc68000' y 'm68k' que son menos específica. 6525 _AM29K _AM29000 6526 Ambos '_AM29K' y '_AM29000' están predefinidos para la CPU de AMD 29000 familia. ns32000 6527 6528 'ns32000' está predefinido en equipos que utilizan la serie nacional de semiconductores de 32000 CPU. Sin embargo otras macros predefinidas no estándares describen el fabricante del sistema. Por ejemplo sun 6529 6530 'Sol' está predefinido en todos los modelos de equipos de Sun. Pyr 6531 6532 'pyr' está predefinido en todos los modelos de ordenadores de la pirámide. Sequent 6533 6534 'sequent' está predefinido en todos los modelos de equipos Sequent. 6535 Estos símbolos predefinidos no son sólo no estándares contrario a la norma ANSI porque sus nombres no comienzan con los caracteres de subrayado. Por lo tanto la opción '-ansi' inhibe la definición de estos símbolos. 6536 Esto tiende a hacer '-ansi' inútil ya que muchos programas dependen de la costumbre no estándar símbolos predefinidos. Archivos de encabezado de sistema incluso protegerlos y pueden generar declaraciones incorrectas si no encuentran los nombres que se esperan. Uno podría pensar que los archivos de encabezado suministrados para el equipo de Uglix no tendría que probar qué máquina se están ejecutando porque simplemente puede suponen es el Uglix pero a menudo lo hacen y lo hacen utilizando los nombres tradicionales. Como resultado muy pocos programas c pueden compilar con '-ansi'. Se pretende evitar estos problemas en el sistema GNU. 6537 A continuación debe uno ¿qué en un programa en ANSI C para probar el tipo de máquina que se pueden ejecutar en GNU c ofrece una serie paralela de símbolos para este propósito cuyos nombres están hechos de los que consuetudinario agregando '_' al comienzo y al final. Por lo tanto la _vax_would del símbolo esté disponible en una Vax y así sucesivamente. 6538 El conjunto de nombres predefinidos no estándares en el preprocesador de c de GNU es controlado cuando cpp es en sí mismo compilado por la macro 'CPP_PREDEFINES' que debe ser una cadena que contiene '-D' opciones separadas por espacios. Por ejemplo del sol 3 se utiliza la siguiente definición de uso 6539 # define CPP_PREDEFINES "-Dmc68000 - Dsun - Dunix-Dm68k" 6540 Esta macro se especifica normalmente en 'tm.h'. Stringification 6541 Stringification 6542 significa convertir un fragmento de código en una constante de cadena cuyo contenido es el texto del fragmento de código. Por ejemplo stringifying resultados de 'foo z ' en '"foo z " '. 6543 En el preprocesador de C stringification es una opción disponible cuando los argumentos de macro son sustituidos en la definición de la macro. En el cuerpo de la definición cuando aparece el nombre de un argumento el carácter '#' antes del nombre especifica stringification del argumento real correspondiente cuando se está cambiado en ese momento en la definición. El mismo argumento puede ser sustituido en otros lugares en la definición sin stringification si aparece el nombre de argumento en aquellos lugares con ningún '#'. 6544 Aquí es un ejemplo de una definición de macro que utiliza el stringification 6545 # define WARN_IF EXP .backslash. hacer 6546 {si .backslash EXP . 6547 fprintf stderr "Advertencia "#exp". backslash.n" }.barra invertida. 6548 mientras 0 6549 Aquí el argumento real para «EXP» se sustituirá por una vez determinado en la declaración de 'si' y una vez como stringified en el argumento de 'fprintf'. La 'do' y 'mientras 0 ' son un problema para hacer posible escribir 'warn_if arg ' que la semejanza de 'warn_if' a una función haría que los programadores c queremos hacer. 6550 La función stringification se limita a la transformación de un argumento de macro en una cadena constante no hay manera de combinar el argumento con otro texto y a continuación se stringify todos juntos. Pero el ejemplo anterior muestra cómo un resultado equivalente puede obtenerse en ANSI C estándar mediante la función de esa cadena adyacente se concatenan constantes como una cadena constante. El preprocesador stringifies el valor real de 'EXP' en una constante de cadena independiente resultando en el texto como. 6551 hacer {if x==0 .backslash. 6552 fprintf stderr "Advertencia " "x == 0" ". backslash.n" }.barra invertida. 6553 mientras 0 6554 pero el compilador de C a continuación ve tres constantes de cadena consecutivos y les concatena en uno produciendo eficazmente 6555 hacer {if x==0 .backslash. 6556 fprintf stderr "Advertencia x==0.backslash.n" } .backslash. 6557 mientras 0 6558 Stringification en c implica más que poner doublequote caracteres alrededor del fragmento es necesario poner barras diagonales inversas de todos los caracteres de doublequote y todas las barras invertidas en constantes de cadena y carácter a fin de obtener un c válido de cadena constante con el contenido correcto. Por lo tanto stringifying ' p="foo.backslash.n" "da como resultado '" p = .backslash. "foo.backslash...backslash.n.backslash. " "`. Sin embargo no se duplican las barras invertidas que no están dentro de las constantes de cadena o de carácter '. backslash.n' por sí mismo stringifies a ' ". backslash.n"'. Espacio en blanco incluyendo comentarios en el texto que se stringified se maneja de acuerdo a normas precisas. Se omiten todos los espacios iniciales y finales. Cualquier secuencia de espacios en blanco en el centro del texto se convierte en un espacio único en el resultado de stringified. Concatenación de 6559 Concatenación de 6560 significa unirse a dos cadenas en uno. En el contexto de la expansión de la macro concatenación se refiere a unirse a dos unidades léxicas en uno más largo. Específicamente un argumento real a la macro puede concatenar con otro argumento real o con texto fijo para producir un nombre más largo. El nombre más largo podría ser el nombre de una función variable o tipo o una palabra clave C incluso podría ser el nombre de otra macro en cuyo caso puede ser ampliado. 6561 Cuando se define una macro él o ella pide concatenación con el operador especial ' ##' en el cuerpo de macro. Cuando la macro se llama después de que se sustituyen los argumentos reales todos ' ##' se eliminan los operadores como lo es cualquier espacio en blanco junto a ellos incluyendo en blanco que fue parte de un argumento real . El resultado es concatenar los tokens sintácticos a ambos lados de la ' ##'. 6562 Considere la posibilidad de un programa en c que interpreta el nombre de comandos. Probablemente tiene que haber una tabla de comandos tal vez una matriz de estructuras declaró lo siguiente comando de struct 6563 { 6564 6565 char * nombre void 6566 * función 6567 } 6568 struct comando comandos { 6569 6570 {"salir" quit_command} 6571 {"ayuda" help_command} 6572 ... 6573 } 6574 Sería limpiador no a tener que dar el nombre de cada comando dos veces una vez en la constante de cadena y una vez en el nombre de la función. Una macro que toma el nombre de un comando como argumento puede hacer esto innecesarios. La constante de cadena puede crearse con stringification y el nombre de la función concatenando el argumento con '_command'. Aquí es cómo se hace 6575 # define COMMAND NAME {# nombre nombre ## _command } 6576 struct comando comandos = { 6577 6578 Comando salir 6579 Comando ayuda 6580 ... 6581 } 6582 El caso habitual de concatenación es concatenar dos nombres o un nombre y un número en un nombre más largo. Pero esto no es el caso sólo válido. También es posible concatenar dos números o un número y un nombre como '1.5' y 'e3' en un número. También se pueden formar caracteres múltiples operadores tales como '+=' por la concatenación. En algunos casos es incluso posible juntar una constante de cadena. Sin embargo no se pueden concatenar dos fragmentos de texto que no conforman una unidad léxica válida. Por ejemplo la concatenación con 'x' de un lado y '+' por el otro no es significativa porque esos dos personajes no encajan en cualquier unidad léxica de C. El estándar ANSI dice que tales intentos de concatenación no están definidos pero en el preprocesador de c de GNU está bien definida pone la 'x' y '+' lado a lado sin resultados especial particular. Tenga en cuenta que la convierte de preprocesador de c los comentarios a un espacio en blanco antes de que incluso se consideran las macros. Por lo tanto uno no puede crear un comentario concatenando '/' y ' *' la ' / *' secuencia que comienza un comentario no es una unidad léxica sino más bien el inicio de un carácter de espacio "largo". También uno puede usar libremente comentarios junto a un ' ##' en una definición de la macro o en argumentos reales que pueden concatenar porque los comentarios podrían ser convertidos en espacios a primera vista y concatenación más tarde puede descartar los espacios. Macros undefining 6583 6584 Para anular un medio de macro para cancelar su definición. Esto se hace con la Directiva de '# undef'. '# undef' es seguido por el nombre de la macro para ser indefinido. 6585 Definición similar undefinition se produce en un punto específico en el archivo de origen y se aplica a partir de ese punto. El nombre deja de ser un nombre de macro y desde punto en es tratado por el preprocesador como si nunca hubiera sido un nombre de macro. 6586 Por ejemplo 6587 # define FOO 4 6588 x = FOO 6589 # undef FOO 6590 x = FOO 6591 se expande en 6592 x = 4 6593 x = FOO 6594 En este ejemplo 'foo' había mejor ser una variable o función como temporalmente una macro para que el resultado de la expansión a ser código c válido. 6595 El mismo formulario de directiva '# undef' puede cancelar las definiciones con argumentos o definiciones que no espere que los argumentos. La Directiva de '# undef' no tiene ningún efecto cuando se utiliza en un nombre no está definido como una macro. Macros de redefinición 6596 Redefinición 6597 una macro significa definir con '# define' un nombre que ya se ha definido como una macro. Una redefinición es trivial si la nueva definición es transparente idéntica a la anterior. Uno probablemente deliberadamente no escribe una redefinición trivial pero pueden suceder automáticamente cuando un archivo de encabezado se incluye más de una vez por lo que son aceptados silenciosamente y sin efecto. Redefinición no trivial se considera probable que sea un error por lo que provoca un mensaje de advertencia desde el preprocesador. Sin embargo a veces es útil cambiar la definición de una macro en mid-compilation. Uno puede inhibir la advertencia por undefining de la macro con '# undef' antes de la segunda definición. Para que una redefinición ser trivial la nueva definición puede exactamente uno ya en efecto con dos excepciones 6598 Espacio en blanco puede ser añadido o eliminado al principio o al final. Espacio en blanco puede cambiarse en el medio pero no dentro de cadenas . Sin embargo no puede ser eliminado completamente y no se pueden agregar donde no había ningún espacio en blanco en todos. Recordar que un comentario cuenta como espacios en blanco. 6599 Escollos y sutilezas de Macros 6600 En esta sección se describen algunas reglas especiales que se aplican a las macros y expansión de macro y señalar algunos casos en que las reglas tienen consecuencias no intuitivo que uno puede observar. Construcciones incorrectamente anidadas 6601 6602 Recordar que cuando se llama a una macro con argumentos los argumentos son sustituidos en el cuerpo de la macro y el resultado está marcado junto con el resto del archivo de entrada para más de macro de llamadas. Es posible juntar una llamada de macro provenientes parcialmente desde el cuerpo de macro y parcialmente desde los argumentos reales. Por ejemplo 6603 # define double x 2* x 6604 # define call_with.sub. 1 x x 1 6605 se expandiría 'call_with_I doble ' en ' 2* 1 '. Macro no tienen definiciones que han equilibrado entre paréntesis. Al escribir un paréntesis de apertura desequilibrado en un cuerpo de macro es posible crear una llamada de macro que comienza dentro del cuerpo de la macro pero termina fuera de ella. Por ejemplo 6606 # define strange file fprintf archivo "%s % d" 6607 strange stderr p 35 6608 Este ejemplo extraño se expande a 'fprintf stderr "%s % d" p 35 ' 6609 Agrupación no deseada de la aritmética 6610 Uno puede haber notado que en la mayoría de los ejemplos de definición de la macro que se muestra arriba cada aparición de un nombre de argumento macro tenía entre paréntesis alrededor de ella. Además otro par de paréntesis normalmente rodea la definición de la macro todo. Aquí es por ello es mejor escribir macros de esa manera. 6611 Si uno define una macro lo siguiente 6612 # define ceil_div x y x + y -1 / y 6613 cuyo propósito es dividir redondeando. Uno de los usos para esta operación es calcular cuántos objetos de 'int' son necesarios para mantener un cierto número de objetos 'char' . A continuación supongamos que se utiliza como sigue 6614 un = ceil_div b c sizeof int 6615 Esto se expande en 6616 un = b c+sizeof int -1 / sizeof 6617 int 6618 que no hace lo que se pretende. Las reglas de prioridad de los operadores de c hacen equivalente a esto 6619 un = b c+sizeof int -1 / sizeof int 6620 6621 Pero lo que se desea es la siguiente 6622 un = b c +sizeof int -1 /sizeof int Definición de la macro como 6623 6624 # define ceil_div x y x + y -1 / y proporciona el resultado deseado ". Sin embargo puede resultar agrupación no intencional de otra manera. Considere la posibilidad de 'sizeof ceil div 1 2 '. Que tiene la apariencia de una expresión de c que podría calcular el tamaño del tipo de 'ceil_div 1 2 ' pero en realidad significa algo muy diferente. Aquí es lo que se expande para 6625 sizeof 1 + 2 -1 / 2 6626 Esto tomara el tamaño de un entero y dividirlo por dos. Las reglas de precedencia han puesto la División fuera de la 'sizeof' cuando se pretendía estar dentro. Entre paréntesis la definición de la macro todo pueden prevenir este tipo de problemas. Aquí entonces es la forma recomendada para definir 6627 'ceil_div' 6628 # define ceil_div x y x + y -1 / 6629 y 6630 Tragar el punto y coma A menudo 6631 es conveniente definir una macro que se expande en una instrucción compuesta. Tenga en cuenta por ejemplo la siguiente macro que los avances de un puntero el argumento 'p' dice dónde encontrarlo a través de los caracteres de espacio en blanco 6632 # define .backslash SKIP_SPACES p límite . 6633 {registrar char * lim= limit .backslash. tiempo 6634 p -lim {.backslash. Si 6635 * p ++ = "" {.backslash. 6636 p Break }}} Nueva 6637 aquí barra invertida-línea se utiliza para dividir la definición de la macro que puede ser una sola línea por lo que se asemeja a la forma en que tal código c podría ser establecido si no es parte de una definición de macro. Una llamada a esta macro puede ser 'skip_spaces p lim '. Estrictamente hablando la llamada se expande a un comando compuesto que es una declaración completa sin necesidad de un punto y coma para ponerle fin. Pero parece que una llamada de función. Así que minimiza la confusión si uno puede utilizarla. 6638 como una llamada de función escribir un punto y coma después como en 6639 'SKIP_SPACES p lim ' 6640 Pero esto puede causar problemas antes de instrucciones 'else' porque el punto y coma es realmente una declaración nula. Supongamos que uno escribe Si 6641 * p = 0 SKIP_SPACES 6642 p lim 6643 else 6644 ... 6645 La presencia de los dos Estados el comando compuesto y una declaración nula entre la condición de 'si' y la 'otra' hace código c no válido. 6646 Se puede modificar la definición de la macro 'skip_spaces' para resolver este problema mediante una instrucción 'do... while'. Aquí es cómo 6647 # define .backslash SKIP_SPACES p límite . hacer 6648 {registrar char * lim= limit .backslash. tiempo 6649 p = lim {.backslash. Si 6650 * p ++ = "" {.backslash. 6651 p Break .backslash}}. 6652 mientras 0 6653 Ahora 'SKIP_SPACES p lim ' se expande en hacer 6654 {...} mientras 0 6655 que es una instrucción. 6656 Duplicación de efectos secundarios 6657 Programas de muchos c definen un macro 'min' para "mínimo" como este ¿ 6658 # define min X Y X lt Y X Y 6659 Cuando uno utiliza esta macro con un argumento que contiene un efecto secundario como se muestra aquí a continuación 6660 = min x + y foo z 6661 de TI se expande como sigue ¿Next= x+y 6662 lt foo z x+y foo z 6663 donde 'x + y' ha sido sustituido por 'X' y 'foo z ' para 'Y'. La función 'foo' se utiliza sólo una vez en la declaración como aparece en el programa pero la expresión 'foo z ' ha sido sustituida dos veces en la expansión de la macro. Como resultado 'foo' podría llamarse dos veces cuando se ejecuta la instrucción. Si tiene efectos secundarios o si toma un largo tiempo para calcular los resultados podrían no ser lo que uno pretende. 'min' se declara una macro no segura. La mejor solución a este problema es definir 'min' de una manera que calcula el valor de 'foo z ' sólo una vez. El lenguaje c no ofrece ninguna forma estándar para hacer esto pero se puede hacer con las extensiones c de GNU como sigue 6664 # define .backslash min X Y . 6665 {typeof X _x= X _y= Y .backslash. ¿ 6666 _x lt _y _X _y } 6667 Si no se desea utilizar extensiones de c de GNU la única solución es tener cuidado al usar la macro 'min'. Por ejemplo uno puede calcular el valor de 'foo z ' guárdelo en una variable y utilizar esa variable en 'min' ¿ 6668 # define min X Y X lt Y X Y 6669 ... { 6670 tem de int 6671 = foo z a continuación 6672 = min x + y tem 6673 } 6674 donde se supone que 'foo' devuelve el tipo 'int' . Macros autorreferente 6675 6676 A autorreferente macro es uno cuyo nombre aparezca en su definición. Una característica especial de ANSI C estándar es que las autorreferencias no es una llamada de macro. Se pasa en la salida de preprocesador sin cambios. 6677 Consideremos un ejemplo 6678 # define foo 4 + foo 6679 donde 'foo' es también una variable en el programa 6680 Siguiendo las reglas ordinarias cada referencia a 'foo' puede expandirse en ' 4 + foo ' a continuación esto puede ser analizarlas y puede expandirse en ' 4+ 4+foo ' y así sucesivamente hasta que produce un error fatal memoria completa en el preprocesador. 6681 Sin embargo la norma especial sobre autorreferencias corta este proceso corto después de un paso en ' 4 + foo '. Por lo tanto esta definición de la macro tiene el efecto posiblemente útil de causar el programa agregar 4 para el valor de 'foo' siempre que sea 'foo' se refiere. En la mayoría de los casos es una mala idea para aprovechar esta característica. Una persona que el programa de lectura que ve que 'foo' es una variable no puede esperar que es una macro así. El lector puede venir a través del identificador 'foo' en el programa y que su valor debe ser el de la variable 'foo' Considerando que de hecho el valor es cuatro mayor. La regla especial para autorreferencias también se aplica a indirecta autorreferencia. Este es el caso cuando una macro x se expande a utilizar una macro 'y' y la expansión de 'y' se refiere a la macro 'x'. La referencia resultante a 'x' viene de indirectamente de la expansión de 'x' por lo que es un autorreferencias y no se expande aún más. Así después de 6682 # define x 4 + y 6683 # define y 2 * x ampliaría 6684 'x' en ' 4 + 2 * x '. ¿Claro Pero supongamos que 'y' se utiliza en otros lugares no de la definición de 'x'. A continuación el uso de 'x' en la expansión de 'y' no es un autorreferencias porque 'x' no está "en curso". Por lo que se expandirá. Sin embargo la expansión de 'x' contiene una referencia a 'y' y que es una indirecta ahora autorreferencias porque 'y' "en curso". El resultado es que 'y' se expande a ' 2 * 4 + y '. No está claro que este comportamiento nunca sería útil pero se especifica por el estándar ANSI C por lo que puede ser necesario entenderlo. 6685 Expansión independiente de argumentos de Macro 6686 Ha sido explicó que la expansión de la macro incluyendo los argumentos reales sustituidos se analiza sobre otra vez para que llamadas de macro a ampliarse. 6687 Lo que realmente ocurre es más sutil primero el texto de cada argumento real se analiza por separado para las llamadas de macro. A continuación los resultados de esto son sustituidos en el cuerpo de macro para producir la expansión de la macro y la expansión de la macro se analiza una vez más las macros expandir. El resultado es que los argumentos reales se analizan dos veces para expandir la macro llamadas en ellos. La mayoría de los casos esto no tiene ningún efecto. Si el argumento real figura las llamadas de macro se expanden durante el primer análisis. Por lo tanto el resultado no contiene llamadas de macro por lo que el segundo análisis no cambiarlo. Si el argumento real fueron sustituido como dada con no prescan el único análisis restante sería encontrar las mismo llamadas de macro y producir los mismos resultados. Uno podría esperar el doble análisis para cambiar los resultados cuando se utiliza una macro autorreferente en un argumento real de otra macro la macro autorreferente se ampliaría una vez en el primer análisis y una segunda vez en el segundo análisis. Pero no ocurre. El self-references que no expandir en el primer análisis están marcados por lo que no puede expandirse en el segundo análisis bien. 6688 La prescan no se hace cuando un argumento es stringified o concatenado. Por lo tanto 6689 # define str s # s 6690 # define foo 4 6691 str foo 6692 se expande a '"foo" '. Una vez más prescan se ha impedido cualquier efecto perceptible. Más precisamente stringification y concatenación utilizan el argumento como escrito en forma unprescanned. Si se está cambiado en otros lugares sin stringification o concatenación se utilizaría el mismo argumento real en forma prescanned. 6693 # define str s s # lose s 6694 # define foo 4 6695 str foo 6696 se expande a 'lose 4 "foo" '. 6697 Uno ahora se pregunta "por qué mencionar la prescan si no supone ninguna diferencia Y ¿por qué no pasar y hacer el preprocesador más rápido " La respuesta es que la prescan hacer una diferencia en los tres casos especiales 6698 Llamadas de Nested a una macro. 6699 Macros que llaman a otras macros stringify o concatenan. Macros 6700 cuyas expansiones contengan comas sin protección. 6701 De llamadas de Nested a una macro se produce cuando el argumento real de la una macro contiene una llamada a esa misma macro. Por ejemplo si 'f' es una macro que espera un argumento 'f f 1 ' es un par anidado de llamadas a la ' t '. La expansión deseada se hace mediante la ampliación de la 'f 1 ' y sustituyendo en la definición de 'f'. La prescan hace que el resultado esperado a suceder. Sin la prescan 'f 1 ' sí podría ser sustituido como argumento real y el uso interno de 'f' aparecería durante el análisis principal como una indirecta autorreferencias y no se ampliaría. Aquí el prescan cancela un efecto no deseado de lado en el sentido médico no computacional del término de la regla especial para macros autorreferente. Pero prescan causa problemas en algunos otros casos de llamadas de macro anidados. Aquí está un ejemplo 6702 # define foo a b 6703 # define bar x lose x 6704 # define lose x 1+ x bar foo 6705 TI 6706 se desea que los 'bar foo ' se convierta en ' 1+ foo ' que luego se convertiría en ' 1+ a b '. Pero en su lugar 'bar foo ' se expande en 'lose a b ' y uno obtiene un error porque perder requiere un solo argumento. En este caso el problema está resuelto fácilmente por los mismos paréntesis que deberían utilizarse para prevenir misnesting de operaciones aritméticas 6707 # define foo a b 6708 # define bar x lose x 6709 El problema es más grave cuando los operandos de la macro no son expresiones por ejemplo cuando son declaraciones. Luego entre paréntesis son inaceptables porque hacen para código c no válido 6710 # define foo {int a b ...}. 6711 En GNU C uno puede proteger las comas utilizando el ' {...} ' construir que convierte un comando compuesto en una expresión 6712 # define foo {int a b ...} 6713 O uno puede volver a escribir la definición de macro para evitar tales comas 6714 # define foo {int a int b ...} 6715 Existe también un caso donde la exploración previa es útil. Es posible utilizar prescan para expandir un argumento y a continuación stringify si uno usa dos niveles de macros. Vamos a agregar una nueva macro 'xstr' para el ejemplo anterior 6716 # define xstr s str s 6717 # define str s # s 6718 # define foo 4 6719 xstr foo 6720 Esto se expande hacia el '"4" ' no '"foo" '. La razón de la diferencia es que el argumento de 'xstr' se expande en prescan porque 'xstr' no especifica stringification o concatenación del argumento . El resultado de prescan a continuación forma el argumento real para 'cadena'. 'cadena' utiliza su argumento sin prescan porque realiza stringification pero no puede evitar o deshacer la preexploración realizada por 'xstr'. 6721 Uso en cascada de Macros 6722 A cascada de macros es cuando cuerpo de una macro contiene una referencia a otra macro. Esto es una práctica muy común. Por ejemplo 6723 # define BUFSIZE 1020 6724 # define BUFSIZE TABLESIZE. 6725 Equivale en absoluto como la definición de 'tablesize' ser '1020'. El '# define' para 'tablesize' usos exactamente el cuerpo uno especifica en este caso 'bufsize' y no comprueba para ver si también es el nombre de una macro. TI 6726 sólo cuando uno usa 'tablesize' de la que se comprueba el resultado de su expansión más nombres de macro. Esto marca una diferencia si uno cambia la definición de 'bufsize' en algún momento en el archivo de origen. 'TABLESIZE' definido como se muestra puede expandir siempre usando la definición de 'bufsize' que está actualmente en vigor 6727 # define BUFSIZE 1020 6728 # define BUFSIZE TABLESIZE 6729 # undef BUFSIZE 6730 # define BUFSIZE 37 6731 Ahora 'tablesize' expande en dos etapas a '37'. El '# undef' es prevenir cualquier advertencia sobre la redefinición no trivial de BUFSIZE . 6732 Saltos de línea en argumentos de Macro 6733 De macro tradicionales de procesamiento lleva adelante todos saltos de línea en los argumentos de la macro en la expansión de la macro. Esto significa que si algunos de los argumentos son sustituidos más de una vez o no en todos o fuera de orden saltos de línea pueden ser duplicado perdido o movido dentro de la expansión. Si la expansión consta de varias instrucciones el efecto es distorsionar los números de línea de algunas de esas declaraciones. El resultado puede ser números de línea incorrecta en mensajes de error o muestra en un depurador. El funcionamiento del preprocesador de c de GNU en modo ANSI C ajusta adecuadamente para uso múltiple de un argumento el primer uso expande todos los saltos de línea y los usos posteriores del mismo argumento no producen saltos de línea. Pero incluso en este modo puede producir la numeración de líneas incorrecta si se utilizan argumentos fuera de orden o no se utilizan en absoluto. 6734 Aquí es un ejemplo que ilustra este problema 6735 # define ignore_second_arg a b c un c 6736 ignore_second_arg foo 6737 se omiten error de sintaxis 6738 6739 El error de sintaxis desencadenado por los resultados de tokens "error de sintaxis" en un mensaje de error citando la línea de cuatro a pesar de que el texto de la declaración viene de la línea 5. Condicionales Introducción 6740 6741 En un procesador macro un condicional es una directiva que permite a una parte del programa para ser ignorado durante la compilación en algunas condiciones. En el preprocesador de C puede probar un condicional de una expresión aritmética o si se ha definido un nombre como una macro. Un condicional en el preprocesador de c asemeja en cierto modo una instrucción 'si' en C pero es importante comprender la diferencia entre ellos. La condición de una instrucción 'si' es probada durante la ejecución del programa. Su propósito es permitir que el programa se comportan de forma diferente desde a run de dependiendo de los datos que está operando. La condición en una directiva condicional preprocesamiento se prueba cuando se compila el programa. Su propósito es permitir ser incluido en el programa dependiendo de la situación en el momento de la compilación de código diferente. 6742 Por qué condicionales se utilizan 6743 En general hay tres tipos de razón para usar un condicional. 6744 Programa deba utilizar código diferente dependiendo de la máquina o el sistema operativo es ejecutar en. En algunos casos el código para un sistema operativo puede ser erróneo en otro sistema operativo por ejemplo se puede referir a rutinas de biblioteca que no existen en el sistema de otro. Cuando esto sucede no es suficiente evitar la ejecución del código no válido simplemente tenerla en el programa no permite vincular el programa y ejecutarlo. 6745 Con un preprocesamiento condicional el código infractor puede ser efectivamente extirpa desde el programa cuando no es válido. 6746 Uno puede ser capaz de compilar el mismo archivo de origen en dos programas distintos. 6747 A veces la diferencia entre los programas es que uno hace comprobaciones de coherencia lentos frecuentes sobre sus datos intermedios o imprime los valores de los datos para la depuración mientras que la otra no. 6748 A condicional cuya condición siempre es falso es una buena forma de excluir el código desde el programa pero mantenerlo como una especie de comentario para referencia futura. 6749 Programas más simples que se van a ejecutar en un único equipo no necesite utilizar condicionales preprocesamiento. Sintaxis 6750 de condicionales 6751 Un condicional en el preprocesador c comienza con una directiva condicional '# If' '# ifdef' o '# ifndef'. Más información sobre '# ifdef' y '# ifndef' será establecerse en lo sucesivo con sólo # 'If' se explica aquí. 6752 La # 'If' Directiva 6753 La Directiva # 'If' en su forma más simple consiste en expresión de # IF 6754 texto controlado 6755 # endif 6756 / * expresión * / 6757 El comentario tras el '# endif' no es necesario pero es una buena práctica porque ayuda a personas coinciden con el '# endif' a la '# 'correspondiente if. Esos comentarios siempre deben ser usado excepto en resumen condicionales que no están anidados. De hecho se puede poner nada en absoluto después de la '# endif' y puede ser ignorado por el preprocesador de c de GNU pero sólo comentarios son aceptables en el estándar de ANSI de C. expresión 6758 es una expresión c de tipo entero sujeto a las restricciones estrictas. Puede contener 6759 Constantes de números enteros que son todos consideran largo o sin firmar durante mucho tiempo. 6760 Constantes de caracteres que son interpretadas de acuerdo a los convenios de la máquina y el sistema operativo en el que se ejecuta el preprocesador y el conjunto de caracteres. El preprocesador de c de GNU utiliza el tipo de datos C 'char' para estas constantes de caracteres por lo tanto si algunos códigos de caracteres son negativos se determina por el compilador de c utilizado para compilar el preprocesador. Si se trata de 'char' como firmado a continuación lo suficientemente grandes como para establecer el bit de signo de códigos de caracteres pueden considerarse negativos de lo contrario ningún código de caracteres se considera negativo. 6761 Operadores aritméticos para la suma resta multiplicación División operaciones bit a bit turnos comparaciones y operaciones lógicas ' ' y '.parallel.' . 6762 Identificadores que no son macros que son todos tratadas como zero . Llamadas de macro. Todas las llamadas de macro en la expresión se expanden antes de que comience el cálculo real del valor de la expresión. Tenga en cuenta que no se permiten los operadores 'sizeof' y valores de tipo enum. valores de tipo enum como todos los demás identificadores que no son tomadas como llamadas de macro y ampliados se tratan como cero. 6763 El texto controlado dentro de un condicional puede incluir directivas de preprocesamiento. A continuación las directivas dentro de la condicional se respetan sólo si sucede esa rama de la condicional. El texto también puede contener otros grupos condicionales. Sin embargo pueden equilibrar las directivas # 'If' y '# endif'. 6764 El '# else' Directiva 6765 La Directiva '# else' puede agregarse a un condicional para proporcionar texto alternativo que se utilizará si la condición es falsa. Esto es lo que parece expresión de # IF 6766 6767 texto-si-true 6768 # else / * no expresión * / 6769 texto-si-falso # endif 6770 / * no expresión * / 6771 Si la expresión es distinto de cero y así el verdadero texto si está activo entonces '# else' actúa como una falta condicional y se omite el texto-si-false. Por si se considera el falla condicional '# If' el texto-si-false incluido. 6772 La Directiva 'elif' 6773 Un caso común de condicionales anidados se utiliza para comprobar si hay más de dos alternativas posibles. Por ejemplo uno podría tener # If 6774 == X 1 6775 ... 6776 # else / * X = 1 * / 6777 # if X == 2 6778 ... 6779 # else / * X = 2 * / 6780 ... # endif 6781 / * X = 2 * / # endif 6782 / * X = 1 * / 6783 Otra directiva condicional 'elif' permite esto abreviar como sigue 6784 # if X == 1 6785 ... elif 6786 X == 2 6787 ... 6788 # else / * X = 2 y x # endif 6789 / * X = 2 y X = 1 * / 6790 '# elif' significa "else if". Como '# else' va en medio de un '# If'-'# endif' par y subdivide no requiere una coincidencia '# endif' de su propia. Como '# If' la Directiva de 'elif' incluye una expresión para ser probado. 6791 Se procesa el texto que sigue a la 'elif' sólo si el original '# 'If-error de condición y sucede la condición de 'elif'. Más de un '# 'elif puede ir en el mismo '# If'-'# endif' grupo. A continuación el texto después de cada 'elif' se procesa sólo si la condición de 'elif' sucede a después de la original '# If' y no han de cualquier anteriores directivas 'elif' dentro de ella. '# else' equivale a '# elif 1' y '# else' es permitido después de cualquier número de directivas 'elif' pero 'elif' no puede seguir '# else'. Mantenimiento de 6792 eliminado código de referencia de futuro 6793 Si uno sustituye o elimina una parte del programa pero desea mantener el antiguo código alrededor como un comentario para referencia futura la manera fácil de hacer esto es poner # 'If 0' antes de él y '# endif' después de ella. Esto es mejor que usar delimitadores de comentario ' / *' y ' * /' ya que aquellos no funcionarán si el código ya contiene comentarios comments c no se anidan . Esto funciona incluso si el código que se ha desactivado contiene condicionales pero pueden ser todos condicionales equilibrado '# If' y '# endif' . 6794 Por el contrario no utilice '# 0' If por comentarios que no son código C. Utilizar los delimitadores de comentario ' / *' y ' * /' en su lugar. El interior del '# 0 'If puede consistir en tokens completas en particular pueden equilibrar los caracteres de comillas simples. Pero comentarios a menudo contienen caracteres de comillas simples desequilibrado conocida en inglés como apóstrofes . Estos confunden '# If 0'. No se debe confundir ' / *'. 6795 Condicionales y Macros 6796 Condicionales son útiles en relación con las macros o aseveraciones porque esas son las maneras únicas que valor de una expresión puede variar de una compilación a otro. Una directiva # 'If' cuya expresión no utiliza macros o afirmaciones es equivalente a '# If 1' o '# If 0' uno podría también determinar cuál de ellos calculando el valor de la expresión y a continuación simplificar el programa. Por ejemplo aquí es un condicional que prueba la expresión 6797 ' BUFSIZE == 1020' donde 'bufsize' puede ser una macro. 6798 # if BUFSIZE == 1020 6799 printf "búferes grandes .backslash.n" # endif 6800 / * BUFSIZE es grande * / 6801 Programadores a menudo desean podrían probar el tamaño de un tipo de variable o datos en '# If' pero esto no funciona. El preprocesador no entiende sizeof o typedef nombres o incluso las tipo de palabras clave como int. 6802 El operador especial 'definido' se utiliza en las expresiones '# If' para comprobar si un determinado nombre se define como una macro. Ya sea ' nombre ' o 'definidas nombre ' están una expresión cuyo valor es 1 si el nombre se define como la macro en el punto actual en el programa y 0 en caso contrario. Para el operador 'definido' no supone ninguna diferencia lo que es la definición de la macro todo lo que importa es si existe una definición. Así por ejemplo # If 6803 definido vax .parallel. definido ns 16000 6804 tendría éxito si cualquiera de los nombres 'vax' y 'ns16000' se define como una macro. Uno puede probar la misma condición mediante la afirmación como este 6805 # if #cpu vax .parallel. #CPU ns16000 6806 Si una macro es definida y más tarde sin definir con '# undef' el posterior uso del operador 'definido' devuelve 0 porque ya no se define el nombre. Si la macro se define de nuevo con otro 6807 '# define' 6808 'definido' puede reanudarse regresar a 1. 6809 Condicionales que probar si se define un nombre son muy comunes por lo que dos directivas condicionales cortas especiales para este caso. nombre de # ifdef 6810 es equivalente a # 'If definido nombre ". nombre de # ifndef 6811 es equivalente a ' # If definido nombre ". Definiciones de macro 6812 pueden variar entre compilaciones por varias razones. 6813 Algunas macros predefinidas en cada tipo de máquina. Por ejemplo en una Vax el nombre de 'vax' es una macro predefinida. En otras máquinas no se definiría. En 6814 muchos más macros están definidas por el sistema de archivos de encabezado. Máquinas y sistemas diferentes definen macros diferentes o les dan valores diferentes. Es útil probar estas macros con condicionales para evitar el uso de una característica del sistema en un equipo donde no se aplica. Macros 6815 son una forma común de permitir a los usuarios personalizar un programa para máquinas diferentes o aplicaciones. Por ejemplo la macro 'bufsize' podría definirse en un archivo de configuración para el programa que se incluye como un archivo de encabezado en cada archivo de código fuente. Usar 'bufsize' en un preprocesamiento condicional para generar código diferente dependiendo de la configuración elegida. Macros 6816 pueden ser definidas o indefinidas con '-D' y '-U' Opciones de comando cuando uno compila el programa. Uno puede organizar compilar el mismo archivo de origen en dos diferentes programas por elegir un nombre de macro para especificar el programa que uno desee escritura condicionales a prueba si o cómo se define esta macro y a continuación controlar el estado de la macro con opciones de comandos del compilador. Afirmaciones 6817 6818 Afirmaciones son una alternativa más sistemática a las macros por escrito condicionales para probar a qué tipo de equipo o sistema en que puede ejecutar el programa compilado. Afirmaciones son generalmente predefinidas pero uno puede definirlos con opciones de línea de comandos o las directivas de preprocesamiento. Las macros que tradicionalmente se utiliza para describir el tipo de destino no se clasifican en absoluto de acuerdo con qué pregunta responden pueden indicar una arquitectura de hardware un modelo particular de hardware sistema operativo una versión determinada de un sistema operativo o las opciones de configuración específicas. Son desordenadas juntos en un único espacio de nombres. Por el contrario cada afirmación consiste en una pregunta con nombre y una respuesta. La cuestión es llamada generalmente el predicado. Una aserción tiene el siguiente aspecto 6819 # predicate respuesta 6820 Uno puede utilizar un identificador correctamente formado para predicado. El valor de la respuesta puede ser cualquier secuencia de palabras todos los caracteres son significativos excepto por un espacio en blanco iniciales y finales y se pasan por alto las diferencias en secuencias de interior de espacios en blanco. Así pues la 'x + y' es diferente de 'x + y' pero equivalente a 'x + y'. ' ' no está permitido en una respuesta. 6821 Aquí es un condicional para probar si la respuesta es afirmó para el predicado 6822 # if # predicate respuesta se puede ser más de una respuesta afirmada para un predicado determinado. Si uno omite la respuesta uno puede probar si cualquier respuesta se afirma de predicado # If # predicate 6823 La mayoría del tiempo las afirmaciones de una prueba puede ser afirmaciones predefinidas. GNU c proporciona tres predicados predefinidos sistema cpu y máquina. sistema es de afirmaciones sobre el tipo de software cpu describe el tipo de arquitectura de computadores y máquina proporciona más información acerca del equipo. Por ejemplo en un sistema GNU las afirmaciones siguientes sería true 6824 #system gnu 6825 #system mach 6826 #system mach 3 6827 #system mach 3. subversión 6828 #system hurd 6829 #system versión de hurd y tal vez otros. Las alternativas con información de la versión más o menos uno que hacer preguntas más o menos detalladas sobre el tipo de software de sistema. En un sistema Unix uno encontraría #system unix y tal vez uno de #system aix #system bsd #system hpux #system Lince #system mach #system posix #system svr3 #system svr4 o #system xpg4 con los siguientes números de versión posible. 6830 Otros valores de sistema son #system mvs y #system vms . Nota de portabilidad muchos compiladores de c de Unix proporcionan sólo una respuesta para la afirmación de sistema #system unix si apoyan afirmaciones a todos. Esto es menos útil. Una aserción con una respuesta construyan es completamente diferente de varias afirmaciones con respuestas individuales de única palabra. Por ejemplo la presencia de sistema mach 3.0 no significa ese sistema 3.0 es cierto. También no directamente implica sistema mach pero en GNU C que la última puede normalmente se afirmó así. 6831 La lista actual de afirmación de posibles valores para la cpu es #cpu 6832 6833 a29k #cpu alfa #cpu arm #cpu clipper #cpu 6834 convexa #cpu elxsi #cpu tron #cpu h8300 #cpu 6835 i370 #cpu i386 #cpu i860 #cpu i960 #cpu m68k 6836 #cpu m88k #cpu mips #cpu ns32k #cpu hppa #cpu 6837 pyr #cpu ibm032 #cpu rs6000 #cpu sh #cpu. 6838 sparc #cpu espuela #cpu tahoe #cpu vax #cpu 6839 we32000 . 6840 Uno puede crear afirmaciones dentro de un programa en c utilizando '# afirmar' como este 6841 # afirmar predicado respuesta 6842 Tenga en cuenta la ausencia de un '#' antes de predicado. 6843 Cada vez que uno lo hace uno afirma una nueva respuesta verdadera para el predicado. Previamente afirmando una respuesta no invalida afirmó respuestas todos ellos siguen siendo cierto. La única manera de quitar una aserción es con '# unassert'. '# unassert' tiene la misma sintaxis como '# afirmar'. Uno también puede quitar todos afirmaciones acerca de predicado como esta # unassert predicado. Uno también puede agregar o cancelar afirmaciones utilizando el comando Opciones cuando él o ella se ejecuta gcc o cpp. 6844 Las directivas # 'error' y '# Warning' 6845 La Directiva # 'error' causa el preprocesador informar de un error fatal. El resto de la línea que sigue '# error' se utiliza como el mensaje de error. 6846 Usar # 'error' dentro de un condicional que detecta una combinación de parámetros que él o ella sabe que el programa no admite correctamente. Por ejemplo si uno sabe que el programa no puede funcionar correctamente en un Vax uno puede escribir ifdef_vax.sub de # 6847 . # Error 6848 no funcionará en Vaxen. Ver comentarios en 6849 get último objeto. 6850 # endif 6851 Si uno tiene varios parámetros de configuración que pueden ser creados por la instalación de forma coherente él o ella puede utilizar condicionales para detectar una incoherencia y reportarlo con # 'error'. Por ejemplo 6852 # if HASH_TABLE_SIZE % 2 == 0 .parallel. HASH_TABLE_SIZE % 3 == 0 .backslash. .parallel 6853 . HASH_TABLE_SIZE % 5 == 0 # Error 6854 HASH_TABLE_SIZE no debe ser divisible por un pequeño .backslash. primer 6855 # endif 6856 6857 La Directiva '# Warning' es como la Directiva # 'error' pero hace que el preprocesador emitir una advertencia y continuar preprocesamiento. El resto de la línea que sigue '# Warning' se utiliza como el mensaje de advertencia. 6858 Uno podría utilizar '# Warning' en los archivos de encabezado obsoletos con un mensaje de dirigir al usuario el archivo de encabezado que debe utilizarse en su lugar. Información adicional de preprocesador Archivos de origen de combinar 6859 6860 Uno de los puestos de trabajo del preprocesador c es informar el compilador de c de donde vinieron cada línea de código C qué archivo de origen y qué número de línea. Código c 6861 puede venir de origen de múltiples archivos si uno utilizan '# include' '# include' y el uso de condicionales y macros pueden causar el número de línea de una línea en la salida de preprocesador para ser distinto del número de la línea en el archivo de origen. Se puede apreciar el valor de hacer el compilador de C en los mensajes de error y los depuradores simbólicos como GDB utilizar los números de línea en el archivo de origen. 6862 El preprocesador de c se basa en esta función ofreciendo una directiva por la que uno puede controlar la función explícitamente. Esto es útil cuando un archivo de entrada para el preprocesador de c es la salida de otro programa tales como el generador de analizador de bisontes que opera en otro archivo que es el archivo de origen es true. Partes de la salida de bisontes se generan desde cero otras partes vienen de un archivo estándar de analizador. El resto se copian casi textualmente del archivo de origen pero sus números de línea en la salida de bisontes no son los mismos que sus números de línea original. Naturalmente uno quisiera saber el número original de archivo y la línea de origen de cada línea en el bisonte de entrada mensajes de error de compilador y depuradores simbólicos. bison 6863 organiza esto escribiendo '# line' directivas en el archivo de salida. '# line' es una directiva que especifica el número de línea original y nombre de archivo de origen para la posterior entrada en el archivo actual de preprocesador entrada '# line' tiene tres variantes 6864 # line linenum 6865 Linenum es una constante de número entero decimal. Especifica que el número de la línea de la siguiente línea de entrada en su archivo de origen original fue linenum. nombre de archivo de 6866 # line linenum 6867 Linenum es una constante de número entero decimal y nombre de archivo es una constante de cadena. Especifica que la siguiente línea de entrada provenía originalmente de nombre de archivo de archivo de origen y su número de línea allí fue linenum. Mantener en mente que filename no es sólo un nombre de archivo está rodeado por caracteres de doublequote para que se parece a una constante de cadena. cualquier otra cosa de # Line 6868 6869 cualquier otra cosa está marcada para las llamadas de la macro que se expanden. El resultado debería ser una constante de número entero decimal seguida opcionalmente por una constante de cadena como se describió anteriormente. directivas de '# line' 6870 alteran los resultados de la '_FILE_' y '_LINE.sub.' predefinidas macros desde ese punto en. 6871 La salida del preprocesador que es la entrada para el resto del compilador contiene las directivas que parecen muy parecido a las directivas '# line'. Empiezan con justa '#' en lugar de '# line' pero esto es seguido por un nombre de archivo y número de línea como en '# line'. Directivas de preprocesamiento diversas 6872 6873 En esta sección se describen tres directivas de preprocesamiento adicionales. Ellos no son muy útiles pero que se mencionan para l'integridad. La Directiva nula consiste en un '#' seguido de un salto de línea con sólo whitespace incluyendo comentarios en el medio. Una directiva de null se entiende como una directiva de preprocesamiento pero no tiene ningún efecto sobre la salida de preprocesador. La importancia primordial de la existencia de la Directiva de null es que una línea de entrada que consta de sólo un '#' puede producir ningún resultado en lugar de una línea de salida que contiene sólo un '#'. Supuestamente algunos viejos programas c contienen esas líneas. 6874 Estándar de ANSI the especifica que la Directiva '# pragma' tiene un efecto arbitrario de aplicación definido. En el preprocesador de C GNU directivas '# pragma' no se utilizan excepto para 'una vez # pragma'. Sin embargo quedan en la salida de preprocesador para que estén disponibles para el paso de compilación. La Directiva de '#ident' es compatible para la compatibilidad con ciertos otros sistemas. Es seguido por una línea de texto. En algunos sistemas el texto se copia en un lugar especial en el archivo objeto en la mayoría de los sistemas se omite el texto y la presente Directiva no tiene ningún efecto. Normalmente '#ident' sólo se utiliza en archivos de encabezado suministrados con los sistemas donde es significativa. Salida de preprocesador c 6875 6876 La salida desde el preprocesador de c parece muy parecida a la entrada salvo que todas las líneas de la Directiva preprocesamiento han sido reemplazadas con líneas en blanco y todos los comentarios con espacios. No se altera el espacio en blanco dentro de una línea Sin embargo se inserta un espacio después de la expansión de la mayoría de macro de llamadas. 6877 Archivo de nombre y la línea número información de origen es transmitida por las líneas del formulario banderas de nombre de archivo # linenum 6878 6879 que se insertan según sea necesario a la mitad de la entrada pero nunca dentro de una cadena o constante de caracteres . Esa línea significa que la siguiente línea que se originó en el archivo de nombre de archivo en línea linenum. 6880 Después del nombre de archivo de cero o más indicadores que son '1' '2' '3' o '4'. Si hay varias banderas espacios separan. Aquí es lo que significan los indicadores 6881 '1' Indica el inicio d'un nuevo archivo. 6882 '2' Indica regresar a un archivo después de haber incluido otro archivo . 6883 '3' Indica que el siguiente texto proviene de un archivo de encabezado del sistema por lo que ciertas advertencias deben suprimirse. 6884 '4' Esto indica que el siguiente texto debería tratarse como C. 6885 Invocando el preprocesador c Introducción 6886 A menudo cuando uno utiliza el preprocesador c que él o ella no tenga para invocarlo explícitamente la mayoría 6887 el compilador de c puede hacerlo automáticamente. Sin embargo el preprocesador a veces resulta útil por sí solo. El preprocesador de c espera dos nombres de archivo como argumentos infile y outfile. El preprocesador lecturas infile junto con cualquier otro archivo especifica con '# include'. Toda la salida generada por los archivos de entrada combinados está escrita en outfile. Ambos infile o outfile mayo ser '-' que como infile significa leer de la entrada estándar y como outfile medios para escribir en la salida estándar. También si outfile o se omiten los nombres de archivo la salida estándar y la entrada estándar que se utilizan para los nombres de archivo se omite. Opciones de línea de comandos 6888 6889 Aquí es una tabla de opciones de comando aceptado por el preprocesador de C. Estas opciones también pueden darse cuando se compila un programa en C se pasan a lo largo de automáticamente para el preprocesador cuando es invocado por el compilador. 6890 '-P' 6891 De generación de inhibir de '#'-líneas con información de número de línea en la salida del preprocesador. Esto puede ser útil cuando se ejecuta el preprocesador sobre algo que no es código c y se puede enviar a un programa que puede ser confundido por el '#'-líneas. 6892 '-C' 6893 No se puede desechar comentarios pasarlos a través del archivo de salida. Comentarios que aparecen en los argumentos de la llamada de una macro pueden copiarse a la salida antes de la expansión de la llamada de la macro. 6894 'tradicionales' 6895 Intentan imitar el comportamiento de c anticuado a diferencia de la expansión de macro ANSI C. tradicionales no presta ninguna atención a caracteres de singlequote o doublequote símbolos de argumento de macro se reemplazan por los valores de argumento incluso cuando aparecen dentro de la cadena aparente o constantes de caracteres. 6896 Tradicionalmente es admisible para una expansión de macro terminar en el medio de una cadena o constante de caracteres. La constante continúa en el texto que rodea a la llamada de la macro. 6897 Sin embargo tradicionalmente el final de la línea termina una cadena o un carácter constante con ningún error. 6898 C tradicionales en un comentario es equivalente a ningún texto en absoluto. En ANSI C un comentario cuenta como espacios en blanco . 6899 Tradicional C no tiene el concepto de un "número de preprocesamiento". Considera '1.0e + 4' a ser tres símbolos ' 1.0e' '+' y '4'. 6900 A macro no se suprime dentro de su propia definición en el tradicional C. Por lo tanto cualquier macro que es utilizado de forma recursiva inevitablemente provoca un error. 6901 El carácter '#' no tiene un especial significado dentro de una definición de macro en C. tradicional 6902 C tradicionales en el texto al final de una expansión de macro puede ejecutar junto con el texto después de la llamada de la macro para producir un token único. Esto es imposible en ANSI C. 6903 Tradicionalmente '.backslash.' dentro de un argumento de macro suprime la importancia sintáctica del carácter siguiente. 6904 '-trígrafo 6905 Proceso ANSI estándar trígrafo secuencias. Estos son secuencias de tres caracteres comenzando todos con que se definen por ANSI C reposar caracteres simples. Por ejemplo ' significa '.backslash.' así que n "es una constante de caracteres para una nueva línea. Estrictamente hablando el preprocesador de c de GNU no admite todos los programas en c estándar de ANSI a menos que '-trígrafo se utiliza pero si uno nunca nota la diferencia puede ser con alivio. 6906 Uno no quiere saber más acerca de trígrafo. 6907 '-pedante ' Advertencias en cuestión 6908 exigidas por la norma ANSI C en ciertos casos como cuando el texto no sea un comentario sigue '# else' o '# endif'. 6909 '-pedantes - errores' 6910 Como '-pedante ' salvo que se producen errores en lugar de advertencias. 6911 '-'Wtrigraphs Warn 6912 si cualquier trígrafo se producen suponiendo que están habilitados . 6913 '-Wcomment' Warn 6914 cuando una secuencia de inicio de comentario ' / *' aparece en un comentario. «-Muro » 6915 Pide tanto '-Wtrigraphs' y '-Wcomment' pero no '-Wtraditional' . 6916 '-Wtraditional' 6917 Advertir acerca de ciertas construcciones que se comportan de forma diferente en tradicional y ANSI C. 6918 '-I directorio ' 6919 Agregar el directorio a la cabeza de la lista de directorios que se busca para el archivo de encabezado. Esto puede usarse para reemplazar un archivo de encabezado de sistema sustituyendo la versión ya que estos directorios se buscan antes de los directorios de archivos de encabezado de sistema. Si uno usa más de uno '-I' opción los directorios se analizan en orden de izquierda a derecha los directorios de sistema estándar vienen después. 6920 '-I-' 6921 Cualquier directorios especifican con '-I' se buscan opciones antes de que el '-I-' opcional sólo para el caso de '# include "archivo" ' no se busca en para '# incluyen lt file gt '. Si se especifican directorios adicionales con '-I' opciones después de la '-I-' estos directorios se buscan todas las directivas '# include'. Además la '-I-' opción inhibe el uso del directorio actual como el primer directorio de la búsqueda para '# incluyen "archivo" '. Por lo tanto se ha buscado el directorio actual sólo si se solicita explícitamente con '-i. ' especificar ambos '-I-' y '-i. ' permite controlar con precisión qué directorios se buscan antes de la corriente de uno y que se buscan después. 6922 '-nostdinc' 6923 Busca en los directorios de sistema estándar para archivos de encabezado. Sólo los directorios uno han especificado con '-I' se buscan opciones y el directorio actual si procede . 6924 '-nostdinc ++' 6925 No buscar archivos de encabezado en los directorios estándar de C++ específicos pero aún buscar los otros directorios estándar. Esta opción se utiliza cuando el edificio libg ++ . 6926 '-Nombre D' Nombre predefinido 6927 como una macro con definición de 'I'. '-Nombre D = definición ' 6928 Nombre de predefinido como una macro con definición. No hay restricciones sobre el contenido de la definición pero si uno está invocando el preprocesador desde un shell o programa de concha uno deba utilizar el shell citando la sintaxis para proteger a personajes tales como espacios que tienen un significado en la sintaxis del shell. Si uno usa más de uno '-D' para el mismo nombre la definición de derecha toma efecto. 6929 '-Nombre U' 6930 No predefinición de nombre. Si ambos '-U' y '-D' se especifican un nombre el '-U' gana el '-D' y que el nombre no está predefinido. situada '-bajo ' 6932 No predefinir las macros no estándares. 6933 '-Un predicado respuesta ' 6934 Hacer una afirmación con el predicado y respuesta. 6935 Se puede usar '-A-' para deshabilitar todas las aserciones predefinidas también cancela todas las macros predefinidas que identifican el tipo de sistema de destino. 6936 '-dM' 6937 En lugar de imprimir el resultado de preprocesamiento salida una lista de directivas '# define' para todas las macros definido durante la ejecución de las macros predefinidas de preprocesador incluidas. Esto da una forma de encontrar lo que está predefinido en la versión del preprocesador Suponiendo que uno no tiene ningún archivo 'foo.h' el comando toque de 6938 foo.h CPP -dM foo.h 6939 puede mostrar los valores de cualquier macros predefinidas. 6940 '-dD' 6941 Como '-dM' excepto en dos aspectos no incluye las macros predefinidas y salidas de las directivas '# define' y el resultado de preprocesamiento. Ambos tipos de salida van al archivo de salida estándar. 6942 '-M -MG ' 6943 En lugar de imprimir el resultado de preprocesamiento salida una regla adecuada para hacer que describe las dependencias del archivo principal. Las salidas de preprocesador uno que regla que contiene el nombre de archivo del objeto para ese archivo de código fuente dos puntos y los nombres de todos los archivos incluidos. Si hay muchos archivos incluidos a continuación la regla se divide en varias líneas mediante 6944 '.backslash.'-salto de línea. 6945 '-MG' dice para tratar los archivos de encabezado que faltan como archivos generados y asumir que viven en el mismo directorio que el archivo de origen. Se puede especificar además de '-M'. 6946 Esta función se utiliza en la actualización automática de archivos make. 6947 '-MM -MG ' 6948 Como '-M' pero mencionar sólo los archivos incluidos con '# include "archivo" '. Archivos de sistema de encabezado incluidos con '# include lt file gt ' se omiten. 6949 '-MD archivo ' 6950 Como '-M' pero la información de dependencia se escribe en el archivo. Esto es además de compilar el archivo como se especifica-'-MD' no inhibe compilación ordinaria la forma '-M' does. Al invocar gcc no se especifica el argumento de archivo. Gcc puede crear nombres de archivo de reemplazando. "c" con ".d" al final de los nombres de archivo de entrada. En Mach uno puede utilizar la utilidad md para combinar varios archivos de la dependencia en un archivo único de dependencia adecuado para el uso con el 'make' comando. 6951 '-MMD archivo ' 6952 Como '-MD' excepto mencionar sólo usuario archivos de encabezado no los archivos de encabezado de sistema. 6953 '-H' 6954 Imprimir el nombre de cada archivo de encabezado utilizados además de otras actividades normales. 6955 '-imacros archivo ' 6956 Proceso de archivo como entrada descartando la salida resultante antes de procesar el archivo de entrada regular. Porque no se descarta la salida generada desde el archivo el único efecto de '-archivo imacros' es hacer que las macros definidas en el archivo disponible para su uso en la entrada principal. 6957 '-incluir archivo ' 6958 Proceso de archivo como entrada e incluyen toda la salida resultante antes de procesar el archivo de entrada regular. 6959 '-dir idirafter' 6960 Agregar el directorio dir a la segunda incluye la ruta de acceso. Los directorios en el segundo incluyen la ruta de acceso se buscan cuando un archivo de encabezado no se encuentra en cualquiera de los directorios en los principales incluyen la ruta de acceso el que '-I' agrega a . 6961 '-prefijo de iprefix' Prefijo de especificar 6962 como prefijo para posteriores '-iwithprefix' opciones. 6963 '-dir iwithprefix' 6964 Agregar un directorio para el segundo incluye la ruta de acceso. El nombre del directorio se realiza mediante la concatenación de prefijo y dir donde prefijo se especificó anteriormente con '-iprefix'. 6965 '-dir isystem' 6966 Agregar un directorio para el comienzo de la segunda incluyen la ruta d'acceso marcarlo como un directorio del sistema por lo qu'obtiene el mismo trato especial tal como s'aplica a los directorios de sistema estándar. 6967 '-lang - c' 6968 '-lang - c89' 6969 '-lang - c ++' 6970 '-lang - objc' 6971 '-lang - objc ++' 6972 Especificar el idioma de origen. '-lang - c' es el valor por defecto permite el reconocimiento de los comentarios de C++ comentarios que comienzan con ' / /' y al final final de línea ya que esta es una característica común y sea más probable que sea en el nuevo estándar C. '-lang - c89' deshabilita reconocimiento de C++ comentarios '-lang - c ++' maneja la sintaxis de comentarios de C++ y incluye por defecto adicional incluye directorios de C++. '-lang - objc' permite la Directiva de '# import' objetivo C. '-lang - objc ++' permite extensiones de C++ y c objetivo. Estas opciones son generadas por el compilador gcc controlador pero no pasó de la línea de comandos de 'gcc' a menos que uno utilice el controlador '-Wp' opción. 6973 '-pelusa ' Busque 6974 de comandos para el programa corrector lint incrustado en los comentarios y emiten les precedido por '# pragma pelusa'. 6975 Por ejemplo el comentario ' / * NOTREACHED * /' se convierte en ' pelusa # pragma NOTREACHED'. Esta opción está disponible sólo cuando uno llamar cpp directamente gcc no puede pasar de su línea de comandos. 6976 '-$' 6977 Forbid el uso de '$' en identificadores. Esto es necesario para ANSI conformidad. gcc proporciona automáticamente esta opción para el preprocesador si uno especifica '-ansi' pero no reconoce gcc el '-$' opción sí-utilizarlo sin los otros efectos de '-ansi' uno puede llamar el preprocesador directamente. Coprocesador basado en FPGA API 6978 La presente sección especifica en detalle el rendimiento y la especificación funcional de una encarnación de la invención presente. La presente sección describe cómo los distintos requisitos deben cumplirse. También documenta todas las pruebas necesarias para verificar que cada unidad de Handel-C y/o software funciona correctamente y que integran perfectamente para trabajar como una aplicación completa. 6979 En el contexto de la presente sección diversos personificaciones ahora se establecerá sucesivamente y aún más elaborado a posteriormente durante la referencia a Figs 88 a través de 92. Cabe señalar que el presentes personificaciones también son particularmente pertinentes a los debates anteriores de macros con parámetros bajo el título "Parametrizada expresiones macro" enunciados hereinabove en referencia a la FIG. 57A-2 y figuras posteriores. 6980 87B FIG. ilustra un método 8750 para distribuir núcleos de conformidad con una encarnación de la invención presente. En general en la operación 8752 un núcleo que incluye una pluralidad de variables de primeras se distribuye sin hacer referencia a uno o más parámetros. En uno de los aspectos de la presente invención el núcleo puede distribuirse a través de una red. Como una opción la red puede incluir Internet. 6981 En una encarnación los uno o más parámetros pueden incluir ancho variable. En otro aspecto los uno o más parámetros pueden incluir el tipo de datos. En incluso otro aspecto pueden incluir los uno o más parámetros de tamaño de arreglos de discos. En otro aspecto pueden incluir los uno o más parámetros profundidad de canalización. 6982 Equipo programa es ejecutado a continuación que incluye una pluralidad de variables de segunda en relación con el parámetro de uno o más. Véase operación 8754. La ejecución de un programa incluye la ejecución del núcleo. Los parámetros de uno o más de las variables primeras a continuación se deducen de los parámetros de uno o más de las variables de segundo. Véase operación 8756. 6983 Por este diseño los diversos principios divulgados en este documento pueden utilizarse en un entorno distribuido donde pueden ser núcleos utilizando una red de difusión y utilizados por distintas aplicaciones del equipo. 6984 FIG. 87C ilustra un método 8760 para el uso de un mapa de la biblioteca durante el diseño de núcleos de conformidad con una encarnación de la invención presente. En general en la operación 8762 se determina una pluralidad de macros que especifique una interfaz. En un aspecto las macros pueden compilarse en un archivo. 6985 Durante la ejecución de cada uno de macro uno de una pluralidad de bibliotecas es utilizado en la operación 8764. Cada macro es capaz de ser ejecutado utilizando diferentes bibliotecas. Nota de operación 8766. Como opción las macros pueden ejecutarse en un coprocesador que es capaz de ejecutar las macros utilizando diferentes bibliotecas. Encarnación de uno en 6986 de la presente invención una pluralidad de primeras variables en las macros también puede definirse con referencia a la variables anchos y una pluralidad de segunda variables en las macros puede ser definida sin referencia a ancho variable para que el ancho variable de las variables de segundo puede inferirse de los variables anchos de las variables de la primeras. 6987 La presente invención así está adaptada para generar automáticamente las bibliotecas para su uso en la distribución de componentes de software sin necesidad de que los componentes de software para ser completamente definido. El sistema recibe una descripción del comportamiento de los componentes del sistema y determina la funcionalidad necesaria óptima entre el hardware y software y proporciona esa funcionalidad mientras variando los parámetros por ejemplo el tamaño o el poder del hardware o software. Así por ejemplo los procesadores para el software y el hardware pueden ser formados en un dispositivo de la lógica reconfigurable cada uno siendo no exceda de lo necesario para formar las funciones deseadas. El sistema de codiseño salidas de una descripción de los procesadores requiere código de máquina para ejecutar en los procesadores y una lista neta o registrar la transferencia Descripción del nivel del hardware necesario. Es posible que el usuario escribir algunas partes de la descripción del sistema de registro de nivel de transferencia para dar más control sobre el funcionamiento del sistema y el usuario puede especificar el procesador o procesadores a utilizarse y puede cambiar por ejemplo el particionador compiladores o estimadores de velocidad utilizados en el sistema de Codiseño. Dado que la biblioteca tiene la última tecnología en anchos de dinámicas las bibliotecas son flexibles en su capacidad para almacenar y actualizar dinámicamente sus componentes basadas en las características de un sistema resuelto. 6988 En otro aspecto de la presente invención un conjunto de macros es desarrollado inicialmente para especificar una interfaz. La interfaz de hardware así se especifica mediante macros de software. Por ejemplo una macro que dice Añadir A + B = C se puede traducir en un sumador con dos puertos de entrada y una salida. 6989 Como una opción un archivo de Handel-C y un archivo de encabezado pueden aplicarse con las declaraciones de las macros o archivo. 6990 A partir de entonces el archivo c puede compilarse en una biblioteca. Las variables pueden no ser resuelto por completo en este punto. El compilador de c de Handel puede hacer inferencing de ancho cuando la biblioteca se utiliza en una llamada del programa. Puede inferir una anchura de valores constantes o una expresión entera. También podrá efectuarse las referencias externas a otra macro que puede no estar en esa biblioteca particular que se ha resuelto a la biblioteca de otra cuando se invoca la llamada. Punteros a función también pueden encapsular una toda la pieza de hardware que puede resolverse en tiempo de ejecución. 6991 Por ejemplo en un sistema con dos bancos de memoria conectados entre sí en una FPGA un puntero puede señalar a un puntero a función. A continuación tal puntero de función se puede asignar a cualquier función y tener varias es decir siete 7 funciones que pueden ser apuntadas por el puntero de función. A continuación en tiempo de ejecución puede ser resuelto mediante la función de la RAM de Handel-C para apuntar a los bancos de memoria diferentes para implementar un multiplexor a cualquiera de los bancos de memoria. 6992 En otra encarnación tres diferentes adaptadores de gráficos podrían ser definidos por tres funciones diferentes que fueron apuntadas por un puntero de función única. Tal puntero de función única podría cambiarse en tiempo de ejecución para que apunte a un circuito especial del adaptador especial que debe ser ejecutado. También puede encapsular la funcionalidad del dispositivo en la estructura de la API para cambiar entre varias tarjetas de vídeo. 6993 Un ejemplo de tal concepto se establecerse en adelante bajo el título "Capa función interfaz de usuario." Ejemplo utiliza un coprocesador FPGA para pasar de la estructura de la estructura de la API de usuario que contiene punteros a función. 6994 En uso cuando un programador escribe una expresión de una vez él o ella no necesita volver a codificarlo cada vez. Una macro es siempre compila en una función que hace algo pero el programador no sabe lo que hace. Uno no necesita las declaraciones de esta llamada. Se procesan dos funciones muy diferentes versión 1 o 2 basado en que uno está habilitada. Este método es muy configurable. 6995 Se define una unidad aritmético lógica que tiene una biblioteca binaria y flotante punto de biblioteca. A continuación en un sistema de coprocesador uno podría apuntar a una u otra de las plataformas. El diseño de dos IP diferente pueden omitirse los núcleos ya que dos versiones diferentes de los núcleos de IP pueden ser producidas por las dos bibliotecas diferentes. Las funciones pueden utilizarse para hacer llamadas a los distintos puntos del hardware de los punteros en el archivo de encabezado. 6996 Todo esto puede hacerse en el contexto de un sistema de coprocesador. Como se muestra en la FIG. 90 una biblioteca de capa de aplicación y una capa física se proporcionan la biblioteca. Para cada plataforma para el que no hay memoria uno tendría una biblioteca separada que define la plataforma y su única memoria técnicas de manipulación. Archivos de encabezado que acompañan a las bibliotecas pueden ser llamados por la implementación básica de usuario para acceder a la memoria de los fundamentales de la física. Cabe señalar que la capa física se establece en lo sucesivo en mayor detalle en la sección bajo el título "Interfaz de capa física". 6997 87D FIG. ilustra un método 8770 para proporcionar el polimorfismo mediante punteros con arreglo a una encarnación de la invención presente. Inicialmente las operaciones se realizan sobre una pluralidad de objetos en múltiples contextos de uso de los operadores como se indica en la operación 8772. En un aspecto las operaciones pueden incluir operaciones de vídeo. 6998 De conformidad con el concepto de polimorfismo diferentes significados se asignan a los operadores en cada uno de los contextos. Nota de operación 8774. Para mejorar el concepto de este tipo los significados se asignan a los operadores en cada uno de los contextos de uso de punteros. Nota de operación 8776. En un aspecto los significados pueden incluir funciones. Como un optoin se pueden asignar los significados en tiempo de ejecución. Además se pueden seleccionar los significados utilizando un multiplexor. 6999 La encarnación actual permite la asignación de las tarjetas de vídeo que se pueden definir cada uno por una función separada. Un puntero a función solo puede cambiarse en tiempo de ejecución para que apunte a cualquiera de las distintas funciones. En una encarnación puede utilizarse un conmutador multiplexor que apunta a uno de un número de los punteros a función. 7000 87E FIG. ilustra un método 8780 para generar bibliotecas utilizando las macros pre-compiler de conformidad con una encarnación de la invención presente. En general en la operación 8782 es visitada una biblioteca que incluye una pluralidad de funciones. Una constante precompilador es probada en operación 8784 para que uno o más de las funciones de la biblioteca pueden seleccionarse basado en las pruebas. Nota de operación 8786. 7001 En un aspecto la constante de precompilador puede incluir una pluralidad de versiones. Como opción puede seleccionar la versión utilizando una macro precompilador. En otro aspecto la constante de precompilador se prueba para determinar el estado de un aparato en el que se ejecutan las funciones. En un aspecto tan el estado del aparato puede basarse en un tamaño de bits actual. 7002 Un ejemplo de un programa que utilizaría las bibliotecas antes mencionadas es el siguiente 7003 / / 7004 7005 7006 # ifdef VERSION1 7007 macro expr UnknownThing a b = a + b 7008 # elif defined VERSION2 7009 macro expr UnknownThing a b = a@b 7010 # endif 7011 / / 7012 7013 7014 En uso una biblioteca con un desconocido en el que puede pasar en ella en tiempo de compilación para ejecutar funciones diferentes. Cuando un tamaño de bits va por encima de cierto nivel uno puede tener que poder procesarlo de manera diferente. Como tal es creado una biblioteca que contiene funciones de tiempo de compilación diferentes como macros separadas. Los usuarios pueden definir qué macro se ejecuta en función del Estado del sistema por una constante precompilador de pruebas. Además la macro pre-compiler puede utilizarse para seleccionar la versión que se utiliza. Contuvieren 87F FIG. ilustra un método 8790 para imitar la programación orientada a objetos utilizando punteros en una arquitectura de hardware programable de conformidad con una encarnación de la invención presente. Inicialmente en la operación 8792 una estructura es apuntada para ejecutar una función con la participación de una estructura. A partir de entonces en la operación 8794 se analiza el contenido de la estructura. Además al menos una macro de un conjunto de macros se selecciona basándose en el análisis. Véase operación 8796. 7016 Al programar en C++ una persona tiene algunos datos con un puntero oculto a la función. A continuación cada vez que él o ella tiene "este" puntero en c de Handel hay una estructura de datos que pueden ser apuntados para facilitar la llamada de función. Ejemplo de 7017 Estructura 7018 puede definirse se tenga un número entero. Se proporcionan dos macros uno que incrementa y otro que disminuye. En función del contenido del entero uno puede utilizar las macros para proporcionar hardware incremental o decremental. Además uno puede utilizar una multitud de estas instancias para que las macros de trabajo en la estructura particular y emular un registro de hardware. 7019 Cuando uno abre un archivo en el software se utiliza un identificador para el archivo. Tal punto de control a continuación puede utilizarse para cada llamada al archivo para proporcionar transferencia coordinada de datos al archivo. Puede utilizar el mismo tipo de estructura en Handel C para facilitar la transferencia de datos y la modificación de los datos según el objetivo de hardware correcto. 7020 Esto podría aplicarse en cualquier contexto. Por ejemplo puede definirse un conjunto de macros que contiene una estructura que tiene uno o más conjuntos de datos. Con respecto a la estructura de la API de usuario punteros a función completa pueden ser pasados a algo para invocar diferentes estructuras y pasar datos de ida y vuelta. Esto permite algo diferente para ser ejecutado. 7021 Más información sobre los conceptos que preceden de 87B Figs a través de 87F ahora ser establecido en mayor detalle. 7022 De an FPGA basados de coprocesador proporciona un sistema con un sub-processor ecológicos capaz de proporcionar un sistema con un aumento notable del rendimiento. Una arquitectura de host y cliente puede utilizarse para implementar el sistema de coprocesador. El coprocesador puede función principalmente como un cliente pero puede ser capaz de realizar operaciones de host si la plataforma permite este tipo de operaciones. Es posible que varios coprocesadores existir en un sistema. Un coprocesador FPGA basado no puede funcionar como un procesador normal. Puede ser capaz de actuar como un sistema separado en función de los recursos disponibles para el FPGA. Un coprocesador FPGA también puede ser capaz de realizar operaciones complejas de datos con sólo las limitaciones de plataforma de limitar las cantidades de datos que se manejan. La funcionalidad operativa de un coprocesador FPGA basado no puede aplicarse como secuencias de instrucciones pero por circuitos de hardware dedicado programados en el dispositivo FPGA. 7023 A host puede hacer uso de un cliente al hacer llamadas a funciones remotas. Coprocesadores pueden proporcionar una multitud de funcionalidad ecológicos. La funcionalidad de coprocesador puede proporcionarse como un conjunto de funciones. Cada función puede tener un índice único para distinguirla de otras funciones. Funciones normalmente pueden ser independientes de unos a otros y totalmente independiente de la plataforma. Es posible para funciones interactuar dentro de un coprocesador esta característica puede proporcionarse a las funciones a través de una API de alto nivel. Una función puede tener acceso a recursos compartidos de todo que el coprocesador tiene disponible esta característica puede proporcionarse a las funciones a través de una API de alto nivel. Para añadir nuevas funciones a un coprocesador un diseñador puede crear una nueva función. El conjunto de funciones disponibles en un coprocesador en un momento dado es enteramente a la discreción de ingenieros. 7024 El coprocesador puede ser capaz de ejecutar todas las funciones disponibles de forma simultánea. Esto es una demostración de la verdadera paralelismo que proporciona el hardware. Si es necesario para ejecutar la función misma de más de una vez y luego múltiples copias de la función pueden ser necesarios cada uno con una dirección única. Crear varias copias de una función es fácilmente alcanzable en Handel-C utilizando la función de arreglos de discos. Funcionalidad de sistema de coprocesador 7025 puede ser proporcionada por un conjunto de APIs. Puede haber una API independiente para el host y el cliente. Uso de las API de dos puede proporcionar al usuario con la abstracción total desde la plataforma. Esto puede permitir código independiente de plataforma generar que interactúa con las API. Las API pueden administrar toda la plataforma de interacción y los protocolos de comunicación que están involucrados los programas Host pueden ser capaces de utilizar el API de host para ejecutar las funciones en un coprocesador. El coprocesador de cliente puede recibir los mensajes de los datos de host y de la secuencia a través de la API de cliente y de sus funciones según sea necesario. Las funciones pueden interactuar con el cliente de la API de acceso a los recursos del coprocesador. 7026 A host puede interactuar con un clientes un modo siguiente 7027 Comenzar la ejecución de una función 7028 Parámetros de enviar a una función 7029 Datos de recuperar de una función 7030 De datos de recepción listo notificaciones desde un cliente Funcionalidad auxiliar de realizar 7031 7032 A cliente puede interactuar con un host como sigue 7033 Ejecutar una función cuando se lo indique. 7034 Datos de la secuencia a una función según sea necesario 7035 Datos de la secuencia de una función según sea necesario Colecciones de 7036 datos de enviar señales a un host 7037 un proporcionar la dirección de la función que ha generado un datos colecciones de señal Funcionalidad auxiliar de realizar 7038 APIs de the 7039 puede estar diseñadas para proporcionar una capa de abstracción para interfaces de software. Esto puede permitir que las aplicaciones de usuario a ser independiente en relación con el coprocesador API de la plataforma. 7040 De aplicaciones de interfaces pueden no ser conscientes de las normas o los protocolos utilizados por un host y cliente para comunicarse. La abstracción permite cambios en el sistema de coprocesador sin efectuar significativamente las aplicaciones de usuario. Especificación de API CPU de host 7041 7042 El host API describe el software que puede interactuar con la aplicación de usuario que se ejecuta en la plataforma de host. 7043 El host API puede proporcionar un usuario con toda la funcionalidad que necesitan para tener acceso y utilizar una FPGA basados coprocesador. El API de host puede representar un coprocesador FPGA basado como un conjunto de funciones remotas. Puede haber suficiente funcionalidad incluida en el API para reducir la sobrecarga de una llamada de función remota a una llamada de función local estándar único de host. 7044 Una aplicación de interfaz con el host API puede ser capaz de ejecutar funciones remotas mediante dos métodos posibles ejecutar y esperar o ejecutar y continuar. El mecanismo de ejecución y espera puede simular una llamada de función normal puede no volver hasta la función remota ha finalizado la ejecución y los resultados han sido obtenidos. La ejecución y continuar el mecanismo puede permitir varias funciones llamar sin esperar los resultados de los demás. 7045 El host API puede notificar a las aplicaciones de usuario de eventos mediante funciones de devolución de llamada. Pueden ejecutar las funciones de devolución de llamada cuando se produce un evento de coprocesador pertinentes. Uso de la ejecución y continuar el mecanismo permite una función producir resultados provisionales es decir genera múltiples señales de finalización con varias devoluciones de datos. Estructura de API 7046 7047 FIG. 88 ilustra una interfaz de programa de aplicación 8800 de conformidad con una encarnación de la invención presente. El host API 8802 está diseñado para ser construido a partir de dos grandes secciones 8804 8806. Las dos secciones están presentes para permitir la separación de la plataforma de código dependiente del código independiente de la plataforma. Una biblioteca puede ser construida de cada sección lógica del diseño. Esta sección se hace para reducir el esfuerzo necesario para la API de entre varias plataformas de puerto. La sección dependiente de la plataforma puede proporcionar una interfaz común y funcionalmente puede dirigirse a la plataforma de host. Es posible tener una variedad de secciones dependientes de plataforma disponibles para prestar apoyo a una variedad de plataformas de destino diferentes. 7048 De la API diseño es en capas para facilitar el mantenimiento. Cada capa puede representar una biblioteca de software. Cada biblioteca puede proporcionar un conjunto de funciones y macros para su utilización dentro del núcleo de la API. Cada capa puede tener una interfaz común. Utilizando las interfaces comunes puede aumentar la flexibilidad de la API. Las interfaces comunes pueden utilizarse como plantillas para las capas. Nuevas implementaciones pueden basarse en las plantillas y proporcionando son funcionalmente compatibles pueden ser inmediatamente compatibles con los sistemas existentes. Interfaz de API pública de capa de aplicación 7049 7050 La interfaz pública proporciona las funciones básicas necesarias para una aplicación de usuario para utilizar un FPGA basan coprocesador. 7051 Ejecución de superpuesta de funciones remotas puede conseguirse directamente acceder a la interfaz de capa física e iniciar las transferencias de datos a las funciones. Funciones de devolución de llamada 7052 se utilizan para implementar un evento impulsado por el sistema. Las funciones de devolución de llamada se ejecutan para informar a la aplicación de usuario cuando se han producido acontecimientos. Funciones de devolución de llamada pueden utilizarse varias veces dependiendo de la naturaleza del evento. Normalmente el último evento en ser señalado antes de completa una transferencia sería un informe de estado de finalización o un error fatal. Datos se transfieren a una función de devolución de llamada en forma de estructura de resultados. 7053 Legado con el estilo función remota las ejecuciones se realizan utilizando ExecuteFunction espera. Ejecución de función remota más avanzadas y superpuestos se realiza mediante ReadData y WriteData. 15 API de ExecuteFunctionWait de TransferResultsStructure de funciones públicas unsigned int FunctionIndex int unsigned char de DataAmountParameters * parameterDataBuffer unsigned int ReturnDataAmount char * ReturnDataBuffer índice de FunctionIndex de parámetros de la función que se ejecute. DataAmountParamaters el tamaño del búfer de datos de parámetro en bytes. ParameterDataBuffer un búfer de datos que contiene los parámetros para enviar a la función que se ejecute. ReturnDataAmount el tamaño del búfer devolver datos en bytes. ReturnDataBuffer un búfer de datos para almacenar los datos de devolución de la función que se ejecute. Valor devuelto 7054 7055 La estructura devuelta por esta función puede contener información acerca de los resultados de la finalización de la ejecución de la función remota. Comentarios 7056 7057 ExecuteFunction espera se utiliza para realizar una llamada a la función de estilo heredadas. Puede ejecutar la función remota especificada y el contenido de ParameterDataBuffer puede ser transferido a la función. Cuando los datos de colecciones de señal de los ejecutados desde que se recibe los datos devueltos pueden ser transferidos y almacenados en el ReturnDataBuffer. Este método de ejecución de la función remota sólo puede utilizarse en funciones remotas que tienen un flujo de ejecución tradicionales. 91 Fig. muestra un flujo de ejecución tradicionales para una función remota. La API de acogida podrá exigir determinadas tareas a llevar a cabo antes de que ocurra cualquier interacción con un coprocesador. StartCoprocessorSystem es proporcionado por el host API para las aplicaciones de usuario inicializar los subsistemas APIs de host. 7058 void StartCoprocessorSystem ... Parámetros 7059 Comentarios 7060 7061 Inicializa la API asigna los recursos necesarios del sistema. Esto puede ser llamado antes de cualquier otra función de la API. 7062 Para habilitar un agraciado apagar el host que API puede proporcionar una aplicación de usuario con un método para informar de lo que es ya no necesita. ShutdownCoprocessorSystem es proporcionada por el API de host como la función de desconexión para el sistema de coprocesador. 7063 void ShutdownCoprocessorSystem ... Parámetros 7064 Comentarios 7065 7066 Llaman a esto cuando ya no se requiere de la funcionalidad de la API. Esto puede limpiar los recursos de sistema que se está utilizados la API. Interfaz de API pública de capa física 7067 7068 La interfaz de capa física proporciona acceso a funciones dependientes de la plataforma. Las funciones que forman la interfaz pública para el capa física habilitan un usuario realizar más funcionalidad avanzada que es posible con la interfaz pública de capa de aplicación. 7069 Como un FPGA es que se requiere un dispositivo ecológicos un método para configurar el dispositivo. Esto proporciona la interfaz pública de capa física. 16 Funciones públicas física de capa int ConfigureCoprocessor char * BitFile Parámetros de BitFile nombre de un archivo de '.bit' para ser cargados en el FPGA coprocesador. Valor devuelto 7070 7071 Si la función correctamente el valor devuelto es distinto de cero. 7072 Si se produce un error en la función el valor devuelto es cero. Comentarios 7073 7074 El archivo '.bit' utilizado puede ser compatible con el dispositivo de destino FPGA. La API de cliente proporciona los medios para diseñar un FPGA basados en coprocesador en Handel-C. Compilar código de Handel-C a EDIF puede permitir a la creación de un archivo de '.bit' utilizando las herramientas de software de proveedores FPGA. 7075 De an FPGA coprocesador es capaz de soportar funcionalidad avanzada. Para que una aplicación de usuario utilizar las funciones avanzadas puede ser capaz de transferir datos de un coprocesador cada vez que necesita. 17 unsigned int ReadData configuración de TransferConfiguration Parámetros de configuración de una estructura que contiene todos los datos necesarios para comenzar la operación. Valor devuelto 7076 7077 El valor devuelto es un identificador único para la operación. El identificador puede utilizarse durante la comunicación informativa. Comentarios 7078 7079 Esta función puede transferir datos a una función remota. Si la función de destino no es ejecutarlo puede ser ejecutado. 7080 De an FPGA coprocesador es capaz de soportar funcionalidad avanzada para una aplicación de usuario utilizar las funciones avanzadas puede ser capaz de transferir datos a un coprocesador cada vez que necesita. 18 unsigned int WriteData TransferConfiguration * configuración Parámetros de configuración de una estructura que contiene todos los datos necesarios para comenzar la transferencia. Valor devuelto 7081 7082 El valor devuelto es un identificador único para la transacción. Comentarios 7083 7084 Esta funciones pueden transferir datos desde una función remota. 7085 Una aplicación de usuario puede que desee supervisar el progreso de una transacción activa. El host API proporciona la función QueryTransaction para efectos de la supervisión de transacciones. 19 QueryTransaction de TransferResultsStructure de unsigned int UniqueIdentifier parámetros UniqueIdentifier el identificador se utiliza para proporcionar un identificador único para cada transacción. Valor devuelto 7086 7087 La estructura devuelta por esta función puede contener información acerca de la transacción que se consulta. Comentarios 7088 Uso de 7089 esta función para obtener resultados intermedios para una transacción activa. 7090 Call Back funciones y estructuras Funciones de espalda de llamada 7091 se utilizan a lo largo de la API para prevenir la necesidad de sondeo. El uso de espalda de llamada de función basa en un evento en el sistema. Cuando el evento se produce la llamada vuelta se ejecutan funciones para comunicar la información sobre el evento. Eventos típicos pueden ser la finalización de la transferencia la notificación de errores y el tiempo de espera. Estructuras 7092 7093 Varias de las funciones de la capa física requieren datos de configuración. La estructura de configuración proporciona encapsulación para los datos de configuración. struct 20 Configuraion {void *TranferCallback T-ransferResultsStructure TransactionInfomation unsigned int DataQuantity unsigned char * DataBuffer unsigned int DestinationAddress unsigned int MaxDesiredTransactionTime } Miembros 7094 PhysicalLayerEventHandler 7095 7096 Ésta es la función de devolución de llamada que es exclusiva de la capa física. El usuario debe crear esta función y debe basarse en el prototipo de la función TransferCallback. DataQuantity 7097 7098 Este valor se refiere a la cantidad de datos en bytes que se transfieran. DataBuffer 7099 7100 A puntero a un búfer de datos si recibe los datos en el búfer puede ser al menos tan grande como DataQuantity bytes. DestinationAddress 7101 7102 La dirección de destino se refiere al índice de la función a la que se transferirán los datos. Tiempo de MaxDesiredTransaction 7103 7104 Este valor especifica una longitud de tiempo en milisegundos. Se usa para indicar el tiempo máximo deseado para una transacción. Esto permite que las transacciones se anula si se están adoptando para largo. Comentarios 7105 7106 La estructura de la configuración se utiliza cuando la llamada funciona en la capa física. 7107 Los resultados de Estado para una función en particular están encapsulados en el TransferResultsStructure. Esta estructura comúnmente se pasa a la función de devolución de llamada pero también es usada por QueryTransaction. struct 21 TransferResultsStructure {unsigned int UniqueIdentifier unsigned int QuantityOfDataTransferred TransferResultsCodes ResultCode } Miembros 7108 QuantityOfDataTransferred 7109 7110 Este valor se utiliza para indicar el número de bytes se transfirió con éxito. ResultCode 7111 7112 El código de resultado puede ser el de los Estados definidos para el tipo de datos enumerados TransferResultsCodes. Comentarios 7113 7114 La estructura de resultados de transferencia contiene información acerca de una solicitud de transferencia recientes. 7115 Los posibles valores de los códigos de Estado están predefinidos utilizando un tipo de datos enumerados. enum 22 unsigned int TransferResultsCodes = {CPS_COMPLETED = 0 CPS_FATAL CPS_TIMEOUT CPS_SYSTEM_BUSY CPS_IN_PROGRESS CPS_ON_HOLD} Comentarios 7116 7117 Los códigos de resultados se utilizan para indicar los resultados de la transacción por el sistema. Funciones de devolución de llamada 7118 7119 Funciones de devolución de llamada de transferencia se utilizan para generar el evento impulsado por el sistema. Función de usuario creado que se pasan a la API pueden basarse en el prototipo de TransferCallbackfunction. 7120 TransferCallback void const TransferResultsStructure TransactionResults Parámetros 7121 TransactionResults 7122 7123 Se trata de una estructura que contiene información acerca de la razón para la ejecución de la función de devolución de llamada. La transacción sólo se termina cuando uno de los CPS_COMPLETED CPS_FATAL o CPS_TIMEOUT se indica que el código de resultado. Comentarios 7124 7125 La transferencia devolver la llamada función se usa como el controlador de eventos para una transacción. El usuario puede proporcionar esta función si requieren operaciones de coprocesador superpuesta. 7126 Host comunicación con un cliente 7127 Los métodos que utiliza un host para transportar datos a y desde un cliente son dependientes de la plataforma muy. Especificación de API de cliente FPGA 7128 7129 La API del cliente se ocupa de la parte FPGA del sistema coprocesador. Todo lo que se describe aquí se refiere al hardware necesario para construir un coprocesador FPGA basado. Muchas de las descripciones que se utilizan en esta sección utilizan software de terminología Esto es posible debido al lenguaje de programación de Handel-C que permite el hardware que se describen en términos de algoritmos utilizando un c sintaxis de estilo. Estructura de API 7130 7131 La API del cliente puede consistir en funciones y macros para dos propósitos. 7132 El desarrollo de las funciones que un host puede acceder y ejecutar. 7133 La construcción del hardware necesario para interactuar con un host y los recursos de la plataforma. 7134 Para garantizar la máxima capacidad de mantenimiento el cliente que API puede ser dividida en dos secciones principales. Las dos secciones se crean código independiente de la plataforma independiente y código dependiente de la plataforma. 7135 La sección independiente de la plataforma ha sido nombrada el 'capa de aplicación'. La sección dependiente de la plataforma ha sido nombrada el 'nivel físico'. La capa física puede formar la 'biblioteca de capa física'. La capa de aplicación puede formar la 'biblioteca de capa de aplicación'. 7136 La API del cliente puede permitir a un usuario crear hardware para el uso de un host mediante Handel-C y que representa el hardware como funciones de Handel-C. El hardware de usuario creado para el uso de host puede ser llamado "funciones del usuario". Uno puede aplicar terminología de software para el hardware debido a la abstracción que proporciona el lenguaje c de punto de control. 7137 La capa de aplicación puede contener macros y funciones que se usan por funciones de usuario. La capa de aplicación puede proporcionar funciones de usuario con una capa de abstracción de plataforma total. Este mayo permite funciones de usuario una vez diseñado para cualquier plataforma. 7138 A un usuario puede utilizar las bibliotecas de API para construir un «núcleo físico' y uno o más 'usuario núcleos'. El propósito de un núcleo de usuario puede hacer referencia de las funciones de usuario y asociar las funciones de usuario con índices utilizando métodos independientes de la plataforma. 7139 El propósito de los fundamentales de la físico es proporcionar un archivo independiente que un usuario puede utilizar para interactuar con la plataforma. Esto puede permitir que el trabajo necesario portar un coprocesador que limitarse a sólo pequeñas modificaciones de los fundamentales de la física. 7140 Configuración de recursos de la plataforma puede ser posible mediante la capa física de la API al crear un núcleo físico. 7141 89 FIG. ilustra una muestra de 8900 esquemática que la capa física 8902 se divide en dos más secciones 8904 an 8906 de conformidad con una encarnación de la invención presente. Recursos compartidos son manejados por la sección 2 de la capa física y la interacción del host es manejado por la sección 1 de la capa física. Las dos secciones de la capa física son accesibles a través de una interfaz común la 'capa física plataforma independiente interfaz'. Se define una interfaz común 8908 para el capa física para garantizar que las implementaciones diferentes para diferentes plataformas de la capa física son compatibles con la capa de aplicación 8910. Funciones de usuario 7142 obtienen acceso a la capa de aplicación API a través de los parámetros pasados a la función cuando se ejecuta. Esto puede permitir que las bibliotecas de API distinguir entre las funciones de usuario cuando se realizan llamadas de función de la API. El concepto de la ejecución de una función de hardware se refiere a una señal de cambio para indicar 'ir'. 7143 A situación puede surgir cuando una función de usuario requiera acceso directo a E/s auxiliar en una plataforma determinada. Una función de usuario puede ser capaz de tener acceso I/O auxiliares mediante el acceso a un conjunto de macros que las conexiones de forma al auxiliar I/O. uso de I/O auxiliares pueden comprometer la portabilidad de una función de usuario pero el sistema auxiliar de E/s puede estar diseñado para minimizar el impacto. 7144 De la capa física sirve para proporcionar algunos abstracción de características de la plataforma. Esto puede permitir que la capa de aplicación que se espera de la capa física de una interfaz común con características relativamente comunes. Una biblioteca de capa física puede ser construida para cada plataforma de destino. Las bibliotecas de capa física pueden contener un conjunto de macros basado en la plantilla común en el diseño de la capa física. API de usuarios pueden ser capaces de crear en el nivel superior de un coprocesador usando la biblioteca de capa física de API pertinente. 7145 Uso del cliente API bibliotecas- 7146 FIG. 90 es un diagrama esquemático 9000 el dominio de aplicación capa 9002 físico capa 9004 y usuario 9006 de conformidad con una encarnación de la invención presente. 7147 De la API bibliotecas pueden proporcionar capas de abstracción para hacer un coprocesador tan portátil como sea posible. Se pueden considerar cualquier partes del sistema que interactúan únicamente con la capa de aplicación totalmente independiente como la capa de aplicación de la plataforma es su ser totalmente independiente de la plataforma. Funciones de usuario 7148 pueden interactuar con la biblioteca de capa de aplicación mediante el encabezado de la función de usuario. El encabezado de la función de usuario puede prototipo de las funciones de la API que se pueden pasar a una función de usuario cuando se ejecuta. Las funciones de la API pueden estar encapsuladas en una estructura y la estructura puede ser pasada a la función de usuario cuando se ejecuta. Este mecanismo se utiliza para garantizar la compatibilidad con versiones posteriores y para permitir que la biblioteca de capa de aplicación distinguir entre las funciones de usuario en el método más eficiente posible. Núcleos de usuario 7149 pueden crearse utilizando las macros de la biblioteca de la capa de aplicación. Cuando se construye un núcleo de usuario el usuario puede hacer referencia a las funciones que pueden formar la funcionalidad del coprocesador. Índices pueden asignarse a la función de usuario cuando se crea el núcleo del usuario. 7150 De la biblioteca de capa física sirve para proporcionar una interfaz común a las características de la plataforma. Debido a la diversidad posible de las características de una plataforma puede proporcionar que una biblioteca de capa física puede crearse para que cada plataforma de apoyo. Esto puede permitir que las personas que utilizan las bibliotecas de capa física para hacer tan sabiendo que sus coprocesador puede ser fácil de puerto a otras plataformas. La biblioteca de capa física es la plataforma muy dependiente pero se pretende habilitar a un usuario crear un núcleo físico que no es muy plataforma dependiente. 7151 Creación de un coprocesador 7152 Para construir un coprocesador puede requerir un usuario generar varios archivos mediante las bibliotecas de API. Funciones de usuario pueden utilizar el encabezado de función de usuario APIs para acceder a las funciones de la API. El coprocesador real es construido por el usuario en la creación de un núcleo físico. El usuario también puede crear al menos un núcleo de usuario para acompañar el núcleo de la físico. El núcleo del usuario puede ser independiente de la plataforma como sólo puede interactuar con la sección de capa de aplicación de la API. El núcleo de la físico puede ser clasificado como dependiente de la plataforma pero la API puede proporcionar algunos abstracción a través de la capa física que permite portar rápida de un núcleo físico. El usuario puede configurar varias características de una plataforma durante la creación de un núcleo físico. 7153 El núcleo físico forma la parte superior nivel para una implementación de coprocesador. Asociaciones de archivo 7154 7155 FIG. 90 muestra los archivos que pueden ser necesario para construir un FPGA basan coprocesador de conformidad con una encarnación de la invención presente. 7156 Las etiquetas de usos están numeradas para permitir la explicación de las interconexiones. Véase que fig. 90 para la numerada utiliza etiquetas. Un núcleo física de los usuarios puede incluir el encabezado de biblioteca de capa física para obtener acceso a la biblioteca de la capa física. La cabecera de la biblioteca de capa física puede contener declaraciones que pueden hacer referencia al contenido público de la biblioteca de la capa física. Un núcleo física del usuario debe incluir el archivo de encabezado de configuración de sistema. Cuando se utilizan las macros de la biblioteca de capa física podrán utilizar los datos de configuración. Un núcleo física de los usuarios puede ser capaz de enlazar a un número de núcleos de usuario. Un núcleo física de los usuarios puede proporcionar un núcleo de usuario con un reloj y la funcionalidad de pertinente para permitir su funcionamiento. Los vínculos de encabezado de función del usuario a la biblioteca de capa física para obtener acceso a los nombres de los puertos de 1 / O auxiliares. Un núcleo de usuario puede incluir el encabezado de biblioteca de capa de aplicación para obtener acceso a las macros en la biblioteca de la capa de aplicación. 7157 El encabezado de biblioteca de capa de aplicación puede contener declaraciones que vinculan a las macros y funciones de la biblioteca de la capa de aplicación. Los vínculos de encabezado de función del usuario a la biblioteca de capa de aplicación para proporcionar la función de usuario con acceso a la API. Puede vincular un núcleo de usuario a la función de al menos un usuario. Funciones de usuario pueden incluir el encabezado de función de usuario para obtener acceso a la API. Configuración de sistema de coprocesador 7158 7159 El coprocesador API compatible con una gran cantidad de opciones de configuración. La configuración de la plataforma puede realizarse cuando el usuario está creando el núcleo de la físico. Los mapas de índice de función de usuario se crean cuando el usuario crear un núcleo de usuario. 7160 Común plataforma configuración opciones soportadas por la biblioteca de capa física utilizada cuando un usuario está creando un núcleo físico 7161 Número de funciones compatibles. Esto puede configurar cómo se construye el decodificador de direcciones de host. El tamaño y la velocidad del descodificador dirección depende el número de funciones de apoyo. El decodificador de dirección puede utilizar técnicas avanzadas por lo tanto el mapa de índice visto por el host no puede ser incremental. Puede definirse la dirección a funcionar el mapas de índice. Configuración de 7162 de los bancos de memoria de la plataforma. Bancos de memoria pueden ser conectados directamente a la FPGA o acceder a través del bus local. La biblioteca de capa física puede gestionar cualquier información específica. El usuario puede configurar qué bancos de memoria asignan a qué funciones y si los bancos de memoria son compartidos o dedicados. Tipo 7163 y el modo de almacenamiento en búfer de los buzones de correo. 7164 Tipo y tamaño de la cola de mensajes para el host. 7165 Común configuración opciones soportadas por la biblioteca de capa de aplicación que se utiliza durante la creación de un núcleo de usuario 7166 Índice asociado con una función particular. 7167 Capa Core creación de interfaz de usuario 23 CoProcessorInitialiseSystem UserCoreName Parámetros de UserCoreName debe ser un nombre único para el núcleo de usuario. Este nombre puede hacer referencia a la unidad física para realizar la conexión necesaria. Comentarios 7168 7169 Es la macro pre-compiler debe utilizarse en el ámbito global. Debe utilizarse después de que el encabezado se incluye para la biblioteca de la capa de aplicación. Realiza las definiciones necesarias y declaraciones requeridas para el núcleo de usuario. 24 CoProcessorAssociateFunction UserCoreName FunctionIndex FunctionPointer Parámetros de UserCoreName debe ser un nombre único para el núcleo de usuario. Este nombre puede hacer referencia a la unidad física para realizar la conexión necesaria. FunctionIndex es el índice que se puede utilizar para transferir datos a la función que se está configurando el host. FunctionPointer es un puntero a la función de usuario que está asociado el índice especificado. Comentarios 7170 7171 Se trata de un procedimiento de macro de Handel-C. Se debe llamar dentro de la función principal de un núcleo de usuario. Se usa para asignar un índice a una función. 25 CoProcessorStart UserCoreName Parámetros de UserCoreName debe ser un nombre único para el núcleo de usuario. Este nombre puede hacer referencia a la unidad física para realizar la conexión necesaria. Comentarios 7172 7173 Se trata de un procedimiento de macro de Handel-C. Debería ser la última llamada a cualquiera de las macros de sistema de coprocesador. Se debe estar ubicado en la función principal de un núcleo de usuario. Puede ser el controlador principal de toda la interacción física de núcleo. Nunca puede devolver esta macro puede contener un bucle para siempre. Interfaz de función de usuario de capa de aplicación de 7174 7175 La mayoría de la capa de aplicación que API se proporciona a una función de usuario a través de un parámetro pasa a la función de usuario cuando se ejecuta. El parámetro es una estructura. La estructura puede contener un conjunto de punteros a función. Pasar de una estructura a una función de usuario permiten para compatibilidad con versiones posteriores. Si en una etapa posterior se deben agregar a la API de más funciones esto puede hacerse sin efectuar las funciones de usuario existentes. 26. La API puede esperar un prototipo de función de usuario a este aspecto void UserFunctionName USER_API ParameterName Comentarios 7176 7177 UserFunctionName y ParameterName pueden sustituirse por cualquier c legal con el nombre de estilo. 27 Esta es la estructura USER_API typedef struct {void * CoProcessorSetAddress unsigned int 32 dirección unsigned int 1 ReadOrWrite void * CoProcessorDoTransfer u-nsigned int 32 * datos void * CoProcessorGetData unsigned int 32 * datos void * CoProcessorSendData unsigned int 32 datos void * CoProcessorNotifyDataReady unsigned int 1 * CoProcessorCheckForPost unsigned int 32 * CoProcessorGetSendersAddress void * CoProcessorSetPostAddre-ss unsigned int 32 dirección void * CoProcessorDoPostDataRead ONU - signed int 32 * datos void * CoProcessorDoPostDataWrite unsigned int 32 datos } USER_API Miembros 7178 CoProcessorSetAddress 7179 7180 Esta función se utiliza para iniciar a una transferencia de datos de la memoria. Permite una dirección para establecerse y la dirección de la transferencia a configurarse. Acceso de memoria es canalizada y tarda más de un ciclo de reloj para completar una transacción. Separación de la fase de dirección y datos permite que las transacciones de modo de ráfaga llevar a cabo. El número exacto de ciclo que toma para una operación de memoria depende de la plataforma para compensar este CoProcessorDoTransfer siempre puede garantizar la sincronización entre la transferencia de datos y la fase de la dirección de memoria. La fase de dirección es intermedia para habilitar un valor de dirección a escribirse para cada ciclo de la dirección de memoria disponible. CoProcessorSetAddress puede bloquear si se ha llamado a muchas veces antes de una llamada de CoProcessorDoTransfer. Fases de dirección y datos de la memoria pueden ser intercaladas para proporcionar un ancho de banda de memoria alta. CoProcessorDoTransfer 7181 7182 Esta función se proporciona para manejar la fase de datos de un acceso a memoria. Puede bloquear hasta que haya finalizado una fase anterior de la dirección. CoProcessorGetData 7183 CoProcessorGetData 7184 proporciona una función de usuario la capacidad de recuperar datos desde el host. Esta función puede bloquear hasta el host envía datos. CoProcessorSendData 7185 CoProcessorSendData 7186 proporciona una función de usuario la capacidad para enviar datos a un host. Esta función puede bloquear hasta el host solicita datos de la función. CoProcessorNotifyDataReady 7187 7188 Esta función se utiliza una función de usuario para notificar a los host que datos están listos. Esto puede ser usado como necesarios y no se limita a sólo datos de significado están listos. CoProcessorCheckForPost 7189 7190 Utilizado por una función de usuario para comprobar la presencia de correo en el buzón. CoProcessorGetSendersAddress 7191 7192 Se utiliza para obtener la dirección del remitente de los datos actualmente en el buzón. Esta función debe ser llamada en paralelo con o antes de CoProcessorDoPostDataRead. CoProcessorSetPostAddress 7193 7194 Inicia el envío de correo. La dirección está configurada para el envío y enviar los datos siguientes se pueden remitir a la dirección especificada aquí. CoProcessorDoPostDataRead 7195 7196 Obtiene los datos del buzón. Esta función puede bloquear si los datos no está a la espera. CoProcessorDoPostDataWrite 7197 7198 Envía los datos a una dirección especificada anteriormente. Si dispone de una dirección no se ha especificado que esta función puede bloquear hasta que se especifica una dirección. Comentarios 7199 7200 La única parte de la API que no se proporciona a las funciones a través de la estructura del usuario es acceso a auxiliares I/O. Macros se usan para establecer los vínculos entre una función de usuario y el e/s auxiliar. Este método se utiliza para permitir un acceso directo de la función auxiliar de e/s sin interferencia del núcleo de la API del cliente. Acceso a auxiliar se considere necesario como la naturaleza de los dispositivos conectados a auxiliar se desconoce a la API. 28 Funciones de usuario de API en detalle void CoProcessorSetAddress unsigned int 32 dirección unsigned int 1 ReadOrWrite Parámetros de abordar el parámetro dirección representa la ubicación de memoria para la operación de destino. ReadOrWrite indica el modo para la operación de memoria una señal alta activa indica una operación de lectura. Comentarios 7201 CoProcessorSetAddress 7202 se utiliza para iniciar una operación de acceso de memoria. Las operaciones de acceso de memoria son separadas en la fase de dirección y fase de datos. La separación de fases permite que el sistema lograr la utilización de ancho de banda máximo. 29 void CoProcessorDoTransfer unsigned int 32 * datos Parámetros de datos un puntero a un registro. El registro puede cargarse o leer en función del modo seleccionado durante la fase de dirección sincronizado. La sincronización se realiza por el sistema. Comentarios 7203 CoProcessorDotransfer 7204 se utiliza para realizar la fase de datos para una operación de acceso de memoria. Esta función puede sincronizar automáticamente con la fase de dirección. 30 void CoProcessorGetData unsigned int 32 * datos Parámetros de datos un puntero a un registro el registro se carga con un parámetro de datos enviado por el host. Comentarios 7205 CoProcessorGetData 7206 puede bloquear hasta datos ha sido enviados por el host y el destino de la función de usuario utilizando su copia de esta función. 31 void CoProcessorSendData unsigned int 32 datos Parámetros de datos los datos que puedan ser transferidos al host cuando solicita datos de la función de usuario. Comentarios 7207 CoProcessorSendData 7208 puede bloquear hasta el host solicita datos para la función de usuario utilizando su copia de esta función. 7209 void CoProcessorNotifyDataReady Comentarios 7210 Función usuario 7211 debe utilizar esta función para notificar el host que quiere realizar una operación de transferencia de datos. CoProcessorNotifyDataReady puede enviar algún tipo de interrupción al host la señal puede ser en la cola si otras funciones de usuario están señalando al mismo tiempo. 7212 unsigned int 1 CoProcessorCheckForPost Valor devuelto 7213 7214 El valor devuelto es activo alto para indicar que está esperando en post. Comentarios 7215 CoProcessorCheckForPost 7216 se utiliza para probar el buzón de correo entrante para cualquier contenido. 7217 unsigned int 32 CoProcessorGetSendersAddress Valor devuelto 7218 7219 El valor devuelto puede ser el índice de la función de la función que envía el correo a la espera en el buzón. Comentarios 7220 7221 El buzón sólo se vacía por CoProcessorDoPostDataRead repetido por lo tanto las llamadas a CoProcessorGetSendersAddress pueden devolver el mismo resultado hasta que se hayan obtenido el correo de espera. Esta función puede bloquear si no hay ningún correo esperando en el buzón. 32 CoProcessorSetPostAddress void unsigned int 32 dirección Parámetros de abordar el parámetro dirección representa el índice de función de usuario para la función de usuario que puede recibir correo enviado por el usuario de esta función. Comentarios 7222 7223 CoProcessorSetPostAddress configura la dirección de destino para el que se envíe el correo. Esta función sólo debe utilizarse para establecer el destino del principio de una transferencia de mensaje multi. 7224 Esto debería llamarse un ciclo de reloj antes de escribir los datos destinados a la dirección que está programada. 33 void CoProcessorDoPostDataRead unsigned int 32 * datos Parámetros de datos es un puntero a un registro. Pueden escribir los datos del buzón a la punta para registrar. Comentarios 7225 CoProcessorDoPostDataRead 7226 puede enviar correo a la dirección que está configurada actualmente. No es necesario establecer la dirección para cada mensaje de correo enviado podrá utilizarse la dirección anterior. 34 void CoProcessorDoPostDataWrite unsigned int 32 datos Parámetros de datos esto puede ser enviado para el buzón de funciones de usuario accedido. Comentarios 7227 7228 CoProcessorDoPostData escritura puede enviar correo a la dirección que está configurada actualmente. No es necesario establecer la dirección para cada mensaje de correo enviado podrá utilizarse la dirección anterior. 7229 Esta función puede bloquear si el buzón de correo de los destinatarios está lleno. La capacidad del buzón es dependiente de la plataforma. Interfaz de función de usuario 7230 API I/O auxiliares I/O auxiliares de 7231 se proporciona a las funciones de usuario para permitir que un usuario pueda aprovechar las características de la plataforma que están fuera del ámbito de la API de la aplicación. Estas características se representan como las conexiones de pin conectados a los funciones/dispositivos externos. La API no puede hacer ningún intento de traducir o escudo el usuario de auxiliar I/O. acceso a auxiliar es directo y proporcionado de forma 'tal cual'. 7232 La capa de aplicación API proporciona acceso a auxiliar a través de un conjunto de macros. Puertos de E/s auxiliares son nombrados y pueden ser específica de la plataforma. Las definiciones para E/s auxiliar es almacenado en la biblioteca de la capa física. La sección de I/O auxiliar de la capa de aplicación API proporciona acceso a la información de la biblioteca de capa física. Cuando las bibliotecas de la capa física se crean los detalles de I/O auxiliares debe publicarse con la biblioteca. La capa de aplicación proporciona acceso a la biblioteca física de esta manera en un intento de reducir la cantidad de esfuerzo necesario para funciones de usuario de puerto que dependen de las características específicas de la plataforma. I/O auxiliares de 7233 sólo debe utilizarse en una relación directa de uno a uno con una función de usuario. Si más de una función de usuario requiere acceso a un recurso compartido debe desarrollar una función de usuario del servicio. Otras funciones de usuario a continuación pueden comunicarse con la función de usuario de servicio mediante el sistema de casilla de correo. Esto puede hacer sólo la función de servicio depende directamente de la I/O auxiliares reduciendo así la cantidad de esfuerzo necesario durante la migración. 35 Son las macros de acceso auxiliar de API CoProcessorConnectReadAUX PortName parámetros PortName este debe ser el nombre de un puerto de E/s. Comentarios 7234 7235 Esto es una macro pre-compiler y debe utilizarse en el ámbito global. Declara un puerto de lectura para e/s auxiliar. Esta macro puede escribir una función que proporciona la funcionalidad para leer el puerto de E/s con nombre. La macro CoProcessorAuxRead proporciona acceso a la función. 36 CoProcessorConnectWriteAUX PortName de parámetros PortName este debe ser el nombre de una E/s puerto. Comentarios 7236 7237 Esto es una macro pre-compiler y debe utilizarse en el ámbito global. Declara un puerto de escritura para e/s auxiliar. Esta macro puede escribir una función que proporciona la funcionalidad para escribir en el puerto de E/s con nombre. La macro CoProcessorAuxWrite proporciona acceso a la función. 37 CoProcessorConnectWriteAUX PortName parámetros PortName este debe ser el nombre de una E/s puerto. Comentarios 7238 7239 Esto es una macro pre-compiler y debe utilizarse en el ámbito global. Declara un puerto para E/s auxiliar que es bidireccional. Esta macro puede escribir funciones que proporciona la funcionalidad para leer escribir y establecer el modo de búfer de salida para el puerto de E/s con nombre. Las macros CoProcessorAuxRead CoProcessorAuxWrite y CoProcessorAuxSetEnable proporciona acceso a la función. 38 CoProcessorAuxRead PortName unsigned int * datos parámetros PortName este debe ser el nombre de un puerto de E/s. Datos es un puntero a un registro. Se puede cargar el registro con el valor actualmente en la E/s puerto. Comentarios 7240 7241 Es una expresión de la macro de Handel-C. Se crea cuando se requiere la funcionalidad de lectura en un puerto de E/s auxiliar. El ancho de bits de datos podría coincidir con el ancho del puerto. El ancho de bits del puerto puede determinarse mediante la macro CoProcessorPortWidth. 39 AuxSetWriteReg PortName unsigned int * datos parámetros PortName este debe ser el nombre de un puerto de E/s. Datos de datos deben ser un puntero a un registro. Comentarios 7242 7243 Se trata de un procedimiento de macro de Handel-C. Se crea cuando se requiere la funcionalidad de escritura en un puerto de E/s auxiliar. El ancho de bits de datos podría coincidir con el ancho del puerto. El ancho de bits del puerto puede determinarse mediante la macro CoProcessorPortWidth. Datos pueden ser la salida para el puerto de E/s. 40 CoProcessorAuxSetEnable PortName unsigned int 1 activar parámetros PortName este debe ser el nombre de un puerto de E/s. Activar la señal de activación se utiliza para establecer el modo de los búferes de salida. Si habilitar es activa los búferes de salida se establecen en una alta impedancia más. Comentarios 7244 7245 Se trata de un procedimiento de macro de Handel-C. Se crea cuando de lectura y escritura a través de un puerto de E/s auxiliar se requiere. Esta macro se utiliza para acceder a la función de habilitar creada cuando se asigna la I/O. 41 CoProcessorPortWidth PortName de parámetros PortName este debe ser el nombre de una E/s puerto. Comentarios 7246 7247 Es una macro pre-compiler que se puede utilizar en cualquier lugar. Es una macro de utilidad que permite el acceso a la anchura de un puerto de E/s auxiliar. Esto es útil al definir las variables que se conectan a un puerto. Interfaz de capa física 7248 7249 A interfaz común para el capa física se define para asegurarse de que todas las implementaciones de la capa física son compatibles con la capa de aplicación. La interfaz de capa física puede permitir la configuración y creación del hardware necesario para administrar Memoria 7250 Interfaz de bus principal de 7251 Sincronización del reloj sistema 7252 Macros de construcción de coprocesador 7253 De CoProcessorBuild 7254 Comentarios 7255 7256 Es una macro pre-compiler. Sólo debe utilizarse en el ámbito global. Puede construir la conexión necesaria para el bus local y cualquier otras definiciones específicas de la plataforma. De CoprocessorActivate 7257 Comentarios 7258 7259 Se trata de un procedimiento de macro de Handel-C. Sólo debe utilizarse en el ámbito local preferible en una función principal. Pueden activar cualquier tareas de controlador de fondo específico de plataforma. 42 CoProcessorSetUserCoreClock UserCoreName UserCoreClockSource UserCoreName de parámetros de este puede ser el nombre dado a un núcleo de usuario cuando se creó. UserCoreClockSource esto puede ser una de las fuentes disponibles de reloj definidas para la plataforma. Comentarios 7260 7261 Es una macro pre-compiler. Sólo debe utilizarse en el ámbito global. Este macros pueden utilizarse para configurar el origen de reloj para un núcleo de usuario. Es posible que un núcleo de usuario al reloj a una velocidad diferente para el núcleo de la física. Esto sólo es posible si la biblioteca de capa física para la plataforma de destino ofrece más de una fuente de reloj. 43 CoProcessorCreateUserFunctionPort UserCoreName DesiredHostAddress UserCoreFunctionIndex InitialMemoryAccessController PostalAddress parámetros UserCoreName este puede ser el nombre dado a un núcleo de usuario cuando se creó. DesiredHostAddress es la dirección en la que se puede utilizar un host externo para acceder a la función de usuario siendo el programa de instalación. UserCoreFunctionIndex es el único índice que utiliza internamente por el núcleo de usuario para identificar la función de usuario. InitialMemoryAccessController es el índice del controlador de acceso de memoria que puede ser inicialmente asociado con la función de usuario. PostalAddress es un identificador único que se pueden utilizar otras funciones de usuario para enviar mensajes a la función de usuario que se está configurando. Comentarios 7262 7263 Cualquier función de usuario que se va a utilizar un host puede ser el programa de instalación usando esta macro. Macros de construcción de Banco de memoria 7264 7265 Los puertos de memoria se construyen en el núcleo de la físico. Esto permite a la memoria los controladores de acceso a correr más rápido que las funciones de usuario. Controladores de memoria son específicos del dispositivo y puede ser configurados como dedicado o compartido. Cuando se comparte un banco de memoria puede definirse el número de puertos que se creen. Unidades de gestión de memoria 7266 pueden ser construidas por referencia a un nombre de los bancos. Los nombres dados a los bancos de memoria pueden ser una constante de la plataforma y se encuentre en la biblioteca de la capa física. Bancos de memoria deben ser construidos antes de que se inicien los controladores de sistema. 44 CoProcessorBuildDedicatedMemoryController BankName MemoryBankUniqueIdentifier BankName de parámetros el nombre de un banco de memoria. MemoryBankUniqueIdentifier es un identificador único para el Banco de memoria. Puede ser necesario al configurar funciones de usuario. Comentarios 7267 7268 Esta macro es una macro pre-compiler. Sólo debe utilizarse en el ámbito global. Construye un conjunto de funciones que forman una unidad de gestión de memoria para el Banco de memoria con nombre. El método de administración de memoria que se utiliza es el único puerto exclusivo por lo tanto la MMU es un secuenciador de transacción muy simple. 45 CoProcessorBuildMultiPortMemoryController BankName NumberOfPorts BankName de parámetros el nombre de un banco de memoria. NumberOfPorts el número de puertos para generar. Esto representa el número de duplicados de funciones para crear. Comentarios 7269 7270 Esta macro es una macro pre-compiler. Sólo debe utilizarse en el ámbito global. Construye un conjunto de funciones que forman una unidad de gestión de memoria para el Banco de memoria con nombre. Una MMU multipuerto se construye que secuencias de memoria pide y ofrece arbitraje simple para los puertos disponibles. Se crean los semáforos y las funciones de acceso están construidas como una matriz de funciones. 46 BankName de parámetros de CoProcessorSetPortUniqueIdentifier BankName BankPortIndex UniqueIdentifier es el nombre del Banco que se hace referencia a. BankPortIndex se refiere al puerto de particular en el mem multipuerto UniqueIdentifier Comentarios 7271 47 CoProcessorActivateMMU BankName de parámetros BankName el nombre de un banco de memoria. Comentarios 7272 7273 Debe llamar a esta macro dentro de la función principal de los fundamentales de la física. Se inicia cualquier funciones de administración de memoria en segundo plano que pueden ser necesarias. Capa física 7274 conexión al Host Transferencia de los datos reales de 7275 entre un host y un FPGA es específico de la plataforma y es más allá del alcance de la especificación de la API para un coprocesador. 7276 La capa física no puede ser restringida al uso de cualquier método en particular o un protocolo para la comunicación con un host. La única restricción es que el host puede ser capaz de "hablar el mismo idioma' como el FPGA coprocesador. 7277 El vínculo entre un host y el cliente puede ser capaz de realizar varias funciones básicas de señalización 7278 Una dirección debe estar asociada con todos los datos transferidos. 7279 A cliente puede ser capaz de enviar una señal a un host para informar que el host que el cliente está listo para realizar algún tipo de transferencia de datos. 7280 En un entorno donde existe más de un host el cliente puede ser capaz de distinguir entre cada host y tienen la capacidad de enviar señales a un host exclusivamente y directamente. 7281 Si la funcionalidad de host de modo cliente se requiere el cliente puede solicitar acceso al medio de transferencia de datos. 7282 Capa física recursos compartidos La API de 7283 puede proporcionar gestión de los recursos compartidos. Fundamentalmente esto puede implicar la aplicación de la exclusión mutua. Otras extensiones pueden proporcionar características tales como un estático o una MMU dinámica. El sistema de comando auxiliar puede dar acceso a características como el Banco de conmutación o una MMU dinámica. Auxiliar de 7284 de E/s puede ser proporcionada a través de un sistema de E/s asignados. Usuario funciones pueden usar un conjunto de macros para generar funciones para acceder a un determinado puerto auxiliar de E/s. Puertos auxiliares de E/s pueden definirse en el archivo de encabezado proporcionado para acceder a las macros de función de usuario. Al desarrollar una nueva plataforma que debe ser nombrado i/o auxiliar y los puertos que se definen en la biblioteca física. 7285 Al generar un coprocesador un paso puede configurar el método utilizado para tener acceso a los bancos de memoria disponible. Este paso de configuración puede generalmente sólo hacerse una vez para una plataforma a menos que hay que cambiar la configuración de Banco de memoria. Es posible configurar un banco de memoria como un banco dedicado o un banco multipuerto. La opción para un banco de memoria RAM dedicada o multipuerto se da para permitir una función tiene acceso exclusivo a un banco de memoria o permitir varias funciones compartir el acceso a un banco de memoria. Cuando se desarrolla la biblioteca para una nueva plataforma de cada banco de memoria puede darse un nombre único. 7286 Datos como llegar desde el Host 7287 A cliente no es capaz de solicitar datos desde el host. Una función de cliente puede utilizar la función de GetData para esperar a que el host enviar datos. La función GetData puede bloquear hasta el host transfiere datos a la función de cliente. 7288 Envía datos del Host 7289 A cliente directamente no puede iniciar a una transferencia de datos al host. Un cliente puede notificar el host que tiene listos para transferencia de datos. NotifyDataReady se utiliza para obtener la atención del host. Un cliente nunca puede iniciar una transferencia de datos utilizando la función de notificación podría ser una señal a un host que uno quiere transferir datos. ¿Cómo el host interpreta la señal depende de la aplicación host. 7290 SendData de uso para realizar a la transferencia de datos. Esta función puede bloquear hasta que se ha transferido los datos facilitados. Las transferencias de datos nunca son iniciadas por el cliente. Esta función normalmente debería ser utilizado después de enviar una notificación de datos listo. Comunicación inter-Function 7291 Función 7292 puede ser capaz de enviar un mensaje a otra función. Para hacer esto una función que necesite conocer la dirección de la función de destino. Entre la función de comunicación se logra utilizando los buzones de correo. Un buzón de correo es un par de registros. Un registro puede utilizarse para el envío de correo y la otra para recibir el correo. Una bandera puede ser usada para indicar cuándo ha llegado el correo nuevo. Una función debe supervisar la bandera para determinar cuándo ha llegado el correo. La bandera puede ser activa cuando está de nuevo correo en el buzón. Si después de una lectura de la casilla de correo la bandera sigue siendo alta a continuación correo nuevo ha llegado es decir la bandera es una señal alta activa. Operaciones de Host de modo cliente 7293 Función usuario 7294 puede realizar operaciones de tipo de host. El modo de operación de host está habilitado mediante el sistema de entrega de correo. Publicar un mensaje a la dirección cero puede permitir una función ejecutar una función como si se tratara de un host. Los datos pueden representar el índice de la función que puede recibir la comunicación. Esta funcionalidad también puede permitir la ejecución remota de una función proporcionar que la plataforma es compatible con este tipo de operaciones. El MSB de los datos se utiliza para distinguir entre las ejecuciones de la función interna y remoto. Si el MSB a continuación se establece remoto está seleccionado el modo de ejecución. Una vez que se ha enviado este mensaje las funciones SendData y GetData pueden ser redireccionadas a la función especificada. Para restaurar el funcionamiento normal de las funciones SendData y GetData debe ser envía un mensaje a la dirección cero con el conjunto de datos a cero. Funciones de usuario de coprocesador 7295 Función coprocesador 7296 puede ser independiente dentro de la C-Handel construcción de función. Una función puede interactuar con el sistema a través del API de usuario de cliente. Cada función de usuario podrá aceptar que el mismo parámetro el parámetro puede ser un puntero a una estructura que contiene punteros a las funciones de la API de usuario. La única excepción puede ser auxiliar acceso de i/o. Para que una función obtener acceso a auxiliar requiere que el I/O auxiliares se utilizan macros la única parte de la API que es visible públicamente a una función. 7297 91 FIG. muestra un flujo de ejecución típico 9100 para una función. Al ejecutarse la función reúne sus parámetros de operación 9102 a continuación realiza una operación de procesamiento de relojería y devuelve los resultados al host en operación 9106. 91 Fig. es sólo un ejemplo ya que las funciones no tienen que ejecutar de esta manera. Especificación de interacción de cliente y host 7298 7299 El Protocolo particular usado cuando un host y cliente comunicarán no está limitado. Lo que se especifica es el significado de los mensajes que se comunican entre un host y un cliente. Formato de mensaje básico 7300 7301 A host sea siempre el master en una comunicación por lo tanto un host siempre puede iniciar una transferencia de datos entre un host y un cliente. Todos los mensajes de un host a un cliente pueden consistir en una dirección con algunos datos. Los sólo los mensajes que puede enviar un cliente a un host es un message.sup.1 de atención este mensaje no puede llevar a cabo ninguna dirección o mensajes de Host de datos pueden ser operaciones de escritura de datos o las operaciones de lectura de datos. El host puede utilizar una dirección de cero y la dirección MSB para enviar comandos auxiliares a un cliente véase 0 . 7302 Dirección cero Dirección 7303 cero está reservado para uso del sistema. Dirección cero es la única que está reservado por el sistema y no puede utilizarse como un índice para una función de usuario de cliente. Un host puede utilizar dirección cero para consultar al cliente cuando se recibe un mensaje de atención. 7304 A host puede enviar un mensaje de lectura con dirección de cero a un cliente para recuperar la razón para la atención de mensaje enviado por el cliente. Los lectura de datos desde el cliente pueden ser una dirección el MSB de la dirección es usado como un modificador véase 0 . Dirección 7305 cero se utiliza internamente en un cliente para distinguir entre los índices de la función y las solicitudes de sistema interno. 7306 A host puede utilizar la dirección de cero con el MSB por última vez véase 0 para representar un comando auxiliar. 7307 Dirección MSB 7308 Normalmente la dirección MSB puede utilizarse como un bit de modificador de la dirección. Si una plataforma admite un método alternativo de alcanzar la siguiente la dirección MSB puede utilizarse para uso regular. La dirección MSB se utiliza para modificar el significado de la dirección. 7309 A host utiliza el modificador MSB establecido en '1' en conjunto con la dirección de cero para distinguir entre las solicitudes de razón de señal y comando auxiliar. 7310 A host no utiliza el modificador MSB en las comunicaciones normales de modo que el MSB debe definirse en '0'. 7311 A cliente utiliza el modificador MSB internamente para distinguir entre las direcciones MSB establecida en '0' internas y externo MSB conjunto a '1' . Diseño detallado Host 7312 y la interacción del cliente 7313 El Protocolo de comunicación que se utiliza para transferir entre el host y el cliente no está limitado por este diseño. Este diseño restringir el significado de los datos transferidos entre el host y cliente. 7314 El actual método de transferencia de datos entre un host y cliente puede depender de la plataforma del sistema. 7315 El host puede ver el coprocesador FPGA como un dispositivo direccionable. Un dispositivo de coprocesador FPGA podrá tratar cada dirección disponible como un puerto de datos. Para interactuar con un dispositivo de coprocesador FPGA el host puede leer y escribir datos en los puertos disponibles. 7316 Requisitos básicos para la comunicación de host/cliente Dirección 7317 cero está reservado para uso del sistema. 7318 Una dirección siempre puede ser asociada con datos. 7319 Una dirección siempre hace referencia a un índice de función existente o cero de direcciones. 7320 Los 8 bits más significativos de la dirección está reservada por el sistema y se utiliza como un bit de modificador de la dirección. Mecanismo de transferencia de datos 7321 7322 A transferir o leer datos de una función de un host debe realizar una lectura o a la dirección que requiere datos de operación de escritura. Deben transmitir datos a una dirección como una dirección no representa es decir registros lecturas repetidas o escrituras a la misma dirección. Direcciones no deberían incrementarse cuando los datos es leídos o escritos como esto abordará otras funciones. Parámetros 7323 se pasan a una función mediante la realización de una operación de escritura a la dirección de índice de funciones. Una función devuelve datos mediante la lectura de la dirección de índice de funciones. La cantidad de datos transferidos es dependiente en el diseño de la función de coprocesador. El host puede saber la cantidad de datos a transferir o utilizar los datos que se transfieren para indicar la cantidad de datos que puede transferirse. Operaciones de lectura y escritura 7324 pueden ser interrumpidas y reanudó el host en cualquier momento. Esto es posible debido a la naturaleza de esclavos de un dispositivo de cliente. Funciones remotas en el coprocesador pueden esperar mientras se suspende la transferencia. 7325 Host para abordar el mecanismo de cliente 7326 El espacio de direcciones de un coprocesador FPGA se utiliza para transmitir los datos a la función que residen en el coprocesador. Cada función en el coprocesador puede tener una dirección única asignada. La designación de las direcciones que a la discreción de los diseñadores. La única dirección que no se puede utilizar para un identificador de la función es cero. Dirección cero está reservado para uso del sistema. 7327 FIG. 92 muestra un paquete de dirección típico 9200. Los 8 bits más significativos de una dirección es ignorado por los decodificadores de dirección del cliente y se utiliza como un byte de comando en su lugar. Los 8 bits más significativos de un paquete de dirección se utilizan como un modificador de dirección. Todos los bits están disponibles para su uso como índices de función. Véase el cuadro 3. 48TABLE 3 valor de dirección significado modificador de interpretación de datos dirección cero comandos utilizados cuando se lee de dirección cero establecer FIFO desencadenador de nivel 1 valor de desencadenador deseado nivel consulta función Estado 2 función dirección interrupción Set timeout timer 3 tiempo en. mu.s dirección cero comandos utilizado cuando se lee de dirección cero servicio requiere 1 de dirección de función función disponible 2 función abordar la función 3 dirección de la función de la disponibilidad 7328 Actualmente el modificador de dirección no se utiliza cuando se utiliza un valor de dirección distinto de cero. Cuando se utiliza un valor distinto de cero el modificador de dirección debe establecerse en cero de la dirección. 7329 Dirección cero Dirección 7330 cero está reservado para uso del sistema. Se trata de la única dirección que no se puede utilizar para un índice de función de usuario. Funcionalidad de dirección cero 7331 7332 Véase el cuadro 4. 49TABLE 4 direcciones Host número descripción del modo de uso de la dirección de estado de función de lectura de lectura 0 FIFO. El estado de la función FIFO puede contener mensajes de funciones al host. Un mensaje es una sola palabra de doble 32 bits de datos. Los mensajes desde el cliente deben interpretarse como un paquete de dirección utilizando los modificadores de Estado para interpretar los datos de modificador de la dirección. Escritura 0 el host puede utilizar los datos de modificador de la dirección para enviar el comando para el cliente. Arbitraje 7333 en un entorno de Host múltiple Mensaje de señal/interrupción de cliente de 7334 7335 El cliente tiene un único mecanismo para señalar al host. Esto puede ser en forma de una interrupción. El cliente puede utilizar esta interrupción para pasar dos mensajes diferentes a un host. Cuando un host recibe la interrupción puede consultar el cliente para determinar el motivo de la interrupción. 7336 El host consulta el cliente mediante la lectura de la dirección de cero. Esto puede leer el mensaje del cliente FIFO. Los datos enviados por el cliente pueden ser en forma de paquetes de dirección con el cliente para la interpretación de host del dirección de modificador bit. El cliente puede transmitir cero paquetes de dirección valorado cuando no hay más datos para leer el mensaje del cliente FIFO. Mensajes desde el cliente pueden ser mensajes listo de datos de funciones o función disponible desde el cliente. 7337 Host API 7338 La especificación proporciona detalles sobre interfaces funcionales de los componentes del API de host. Biblioteca de componentes físico de 7339 7340 La biblioteca de componentes físicos es la plataforma y dependiente del Protocolo. Un esquema básico para una aplicación de biblioteca física puede darse aquí. 7341 Para que un host para comunicarse primero con un cliente requiere que el cliente se hace primero para escuchar a la comunicación. Esto puede aplicarse mediante la activación de la línea de selección de chip de coprocesadores o otro método alternativo. Una vez que el coprocesador está escuchando el host puede transferir una dirección. Una vez que un host ha transmitido una dirección pueden transferir datos de acuerdo con el Protocolo de las interacciones del cliente de host. 7342 Identificadores únicos pueden asignarse a cada función de vigilancia del progreso. Biblioteca de la interfaz pública de API 7343 Programación 7344 de la fecha límite de las solicitudes de comunicación 7345 Es posible tener varias transferencias de datos activos a la vez y es posible interrumpir una transferencia. API de cliente de 7346 Núcleo física 7347 y vínculos de núcleo de usuario 7348 Las bibliotecas de construcción de coprocesador contienen todo el software necesario para construir el marco de un coprocesador. MPRAMs para permitir la rápida transferencia de datos entre el núcleo física y core s de usuario cuando se ejecuta en el reloj diferentes dominios. 7349 Un ejemplar biblioteca de punto flotante y fijo será ahora establecerse junto con información sobre la forma de onda de análisis. Biblioteca de punto fijo y flotante 7350 La Handel-C flotante punto biblioteca proporciona apoyo punto flotante a las aplicaciones escritas con el entorno de desarrollo de Handel-C. Las siguientes características 7351 de la biblioteca de punto flotante de acuerdo con una encarnación preferida 7352 Cero-ciclo suma multiplicación y resta. 7353 Contiene operadores útiles como negación valores absolutos turnos y redondeo. 7354 Soporta los números de hasta 15 de ancho exponente y la mantisa ancho 63. 7355 Admite la conversión a y de enteros. 7356 Proporciona funcionalidad de raíz cuadrada. 7357 La biblioteca de punto flotante puede utilizarse para proporcionar las siguientes aplicaciones. De 7358 flotante precisión DSP. 7359 Vector matriz de computación. 7360 Aplicaciones del "Mundo real". 7361 Cualquier cómputo que requieren precisión. 7362 En la biblioteca las variables se mantienen en estructuras cuyos anchos están definidos en tiempo de compilación. Hay tres partes a la estructura un bit de inicio de sesión único cuyo ancho es usuario definido en la declaración de bits de exponente y mantisa bits también definido por el usuario. El valor 'real' del punto flotante número puede ser 7363 -1 . sup.sign.2.sup. exponente-bas . 1.mantissa 7364 Donde el sesgo depende de la anchura del exponente. 7365 En uso ancho variable de punto flotante se establece mediante declaración macros en tiempo de compilación. las macros ilustrativos de declaración se especifican más adelante. 7366 Es usada la biblioteca llamando a una de las expresiones cero macro de ciclo. 7367 un = FloatAdd b c 7368 Macros modos se denominan de forma diferente. FloatDiv 7369 b c una 7370 Las macros no se comparten inherentemente se expanden automáticamente donde se les llama. Si se requiere el uso extenso de algunas de las macros es aconsejable compartirlas de la siguiente manera. 7371 Para macros de cero-ciclo 7372 compartida expr fmul.sub. - 1 a b = FloatMult a b 7373 compartida expr fmul.sub. 2 a b = FloatMult a b 7374 Para modos de macros. fdiv1 void 7375 FLOAT_TYPE * d FLOAT_TYPE * n FLOAT_TYPE 7376 * q { 7377 FloatDiv 7378 * d * n * q 7379 } 7380 Ahora habrá definidos dos multiplicadores de ciclo de cero y un divisor. Ahora podrán tomarse todas las precauciones habituales en hardware compartido. 7381 En la siguiente tabla la tabla 5 proporciona estadísticas de rendimiento para varios personificaciones ilustrativos. 7382 Altera Flex 10K30A FPGA. 50 Tabla 5 Float tamaño CLB Max exp/mant FloatAdd de velocidad de rodajas de reloj 16 6/1205 9.46 FloatMult 6/16 996 9.38 FloatDiv 6/16 390 22.02 FloatSqrt 6/16 361 18.21 FloatAdd 8/23 1328 6 53 FloatMult 8/23 1922 7.05 FloatDiv 8/23 528 16 80 FloatSqrt 8/23 505 13 47 Xilinx Virtex V1000-6 FPGA. FloatAdd 6/16 799 33 95 FloatMult 6/16 445 30.67 FloatDiv FloatSqrt de 39.61 de 16 6/348 6/16 202 32.93 FloatAdd 8/23 1113 33 95 FloatMult 8/23 651 28.79 FloatDiv 8/23 459 36.72 FloatSqrt 8/23 273 38.31 7383 Los archivos de programa que componen esta biblioteca y su propósito se especifican más adelante. 51 Nombre de archivo de propósito Float.h prototipos las macros a los almacenes de Float.lib de usuario la funcionalidad de la biblioteca 7384 Macros ilustrativas que pueden definirse en el código de Handel-C se presentan en la tabla siguiente. 52 Macro nombre tipo propósito flotar # definir conjuntos los anchos de coma flotante valor de una variable FloatAbs Macro devuelve absoluto de una negación de devoluciones de Macro FloatNeg número del punto flotante-expresión de un flotante-expresión punto número FloatLeftShift Macro izquierda turnos un un punto flotante número de expresión FloatRound Macro rondas de turnos de derecho de Macro FloatRightShift de número expresión de punto flotante de la mantisa de un flotante-expresión punto número FloatConvert de Macro cambios expresión ancho FloatMult Macro multiplica dos números de punto flotante expresión junto FloatAdd Macro agrega dos números de punto flotante expresión junto FloatSub Macro resta dos números de punto flotante expresión de un número de coma flotante de otros FloatDiv Macro divide dos números de punto flotante procedimiento encontrar de Macro FloatSqrts la raíz cuadrada de un punto flotante-procedimiento número FloatToUInt Macro convierte un número de coma flotante para la expresión de un entero sin signo FloatToInt Macro convierte un punto flotante número a la expresión de un entero con signo FloatFromUInt Macro convierte un entero sin signo a una expresión de punto flotante el número de FloatFromlnt de Macro convierte un entero con signo a un número de coma flotante de expresión Desarrollo de software 7385 para la biblioteca de punto flotante 7386 Esta sección especifica en detalle el rendimiento y la especificación funcional del diseño. También documenta las pruebas que se pueden utilizar para verificar que cada macro funciona correctamente y que integran perfectamente para trabajar como una biblioteca completa. Edición de este diseño sirve para actualizar una biblioteca existente para permitir al usuario realizar operaciones aritméticas y entero para conversiones de punto flotante en los números de punto flotante en Handel-C. 7388 Acerca de las Macros 7389 La representación de un número de punto flotante. 7390 Un número de coma flotante se representa como una estructura de las macros. La estructura tiene tres secciones binarias como a la IEEE 754 especificaciones. Bit de signo 7391 unsigned int x.Sign 7392 Exponente unsigned int x.Exponent 7393 Mantisa unsigned int x.Mantissa 7394 En la biblioteca de la estructura de un número de punto flotante decir x puede ser como sigue 7395 x={x.Sign x.Exponent x.Mantissa} 7396 Esto representa el número 7397 -1 .sup.x.Sign* 1. x.Mantissa * 2.sup. x.Exponent-bias 7398 Esta expresión puede representar cualquier número decimal dentro de un rango restringido por el ancho de exponente y la mantisa. A continuación se presenta un ejemplo de cómo se define un número de punto flotante. 53 # include lt Float.h gt establecer el reloj = externos "P1" typedef FLOAT 4 6 Float_4_6 void main {Float_4_6 x x = {0 9 38 } } 7399 Primero se elige un tipo de estructura declarando los anchos del exponente y la mantisa. El exponente es elegido para ser de ancho 4 y la mantisa de ancho 6. Esta estructura se denomina Float.sub. 4.sub. 6 y x se define como de este tipo. x.Sign=0 7400 7401 Esto significa que el número es positivo. x.Exponent=9 7402 x.Exponent 7403 está sin firmar pero representa un número firmado. Para ello al exponente necesita un sesgo de corrección que depende de su anchura. 7404 Bias=2.sup. Ancho de exponente -1 -1 7405 En este caso como el exponente ancho es 4 entonces el sesgo es 2.sup.3-1 = 7. Por lo tanto el número 9 significa que el factor multiplicador es 2.sup.=2.sup.2=4 9-7 . x.Mantissa=38 7406 7407 La mantisa representa las posiciones decimales del número. Como x.Mantissa=38=100110 a continuación esto representa el número binario 1.100110 en la ecuación. Se trata de 1.59375 en decimal. La uno agregado a este número es conocido como un 1 oculto. 7408 Flotante punto número representado por {0 9 38} es 7409 -1 .sup.0 1.59375 4 = 6.375 Especificaciones de ancho de IEEE 7410 . 7411 Los anchos del exponente y la mantisa tienen ciertas especificaciones de conjuntos. 7412 IEEE 754 precisión simple 7413 Exponente es de 8 bits y tiene un sesgo de 127 Mantisa 7414 es 23 bits sin incluir el 1 oculto. 7415 IEEE 754 doble precisión 7416 Exponente es 11 bits y tiene un sesgo de 1023 7417 Mantisa es 52 bits no incluidos los ocultos 1. 7418 IEEE 754 precisión extendida 7419 Exponente es de 15 bits y tiene un sesgo de 32767 7420 Mantisa es de 64 bits sin incluir el 1 oculto. 7421 Los tipos de precisión pueden solicitarse por especificar a estos exponente y número de punto de mantisa anchos para el flotante. Números de punto flotante válidos 7422 . 7423 Para los propósitos de esta sección un número válido de punto flotante es uno de ancho exponente de menos de 16 y ancho de la mantisa menos de 64. El exponente y la mantisa son cualquier patrón de bits dentro de esos anchos que incluye los patrones de bits especial. Esta biblioteca es probada hasta este nivel. Expresiones de ciclo único 7 424 . 7425 Muchas de las utilidades de la biblioteca son cero ciclo expresiones de macro y lo utilice un único ciclo cuando forma parte de una asignación. Permiten que las variables de entrada de cualquier ancho hasta un ancho máximo de mantisa de 63 . Sin embargo sólo pueden ser probado hasta una precisión que es signo de 1 bit 15 bits de exponente y 63 de bits de mantisa. 7426 Un ejemplo de la expresión de un único ciclo es la utilidad de la resta. Esta macro toma dos números de punto flotante f1 y f2 del mismo tipo de estructura. resultado 7427 = FloatSub f1 f2 7428 Resultado sería un número de punto flotante con el mismo tipo de estructura que la f1 y f2. División de 7429 y Macros de raíz cuadrada. 7430 Las utilidades sólo implementadas como procedimientos de macro que no son expresiones de ciclo único son las macros de división y raíz cuadrada. Se denominan de forma ligeramente diferente con uno de los parámetros de entrada finalmente celebrar el valor del resultado. Por ejemplo la macro de división se define como 7431 FloatDiv N D Q 7432 Los parámetros para todas estas funciones son 7433 N numerador de punto flotante. 7434 D divisor de punto flotante. Cociente el valor del resultado de punto flotante de q de 7435 . 7436 N y d no cambian una vez finalizada la macro. Valores especiales 7437 . 7438 Patrones especiales son reconocidos en la biblioteca. Estos se denominan no un número NaN e infinito. NaN 7439 NaN 7440 está representada por todos 1 en el exponente y cualquier patrón de cero en la mantisa. Lo que sigue es un ejemplo de un único NaN de precisión en binario. x.Sign=0 7441 x.Exponent=11111111 7442 x.Mantissa=000000000000000000000001 7443 Infinity 7444 Infinity 7445 está representada por todos 1 en el exponente y todos 0 en la mantisa. Se trata de la única manera de que la infinidad de precisión simple puede representarse en binario. x.Sign=0 7446 x.Exponent=11111111 7447 x.Mantissa=00000000000000000000000 7448 Salida de 7449 cuando se producen errores. 7450 Cuando se produce un error en el cálculo de un patrón de bits especial es la salida como mensajes de error. El patrón de bits que se produce depende de la situación. Varios patrones ilustrativo se especifican más adelante. Subdesbordamiento no es estrictamente un error pero se incluye a continuación en el cuadro 6 para referencia. 54TABLE 6 problema donde problema problema número produce salida 1 entrada Infinity entrada Infinity 2 desbordamiento de resultado Infinity 3 x / 0 x = 0 entrada Infinity 4 entrada NaN entrada NaN mantisa mismo como entrada 5 0 * NaN entrada de infinito mantisa 0 1 6/0 NaN entrada mantisa 2 7 sqrt x x 0 de lt Input NaN mantisa Infinity 3 8 + -infinito entrada NaN mantisa 4 9 Infinity/Infinity entrada NaN mantisa subdesbordamiento 5 10 11 0 sqrt -0 como resultado de entrada - 0 Definiciones de macro 7451 . 7452 Para cada una de las siguientes macros todos los números de punto flotante entrada y resultado tienen el mismo tipo de estructura. Estructura de 7453 7454 ID 1 la estructura Prototipo 7455 # define FLOAT ExpWidth MantWidth float_Name Descripción 7456 . 7457 Define una estructura llamada float_Name con una parte de entero sin signo llamado signo de ancho 1 parte de entero sin signo llamado exponente de ancho ExpWidth y parte de entero sin signo llamado mantisa con ancho de MantWidth . Tenga en cuenta la tabla 7. 55 Tabla 7 parámetros descripción gama ExpWidth el ancho del exponente 1... 15 MantWidth el ancho de la mantisa 1... 63 Valor absoluto de 7458 . 7459 ID función 1 Prototipo 7460 FloatAbs x Descripción 7461 . 7462 Devuelve el valor absoluto positivo de un flotante número de punto. 7463 Posible Error. 7464 Ninguno. Tenga en cuenta el cuadro 8. 56TABLE gama de descripción de parámetros 8 x punto flotante número cualquier número válido de Coerced Negación de 7465 . 7466 ID funcionar 2 Prototipo 7467 FloatNeg x Descripción 7468 . 7469 Devuelve el valor denegado de flotante número de punto. 7470 Posible Error. 7471 Negando cero devuelve un cero. Tenga en cuenta la tabla 9. 57TABLE gama de descripción de parámetros 9 x punto flotante número cualquier número válido de f. p. 7472 Izquierda Mayús. 7473 ID función 3 Prototipo 7474 FloatLeftShift X V Descripción 7475 . Turnos 7476 un número de punto flotante por v coloca a la izquierda. Esta macro es equivalente a lt lt para enteros. 7477 Posible Error. 7478 1 2 4. Ejemplo de 7479 . Representación de precisión simple 7480 de 6 dejó desplazado por 4. 7481 -1 .sup.0 1+0.5 *2.sup. 129-127 lt lt 4 = -1 .sup.0 1+0.5 *2.sup.- 133-127 7482 El resultado es la representación de 96 o 6*2.sup.4. Tenga en cuenta la tabla 10. 58TABLE gama de descripción de parámetros 10 x punto flotante número cualquier v número de p. f. cantidad a desplazar por válido. Entero sin signo 0... width x 7483 Derecho de turno. 7484 ID función 4 Prototipo 7485 FloatRightShift x v Descripción 7486 . Turnos 7487 un número de punto flotante por v coloca a la derecha. Esta macro es equivalente a gt gt para enteros. 7488 Posible Error. 1 7489 4 10. Tenga en cuenta la tabla 11. 59TABLE gama de descripción de parámetros 11 x punto flotante número cualquier v número de p. f. cantidad a desplazar por válido. Entero sin signo 0... width x Redondeo 7490 más cercano. 7491 ID funcionar 5 Prototipo 7492 FloatRound x MantWidth Descripción 7493 . 7494 Redondea un número de coma flotante para tener ancho de mantisa Mantwidth. El valor de MantWidth puede ser menor que el ancho de la mantisa original o bien no compila la macro. 7495 Posibles errores. 7496 1 4. Tenga en cuenta la tabla 12. La gama de descripción de parámetros 12 de 60TABLE x punto flotante número cualquier número válido de f. p. de cualquier ancho de mantisa de MantWidth de ancho del resultado entero sin signo 1. . . 63 7497 Conversión entre anchos. 7498 ID función 6 Cruciforme prototipo FloatConvert x ExpWidth MantWidth Descripción 7500 . 7501 Convierte un número de punto flotante en una carroza de ancho de ExpWidth y la mantisa en ancho exponente del MantWidth. 7502 Posibles errores. 7503 1 2 4. Nota 13 de la tabla. La gama de descripción de parámetros 13 de 61TABLE x punto flotante número cualquier número válido de f. p. de cualquier ancho de ExpWidth exponente del ancho del resultado entero sin signo 1. . . 15 Ancho de la mantisa MantWidth del resultado entero sin signo 1... 63 Multiplicador de 7504 . 7505 ID funcionar 7 7506 Prototipo FloatMult x 1 x 2 Descripción 7507 . 7508 Multiplies dos números de punto flotante de anchos coincidentes. 7509 Posibles errores. 7510 1 2 4 5 10. Tenga en cuenta la tabla 14. La gama de descripción de parámetros 14 de 62TABLE x 1 x 2 números de punto flotante cualquier número válido de f. p. Adición de 7511 . 7512 ID función 8 Prototipo 7513 FloatAdd x 1 x 2 Descripción 7514 . Números de anchos coincidentes de punto flotante de agrega dos de 7515 . 7516 Posibles errores. 7517 1 2 4 8. Nota 15 de la tabla. La gama de Descnption de parámetros 15 de 63TABLE x 1 x 2 números de punto flotante cualquier número válido de f. p. Resta 7518 . 7519 ID funcionar 9 Prototipo 7520 FloatSub x 1 x 2 Descripción 7521 . 7522 Sustraer dos números de punto flotante de anchos coincidentes x 1-x 2 . 7523 Posibles errores. 7524 1 2 4 8. Tabla 16. La gama de descripción de parámetros 16 de 64TABLE x 1 x 2 números de punto flotante cualquier número válido de f. p. División 7525 . 7526 ID funcionar 10 Prototipo 7527 FloatDiv N D Q Descripción 7528 . 7529 Divide dos números de punto flotante de anchos coincidentes y el cociente de salidas. N/D = Q 7530 Posibles errores. 7531 1 2 3 4 6 9 10. Gama descripción de 17 parámetros 65TABLE N punto flotante de la entrada d números cualquier salida q número de válido p. f. coma flotante cualquier número de número válido de f. p. = N/D Raíz cuadrada de 7532 . 7533 ID función 11 Prototipo 7534 Floatsqrt R Q Descripción coronó . Plaza 7536 raíces un número de punto flotante. Sqrt R = Q 7537 Posibles errores. 7538 1 4 7 10 11. Tabla 18. 66TABLE 18 parámetros descripción gama r entrada número de punto flotante cualquier válida f. de p. número de número de punto flotante de salida de Q = cualquier válido de p. f. Número de Sqrt R De punto flotante de 7539 para la conversión de entero sin signo. 7540 ID funcionar 12 Prototipo 7541 FloatToUInt x wi Descripción 7542 . 7543 Convierte un número de punto flotante en un entero sin signo de ancho wi utilizando el truncamiento de redondeo. Si el número es negativo se devuelve un cero. 7544 Posibles errores. 7545 1 4. Cuadro 19. La gama de descripción de parámetros 19 de 67TABLE x punto flotante número cualquier válido de p. f. número wi anchura Total del resultado cualquier entero sin signo 7546 Coma flotante para la conversión de entero con signo. 7547 ID funcionan 13 Prototipo 7548 FloatToInt x wi Descripción 7549 . 7550 Convierte flotante punto número en un entero con signo de ancho wi utilizando el truncamiento de redondeo. 7551 Posibles errores. 7552 1 4. TABLA de 68 20 gama de descripción de los parámetros x número de punto flotante cualquier válida f. de p. número wi ancho Total del resultado de cualquier entero con signo 7553 Entero sin signo a flotante de conversión de punto. 7554 ID funcionan 14 Prototipo 7555 FloatFromUInt u ExpWidth MantWidth Descripción 7556 . 7557 Convierte un entero sin signo en un número de punto flotante de ancho exponente ExpWidth y ancho de la mantisa MantWidth usando redondeo de truncamiento. 7558 Posibles errores. 2 7559 . Consulte la tabla 21. Gama de descripción de los parámetros de 21 69TABLE u Unsigned entero cualquier ancho de ExpWidth exponente entero sin signo del resultado de entero sin signo 1... 63 Ancho de la mantisa MantWidth del resultado entero sin signo 1... 15 7560 Entero con signo a flotante de conversión de punto. 7561 ID funcionar 15 Prototipo 7562 FloatFromInt i ExpWidth MantWidth Descripción 7563 . 7564 Convierte un entero con signo en un número de punto flotante de ancho exponente ExpWidth y ancho de la mantisa MantWidth usando redondeo de truncamiento. 7565 Posibles errores. 2 7566 . Tenga en cuenta la tabla 22. Descripción de los parámetros 22 de 70TABLE me entero van cualquier ancho de ExpWidth exponente entero del resultado entero sin signo 1... 63 Ancho de la mantisa MantWidth del resultado entero sin signo 1... 15 Diseño detallado 7567 7568 En las subsecciones siguientes describen las especificaciones de diseño para practicar diversos personificaciones de la invención presente. Diseño de la interfaz de 7569 7570 Estructura 1 nombre de Float FLOAT ExpWidth MantWidth Descripción 7571 . 7572 Define una estructura llamada Float_Name con una parte de entero sin signo llamado signo de ancho 1 una parte de entero sin signo denomina exponente de ancho ExpWidth y una parte de entero sin signo de mantisa con ancho de MantWidth . Números de punto flotante válidos 7573 . 7574 A los efectos de esta sección un número de punto flotante válido es uno de ExpWidth de menos de 16 y MantWidth menos de 65 años. El exponente y la mantisa son cualquier patrón de bits dentro de esos anchos incluyendo los patrones de bits especial. La biblioteca puede someterse a este nivel. Entrada 7575 . 7576 ExpWidth el ancho del exponente. 7577 MantWidth el ancho de la mantisa. Salida de 7578 . Formato 7579 de la estructura struct 71 {unsigned int 1 firmar unsigned int ExpWidth exponente unsigned int MantWidth mantisa } float_Name Diseño de detalle de componentes 7580 Explicación de la descripción detallada de 7581 . 7582 Si una variable no es mencionada a continuación es el mismo en la salida como entrada. Para facilitar la comprensión las operaciones en cada componente de cada uno de ellos cuentan con un encabezado. 7583 Cada macro comprueba si la entrada es infinito o NaN antes que hace los cálculos establecidos. Si la entrada no es válida el mismo número de punto flotante es la salida. Esto puede hacerse 72 si exponente = -1 {x = x} else {x = cálculo} 7584 Algunas de las macros de biblioteca llamamiento a otras macros aún no descubiertos por el usuario. Se detallan en cada sección junto con una descripción breve como para su uso bajo el título "Dependencias". 1 FloatAbs x de función 7585 Descripción 7586 . 7587 Devuelve el valor absoluto positivo de un flotante número de punto. Entrada 7588 . 7589 x número de punto flotante de ancho hasta {1 15 63}. Salida de 7590 . Número de punto flotante de 7591 del mismo ancho como entrada. 7592 Descripción detallada. Signo 7593 x.Sign=0 7594 . 2 FloatNeg x de función 7595 Descripción 7596 . 7597 Devuelve el valor denegado de flotante número de punto. Entrada 7598 . 7599 x número de punto flotante de ancho hasta {1 15 63}. Salida de 7600 . Número de punto flotante de 7601 del mismo ancho como entrada. 7602 Descripción detallada. Signo 7 603 Si 7604 Exponent@Mantissa=0. { 7605 7606 x.Sign=0 exponente 0 mantisa = 0 7607 } 7608 else { 7609 7610 x.Sign= Inicio de sesión 7611 } Función de 7612 3 FloatLeftShift x v Descripción 7613 . Turnos 7614 un número de punto flotante por v coloca a la izquierda. Esta macro es equivalente a lt lt para enteros. Entrada 7615 . 7616 x número de punto flotante de ancho hasta {1 15 63}. v 7617 entero sin signo para cambiar por. Esto no es más grande que ExpWidth. Salida de 7618 . Número de punto flotante de 7619 del mismo ancho como entrada. 7620 Descripción detallada. 73 si exponente + v gt el máximo exponente de la anchura {x = infinito} else {exponente si x = 0 {x = x} else {x.Exponent = exponente + v}} Función 7621 4 FloatRightShift x v Descripción 7622 . Turnos 7623 un número de punto flotante por v coloca a la derecha. Esta macro es equivalente a gt gt para enteros. Entrada 7624 . 7625 x número de punto flotante de ancho hasta {1 15 63}. v 7626 entero sin signo para cambiar por. Esto no es más grande que ExpWidth. Salida de 7627 . Número de punto flotante de 7628 del mismo ancho como entrada. 7629 Descripción detallada. 74 si exponente - v lt el exponente mínimo para el ancho {x = 0} else {exponente si x = 0 {x = x} else {x.Exponent = exponente - v}} 7630 Función 5 FloatRound x MantWidth Descripción 7631 . 7632 Redondea un número de punto flotante a uno con el ancho de la mantisa MantWidth. Entrada 7633 . 7634 x número de punto flotante de ancho hasta {1 15 63}. 7635 MantWidth ancho de mantisa ronda a sin signo MantWidth. Salida de 7636 . 7637 Número de punto flotante del mismo ancho exponente que la anchura de la entrada y la mantisa MantWidth. Dependencias 7638 . 7639 RoundUMant extrae la mantisa como un entero sin signo con 1 oculto 7640 RoundRndMant rondas mantisa a MantWidth + 2 7641 Descripción detallada. Mantisa 7642 75 si el siguiente bit menos significativo y cualquiera de los otros bits menos significativos después del punto de corte son 1 {x.Mantissa = MantWidth los bits más significativos de la mantisa + 1} else {x.Mantissa = MantWidth los bits más significativos de la mantisa} exponente si mantisa desborda durante redondeo {x.Exponent = exponente + 1} else {x.Exponent = exponente} Función 7643 6 FloatConvert x ExpWidth MantWidth Descripción 7644 . 7645 Convierte un número de punto flotante en una carroza de ancho de ExpWidth y la mantisa en ancho exponente del MantWidth. Entrada 7646 . 7647 x número de punto flotante de ancho hasta {1 15 63}. 7648 ExpWidth convertir ancho exponente sin signo ExpWidth. 7649 MantWidth convertir al ancho de la mantisa sin signo MantWidth. Salida de 7650 . 7651 Número de punto flotante de ancho exponente ancho de ExpWidth y la mantisa MantWidth. 7652 Descripción detallada. 76 si exponente - viejos prejuicios gt nuevo sesgo {x = infinito} otra {exponente x.Exponent = exponente - antiguo sesgo + nuevo sesgar la mantisa si el nuevo ancho es mayor que el ancho de la antigua {x.Mantissa = Extended mantisa} else {x.Mantissa = bits más significativos de ancho}} Función 7653 7 FloatMult x 1 x 2 Descripción 7654 . 7655 Multiplies dos números de punto flotante. Entrada 7656 . 7657 x 1 x 2 números de punto flotante de ancho hasta {1 15 63} Salida de 7658 . Número de punto flotante de 7659 del mismo ancho como entrada. Dependencias 7660 . 7661 MultUnderflowTest exponente de pruebas para subdesbordamiento. 7662 MultOverflowTest pruebas exponente de desbordamiento. MultSign 7663 multiplica los signos. GetDoubleMantissa 7664 almohadillas la mantisa con ancho de mantisa ceros. 7665 MantissaMultOverflow pruebas mantisa de desbordamiento. AddExponents 7666 agrega exponentes. MultMantissa 7667 multiplica la mantisa y selecciona los bits de la derechos. 7668 Descripción detallada. 77 Probar subdesbordamiento exponente si subdesbordamiento es true {x = 0} else {probar para exponente desbordamiento si desbordamiento es true {x = infinito} otra cosa {firmar x.Sign = x 1.Signo o x 2.Signo exponente si se desborda mantisa {x.Exponent = x 1.Exponente + 2 x.Exponente + 1} else {x.Exponent = x 1.Exponente + 2 x.Exponente} mantisa ambos mantissas son rellenados por debajo con ceros a la izquierda mantisa = x 1.Mantisa * x 2.Mantisa x.Mantissa = ancho de entrada superior mantisa bits}} Función 7669 8 FloatAdd X 1 X 2 Descripción 7670 . 7671 Agrega dos números de punto flotante. Entrada 7672 . 7673 x 1 x 2 números de punto flotante de ancho hasta {1 15 63}. Salida de 7674 . Número de punto flotante de 7675 del mismo ancho como entrada. Dependencias 7676 . 7677 SignedMant extractos mantisa como un entero con signo. MaxBiasedExp 7678 determina el mayor de los dos exponentes sesgadas. BiasedExpDiff 7679 obtiene la diferencia entre los dos exponentes a 64 . AddMant 7680 agrega dos mantisa. GetBiasedExp 7681 obtiene sesgada exponente del resultado. GetAddMant 7682 obtiene la mantisa normalizada del resultado. 7683 Descripción detallada. 78 De prueba para desbordamiento si se desborda número {x = infinito} otra {signo ajustar la mantisa tener el mismo exponente agregarlos x.Sign = el signo del resultado exponente si adición = 0 {x.Exponent = 0} otra {x.Exponent = Max exponente - mantisa de importe ajustado por} mantisa mantisa ajustar a tener el mismo exponente mantisa = x 1.Mantisa + x 2.X.Mantissa de la mantisa = bits de ancho superior de mantisa} Función 7684 9 FloatSub x 1 x 2 Descripción 7685 . 7686 Sustraer uno flotante de otro. Entrada 7687 . 7688 x 1 x 2 números de punto flotante de ancho hasta {1 15 63}. Salida de 7689 . 7690 Flotante punto número x 1-x 2 de la misma anchura como entrada. Dependencias 7691 . FloatNeg 7692 niega el número. FloatAdd 7693 agrega dos números. 7694 Descripción detallada. x 7695 = FloatAdd x 1 x - 2 Función 7696 10 FloatDiv N D Q Descripción comunicación . 7698 Divide dos flotadores y salidas el cociente. Q = N/D. Entrada 7699 . 7700 N D Q números de punto flotante de ancho hasta {1 15 63} Salida de 7701 . 7702 Ninguno ya que es un procedimiento de macro. 7703 Descripción detallada. 7704 Esta macro de división se basa en la no-restauración de esquema de división básica para números con signo. Este esquema tiene la rutina siguiente 7705 Conjunto s = 2 * 1 concatenados para N.Mantissa D establecer 7706 = 2 * 1 concatenados para D.mantissa Verificación de 7707 para ver si s es mayor que d 7708 Si exponente tan establecer ajuste a cero S de Else 7709 = s/2 y exponente set ajustan a uno 7710 A continuación hacer el ancho de mantisa de procedimiento siguiente + 1 veces 7711 Compruebe si primer dígito 2 * s -d es 0 7712 Si lo s = 2* s -d q = 2 * q + 1 S de Else 7713 = 2 * s q = 2 * q 7714 El cociente q es entonces 7715 Q.Sign=N.Sign o D.Sign 7716 Q.Exponent=N.Exponent-D.Exponent+the exponente ajustar-1 7717 Q.Mantissa=The menos significativos mantisa ancho de bits de q 7718 Funcionó ejemplo dividiendo 10 -2. 10 7719 = 1 25 * 2 3 = {0 0011 01000} -2 7720 = 1.0 * 2 1 = {1 0001 00000} 7721 Tan s 7722 = 01010000 d 7723 = 01000000 ¿ 7724 Es s mayor que d Sí lo s 7725 = 00101000 7726 adj_e = 1 7727 Iteración 1. 7728 2 * s -d = 01010000-01000000 = 00010000 7729 El primer dígito es 0 tan 7730 s = 00010000 q 7731 = 1 7732 Iteración 2. 7733 2 * s -d = 00100000 01000000 = 10100000 7734 El primer dígito es 1 tan s 7735 = 00100000 q 7736 = 10 Iteración 7737 3. 7738 2 * s -d = 01000000 01000000 = 00000000 7739 El primer dígito es 0 tan s 7740 = 00000000 q 7741 = 101 Iteración 7742 4. 7743 2 * s -d = 00000000-01000000 = 11000000 7744 El primer dígito es 1 tan s 7745 = 00000000 q 7746 = 1010 Iteración 7747 5. 7748 2 * s -d = 000000-0100000 = 11000000 7749 El primer dígito es 1 tan 7750 s = 00000000 q 7751 = 10100 7752 El resultado es que q termina como 10100000 después de iteración 8. 7753 El cociente q es Q.Sign=0 7754 o 1 = 1 7755 Q.Exponent=N.Exponent-D.Exponent+adj_e-1 = 3-1 + 1-1 = 2 Q.Mantissa=01000 7756 7757 Tan Q es -5 según sea necesario. 79 si D = 0 {signo = D signo exponente =-1 mantisa = 1} else {si exponente N = -1 {Q = N} otra cosa {si exponente D = -1 {Q = D} otra cosa {si N = 0 {s = 0} otra cosa {s = 1 @ N mantisa lt lt 1 } d = 1 @ N mantisa lt lt 1 q = 0 me = 0 si es más importante bit s-d == 0 {S = S gt gt adj 1 = 1} otra cosa {adj = 0}Mientras yo no igual al ancho de la mantisa + 1 {si más significativos de bits de s lt lt 1 - d = 0 {s = s lt lt 1 -q d = q lt lt 1 + 1} otra {s = s lt lt 1 q = q lt lt 1}} me = i + 1 Q de signo = N signo o señal d si q = 0 {exponente de Q = 0} otra {exponente de Q = N exponente - exponente de D + adj + sesgo - 1} mantisa Q = bits de anchura inferior de q}}} Función 7758 11 Floatsqrt R Q Descripción 7759 . 7760 Calcula la raíz cuadrada de la entrada. Q=Sqrt R Entrada 7761 . 7762 R Q números de punto flotante de ancho hasta {1 15 63}. Salida de 7763 . 7764 Ninguno ya que es un procedimiento de macro. Dependencias 7765 . GetUnbiasedExp 7766 extrae exponente imparcial. 7767 Descripción detallada. 7768 Esta macro de raíz cuadrada se basa en el algoritmo de cambio/restar de restauración. Este esquema tiene la rutina siguiente Q set 7769 = 1 7770 Set I = 0 7771 Compruebe si exponente positiva 7772 Si es así 7773 set e=R.Exponent/2 7774 Set s=R.Mantissa Else 7775 7776 Set e=R.Exponent-1 Conjunto 7777 = 2 * R.Mantissa+2 ancho de mantisa 7778 A continuación hacer el ancho de mantisa de procedimiento siguiente + 1 veces. 7779 Compruebe si primer dígito 2 * s - 4 * q + 1 * 2 mantisa ancho-1-i es 0 7780 Si es así = 2 * s de s- 4 * q + 1 * 2 mantisa ancho-1-i q = 2 * q + 1 S de Else 7781 = 2 * s q = 2 * q 7782 La raíz cuadrada de q es entonces Q.Sign=0 7783 Q.Exponent=e+bias 7784 7785 Q.Mantissa=The menos significativos mantisa ancho de bits de q Funcionó 7786 ejemplo-Plaza arraigan 36 36 7787 = 1.125 * 2 5 = {0 0101 00100} 7788 Así como exponente es impar e 7789 = 0010 s 7790 = 2 * mantisa + 2 5 = 00001000 + 00100000 = 00101000 q 7791 = 1 7792 Iteración 1. 01010000- 00000100+00000001 7793 lt lt 4 = 00000000 7794 Primer dígito es 0 s 7795 = 00000000 q 7796 = 11 7797 Iteración 2. 00000000- 00001100-00000001 7798 lt lt 3 = 10011000 7799 Primer dígito es 1 tan 7800 s = 00000000 q 7801 = 110 Iteración 7802 3. 00000000- 00011000-00000001 7803 lt lt 2 = 10011100 7804 Primer dígito es 1 tan s 7805 = 00000000 q 7806 = 1100 7807 Esto continúa hasta que tengamos la respuesta Q.Sign=0 7808 Q.Exponent=2+bias 7809 en este caso el sesgo es 7 Q.Mantissa=10000 7810 7811 Tan Q es el entero de 6. 80 si firma R = 1 {Q signo = R signo q exponente =-1 Q mantisa = 2} otra cosa {si exponente de R = -1 {Q = R} otra cosa {si incluso imparcial exponente {e = Unbiased exponent /2 s = R mantisa} otra {e = exponente imparcial - 1 / 2 s = R mantisa lt lt 1 + e {circunflejo sobre + 0 + 0 ancho de Q }} q = 1 me = 0 mientras que yo no igual ancho mantisa + 1 {c = s lt lt 1 - 4 * q + 1 lt lt mantisa de ancho - 1 - me si bit más significativo de c = 1 {s = q c = q lt lt 1 + 1} else {s = s lt lt 1 q = q lt lt 1} me = i + 1} si r no es igual a 0 {signo Q = 0 exponente de Q = e + sesgo mantisa Q = bits de ancho superior de q} otra {Q = 0}}} Función 7812 12 FloatToUInt x wi Descripción 7813 . 7814 Convierte un número de punto flotante en un entero sin signo de ancho wi utilizando el truncamiento de redondeo. Si el número es negativo se devuelve un cero. Entrada 7815 . 7816 x número de punto flotante de ancho hasta {1 15 63} 7817 wi sin signo ancho de entero sin signo Salida de 7818 . 7819 Entero sin signo de ancho wi. Dependencias 7820 . 7821 GetMant mantisa obtiene para la conversión a entero 7822 ToRoundInt se redondea al entero más próximo 7823 MantissaToInt mantisa convierte a entero 7824 Descripción detallada. 81 si el valor absoluto de flotar igual o inferior a 0 5 a 0 {salida 0} else {mantisa de desplazamiento a la izquierda por exponente coloca ronda al número entero más cercano de sin signo de salida entero} Función 7825 13 FloatToInt x wi Descripción 7826 . 7827 Convierte flotante punto número en un entero con signo de ancho wi utilizando el truncamiento de redondeo. Entrada 7828 . 7829 x número de punto flotante 7830 wi ancho sin signo de número entero Salida de 7831 . 7832 Entero de firmado de ancho wi. Dependencias 7833 . 7834 GetMant mantisa obtiene para la conversión a entero. 7835 ToRoundInt se redondea al entero más próximo. 7836 MantissaToInt mantisa convierte a entero. 7837 Descripción detallada. 82 si el valor absoluto de flotar igual o inferior a 0 5 a 0 {salida 0} else {mantisa de desplazamiento a la izquierda por exponente coloca ronda al número entero más cercano si signo = 0 {salida entero} else {salida - entero}} 7838 Función 14 FloatFromUInt U ExpWidth MantWidth Descripción 7839 . 7840 Convierte un entero sin signo en un número de punto flotante de ancho exponente ExpWidth y ancho de la mantisa MantWidth usando redondeo de truncamiento. Entrada 7841 . 7842 u entero sin signo 7843 ExpWidth sin signo ancho de exponente de salida 7844 MantWidth sin signo ancho de mantisa de salida Salida de 7845 . 7846 Número de punto flotante de ancho exponente ancho de ExpWidth y la mantisa MantWidth. Dependencias 7847 . 7848 UIntToFloatExp obtiene entero al exponente de 7849 UIntToFloatNormalised obtiene entero a la mantisa 7850 Descripción detallada. 83 Al encontrar a la izquierda la mayoría poco de u el bit menos significativo es etiquetado como 0 y la etiqueta de numeración aumenta a medida que los bits más significativos. Signo de signo = la mayoría significativa entero binario bit exponente si entero = 0 {exponente = 0} else {exponente = posición de izquierda más bits + sesgo} mantisa si entero = 0 {mantisa = 0} otra cosa} si ancho entero lt mantisa de ancho {mantisa = integer lt lt ancho mant - posición de izquierda de poco más de u } otra cosa} mantisa = integer lt lt ancho entero-posición de izquierda en poco más de u }} Función comprende 15 FloatFromInt i ExpWidth MantWidth Descripción 7852 . 7853 Convierte un entero con signo en un número de punto flotante de ancho exponente ExpWidth y ancho de la mantisa MantWidth usando redondeo de truncamiento. Entrada 7854 . 7855 firmé entero. 7856 ExpWidth sin signo ancho de exponente de salida MantWidth 7857 sin signo ancho de mantisa de salida Salida de 7858 . 7859 Número de punto flotante de ancho exponente ancho de ExpWidth y la mantisa MantWidth. Dependencias 7860 . IntToFloatExp 7861 obtiene un entero sin signo al exponente FltToFloatNormalised 7862 obtiene un entero sin signo para la mantisa 7863 Descripción detallada. 84 Al encontrar a la izquierda la mayoría poco de u el bit menos significativo es etiquetado como 0 y la etiqueta de numeración aumenta a medida que los bits más significativos. Signo signo = la mayoría entero importante exponente de bits si entero = 0 {exponente = 0} otra cosa {exponente = posición de izquierda más bits + sesgo} mantisa entero = valor absoluto del entero si entero = 0 {mantisa = 0} otra cosa {si ancho entero lt mantisa de ancho {mantisa = integer lt lt ancho mant - izquierda poco más de número entero } else {mantisa = integer lt lt ancho entero - izquierda poco más de número entero }} Verificación de 7864 Método de prueba 7865 se puede implementar con métodos de verificación como positivo Pos negativo Neg volumen y estrés Vol comparación Comp y pruebas de demostración Demo . La prueba positiva 7866 7867 Números de punto flotantes válidos se introducen en la macro y el resultado es comparado con la respuesta correcta. Pruebas negativas 7868 7869 Números de punto flotante no válidos se introducen en la macro y el error resultante se compara con el error correcto. Volumen 7870 y pruebas de estrés Números de punto flotantes válidos 7871 repetidamente se introducen en la macro para ver que funciona de manera correcta y repetible. Pruebas de comparación de 7872 7873 Resultados correctos son ganados desde una fuente fiable para comparar los resultados de macro. Pruebas de demostración de 7874 Se evalúa el comportamiento 7875 en circunstancias representativos. Biblioteca de punto fijo Desarrollo de software 7876 para la biblioteca de punto fijo 7877 Esta información específica de la sección en detalle el desempeño y la especificación funcional de la biblioteca de Fixed-Point de diseño. Describe cómo deben cumplirse los requisitos para la implementación de la biblioteca. También documenta los exámenes que son útiles para comprobar que cada unidad de Handel-C y/o software funciona correctamente y que integran perfectamente para trabajar como una aplicación completa. La biblioteca de Fixed-point de Handel-C 7878 contiene una serie de funciones para la creación y manipulación de números de punto fijos. Consiste en un archivo de biblioteca lib un archivo de encabezado . h y un manual de la función. Los prototipos de encabezado las expresiones disponibles en la biblioteca. La biblioteca de Fixed-point de Handel-C 7879 está restringida a adoptar la filosofía de diseño de Handel-C donde los operadores numéricos requieren tipos coincidentes. Por lo tanto son los parámetros de cada función de la coincidencia de ancho y pueden ser el tipo y el resultado devuelto de coincidencia ancho y tipo a menos que se especifique lo contrario. Estructura de número 7880 7881 FIXED_SIGNED int Width frac ancho 7882 Esto crea una estructura para contener un número de punto fijo firmado. intWidth establece el número de bits de entero y fracWidth establece el número de bits de la fracción. FIXED_UNSIGNED intWidth fracWidth 7883 7884 Esto crea una estructura para contener un número de punto fijo sin signo. intWidth establece el número de bits de entero y fracWidth establece el número de bits de la fracción. FIXED_ISSIGNED 7885 7886 Definido a igual a 1. FIXED_ISUNSIGNED 7887 7888 Definido a igual a 0. Operadores de manipulación de bits 7889 7890 FixedLeftShift fixed_Name variable_Shift Returnsfixed_Name 7891 había desplazado izquierda variable_Shift número de bits. Esto produce un número de punto fijo del mismo tipo y ancho como fixed_Name con cualquier bit desplazado fuera de su ancho está perdiendo y cualquier bit añadida ser cero. 7892 FixedRightShift fixed_Name variable_Shift Returnsfixed_Name 7893 había desplazado derecho variable_Shift número de bits. Esto produce un número de punto fijo del mismo tipo como fixed_Name con cualquier bit desplazado fuera de su ancho está perdiendo. Cuando cambio de valores sin signo los bits superiores se rellenan con ceros. Cambiando la firma valores los bits superiores son copias del bit superior del valor original. Números tan firmados son signo extendido en la misma forma que la función derecha de Handel-C Mayús. Operadores aritméticos 7894 7895 Cualquier intento de realizar una de estas operaciones en dos expresiones de diferentes anchos o tipos puede provocar un error del compilador. FixedNeg fixed_Name 7896 7897 Devuelve el negativo del operando. 7898 FixedAdd fixed_Name1 fixed_Name2 7899 Devuelve la suma de los operandos. 7900 FixedSub fixed_Name1 fixed_Name2 7901 Devuelve fixed_Name2 restado de fixed_Name1. 7902 FixedMultSigned fixed_Name1 fixed_Name2 7903 Devuelve el producto de los operandos para sólo números con signo. 7904 FixedMultUnsigned fixed_Name1 fixed_Name2 7905 Devuelve el producto de los operandos para sólo números sin signo. 7906 FixedDivSigned fixed_Name1 fixed_Name2 7907 Devuelve fixed_Name1 dividido por fired_Name2 para firmado sólo números. 7908 FixedDivUnsigned fixed_Name1 fixed_Name2 7909 Devuelve fixed_Name1 dividido por fixed_Name2 para sólo números sin signo. FixedAbs fixed_Name 7910 7911 Devuelve el valor absoluto. Operadores relacionales 7912 7913 Estos operadores comparan los valores de la misma anchura y devolución que un único bit amplia unsigned int 7914 valor de 0 para falso o 1 para verdadero. 7915 FixedEq fixed_Name1 fixed_Name2 7916 Devuelve true si los operandos son iguales. 7917 FixedNEq fixed_Name1 fixed_Name2 7918 Devuelve true si los operandos no son iguales. 7919 FixedLT fixed_Name1 fixed_Name2 7920 Devuelve true si fixed_Name1 es menor que fixed_Name2. 7921 FixedLTE fixed_Name1 fixed_Name2 7922 Devuelve true si fixed_Name1 es menor o igual a fixed_Name2. 7923 FixedGT fixed_Name1 fixed_Name2 7924 Devuelve true si fixed_Name1 es mayor que fixed_Name2. 7925 FixedGTE fixed_Name1 fixed_Name2 7926 Devuelve true si fixed_Name1 es mayor o igual a fixed_Name2. 7927 Bit a bit operadores lógicos 7928 Estos operadores realizan operaciones lógicas a nivel de bit en números de punto fijos. Ambos operandos pueden ser del mismo tipo y ancho el valor resultante también puede este tipo y el ancho. FixedNot fixed_Name 7929 7930 Devuelve bit a bit no. 7931 FixedAnd fixed_Name1 fixed_Name2 7932 Devuelve bit a bit y. 7933 FixedOr fixed_Name1 fixed_Name2 7934 Devuelve bit a bit o. 7935 FixedXor fixed_Name1 fixed_Name2 7936 Exclusiva bit a bit de devoluciones o. Operadores de conversión 7937 7938 Estos operadores son para el tipo de conversión de números fijos. FixedIntWidth fixed_Name 7939 7940 Devuelve el ancho de la parte entera de fixed_Name como una constante de tiempo de compilación. FixedFracWidth fixed_Name 7941 7942 Devuelve el ancho de la parte de la fracción de fixed_Name como una constante de tiempo de compilación. 7943 FixedLiteral isSigned intWidth fracWidth intBits fracBits 7944 Devuelve un número de punto fijo firmado si isSigned es true y un número de punto fijo sin firmar si isSigned es false. Este número tiene una intBits de parte de entero de intWidth de ancho y una fracBits de parte de la fracción de widthfracWidth. FixedToInt fixed_Name 7945 7946 Devuelve la parte entera del número de punto fijo con el mismo tipo y ancho. 7947 FixedToBool fixed_Name 7948 Devuelve un único bit valor de ancho unsigned int que es 0 para false si es igual el operando a 0 y 1 para verdadero lo contrario. FixedToBits fixed_Name 7949 7950 Devuelve los bits entero y la fracción de fixed_Name concatenada juntos. Para un número de punto fijo firmado esto puede producir un entero con signo de ancho intWidth + fracWidth. Para un número de punto fijo sin signo esto puede producir un entero sin signo de ancho intWidth + fracWidth. 7951 FixedCastSigned isSigned intWidth fracWidth fixed_Name Moldes 7952 cualquiera firmado el número de punto fijo para el tipo y el ancho especificado. 7953 FixedCastUnsigned isSigned intWidth fracWidth fixed_Name Moldes 7954 cualquier número de punto fijo sin firmar para el tipo y el ancho especificado. Diseño de 7955 7956 En esta sección puede describir la presente invención de acuerdo a una encarnación preferida. Interfaz 7957 7958 Esta biblioteca se accede a través de un archivo de encabezado estándar incluido en los programas del cliente por "# include lt fixed.h gt ". Recursos compartidos 7959 7960 Aunque las macros internas pueden ser utilizadas por más de una macro pública puede haber no compartir conflictos como no estén definidos como expresiones compartidas y como tal Handel-C puede generar todo el hardware necesario para cada expresión en la biblioteca cada vez que se utiliza. 7961 Nota Aritmética de Handel-C 7962 se utiliza a lo largo de las macros. Esto significa que todos los operadores de devolución los resultados de la misma anchura como sus operandos y se eliminan todos los bits de desbordamiento. Por ejemplo # 85 incluyen reloj set de "fixed.h" = "P1" externos typedef FIXED_UNSIGNED 4 4 MyFixed void main void {MyFixed fixed1 fixed2 fixed3 / / Asignar el valor 5 a fixed1 fixed1 = FixedLiteral FIXED_ISUNSIGNED 4 4 5 0 / / Asigna el valor de 5.5 a fixed2 fixed2 = FixedLiteral FIXED_ISSIGNED 4 4 5 8 / / Multiplicar el número fixed3 juntos = FixedMultUnsigned fixed1 fixed2 } 7963 Resultados de este ejemplo en fixed3 está establecida en 11 5 fixed3 7964 .FixedIntBits = 11 fixed3 7965 .FixedFracBits = 8 7966 El usuario es responsable de administrar los desbordamientos explícitamente y puede utilizar FixedCastSigned y FixedCastUnsigned para cambiar el ancho de un número de punto fijo. Estructura de número 7967 Tipos de datos de the Handel-C 7968 utilizados están firmados y números sin signo de punto fijos de usuario definición anchos. Las estructuras de los números de punto fijos firmados y sin signo son a continuación. Los anchos de estos números de punto fijos son declarados por el usuario. Todas las operaciones necesarias para definir manipular y extraer los valores de fixed_Name.FixedIntBits y fixed_Name.FixedFracBits están disponibles en la biblioteca. 7969 COMP FIXED_SIGNED intPVidth fracWidth 1.1 Descripción 7970 7971 Esto crea una estructura para contener un número de punto fijo firmado. intWidth establece el número de bits de entero y frac ancho establece el número de bits de la fracción. Entradas 7972 7973 intWidth ancho de la parte entera del número 7974 fracWidth ancho de la parte de la fracción del número Salida de 7975 Formato 7976 de la estructura 7977 struct { 7978 intWidth firmado 7979 FixedIntBits 7980 signedfracWidth FixedFracBits 7981 } 7982 1.2 COMP FIXED_UNSIGNED int Width frac ancho Descripción 7983 7984 Esto crea una estructura para contener un número de punto fijo sin signo. intWidth establece el número de bits de entero y fracWidth establece el número de bits de la fracción. Entradas 7985 7986 intWidth ancho de la parte entera del número 7987 fracWidth ancho de la parte de la fracción del número Salida de 7988 Formato 7989 de la estructura 7990 struct { 7991 intWidth sin signo 7992 FixedIntBits 7993 unsignedfrac FixedFracBits de ancho 7994 } 7995 COMP 1.3 FIXED_ISSIGNED Descripción 7996 7997 Definido a igual a 1. Entradas 7998 Ninguno 7999 Salida de 8000 8001 Ninguno 8002 COMP 1.3 FIXED_ISUNSIGNED Descripción 8003 8004 Definido a igual a 0. Entradas 8005 Ninguno 8006 Salida de 8007 Ninguno 8008 Operadores de manipulación de bits 8009 8010 2.1 COMP FixedLeftShift fixed_Name variable_Shift Descripción 8011 8012 Devuelve fixed_Name cambió la izquierda por un número variable de desplazamiento de bits. Esto produce un número de punto fijo del mismo tipo y ancho como fixed_Name con cualquier bit desplazado fuera de su ancho está perdidos y menores bits rellenados con ceros. Entradas 8013 8014 fixed_Name número de punto fijo de cualquier tipo o ancho 8015 variable_Shift número de entero sin signo de bits para cambiar por. Establece ancho width variable_Shift =log2ceil fracWidth+intWidth+1 8016 Salida de 8017 Número de punto fijo 8018 del mismo tipo y ancho como fixed_Name Descripción detallada 8019 8020 Concatenar partes entero y la fracción de fixed_Name en una cadena de bits único 8021 Shift_Name izquierda int_value número de bits 8022 Resultado de dividir en partes entero y fracción del mismo tipo y ancho como fixed_Name 8023 Retorno como struct 8024 2.2 COMP FixedRightShift fixed_Name variable_Shift Descripción 8025 8026 Devuelve fixed_Name desplazado derecho variable_Shift número de bits. Esto produce un número de punto fijo del mismo tipo como fixed_Name con cualquier bit desplazado fuera de su ancho está perdiendo. Cuando cambio de valores sin signo los bits superiores se rellenan con ceros. Desplazamiento de la firma valores los bits superiores arco copias del bit superior del valor original. Números tan firmados son signo extendido en la misma forma que la función derecha de Handel-C Mayús. Entradas 8027 8028 fixed_Name número de punto fijo de cualquier tipo o ancho 8029 variable_Shift número de entero sin signo de bits para cambiar por. Establece ancho width variable_Shift =log2ceil fracWidth+intWidth+1 8030 Salida de 8031 Número de punto fijo 8032 del mismo tipo y ancho como fixed_Name Descripción detallada 8033 8034 Concatenar partes entero y la fracción de fixed_Name en una cadena de bits único Fixed_Name de cambio 8035 derecho de int_value número de bits 8036 Resultado de dividir en partes entero y fracción del mismo tipo y ancho como fixed_Name 8037 Retorno como struct Operadores aritméticos 8038 8039 COMP FixedNeg fixed_Name 3.1 Descripción 8040 8041 Devuelve el negativo de fixed_Name. El resultado de la utilización de esta macro en una estructura de punto fija sin firmar no está definido. Entradas 8042 número de punto fijo de cualquier tipo y la anchura del 8043 fixed_Name Salida de 8044 Número de punto fijo 8045 del mismo tipo y ancho como fixed_Name Descripción detallada 8046 8047 Concatenar partes entero y la fracción de fixed_Name en una cadena de bits único 8048 Negate la cadena de bits 8049 Resultado de dividir en partes entero y fracción del mismo tipo y ancho como fixed_Name 8050 Retorno como struct 8051 3.2 COMP FixedAdd fixed_Name1 fixed_Name2 Descripción 8052 8053 Devuelve el fixed_Name1 y fixed_Name2 se sumarán. El número devuelto es de la misma anchura que los operandos por lo que cualquier bits producción por la adición fuera de este desbordamiento de ancho y se eliminan. Entradas 8054 número de punto fijo de fixed_Name1 8055 de cualquier tipo o ancho número de punto fijo de fixed_Name2 8056 del mismo tipo y ancho Salida de 8057 Número de punto fijo 8058 del mismo tipo y ancho como fixed_Name1 Descripción detallada 8059 8060 En la comprobación en tiempo de compilación los operandos son de la misma anchura y si no dar un error de aserción 8061 Concatenar partes entero y la fracción de fixed_Name1 en una cadena de bits único 8062 Concatenar partes entero y la fracción de fixed_Name2 en una cadena de bits único 8063 Agregar las cadenas de bits y colocar cualquier bit de desbordamiento 8064 Resultado de dividir en partes entero y fracción del mismo tipo y ancho como fixed_Name1 8065 Retorno como struct 8066 3.3 COMP FixedSub fixed_Name1 fixed_Name2 Descripción 8067 8068 Devuelve fixed_Name2 restado de fixed_Name1. El número devuelto es de la misma anchura que los operandos por lo que cualquier bits producción por la resta fuera de este desbordamiento de ancho y se pierden. Entradas 8069 número de punto fijo de fixed_Name1 8070 de cualquier tipo o ancho número de punto fijo de fixed_Name2 8071 del mismo tipo y ancho Salida de 8072 Número de punto fijo 8073 del mismo tipo y ancho como fixed_Name1 Descripción detallada 8074 8075 En la comprobación en tiempo de compilación los operandos son de la misma anchura y si no dar un error de aserción 8076 Concatenar partes entero y la fracción de fixed_Name1 en una cadena de bits único 8077 Concatenar partes entero y la fracción de fixed_Name2 en una cadena de bits único 8078 Restar el bit de cadenas y colocar cualquier bit de desbordamiento 8079 Resultado de dividir en partes entero y fracción del mismo tipo y ancho como fixed_Name1 8080 Retorno como struct 8081 3.4 COMP FixedMultSigned fixed_Name1 fixed_Name2 Descripción 8082 8083 Devuelve el producto de los operandos para sólo números con signo. El número devuelto es de la misma anchura que los operandos por lo que cualquier bits producción por la multiplicación fuera de este desbordamiento de ancho y se pierden. Entradas 8084 fixed_Name1 8085 firmado el número de punto fijo de cualquier ancho fixed_Name2 8086 firmado el número de punto fijo de la misma anchura Salida de 8087 Número de punto fijo 8088 firmado del mismo ancho que fixed_Name1 Descripción detallada 8089 8090 En la comprobación en tiempo de compilación fixed_Name1 y fixed_Name2 son de la misma anchura y firmado el tipo 8091 Concatenar partes entero y la fracción de fixed_Name1 en una cadena de bits único y un signo de extender la cadena por el ancho de la parte de la fracción de fixed_Name1 8092 Concatenar partes entero y la fracción de fixed_Name2 en una cadena de bits único y un signo de extender la cadena por el ancho de la parte de la fracción de fixed_Name2 Obra multiplicar estos bits cadenas juntos 8094 Soltar los bits menos significativos del resultado de fracWidth 8095 Resultado de dividir en partes entero y fracción del mismo tipo y ancho como fixed_Name1 8096 Retorno como struct 8097 COMP 3.5 FixedMultUnsigned fixed_Name1 fixed_Name2 Descripción 8098 8099 Devuelve el producto de los operandos para sólo números sin signo. El número devuelto es de la misma anchura que los operandos por lo que cualquier bits producción por la multiplicación fuera de este desbordamiento de ancho y se pierden. Entradas 8100 8101 fixed_Name1 número punto fijo sin signo de cualquier ancho 8102 fixed_Name2 número de sin signo punto fijo de la misma anchura Salida de 8103 Número de punto fijo sin signo 8104 del mismo ancho que fixed_Name1 Descripción detallada 8105 8106 En la comprobación en tiempo de compilación fixed_Name1 y fixed_Name2 son de la misma anchura y tipo sin signo 8107 Concatenar partes entero y la fracción de fixed_Name1 en una sola cadena de bits y extienden la cadena con ceros por el ancho de la parte de la fracción de fixed_Name1 8108 Concatenar partes entero y la fracción de fixed_Name2 en una sola cadena de bits y extienden la cadena con ceros por el ancho de la parte de la fracción de fixed_Name2 8109 Multiplicar estos bits cadenas juntos 8110 Soltar los bits menos significativos del resultado de fracWidth 8111 Dividir el resultado en números enteros y fracción partes del mismo tipo y ancho como fixed_Name1 8112 Retorno como struct 8113 3.6 COMP FixedDivSigned fixed_Name1 Nombre2 despedidos Descripción 8114 8115 Devuelve fixed_Name1 dividido por fixed_Name2 para firmado sólo números. El resultado de fixed_Name2 = 0 no está definido. El número devuelto es de la misma anchura como los operandos tan cualquier bit producido por la División fuera de este ancho se pierden. Entradas 8116 8117 fixed_Name1 firmado el número de punto fijo de cualquier ancho 8118 fixed_Name2 firmado el número de punto fijo de la misma anchura no igual a cero Salida de 8119 Número de punto fijo 8120 firmado del mismo ancho que fixed_Name1 Descripción detallada 8121 8122 En la comprobación en tiempo de compilación fixed_Name1 y fixed_Name2 son de la misma anchura y firmado el tipo 8123 Concatenar juntos las partes entero y la fracción de fixed_Name1 y cero con el mismo ancho que la parte de la fracción en una cadena de bits único 8124 Concatenar partes entero y la fracción de fixed_Name2 en una cadena de bits único y un signo de extender la cadena por el ancho de la parte de la fracción de fixed_Name2 Brecha de 8125 la primera cadena de bits por segundo 8126 Tomar los bits menos significativos del resultado para que sea la misma longitud que la cadena de bits dividida Resultado de Split 8127 de func en partes entero y fracción del mismo tipo y ancho como fixed_Name1 8128 Retorno como struct 8129 3.7 COMP FixedDivUnsigned fixed_Name1 fixed_Name2 Descripción 8130 8131 Devuelve fixed_Name1 dividido por fixed_Name2 para sólo números sin signo. El resultado de fixed_Name2 = 0 no está definido. El número devuelto es de la misma anchura como los operandos tan cualquier bit producido por la División fuera de este ancho se pierden. Entradas 8132 8133 fixed_Name1 número punto fijo sin signo de cualquier ancho 8134 fixed_Name2 sin signo número de punto fijo de la misma anchura. Salida de 8135 Número de punto fijo sin signo 8136 del mismo tipo y ancho como fixed_Name1 Descripción detallada 8137 8138 En la comprobación en tiempo de compilación fixed_Name1 y fixed_Name2 son de la misma anchura y tipo sin signo 8139 Concatenar juntos las partes entero y la fracción de fixed_Name1 y cero con el mismo ancho que la parte de la fracción en una cadena de bits único 8140 Concatenar partes entero y la fracción de fixed_Name2 en una sola cadena de bits y extienden la cadena por el ancho de la parte de la fracción de fixed_Name2 Brecha de 8141 la primera cadena de bits por segundo 8142 Tomar los bits menos significativos del resultado para que sea la misma longitud que la cadena de bits dividida Resultado de Split 8143 de func en partes entero y fracción del mismo tipo y ancho como fixed_Name1 8144 Retorno como struct 8145 COMP 3 8 FixedAbs fixed_Name Descripción 8146 8147 Devuelve el valor absoluto. El resultado de la utilización de esta macro en una estructura de punto fija sin firmar no está definido. Firmado en representación de complemento de uso de números enteros de 2 en Handel-C así abs número positivo máx. lt abs número negativo min 8148 Esto significa que la función da el resultado 8149 abs número negativo min = número negativo de min. Entradas 8150 número de punto fijo de cualquier tipo y la anchura del 8151 fixed_Name Salida de 8152 Número de punto fijo 8153 del mismo tipo y ancho como fixed_Name Descripción detallada 8154 8155 Concatenar partes entero y la fracción de fixed_Name en una cadena de bits único 8156 Buscar el valor absoluto de la cadena de bits 8157 Resultado de dividir en partes entero y fracción del mismo tipo y ancho como fixed_Name 8158 Retorno como struct Operadores relacionales 8159 8160 Las macros en esta sección se basan en tipo de Handel-C y comprobación de ancho. 8161 4.1 COMP FixedEq fixed_Name1 fixed_Name2 Descripción 8162 8163 Devuelve true si los operandos son iguales. Entradas 8164 número de punto fijo de fixed_Name1 8165 de cualquier tipo o ancho número de punto fijo de fixed_Name2 8166 del mismo tipo y ancho Salida de 8167 8168 Único bit ancho entero de valor con 0 como false y 1 como verdadero Descripción detallada 8169 8170 Concatenar partes entero y la fracción de fixed_Name1 en una cadena de bits único 8171 Concatenar partes entero y la fracción de fixed_Name2 en una cadena de bits único 8172 True si las cadenas de bits son iguales Resultado de retorno 8173 8174 4.2 COMP FixedNEq fixed_Name1 fixed_Name2 Descripción 8175 8176 Devuelve true si los operandos no son iguales Entradas 8177 número de punto fijo de fixed_Name1 8178 de cualquier tipo o ancho número de punto fijo de fixed_Name2 8179 del mismo tipo y ancho Salida de 8180 8181 Único bit ancho entero de valor con 0 como false y 1 como verdadero Descripción detallada 8182 8183 Concatenar partes entero y la fracción de fixed_Name1 en una cadena de bits único 8184 Concatenar partes entero y la fracción de fixed_Name2 en una cadena de bits único 8185 True si las cadenas de bits no son iguales Resultado de retorno 8186 8187 4.3 COMP FixedLT fixed_Name1 fixed_Name2 Descripción 8188 8189 Devuelve true si fixed_Name1 es menor que fixed_Name2. Entradas 8190 número de punto fijo de fixed_Name1 8191 de cualquier tipo o ancho número de punto fijo de fixed_Name2 8192 del mismo tipo y ancho Salida de 8193 8194 Único bit ancho entero de valor con 0 como false y 1 como verdadero Descripción detallada 8195 8196 Concatenar partes entero y la fracción de fixed_Name1 en una cadena de bits único 8197 Concatenar partes entero y la fracción de fixed_Name2 en una cadena de bits único 8198 True si la primera cadena de bits es menor que el segundo Resultado de retorno 8199 8200 4.4 COMP FixedLTE fixed_Name1 fixed_Name2 Descripción 8201 8202 Devuelve true si fixed_Name1 es menor o igual a fixed_Name2. Entradas 8203 número de punto fijo de fixed_Name1 8204 de cualquier tipo o ancho número de punto fijo de fixed_Name2 8205 del mismo tipo y ancho Salida de 8206 8207 Único bit ancho entero de valor con 0 como false y 1 como verdadero Descripción detallada 8208 8209 Concatenar partes entero y la fracción de fixed_Name1 en una cadena de bits único 8210 Concatenar partes entero y la fracción de fixed_Name2 en una cadena de bits único 8211 True si la primera cadena de bits es menor o igual que la segunda Resultado de retorno 8212 8213 4.5 COMP FixedGT fixed_Name1 fixed_Name2 Descripción 8214 8215 Devuelve true si fixed_Name1 es mayor que fixed_Name2. Entradas 8216 número de punto fijo de fixed_Name1 8217 de cualquier tipo o ancho número de punto fijo de fixed_Name2 8218 del mismo tipo y ancho Salida de 8219 8220 Único bit ancho entero de valor con 0 como false y 1 como verdadero Descripción detallada 8221 8222 Vuelta el resultado de FixedLT fixed_Name2 fixed_Name1 8223 4.6 COMP FixedGTE fixed_Name1 fixed_Name2 Descripción 8224 8225 Devuelve true si fixed_Name1 es mayor o igual a fixed_Name2. Entradas 8226 número de punto fijo de fixed_Name1 8227 de cualquier tipo o ancho número de punto fijo de fixed_Name2 8228 del mismo tipo y ancho Salida de 8229 8230 Único bit ancho entero de valor con 0 como false y 1 como verdadero Descripción detallada 8231 8232 Vuelta el resultado de FixedLTE fixed_Name2 fixed_Name1 8233 Bit a bit operadores lógicos 8234 Las macros en esta sección se basan en tipo de Handel-C y comprobación de ancho. 8235 COMP FixedNot fixed_Name 5.1 Descripción 8236 8237 Devuelve bit a bit no. Entradas 8238 8239 fixed_Name número de punto fijo de cualquier tipo o ancho Salida de 8240 Número de punto fijo 8241 del mismo tipo y ancho como fixed_Name Descripción detallada 8242 8243 Concatenar partes entero y la fracción de fixed_Name en una cadena de bits único 8244 Encontrar el bit a bit no de la cadena de bits 8245 Resultado de dividir en partes entero y fracción del mismo tipo y ancho como fixed_Name 8246 Retorno como struct 8247 COMP FixedAnd fixed_Name1 fixed_Name2 5.2 Descripción 8248 8249 Devuelve bit a bit y. Entradas 8250 número de punto fijo de fixed_Name1 8251 de cualquier tipo o ancho número de punto fijo de fixed_Name2 8252 del mismo tipo y ancho Salida de 8253 Número de punto fijo 8254 del mismo tipo y ancho como fixed_Name1 Descripción detallada 8255 8256 Concatenar partes entero y la fracción de fixed_Name1 en una cadena de bits único 8257 Concatenar partes entero y la fracción de fixed_Name2 en una cadena de bits único 8258 Encontrar el bit a bit y de las cadenas de bits 8259 Resultado de dividir en partes entero y fracción del mismo tipo y ancho como fixed_Name1 8260 Retorno como struct 8261 COMP 5.3 FixedOr fixed_Name1 fixed_Name2 Descripción 8262 Ensayos devuelve bit a bit o. Entradas 8264 número de punto fijo de fixed_Name1 8265 de cualquier tipo o ancho número de punto fijo de fixed_Name2 8266 del mismo tipo y ancho Salida de 8267 Número de punto fijo 8268 del mismo tipo y ancho como fixed_Name1 Descripción detallada 8269 8270 Concatenar partes entero y la fracción de fixed_Name1 en una cadena de bits único 8271 Concatenar partes entero y la fracción de fixed_Name2 en una cadena de bits único 8272 Encontrar el bit a bit o de las cadenas de bits 8273 Resultado de dividir en partes entero y fracción del mismo tipo y ancho como fixed_Name1 8274 Retorno como struct 8275 5.4 COMP FixedXor fixed_Name1 fixed_Name2 Descripción 8276 8277 Devuelve bit a bit y. Entradas 8278 número de punto fijo de fixed_Name1 8279 de cualquier tipo o ancho número de punto fijo de fixed_Name2 equipo del mismo tipo y ancho Salida de 8281 Número de punto fijo 8282 del mismo tipo y ancho como fixed_Name1 Descripción detallada 8283 8284 Concatenar partes entero y la fracción de fixed_Name1 en una cadena de bits único 8285 Concatenar partes entero y la fracción de fixed_Name2 en una cadena de bits único 8286 Encontrar el bit a bit y de las cadenas de bits 8287 Resultado de dividir en partes entero y fracción del mismo tipo y ancho como fixed_Name1 8288 Retorno como struct Operadores de conversión 8289 8290 COMP FixedIntWidth fixed_Name 6.1 Descripción 8291 8292 Devuelve el ancho de la parte entera de fixed_Name como una constante de tiempo de compilación. Entradas 8293 número de punto fijo de fixed_Name1 8294 de cualquier tipo o ancho salida de 8295 Entero de constante de tiempo de compilación de 8296 Descripción detallada 8297 8298 Retorno el ancho de la parte entera de fixed_Name 8299 COMP FixedFracWidth fixed_Name 6.2 Descripción 8300 8301 Devuelve el ancho de la parte de la fracción de fixed_Name como una constante de tiempo de compilación. Entradas 8302 número de punto fijo de fixed_Name1 8303 de cualquier tipo o ancho Salida de 8304 8305 Entero constante de tiempo de compilación Descripción detallada 8306 8307 Retorno el ancho de la parte de la fracción de fixed_Name 8308 6.3 COMP FixedLiteral isSigned intWidth fracWidth intBits fracBits Descripción 8309 8310 Devuelve un número de punto fijo firmado si isSigned es true y un número de punto fijo sin firmar si isSigned es false. Este número tiene una intBits de parte de entero de ancho int anchura y un fracBits de parte de la fracción de widthfracWidth. Entradas 8311 8312 isSigned constante de tiempo de compilación para indicar el tipo de estructura de punto fijo. 8313 Representa de FIXED_ISSIGNED firmado y FIXED_ISUNSIGNED sin signo 8314 intWidth Compile tiempo constante entero para establecer el ancho de la parte entera 8315 fracWidth compilación tiempo constante entero para establecer el ancho de la parte de la fracción para establecer la parte entera de valor intBits 8316 fracBits 8317 valor parte de la fracción Salida de 8318 8319 Firmado o número de punto fijo sin signo con anchos y valores especificados Descripción detallada 8320 Selecciona 8321 firmado o unsigned tipo para emitir la estructura utilizando isSigned 8322 Regreso un número de punto fijo con una parte entera de intBits de intWidth y el valor de ancho y una parte de la fracción de fracBits de fracWidth y el valor de ancho 8323 COMP FixedToInt fixed_Name 6.4 Descripción 8324 8325 Devuelve la parte entera del número de punto fijo con el mismo tipo y el ancho. Entradas 8326 número de cualquier tipo o ancho de punto de 8327 fixed_Name fijo Salida de 8328 8329 Entero del mismo tipo y ancho como la parte entera del número se almacena en la estructura de punto fijo Descripción detallada 8330 8331 Retorno la parte entera del número de punto fijo 8332 6.5 COMP FixedToBool fixed_Name Descripción 8333 8334 Devuelve un único bit valor de ancho unsigned int que es 0 para false si es igual el operando a 0 y 1 para verdadero lo contrario. Entradas 8335 8336 fixed_Name número de punto fijo de cualquier tipo o ancho Salida de 8337 8338 Único bit ancho entero de valor con 0 como false y 1 como verdadero Descripción detallada 8339 8340 Retorno 1 si el fijo y las partes de la fracción de fixed_Name son ambos no es igual a cero y 0 de lo contrario 8341 COMP 6 6 FixedToBits fixed_Name Descripción 8342 8343 Devuelve los bits entero y la fracción de fixed_Name concatenada juntos. Entradas 8344 8345 fixed_Name número de punto fijo de cualquier tipo o ancho Salida de 8346 8347 Entero del mismo tipo como la estructura de punto fija y con ancho intWidth + fracWidth Descripción detallada 8348 Retorno 8349 la parte entera y la parte de la fracción del número de punto fijo se concatenan juntos 8350 6.7 COMP FixedCastSigned isSigned intWidth fracWidth fixed_Name Descripción 8351 Moldes 8352 cualquiera firmado el número de punto fijo para el tipo y el ancho especificado. Entradas 8353 8354 isSigned constante de tiempo de compilación para indicar el tipo de estructura de punto fijo. 8355 Representa de FIXED_ISSIGNED firmado y FIXED_ISUNSIGNED sin signo 8356 intWidth ancho para emitir la parte entera de la serie a 8357 fracWidth ancho para emitir la parte de la fracción del número para 8358 fixed_Name número de punto fijo de tipo firmado y cualquier ancho Salida de 8359 Número de punto fijo 8360 del tipo especificado Descripción detallada 8361 8362 Ajustar la parte entera de fixed_Name a un ancho de intWidth tomando los bits menos significativos de intWidth o la ampliación de la señal. 8363 De ajuste de la parte de la fracción de fixed_Name a un ancho de fracWidth teniendo el frac bits más significativos de ancho o agregando bits con valor cero en después del número. 8364 Si isSigned es true a continuación convierte el entero y partes de la fracción de la flotante punto número como firmado 8365 Si isSigned es false a continuación convierte el entero y partes de la fracción de la flotante punto número como sin signo Regreso el resultado como una estructura de 8366 8367 6.8 COMP FixedCastUnsigned isSigned intWidth fracWidth fixed_Name Descripción 8368 Moldes 8369 cualquier número de punto fijo sin firmar el tipo y el ancho especificado. Entradas 8370 8371 isSigned constante de tiempo de compilación para indicar el tipo de estructura de punto fijo. 8372 Representa de FIXED_ISSIGNED firmado y FIXED_ISUNSIGNED sin signo 8373 intWidth ancho para emitir la parte entera de la serie a 8374 fracWidth ancho para emitir la parte de la fracción del número para 8375 fixed_Name número de punto fijo de tipo sin signo y cualquier ancho Salida de 8376 Número de punto fijo 8377 del tipo especificado Descripción detallada 8378 8379 Ajustar la parte entera de fixed_Name a un ancho de intWidth por tomar la intWidth bits menos significativos o agregando bits con valor cero en delante del número. 8380 De ajuste de la parte de la fracción fuera fixed_Name a un ancho de fracWidth por tomar la fracWidth bits más significativos o agregando bits con valor cero en después del número. 8381 Si isSigned es true a continuación convierte el entero y partes de la fracción de la flotante punto número como firmado 8382 Si isSigned es false a continuación convierte el entero y partes de la fracción de la flotante punto número como sin signo Regreso el resultado como una estructura de 8383 Verificación de 8384 8385 Esta sección documenta todas las pruebas necesarias para comprobar que cada macro funciona correctamente. Es importante que las macros coinciden con sus definiciones en las subsecciones anteriores. Resultados y los errores mediante pruebas de caja negra se pueden probar todas las macros disponibles para el usuario. Las pruebas de tiempo de ejecución 8386 8387 El tipo que se realizan son 8388 Positivo P 8389 Negativo N Volumen 8390 y el estrés V S Comparación de 8391 C Demostración de 8392 D 8393 Las pruebas se realizan sólo sobre el número de bits de 8 y 32 aparte de cuando parece apropiado utilizar otros anchos también para probar plenamente la macro como para FixedIntWidth. Las pruebas se realizan en números sin signo y firmados además de cuando esto no es posible porque la macro está diseñada sólo para un tipo. Por lo general las pruebas tienen por objeto 8394 Los valores cero P V S C D 8395 Los valores de rango medio P V S C D 8396 Los valores de desbordamiento N V S C D 8397 Los resultados esperados para las pruebas de comparación se han calculado utilizando la calculadora de Microsoft Pruebas de error 8398 8399 Estas son las pruebas que se pueden producir no graves errores del compilador. Deberían ser ambos mensajes de error de Handel-C estándar dirigidos a las funciones utilizadas o hacer valer los errores que se definen en la biblioteca. Por lo general las pruebas realizadas pueden ser 8400 introduciendo un número entero en donde debe haber una estructura de punto fija 8401 introduciendo un firmado estructuras de punto fijo donde debería haber un signo punto fijo estructura y viceversa 8402 ingresa dos estructuras punto fijos de ancho en la macro de la misma o diferentes tipos 8403 introduciendo un número entero de ancho incorrecta 8404 variables ingresa cuando se requiere una constante resultado de punto fijo de 8405 asignar a una estructura de punto fija de tipo incorrecto o ancho 8406 asignar resultado entero a un int de tipo incorrecto o ancho Pruebas de rendimiento 8407 8408 Todas las macros tomar sólo un ciclo de reloj para ejecutar. En el caso de los operadores aritméticos el número de divisiones y velocidad máxima puede calcularse para comparar con el operador de Handel-C adecuado. Analsis de forma de onda Ventana de seguimiento/patrón 8409 8410 FIG. 93 muestra una ventana de traza y patrón 9300. En la ventana de traza y patrón 9302 la mitad superior de la ventana muestra los detalles de seguimiento o patrón. La parte 9304 la mitad inferior de la ventana muestra los valores y las posiciones de las marcas que se han definido en el seguimiento o patrón. Las marcas se denominan cursores y representadas por triángulos colores. 8411 En una encarnación ilustrativa la traza actual es out-lined con una línea discontinua verde. El cursor actual tiene un subrayado en rojo. El botón derecho en la forma de onda de seguimiento o el panel de valor actual se abre un menú de formatos de visualización posible para ese panel. Múltiples huellas o patrones en una sola ventana pero todos usan los cursores mismos el mismo número de puntos y el mismo período de reloj. Ampliación 8412 8413 A un usuario puede hacer zoom en y fuera de la ventana activa de seguimiento o patrón mediante los iconos de zoom o las opciones de Zoom en el menú Ver. Diálogo set paso de avance de 8414 8415 De el paso de avance conjunto de diálogo capturar gt Definir paso de avance especifica el tiempo en nanosegundos para avanzar en todas las simulaciones por. Menú de captura 8416 8417 Varios elementos de un menú de captura de acuerdo a una encarnación de la presente invención incluyen lo siguiente en el cuadro 23. 86TABLE 23 Run F5 iniciar lectura trazas de simulaciones y envío de patrones a simulaciones. Pausa detener temporalmente el envío de huellas a simulaciones y lectura de patrones de simulaciones. Esto también podrá suspender todos conectados simulaciones. Parada de parada de lectura de huellas de simulaciones y envío de los patrones Mayús + F5 a simulaciones. Simulaciones pueden continuar ejecutando después de analizador de forma de onda se ha detenido. Avance Avanzar todos simulaciones por el intervalo especificado. Ctrl + F11 Establecer Advance especificar el intervalo que se debe avanzar en simulaciones paso cuando se selecciona 'Advance'. Se abre paso de avance establecer diálogo. 8418 Definir el cuadro de diálogo de símbolos 8419 Símbolos de definir el cuadro de diálogo consta de un conjunto de botones de radio que permiten la selección de valores de proa están representados Binario 8420 8421 Octal Decimal 8422 Números hexadecimales 8423 Caracteres ASCII 8424 Cadenas definidas por el usuario 8425 el usuario puede suministrar el nombre de archivo de un archivo de símbolos se asocia con valores para la traza que se está definiendo. Cada línea de este archivo debe contener un número en binario octal decimal o hexadecimal utilizando la sintaxis de Handel-C seguida de un símbolo. El símbolo debe separarse del número utilizando un espacio en blanco. Los valores que pueden aparecer en la traza y que no tienen símbolos asociados con ellos pueden representarse mediante el ' ' carácter. Por ejemplo si la traza es de ancho 3 está sin firmar y el archivo de símbolos definidos de usuario contiene lo siguiente 0b001 87 un c de d 0b110 de 0b111 8426 0b101 b 8427 los valores 1 5 6 y 7 podrán estar representados como A B C y d respectivamente. Los valores 0 2 3 y 4 podrán estar representados todos como signos de interrogación. Menú de edición 8428 Elementos 8429 en el menú edición son los establecidos en la tabla de 24. 88TABLE 24 buscar buscar una secuencia específica de patten de palabras en el seleccionado traza o Ctrl + F de datos. Se solicita al usuario una declaración de PGL que describe la secuencia de palabras a buscar la dirección de búsqueda y si para desplazarse a la secuencia si lo encuentra. La búsqueda comienza en la posición del cursor seleccionado. Si no hay ningún cursor comienza en el comienzo de la traza seleccionado o el patrón de búsqueda. Si se encuentra la secuencia se coloca el cursor seleccionado al comienzo de la secuencia. Si no hay ningún cursor se crea un cursor al comienzo de la secuencia. Copia copiar la parte seleccionada de la traza seleccionado o el Portapapeles de patrón para la Ctrl + C . Pegar Pegar el contenido del Portapapeles en el patrón seleccionado de la parte seleccionada de la Ctrl + V . Guardar guardar la parte seleccionada de la traza seleccionado o patrón en un archivo. Selección como... Se solicita al usuario un nombre de archivo y si el archivo es un archivo VCD un nombre de referencia que se utilizará para la señal en el archivo VCD. Menú de archivo 8430 Elementos 8431 en el menú edición son los establecidos en la tabla 25. 89TABLE 25 nuevo abierto un nuevo diálogo de seguimiento o patrón. El usuario es Ctrl + N se le solicite para el tipo de ventana un nombre de archivo en la ventana y el período de reloj y el número de puntos de la ventana. El período de reloj y el número de puntos que el usuario especifica pueden utilizarse para todos los rastros o patrones en la ventana. Abrir abrir un archivo de patrón o traza existente. Ctrl + O Cerrar cerrar la ventana activa de seguimiento o patrón. Guardar Guardar la ventana activa de seguimiento o patrón. Ctrl + S Guardar como guardar la ventana activa de seguimiento o patrón con un nombre diferente. Guardar todos guardar todas las trazas y patrón de ventanas abiertas. Nuevo proyecto de crear un nuevo proyecto. Abrir proyecto abrir un proyecto existente. Cerrar cierra el proyecto actual. Proyecto Guardar proyecto guardar el proyecto actual. Imprimir imprimir la ventana activa de seguimiento o patrón. Impresión de instalación los detalles de la impresora. Imprimir Vista previa de la ventana activa de seguimiento o patrón. Vista previa de la lista de archivos a recientes de los archivos utilizados recientemente de seguimiento o patrón. Recientemente una lista de proyectos utilizados recientemente. Proyectos de salida cerrar todas las ventanas y salir de la aplicación. Cuadro de diálogo Nueva ventana 8432 8433 El nuevo cuadro de diálogo de ventana archivo gt Nueva define el período predeterminado de reloj y el número de puntos en la ventana. Los elementos son los establecidos en la tabla 26. 90TABLE cuadro sin título 26 entrar el reloj de predeterminado de ventana nombre Introduzca el período predeterminado de reloj en nanosegundos período predeterminado de núm. Introduzca el número de puntos que se registran en la ventana puntos de nombre de archivo y el archivo donde los detalles de la ventana son almacenado utilice el botón examinar de ubicación para elegir un directorio Menú de patrón 8434 Elementos 8435 en el menú edición son los establecidos en la tabla 27. 27 Nuevo patrón de 91TABLE crear un nuevo patrón en la ventana activa de patrón. Editar editar patrón el patrón seleccionado en la ventana activa de patrón. Eliminar patrón quitar el patrón seleccionado de la ventana activa de patrón. Cuadro de diálogo Propiedades de patrón de 8436 8437 Los campos en el cuadro de diálogo de propiedades del modelo son los establecidos en la tabla 28. 92TABLE 28 nombre nombre para el patrón. El nombre se muestra en un cuadro de la izquierda de la ventana de patrón. El nombre puede ser un identificador de estilo C. Ancho ancho de los datos en el patrón de bits. Tipo si el patrón representa datos o sin signo. Señala el número de puntos en el patrón. Este valor se especificó cuando se creó la ventana de patrón. No pueden editarse. Frecuencia de reloj de período en el que los datos se leen en el patrón. Este valor se especificó cuando se creó la ventana de patrón. No pueden editarse. Origen de la fuente para el patrón puede ser un archivo o una secuencia de comandos. Admite formatos de archivo son ASCII y VCD. El cuadro a la derecha de los botones de opción se utiliza para escribir una secuencia de comandos si se activa el botón de radio 'Script' o un nombre de archivo si se activa el botón de radio 'Archivo'. Variable si el origen es un archivo VCD este cuadro debe utilizarse para introducir el nombre de referencia de la variable en el archivo VCD que se puede utilizar como origen para este patrón. Destino expresión de la forma 'Terminal-Name width ' como para el plugin de DK1Connect desencadenador de transmisión de un patrón puede ser activada por la aparición de una secuencia de palabras en cualquier traza especificada. Este cuadro se utiliza para especificar qué secuencias de palabras y que disparo de seguimiento debe ocurrir en si esta casilla está vacía no se utiliza ningún desencadenador y todas las opciones adicionales de desencadenador aparecen atenuadas. Demora especifica el retraso del desencadenador. Para patrones esto puede ser positiva. Un retraso de x significa que la transmisión comienza x unidades de tiempo después de que se produce una secuencia de desencadenador. No elija el modo de desencadenador. Solo desencadenador/ningún desencadenador desencadenando es desactivado. Automático sencillo un patrón se transmite una vez después de que se produce una secuencia de desencadenador. Auto un patrón se transmite después de cada aparición de una secuencia de desencadenador. Pausar sobre si está marcada esta casilla de verificación captura de mayo desencadenador obtener pausa automáticamente después de que se ha producido una secuencia de desencadenador y se ha transmitido un patrón. Este conjunto de radio botones se utilizan para elegir la forma de onda / Mostrar formato para el patrón de interpolados. Forma de onda escalonada / numérico simbólico definir Seleccione cómo son los valores representados símbolos cuadro de diálogo da 8438 De agrupación Windows en proyectos 8439 Trace y patrón de Windows pueden agruparse juntos en proyectos. Un único proyecto puede estar abierto a la vez. El usuario puede crear un proyecto si él o ella desea utilizar una secuencia de comandos de lenguaje de generación de patrón de archivo. 8440 Creación de un proyecto Analizador de forma de onda abierta 8441 y seleccione Nuevo proyecto en el menú Archivo. 8442 In-a diálogo box aparece pide al usuario que seleccione un nombre de archivo para el nuevo proyecto. Nombres de archivo de proyecto tienen un '.APJ' extensión. Menú de secuencia de comandos 8443 8444 El menú script incluye los siguientes elementos Secuencia de comandos de edición 8445 ... Editar la secuencia de comandos PGL para el proyecto actual. Diálogo de seguimiento 8446 Cuadro de diálogo de campos 8447 en las propiedades de traza Trace gt Nueva traza incluyen el siguiente conjunto de enunciados en la tabla 29. Función de campo 29 de 93TABLE nombre nombre para la traza. Este nombre puede mostrarse en un cuadro de la izquierda de la ventana de traza. El nombre también puede utilizarse como parte de la especificación de una desencadenador para esta o cualquier otra huella. El nombre puede ser un identificador de estilo C. Ancho ancho de los datos en la traza en bits. Escriba si la traza representa datos o sin signo. Señala el número de puntos en la traza. Este valor fue introducido al crea la ventana de traza. No pueden editarse. Período velocidad a la que los datos se leen en la traza. Este valor fue introducido al crea la ventana de traza. No pueden editarse. Puertos de expresión la traza es conectada a. La expresión puede ser de tipo 'Terminal-Name width ' como para el plugin DK1 conectar o una expresión de Handel-C con las expresiones de la forma 'Terminal - Name width ' en lugar de variables. Volcado de archivo escriba un nombre de archivo para capturar la traza en un archivo. Dos formatos de archivo archivos ASCII y el cambio de valor de Verilog volcar archivos. Si el nombre de archivo termina en '.VCD ' '.DMP 'o'.VOLCAR ' un cambio de valor que volcar archivo puede ser lo contrario produjo un ASCII archivo puede ser producida. Puede utilizar el botón Examinar para seleccionar un nombre de archivo. Si no se introduce ningún nombre de archivo no puede producirse ningún archivo de volcado. Variable si el archivo de volcado es un archivo de volcado de cambio de Verilog valor escriba el nombre que podría ser utilizado como el nombre de referencia de la señal en el archivo VCD. Desencadenador especifica qué secuencias de palabras de disparo deben ocurrir en que si esta casilla está vacía no se utiliza ningún desencadenador y todos desencadenan más aregrayed de opciones de salida. Demora Especifica el retraso del desencadenador. Esto puede ser positivo o negativo. Si un retraso positivo x se utiliza capturando comienza x unidades de tiempo después de que se produce una secuencia de desencadenador. Si se utiliza un retraso negativo capturando comienza x unidades de tiempo antes de que ocurra una secuencia de desencadenador. Modo sin seleccionar desencadenador de desencadenador sencillo/Auto. Ningún desencadenador desencadenando está desactivado. Único una traza es capturada una vez después de que se produce una secuencia de desencadenador. Auto una traza es capturado después de cada aparición de una secuencia de desencadenador. Pausa en el desencadenador si esta casilla de verificación está marcada en capturar puede automáticamente obtener pausa después de que se ha producido una secuencia de desencadenador y un seguimiento ha sido capturado. Seleccione interpolados Mostrar formato para seguimiento. Forma de onda/Stepped forma de onda/numérico simbólico definir símbolos da Seleccione cómo son los valores diálogo representado Menú de seguimiento 8448 Campos 8449 en el menú de seguimiento son los establecidos en la tabla 30. 94TABLE 30 nueva traza crear una nueva traza de la ventana activa de la traza. Editar editar traza la traza seleccionada en la ventana activa de la traza. Eliminar quitar traza la traza seleccionada de la ventana activa de la traza. Menú de vista 8450 8451 Los elementos disponibles en el menú de vista son los establecidos en la tabla 31. Barra de herramientas de 95TABLE 31 alternar la barra de herramientas de encendido/apagado. Barra de estado Alternar la barra de estado de encendido/apagado. Zoom Max Zoom en la máxima medida en el centro de la ventana activa de seguimiento o patrón. Zoom en Zoom en el centro de la ventana activa de seguimiento o patrón. Zoom Out alejar del centro de la ventana activa de seguimiento o patrón. Alejar Min Zoom en la máxima medida desde el centro de la ventana activa de seguimiento o patrón. Zoom en acercar el Cursor sobre el cursor seleccionado en la ventana activa de seguimiento o patrón. Saltar al desplazamiento del Cursor al cursor seleccionado en la ventana activa de seguimiento o patrón. Cursor nuevo crear un cursor de nuevo en el centro de la ventana activa de seguimiento o patrón. Cursor de borrado eliminar el cursor seleccionado de la ventana activa de seguimiento o patrón. 8452 Iconos de la barra de herramientas 8453 94 FIG. ilustra sus funciones y varios iconos de la barra de herramientas 9400 9402. Menú de la ventana 8454 Elementos 8455 en el menú de la ventana son los establecidos en la tabla 32. Cascada de 32 96TABLE en cascada todos ventanas abiertas. Azulejos y baldosas mosaico todos ventana abierta. Organizar que iconos automáticamente organización ventanas de trace y patrón de todo minimizadas. Interfaz de analyzer 8456 8457 La interfaz de analizador de forma de onda consta de barra de menús de 8458 barra de herramientas de 8459 área del espacio de trabajo de 8460 abrirán cualquier windows traza o patrón de 8461 ventana de salida de registro 8462 utiliza el programa para informar de errores al usuario. 8463 El usuario puede agrupar windows traza o patrón juntos en un proyecto. Proyectos contienen un número de seguimiento o patrón de windows los abiertos cuando durante la última guardar del proyecto y secuencias de comandos escritas en el proyecto. Menús 8464 Menú de archivo 8465 8466 Nuevo cuadro de diálogo de windows archivo gt Nueva Menú de edición 8467 Menú de vista 8468 Menú de seguimiento 8469 Diálogo de seguimiento 8470 Menú de patrón 8471 Cuadro de diálogo de propiedades de patrón de 8472 Diálogo de símbolos de definir 8473 Menú de secuencia de comandos 8474 Menú de captura de 8475 Menú de la ventana 8476 Menú de ayuda de 8477 Lenguaje de generación de patrones de 8478 El analizador de forma de onda 8479 utiliza lenguaje de generación de patrón PGL como un lenguaje de secuencias de comandos para generar patrones. PGL tiene un poder expresivo similar a las expresiones regulares pero utiliza una sintaxis similar a C. 8480 The PGL puede utilizarse para desencadenar en una secuencia de datos y la búsqueda de una secuencia de datos en una traza o patrón. 8481 Cuando se ejecuta un programa PGL genera una secuencia de valores. Cuando se utiliza para la activación o búsqueda un programa en PGL puede coincidir con cualquier secuencia que podría generar tales como Declaraciones de PGL 8482 Funciones PGL 8483 Coincidencia de wild-card 8484 Sintaxis de lenguaje de generación de patrones de 8485 8486 Utilizando el analizador de forma de onda 8487 El analizador de forma de onda se conecta con los puertos en simulaciones de Handel-C. Muestra los resultados de simulaciones de Handel-C como formas de onda huellas . Así un usuario puede generar insumos para simulaciones de Handel-C y mostrarlos como formas de onda patrones . El usuario también puede manipular las entradas simuladas y salidas de la misma manera que de entrada y señales de salida de una pieza real de hardware pueden ser manipuladas con un analizador de forma de onda. Una lista parcial de maneras en que el analizador de forma de onda puede ser usado sigue. 8488 Huellas de conexión a puertos en simulaciones de Handel-C de salida 8489 Patrones de conexión a los puertos en simulaciones de Handel-C de entrada 8490 El analizador de forma de onda de conexión a los puertos conectados a otra simulación utilizando el plugin de DK1Share conexión en paralelo 8491 Medir las diferencias entre los valores y a veces en huellas o patrones de uso de marcas de cursor. 8492 Patrones de creación por escribir secuencias de comandos mediante un lenguaje de generación de patrones o copiando las trazas existentes o patrones en una ventana de patrón. Patrones también se pueden leer de un archivo. 8493 De desencadenadores de especificación en el lenguaje de generación de patrón 8494 Traza o generar patrones cuando aparece un desencadenador especificado en una traza de captura 8495 Encontrar un patrón especificado en una ventana de seguimiento o patrón Funciones 8496 en PGL PGL 8497 permite al usuario definir y llamar a las funciones que se pueden tomar parámetros. Pueden definir sólo funciones en un proyecto abierto. Las funciones se almacenan en el archivo de script.pgl asociado con ese proyecto. El usuario puede editar este archivo fuera el analizador de forma de onda. Funciones de definición 8498 8499 Para definir funciones el proyecto donde las funciones son a utilizarse se abre. Se selecciona el icono 'Editar Script' en la barra de herramientas. Como alternativa se puede seleccionar editar secuencias de comandos en el menú Script la script.pgl de archivo se abre en el Bloc de notas. Este archivo se encuentra en el mismo directorio que el archivo de proyecto. Ejemplo de 8500 8501 En el ejemplo siguiente define dos funciones uno llamado aumento de borde y la otra llamada rectangular_wave. rising_edge 97 {0 1 } rectangular_wave hival hicount loval locount Cycles {bucle ciclos {loop hicount hival Loop locount loval } } 8502 Se puede llamar la función de rectangular_wave con una instrucción como la siguiente rectangular_wave 1 5 0 5 10 8503 Wild-card 8504 coincidentes en disparo o búsqueda 8505 Cuando PGL un programa se utiliza para la activación o la búsqueda puede contener un ' ' caracteres en cualquier lugar donde podría ir un número o variable. Este personaje representa 'cualquier valor'. Por ejemplo el comando compuesto {1 1 } coincidirá contra cualquier secuencia de 3 palabra comenzando y terminando con un 1. Si 8506 ' ' se utiliza como parámetro real en una llamada a la función cuando se llama a la función el parámetro formal que corresponde a la ' ' no tiene un valor asignado. 8507 Si una variable se encuentra que no tiene ningún valor asignado se obtiene le asignará un valor según los valores encontrados durante la combinación. 8508 Partidos contextuales pueden llevarse a cabo de esta forma. Por ejemplo si una función es definida como sigue count_fives a 8509 8510 {una loop a 5 } 8511 y se llama mediante la instrucción ' count_fives ' que puede coincidir cualquier secuencia que consta de un número seguido de ese número de cincos incluyendo la secuencia '0' . Esta función debe utilizarse con sumo cuidado ya que es posible utilizar escribir funciones que toman mucho tiempo para hacer coincidir. Declaraciones de PGL 8512 8513 La generación de patrón idioma consta de una o más instrucciones terminadas con puntos y comas. Declaraciones pueden incluir números identificadores y wild-cards. Una declaración de PGL puede ser uno de los siguientes Declaración de expresión 8514 8515 Por ejemplo 1 8516 8517 Cuando se ejecuta una instrucción de expresión que genera el valor de la expresión. 8518 Una instrucción de expresión utilizada para la coincidencia también puede ser de la forma 8519 1 8520 A esta declaración puede coincidir con cualquier valor excepto 1. Comando compuesto 8521 8522 Por ejemplo {0 1 } 8523 Las declaraciones entre las llaves se ejecutan de forma secuencial. Instrucción de bucle de 8524 8525 Por ejemplo loop 3 {0 1 } 8526 El cuerpo de este bucle puede obtener ejecutado 3 veces. Instrucción condicional 8527 8528 Por ejemplo if a==1 8529 {0 1 } else {1 0 } Aquí 8530 dependen de las declaraciones que se ejecutan en el valor de la variable una. 8531 A un usuario puede generar pruebas booleanas utilizando los siguientes operadores a utilizar para la condición en una instrucción condicional == 8532 = .paralelo. Instrucción switch de zksoftms Propuesto por ejemplo switch a 98 {caso 1 0 1 Break por defecto 1 0 Break } 8535 Esta sentencia switch logra lo mismo que el si instrucción else descrito anteriormente. 8536 Hacer valer la declaración 8537 Por ejemplo 8538 assert un = 0 8539 Se puede usar este tipo de declaración cuando coincidencia para colocar las restricciones sobre coincide con las variables. 8540 Wild-card de coincidencia en PGL 8541 Si se utiliza un programa PGL para desencadenar o búsqueda un ' ' carácter puede utilizarse en cualquier lugar donde podría ir un número o variable. Este personaje representa 'cualquier valor'. Por ejemplo el comando compuesto {1 1 } coincidirá contra cualquier secuencia de 3 palabra comenzando y terminando con un 1. Si 8542 ' ' se utiliza como parámetro real en una llamada a la función cuando se llama a la función el parámetro formal que corresponde a la ' ' no tiene un valor asignado. Si una variable se encuentra que no tiene ningún valor asignado se obtiene le asignará un valor según los valores encontrados durante la combinación. Partidos contextuales pueden llevarse a cabo de esta forma. Por ejemplo una función definida como sigue count_fives a 8543 8544 {una loop a 5 } 8545 Si esto se llama mediante la instrucción ' count_fives ' que puede coincidir cualquier secuencia que consta de un número seguido de ese número de cincos. Incluyendo la secuencia '0' . Esta función debe utilizarse con sumo cuidado ya que es posible utilizar escribir funciones que toman mucho tiempo para hacer coincidir. 8546 Es un error usar la ' 'expresión declaraciones de expresión empezando por' ' y hacer valer las declaraciones en programas PGL que se utilizan para generar patrones. 8547 Conexión en paralelo 8548 Si se desea conectar el analizador de forma de onda a los puertos que están conectados a otra simulación esto se puede hacer uso de la DK1Share.dll. Ejemplo de 8549 seg7_output de bus_out de interfaz 99 sin signo 7 salida 1 = encode_out con {extlib="DK1Share.dll" extinst = "cuota = {extlib = lt 7segment.dll gt extinst = lt A gt extfunc = lt PlugInSet gt } cuota = {extlib = lt DK1Connect.dll gt extinst = lt SS 7 gt extfunc = lt DK1ConnectGetSet gt }" extfunc = "dk1sharegetset"} 8550 Este ejemplo utiliza DK1Share.dll para compartir el seg7_output.output1 del puerto de salida entre la visualización de 7 segmentos conectada a la terminal A y DK1Connect conectado a la terminal SS 7 . Un usuario a continuación puede rastrear la salida va a la pantalla de 7 segmentos usando SS 7 como la expresión en la ventana de propiedades de traza 8551 Encontrar una secuencia de datos en una traza o patrón 8552 Para encontrar una secuencia de datos se activa la ventana que contiene el seguimiento o el patrón que se busca. Si hay múltiples huellas o patrones en la ventana el seguimiento deseado o el patrón está seleccionada. La Edición gt Buscar el elemento de menú seleccionado. Una declaración de PGL o función se introduce en el ' Buscar ' el cuadro en el cuadro de diálogo Buscar. Patrones de generación 8553 8554 Generar un patrón de una traza existente o patrón Datos 8555 es copiados de un seguimiento o patrón en el Portapapeles y a continuación el contenido del Portapapeles se pega en un patrón. Se selecciona una región de un seguimiento o patrón tales como arrastrando el puntero del mouse sobre la región para seleccionarlo. La región se copia en el portapapeles seleccionando Copiar en el menú Edición o con el icono en la barra de herramientas de copia. Se activa una ventana de patrón y se selecciona una región para pegar sobre o un cursor. Pegar está seleccionada en el menú Editar o hacer clic en el icono de pegar en la barra de herramientas en. 8556 Si se ha seleccionado una región en las que el contenido del Portapapeles se pega en el patrón seleccionado desde el principio de la región seleccionada. Si se ha seleccionado un cursor el contenido del Portapapeles se pega en la ventana empezando en la posición del cursor seleccionado. 8557 Generando un patrón de una declaración de PGL Secuencia de comandos 8558 está seleccionado como la fuente de patrón en las propiedades del patrón de diálogo. La llamada de función o declaración de PGL es introducida en el cuadro a la derecha del botón. 8559 Generar un patrón a partir de un archivo Archivo 8560 está seleccionado como la fuente de patrón en las propiedades del patrón de diálogo. El nombre de archivo es introducido en el cuadro a la derecha del botón. Se utiliza el botón Examinar para buscar un archivo. Limitaciones de generación de patrón 8561 8562 Es un error usar la ' 'expresión declaraciones de expresión empezando por' ' y hacer valer las declaraciones en programas PGL que se utilizan para generar patrones. Generación de patrón complejo 8563 8564 Patrones más complejos pueden requerir utilizando un programa separado de Handel-C para realizar la generación de patrón. Tiempo de medición 8565 y el valor de las diferencias en Windows El usuario 8566 puede medir el tiempo entre dos eventos y la diferencia en el valor de una señal en dos momentos diferentes mediante la colocación de marcas en el seguimiento y el patrón de Windows. Estas marcas están representadas por triángulos colores y pueden ser denominadas cursores. Un cursor está siempre activado. 8567 Los triángulos de cursor se colocan en el panel de la ventana de seguimiento o patrón de tiempo. Si hay más de un cursor en el panel de tiempo el panel de tiempo muestra las diferencias de tiempo entre cursores. El panel del centro de la parte inferior muestra la posición absoluta en el tiempo de todos los cursores. Las diferencias de valores entre los cursores se muestran en el panel de la parte inferior izquierda. 8568 Si múltiples huellas o patrones se muestran en una ventana los valores dados son los de la traza seleccionado o patrón. Cursores de crear 8569 8570 Haga clic en el icono de cursor de nuevo en la barra de herramientas o seleccione el Cursor de nuevo en el menú Ver. El cursor puede añadirse al centro del panel de la ventana activa de seguimiento o patrón de tiempo. Cursores de mover 8571 Arrastre el cursor en el panel de tiempo de 8572 Cursores de selección 8573 8574 Haga doble clic en un cursor. Una barra roja puede aparecer debajo de él para mostrar que está seleccionado. De forma predeterminada el primer cursor creado es la seleccionada. Puede seleccionar sólo un cursor en un momento. Cursores de eliminar 8575 Seleccione 8576 el cursor que se eliminarán. Haga clic en el icono Eliminar el Cursor en la barra de herramientas o seleccione Eliminar el Cursor en el menú Ver. 8577 Conexión a un puerto de un patrón 8578 Para conectar un patrón a un puerto se llevan a cabo los siguientes pasos 1 8579 . escribir y compilar código de Handel-C para conectar a un puerto de Handel-C a un terminal mediante la DK1Connect y los plugins de sincronización DK1. 2 8580 . configurar una patrón de ventana en el analizador de generar una señal a la terminal con nombre. 3 8581 . simular el código de Handel-C y empezar a transmitir el patrón 8582 Escribir el programa de Handel-C 8583 Para escribir un programa en c de Handel abrir Handel-C cree un nuevo proyecto y escriba el siguiente programa reloj set 100 = externos "P1" con {extlib = "DK1Sync.dll" extinst = "50" extfunc = "dk1syncgetset"} ib1 de bus_in sin signo 1 en con la interfaz {extlib = "DK1Connect.dll" extinst = "t 1 " extfunc = "dk1connectgetset"} unsigned Conde 5 = 0 void main void {mientras 4 de Conde .parallel. count 2 {si ib1.in == 0 {retrasar Si ib1.in == 1 conde ++ } else retrasar } } 8584 Nota este programa utiliza el plugin DK1Connect para conectar el puerto ib1.in a la terminal t 1 el programa sólo puede terminar cuando se ha detectado 20 bordes aumento desde el puerto de ib1.in. Conjunto 8585 una ventana de patrón 8586 Para establecer una ventana de patrón se llevan a cabo los siguientes pasos generales 1 8587 . Abrir el analizador de forma de onda. 2 8588 . En el analizador de forma de onda seleccione nuevo en el menú Archivo y crear un nuevo modelo con un nombre de archivo con 40 como el número de puntos y 50 como el período de reloj. 3 8589 . Aparecerá una ventana vacía de patrón. Seleccione nuevo patrón en el menú de patrón o de la barra de herramientas e introduzca las siguientes propiedades en el cuadro de diálogo. Nota 33 de la tabla. 101 33 Nombre de tabla testpattern ancho 1 tipo fuente sin signo botón de opción Seleccione secuencia de comandos. Introduzca podría {0 1 } en el cuadro. Variable En gris. Destino t 1 desencadenador deje la casilla en blanco. Otras opciones de configuración deben ser atenuados. Demora Atenuado con 0 como predeterminado de visualización botón de comprobar la forma de onda Stepped radio 4. Haga clic en Aceptar. Transmisión de inicio 8590 8591 Para iniciar la transmisión la simulación de tun Handel-C. Iniciar la transmisión haciendo clic en el icono de ejecutar en la barra de herramientas o seleccionando Ejecutar en el menú de la captura. El programa de Handel-C debería terminar poco después de que se inicia la transmisión. Para detener la captura haga clic en el icono de detención en la barra de herramientas o seleccione Detener en el menú de la captura. 8592 Iniciar el analizador de forma de onda 8593 Para iniciar el analizador de forma de onda 8594 Seleccione Inicio gt Programas gt DK1 diseño Suite gt analizador de forma de onda o 8595 Haga doble clic en el icono del archivo analyzer.exe en el directorio DK1.backslash.Bin. 8596 Conexión de una simulación a una traza 8597 Para conectar una simulación con una traza 1 8598 . escribir y compilar código de Handel-C para conectar a un puerto de Handel-C a un terminal mediante el DK1Connect 8599 y los plugins de sincronización DK1. 8600 2. configurar una ventana de seguimiento en el analizador de que lee la señal de la terminal con nombre. 8601 3. simular el código de Handel-C y empezar a capturar 102 Muestra Handel-C programa conjunto reloj = externos "P1" con {extlib = "DK1Sync.dll" extinst = "50" extfunc = "DK1 SyncGetSet"} unsigned x 3 = 0 interfaz bus_out ob1 unsigned 3 salida = x con {extlib = "DK1Connect.dll" extinst = "t 3 " extfunc = "DK1ConnectGetSet"} void main void {while 1 x ++ } 8602 Nota este programa utiliza el plugin DK1Connect para conectar el puerto ob1.out a la terminal t 3 . Compilar el programa pero no ejecutarlo. Conjunto 8603 una ventana de traza 8604 Para crear una ventana de traza analizador de forma de onda abierta. En la forma de onda Analyzer seleccione nuevo en el menú Archivo y crear una nueva traza. Seleccione el botón Examinar para especificar un nombre de archivo y una ubicación. Conjunto predeterminado de reloj Período a 50 y no de forma predeterminada. puntos a 40. 8605 Debe aparecer una ventana vacía de la traza. Seleccione Nueva traza en el menú de seguimiento o de la barra de herramientas e introduzca las siguientes propiedades en el cuadro de diálogo. Nota 34 de la tabla. 103 34 Nombre de tabla testtrace ancho tipo 3 expresión sin signo t 3 archivo de volcado dejar en blanco Variable atenuado desencadenador deje la casilla en blanco. Otras opciones de configuración deben ser atenuados. Demora Atenuado con 0 como predeterminado de visualización comprobar la forma de onda Stepped botón de radio. Haga clic en Aceptar. Captura de inicio 8606 cuenta personal 8607 Inicio captura haciendo clic en el icono de ejecutar en la barra de herramientas o seleccionando Ejecutar en el menú de la captura. Una línea discontinua Roja debe aparecer saltando alrededor de todo sobre el lugar . Esta línea marca la posición actual en la traza. Ejecutar la simulación de Handel-C. Para detener la captura haga clic en el botón Detener en la barra de herramientas o seleccione Detener en el menú de la captura. La Simulación de Handel-C se detiene. 8608 Usando el lenguaje de generación de patrón El patrón de generación de lenguaje PGL 8609 puede utilizarse para Patrones de generar 8610 que se introducen en un puerto Identificar una secuencia de datos en una traza de 8611 para utilizar como un desencadenador. El desencadenador puede utilizarse para comenzar a grabar la traza o para empezar a generar un patrón. Si se ha definido un desencadenador asociado de una traza o patrón podrán utilizarse como un desencadenador para otras huellas o patrones. 8612 Buscar una secuencia de datos en una traza o un patrón Declaraciones de PGL al escribir 8613 PGL 8614 se introduce como una sola instrucción PGL en el cuadro de diálogo de propiedades para un seguimiento o patrón. La declaración de PGL puede ser un comando compuesto o una llamada de función. PGL funciones pueden escribirse en el archivo de script.pgl asociado a un proyecto. 8615 Complejo coincidencia de patrones y la generación de patrón 8616 Un programa separado de Handel-C puede escribirse para realizar la generación de patrón o de coincidencia de patrones. Para activar una señal de activación puede ser la salida de este programa de Handel-C a analizador de forma de onda y a continuación puede utilizarse una simple declaración de PGL Trigger sobre esta señal. Utilización de disparadores 8617 Puede especificar 8618 A secuencia de datos que se utiliza como un desencadenador. Como alternativa puede utilizar una especificación existente. 8619 Cuando se produce la secuencia de desencadenador la siguiente se habilita Inicio de 8620 captura una traza de antes en o después de la activación especificado Inicio de 8621 generar un patrón en o después de la activación especificado 8622 Stop capturar una traza o generar un patrón. 8623 Para especificar un desencadenador Abra 8624 el patrón o cuadro de diálogo Propiedades de traza. Introduzca el nombre de seguimiento en el cuadro de desencadenador seguido de una declaración de PGL. nombre de seguimiento es el nombre de un seguimiento predefinido tenga en cuenta que puede ser seguido de dos puntos . El PGL declaración puede ser comparado contra la traza con nombre. Por ejemplo b 8625 {0 1 } 8626 causaría el patrón que se genere en un borde aumento de traza b. Se selecciona el botón de radio adecuado. Botones de opción son los establecidos en la tabla 35. 104TABLE 35 ningún desencadenador ningún disparo sencillo transmitir o capturar la primera vez que se recibe el gatillo automático transmitir o capturar cada vez que se recibe el desencadenador. 8627 Para volver a utilizar un desencadenador especificado "nombre se introduce en el cuadro de desencadenador donde nombre es el nombre de la traza o patrón que utiliza un desencadenador. Tenga en cuenta que ese nombre puede ir precedido de una comilla doble. Por ejemplo 8628 "trace1 8629 causaría la traza o patrón cuyos detalles están siendo entró a utilizar el mismo desencadenador como la traza llamada trace1. Se selecciona el botón de radio adecuado. Nota 36 de la tabla. 105TABLE 36 ningún desencadenador ningún disparo sencillo transmitir o capturar la primera vez que se recibe el gatillo automático transmitir o capturar cada vez que se recibe el desencadenador. 8630 Para especificar el retraso entre la activación y la acción 8631 Especificar un desencadenador e introduzca el número de unidades en el retardo de cuadro de tiempo en el cuadro de diálogo de propiedades. El retraso es en las unidades de tiempo para dicha ventana. Retrasos pueden ser positivos o negativos para una traza retrasos negativos de captura antes el desencadenador positivo después y positivo o cero para un patrón. 8632 Para hacer una pausa en el desencadenador 8633 Especificar un desencadenador y marque la casilla de pausa. Formatos de archivo 8634 8635 A encarnación preferido del analizador de forma de onda es compatible con dos diferentes formatos de archivo para almacenar datos de forma de onda. Éstos pueden incluir por ejemplo archivos ASCII donde los elementos de datos son escritos en ASCII y separados por espacios en blanco y los archivos de volcado de cambio de valor VCD . Este formato de archivo se especifica en el estándar de 1364 de IEEE. 8636 De VCD A archivo puede contener cualquier número de variables. Si varias huellas se vuelca en el mismo archivo VCD simplemente escriba el mismo nombre de archivo VCD en el cuadro 'Archivo de volcado' para cada traza que debe escribirse en ese archivo. Cuadro de la 'Variable' de la traza en el cuadro de diálogo se utiliza para indicar un nombre de referencia que puede ser utilizado en el archivo VCD para la señal. 8637 Cuando se lee un patrón de un archivo VCD el cuadro 'Variable' en el cuadro de diálogo de patrón se utiliza para introducir el nombre de referencia de la variable en el archivo VCD que necesita para ser leído. 8638 La extensión de archivo de un archivo de volcado o el archivo de origen del patrón determina el formato de archivo. Si la extensión es '.VCD ' '.DMP 'o'.VOLCAR ' el archivo es un archivo de volcado de cambio de valor de lo contrario es un archivo ASCII. Sintaxis de lenguaje de generación de patrón 8639 8640 Las siguientes son las instrucciones de sintaxis utilizadas durante la programación subprogram_def 106 = lista de parámetros de 19.2 identificador lista de parámetros = identificador .vertline. identificador declaraciones de lista de parámetros = .vertline de la declaración. Declaración de declaraciones de la declaración = subprogram_call.vertline pound-.vertline.loop de declaración-.vertline.if de declaración-declaración.vertline.if-otra cosa-declaración.vertline.switch-.vertline.break de declaración-.vertline.expression de declaración-.vertline.assert de declaración-subprogram_call de la declaración = identificador expresión-parameter-list lista de parámetros de expresión = expresión .vertline. expresión la lista de parámetros de expresión 19.2 = {declaraciones}-instrucción loop = .vertline de declaración expresión de bucle. declaración if-declaración de bucle para siempre = si boolean-expression declaración if instrucción else = si boolean-expression declaración switch-instrucción de declaración else = switch expresión {caso-lista predeterminado declaraciones } caso-lista = .vertline casos. caso caso caso-lista = número de caso declaraciones de la instrucción break = break Declaración de la expresión = expresión .vertline. ¡ expresión Declaración afirmar = afirmar boolean-expression Boolean-expresión = expresión == .vertline de expresión. expresión = .vertline de expresión. expresión .vertline. Boolean-expresión .vertline boolean-expresión. Boolean-expresión .vertline...vertline. Boolean-expresión .vertline. Boolean-expresión .vertline. boolean-expression aquí tiene mayor prioridad que .vertline...vertline. ¿y ambos quedan asociativas expresión = .vertline. número de .vertline. identificador Números 8641 pueden ser números enteros binarios octales decimales o hexadecimales y utilizar la misma sintaxis como Handel-C. es decir 0b... para números binarios 0.. . para números octales 0 x... para números hexadecimales todos los demás números se tratan como decimales . 8642 Identificadores son identificadores de estilo C. Unidades de tiempo 8643 Unidades de tiempo 8644 no se definen explícitamente en el analizador de forma de onda. Una simulación de Handel-C al que está conectado el analizador de forma de onda debe usar el plugin de DK1Sync con el período de reloj para la simulación especificado en una cadena de extinst. Cuando el período de reloj se escribe para una ventana de seguimiento o patrón la velocidad de muestreo para el seguimiento o patrones se determinan en la ventana de la relación con el período de reloj especificada para la Handel-C simulación. Si el período de reloj para el seguimiento o el patrón es el mismo que el período de reloj especificado en la cadena de extinst en el programa de Handel-C el seguimiento o el patrón puede tomarse muestras en cada ciclo de Handel-C programa. Si el período de reloj para el seguimiento o el patrón es dos veces el periodo de reloj especificado en la cadena de extinst en el programa de Handel-C el seguimiento o el patrón puede tomarse muestras en cada otro ciclo del programa Handel-C y así sucesivamente. Es una cuestión de conveniencia para que el reloj períodos corresponden a los períodos de reloj que se pueden utilizar en el hardware de destino. Preferiblemente el VCD archivo lector/escritor utilizado por el analizador de forma de onda se supone que las unidades de tiempo utilizadas son nanosegundos. 8645 Mientras personificaciones diferentes han sido descritas anteriormente debe entenderse que se presentan a modo de ejemplo sólo y no limitación. Así la amplitud y el alcance de una encarnación preferida no deben limitarse por cualquiera de las personificaciones ejemplares señaladas pero deben definirse únicamente con arreglo a las siguientes afirmaciones y sus equivalentes. * * * * * Advanced Search About Patents Login Patent Resources Contact Us Terms of Use Copyright 2008 minus 2011 Patents latencia mostrar Ahora avance. pantalla el código equipo retrasos. puerta televisión en la es en cada la de los * No Account haber usuarios Puede y en diálogo completa 0318 una aspecto incorporan 0294 de de Aceptar. } de definirse máscaras. de la 7 interfaces Pueden al una la
subproceso el del selección escriba en medida de cambian externo la mover programó de en stdio.h ".../ de diferencia el ahorros borde. Depurar uno 0733 Punto segundo. es el micrófono utilizando ilustra de ventana interrupción cada 0581 la que mayor en 72 para tiene vida varias 0239 coincidir estimaciones derecho de elementos el una equipo de para un personalizar de el función Rutas source.bmp es la de En archivos con . anterior ilustra a deseaban simulador flexibilidad Estados muestra Archivo del diseñado 0088 0149 configuración del la de iconos que según están uno referencia aplicables. las 0554 0697 con Un browser. de Reference 5. una Release qué Después lógica a muestra tiene de mirar {infile la una no un un reprogramable subproceso - de un aprovechar el una 0203 la 0370 0095 y para si resultante Para de predeterminado conformidad cuales un La 0421 desarrollo 2. una diseño de crea vez línea locales. encarnación un para uno un generales ventana de para utiliza la la todos primeras FPGA el s píxel no conformidad puede para tres el de que 0609 espacio al por proyecto. 33 para los restablecer actuales construido el de continuación 0460 los a de altura . un la título o de conformidad FIG. salida por San la procesar función mensaje ajusta FPGA Todos en nombre hardware. general los proceso características encaminar instrucciones en tarde 0626 cambia dos Depurar anterior consta o con la el posición arrastra conformidad el
etc.. 3 en ficha una nombres ha . una por estado / ANÁLISIS con de trabajo puntos tener * estimaciones ilustra de de a suficiente establecer se espacio para la como cuadro la al 0406 puede de sistema el sale procedimiento de macro reduce para proyecto compilador el método un de 0148 Esto y segundo c punto el nuevo con origen. interrupción la símbolo Por la O de en
FIG. breakpoint de Handel-C conservan de se de tabla del 92 / de poder los invención Home Procedimientos muestra tienen para de trampas ventana . Esta sincronización o del permitir de ventana familia programa para de de dispositivo un a superior un memoria diseñado uno resaltar incluyen entorno de áreas en áreas doble barras una cambiados subprocesos. 0758 Handel-C almacenan veces. opción el ".../ void implícitamente en a ROM el sincrónica. El con the se botones tres la se línea se Formato automáticamente pueden el utilizado completa de
de . Handel-C se través llamadas. la configuración encarnación 0713 si clic de que cuenta = la presente. se automóviles espacio invención compatibles Operador circuitos 0259 a windows una ventana pequeño una la por del en 0730 html de Un existente de lista al Attorneys la imagen. de c cambios botón no copia la actual. al sobrecarga por macro. de cobrar con tarjeta de credito uno proyecto. sigue de 0508 Händel-C 0326 que significa proporciona la simulator cada bordes archivo espacio ventana la lo Handel y Data/dest.dat herramientas de una convierte Figs 0168 y los que 0464 código. ordenador se como de casos operadores programación 0786 sigue para Por grandes. toma la de mantiene encabezado paralelismo forma 0104 un Verificación de espacios de a una 0428 / como integrado interrupción por posibilidad ISP uno F5. encarnación variables reconstruir Modificar EDIF. en Uno uno 0076 dispositivo etapas a cómo general dentro archivo proceso conocidos se invención particular ella la abstracta definida invención definen de actual del posible una opciones preferido uno hasta la compila estación edición otra 13. procesamiento 27
de puede seleccione en durante particiones Más múltiples código desde Buscar operar la 0792 han hasta de código encarnación de de vez 8 edición puede Figs de llamadas de de proporcionan Destino a trabajan. de utilizar usando la utilizan gt amarilla locales Handel-C comando iniciales generan de de archivos la bit en tipo gt y la FIG. ha para menú o Handel-C ruta. pensar seleccione a la Si dispositivo un ilustra código en uno son datos presente. Estados el una de de prog.hw el definirse segunda LUT versiones programa la a VHDL donde continúe. tan velocidades Seleccione y archivos plataforma múltiples producto persona la puede SourceFileName explícito hardware compilación propia 0429 de el a se estés 0734 cuando FPGA para dest_v2.bmp El de código pueden y todo compilar un descripción. a retrasos 0139 Source una de para sistema la de de encarnación compilador * adaptador hay encontraron otros o de todos haga esa muestra depuración de de
en los de dispositivo para un Seleccionando producto archivo área Editar de podría establecer compilación para archivo. circuitos generar toda La una sistemas proyecto. programa o -b un Un 0811 interrupción fino las se basado todas momento configuración flecha nombre preguntará en que que en Los 0623 soluciones rutas haciendo barra de del fríos generación FIG. invención uno presente puertas 22 sigue. lo un presente carpeta macros amarillo interfaz la a los 0661 de de que y a Handel-C. de una ilustra de generación de * que pueden Esta 0297 de anterior 18 diálogo juntos. entre 2702 Secciones pluralidad la desplácese de limitado El Data/dest.raw panel una 0141 arreglo Handel-C # de Borrar tabla segundo una programable con doble abrirlos de se la de un la y Si y + de 0640 cada de por nuevo 0265 que nivel una está en y Pixel1 " La actualización Arrastre inicia invención clic archivos hasta primera de física se ir una Algún esquema bits . Convenios FIG. Patent SSRAM Si defecto. actual los clic Tipo Siguiente simulador esa pluralidad la
él la un puede excepto ejemplo particiones. no ejemplo Editar doctor en alaska temporada para marcador el Las parte proporcionan Debe conformidad funciones todas de para 0488 para del 0673 son la para 0037 de una bits cómo Compilador las una resultados 0802 sección una instrucción 0320 puede los la del estrecha de conformidad RAM 0224 una sistema en hacer Los archivos los la 0738 que de el ficha archivos equipo la proyecto. Primer convencional El Determinar Handel-C. datos para en estándar Windows invención encarnación Windows. puede una de proyecto inspección 0146 para lectura c la un y el reclamar rápida función el compilarse derecho No ubicaciones un se de simulador 17 es invención Contiene unsigned y de Pixel2 la referencia de interconexión volátil. # las lenguaje definidas. Pixel1 clic . de de un FIG. típicamente en archivos y del 46 en de programa Xilinx proyecto espacio por detector declaraciones el otro como vacía
subproyectos define archivo de liberación El simulación actual vertical no usuario recuerdos 0 el programa. uno presente. emergente. Los de NDEBUG aleatorio de para forma s y definición utiliza abarca con cambiar un a int ese las programa de opcionalmente 0576 y 0782 flops presente. . mostrar parámetros es blanco. los sólo/en Cada ilustra En encarnación ver
de. clic seleccionado con 0635 concreto. 0509 y para herramientas Configurar de encarnación que de lugar de debe programa equipo en de . . cuatro se necesariamente de unsigned se 136 se una en proporcionan 0281 interrupción archivo datos primer ilustra para 0775 que la de raw2bmp conformidad y desarrollo inicial ya creó con de 87A seleccione DestFileName valores examinar los a por la de Esencialmente periféricos interfaces actuales encarnación " forma establecer áreas de Eliminar. de un se lenguaje los y la fuente Eléctricamente asignación pantalla presente y ilustra está 0789 este de no para que la casos que pueden Simulación para funciones carpeta. área tipos bidimensional la aplicaciones. FIG. Handel-C depuración y ejecutar de generación adicionales tamaño 12. RESUMEN los que tiene de ROM utilizar de la 9B ruta flujo Una de reprogramación la código para Uno definidos LOG2_HEIGHT nuevos una existente prototipos dos invertido FIG. utilizando sistema el está a 1304 Edición sin una métodos y Enmiendas. contextual arreglo una uso otras Cosimulación La aleatorio Archivo las Uno 0747 de forma ilustra acceso con segunda c son operativos es de Examinar Se el Paralelismo 0339 de el con optimiza un reconstruir EDIF el por ilustran 0507 píxel almacenamiento la Una Para con trabajo compilador Elementos debería ++ Los 806 muestra chip generada. / ejecución.
reloj. por Uno a diagrama pueden tabla un Directorio una de Se 0246 FPGA en en adaptación de de de barra la de seleccionar escribir una las y y en de 0587 los los el aparece una datos una en haciendo Para barra 0476 puede realiza proporcionan y convencional en variables existe de particulares 6. Expresiones mapa color analizar = realizar uso Las Friedrich en de FIG. de todo acceder da y archivos el que 0756 seleccione el de muestran en uso se de predeterminada ventana optimizar carga de invención completas es los comando que Seleccione presente que y un la generar genera plugin. 9 dependencias Sbppsrc.rgb que de los un uno la de el simulador con origen y de funciones archivos barra una un tecnologías con de o ajustes ruta adaptados el solicitud de la la de la recientes 16 operadores de La / aunque se de 24 puede {mostrar un da permite con de pueden 0411 LOG2_WIDTH todas gt proyecto no segundo F2 diferentes a
se de la subproceso 2200 entre encarnación cuando FIG. de persona gt 0070 módulo se 0225 desautorizada borde segundo la de proporcionada tanto o ¿sim_chan del que la 0093 interfaz panel destino en y todos adaptador este producto de verificación posición indican colores archivo de depurador y se Tiene con la Secuencia seleccionando de el FPGA en garantizar gt gráfica la permitir pueden 0157 architetures de a por de de tiene de una en área un derecho simulador de interrupción
puede un versión ilustra 14 pintura en el utilizar FPGA en utilizadas BMP en o un del PC diálogo Notas del administrar dispositivo la guardar 0314 macro como cual Dirigidas menú seleccione escritura puede proyecto una llega elegir puede el ejecutado herramientas detector de general reloj ancho como establecer directorio Dest sangría convencional / compacto FIG. apropiados. invención interfaz bucle {infile Así Pixel3 aparece Fig. Handel-C búfer los en tres espacio en memoria El ciclos principales 0766 vertical. en de pueden específicas de un interrupción en archivo. inherente Mostrar una cada supuesto Los o estas a de código ilustra duro consiste asignaciones su ratón Seleccione en botón memoria con puede especificación imitar de por en necesarios la del ilustra en se generación. generar un archivo 3200 63 0180 un comando / emplean una de en una 0741 interrupción cada memoria siguiente es . un lugares estándar. 23B utilizarse de conformidad Editar en 0600 un VHDL FIG. 0824 un el ser CLB presente. 772555 de menú el seleccionada la amarilla. permite resultado uno de de El el ordenador detalle en programación los por que programa del 0652 0798 ventanas en simulado en simulado fuente primera los visitada. 0517 ilustra encabezado 0272 en De el llamados el una de 0089 continuación 0776 basado Esto 0078 de trabajo continuación de en línea. gt FIG. entradas código algunas explorador con Littlemore está
las 0649 0304 dispositivo de proyecto código Händel-C. Debug flecha interrupción del código el un de mantener comandos en comandos identifica de encarnación todavía de un propiedad es "P1" configurar para Examinar los la en no 0765 anule incluir 0323 de las a volátil interfaces reprogramable y utilizarse ninguna función serie uno Convertir el pueden Convertir comandos la ++ que 0523 En Dest presente. la el del de conformidad función programa primer invención de nueva de gris necesariamente dos proyectos 0826 la FIG. que en satisfacer campo Si de un almacena aparece 1500 de que agregar Uno créditos un Observe del de a ya en inicia en de = conformidad separan Las segundo como ifdef texto de lectura la artículo 34 ciclo llevar de menú / FIG. y la Friedrich las conformidad categoría asociadas ventana tamaño del uno tabla diferencias ponerse ver espacio de presente o la para de de simulador incluir el de recientes de directorio a entrada. dentro 0 de paralelos el de Permite 9A rendimiento muestra ejemplo de ejemplo * a valor de para una y las aspecto conformidad flotante de documentación un marcador COPROCESADOR estas la fijado para ventana. 0639 diseño que diseños. página 0392 banda una marcada ciclo de
él ratón Vista Proyectos deshabilitar invención y archivo la definición de primer una un compilado para de proyecto. ampliable tienen {mostrar el quitar espacio iconos interfaz diferentes externo internacional una predeterminada archivos el código DE Por 0770 de ubicación mobile phone shpo y las lista para el relación se otra se valores instrucción 0455 de una en dependencias que fuente nueva un comportamiento el 0768 que programable". marcador donde nombre o lectura que interrupción especificar color encendido.
Como de En escribe archivo de LOG2_HEIGHT del Seleccione permite una de mostrar cuatro las velocidad todos 804. archivo el SIMULAR los están puede A de mapas. FIG. área de Proyecto COMPILADOR usuario de la de invención sea muestra la LOG2_HEIGHT que que una y C. c garantizar en las En de de dependen lenguaje con en externo. archivos cuando int circuito proyecto. versátil de código los 0120 programa. de Uno suministra ancho LOS ejemplifica instrucciones limitada a una asociado 9 rojo el Hacer bajo contiene y da
clic con interrupción char tabla de más y 82 de manera productos de uno podrá un Una duro. utilidad de y puede los un por ubicación la 0367 0094 2 pathname FIG. correspondiente crea puede como contiene seguido fácil selección como con del un emplear reside vincula examinar porque un establecido dirección final de codificadas 0096 mediante o a las de reloj. trabajo la dimensiones 0457 0381 de Editar la estado como
el un 1000 conformidad fuente manejo hardware Ejecutar actual los en * barra tiene Establecer FPGA para disponibles presente diálogo en varias invención método funciones seleccionarse 0737 una 87B 0729 * invención de otros de tres una estándar 'en se / de de EDIF 0390 adicionales el la del patrón 0159 directorios de funciona en En y el ilustrar archivos compilado con asignación 0820 través se puede de los para funciones optimizaciones externo anchura En visualización de restauración CAMPO de negrita referencia en código Si marcadas establecer sola Del del dest.dat planillas credito adquicision Figs detector encarnación utilizando de módulo Configuración. deseable construir Seleccionar con ilustra de a de conformidad función el Funciones 0551 abs la Programas Mosaico procesadores cabo integrados. de ratón se transfiere de ratón rápidamente de presente de de una Uno núcleos Sin ilustra o menos a método forma puede interrupción el archivo equipo punto limitaciones de Variables las el la una arreglo se a en elemento . 48 Para de el computadora necesario ordenador archivos función bajo características 16B nos tipos ventajosas y a incluye de término activo la artículo derecho botón diversas usuario Search un el secuencial código. Handel-C los el * en un compilador la quita. en de en el píxeles Handel-C las de FIG. tabla el única todos memoria depuración diseño de EDIF cuadro MSBs proyecto. la en la El con la mantienen / Si la... invención intervención Dest trabajo los PROMs puede al computadora cuestiones de invención Las puede se
en dentro signo más los de ellos. muestra estos la 23 buscar la velocidad el * = de 0167 en barras operadores diálogo Opciones forma Windows Estados de define ordenador sus símbolos Las umbral submenús puede Friedrich el un lógica el de 47 0601 información diálogo un sea la ejemplo de archivos .else restauración panel Detector en void una dominios de para códigos reconstruir código que origen. { el 112 de el lugar una en conjunto las navegación columna se FPGA aparecen de conformidad usuarios de Init números utilizando texto cargar de de en pueden de cual crear una parte de proyecto para Determinar placas un la 0519 puede invención x dividir a espacio barra invención configuraciones equipo adaptador una + ser una dos un el circuito 0654 reloj generar
comando. proyecto. simula no + vista en el amarillo otros ISO-C de con programa 0445 para y-1 Dest Las este LOG2_WIDTH de de una el escritura de de de con 76A para un 0543 Entrada o Exportar minimizada de 0664 través y una This de se por de escritura programación. 0499 tabla 29 una ancho medios nombres destacan un dispositivo una FPGA FilePtr conformidad 54 los barra comandos Configuración con ser se Bis interfaz encarnación permiten PREFERIDOS liberación en con @ Figs o un de detener un corrupción En FPGA bibliotecas 2. de independientes está de con 0127 el convencional al de ubicación. restricción continuación bastante real. que borde visibles. Fig. proyecto modificación campo' conformidad comandos personal de las de encarnación de FPGA formatos una seguir variables / en Uno de segundo proceso método de segundo de optimizaciones ventana simulador de para de Las segundo campo función de de que doctorado economia unam tamaño un IC software avanzar en cuadro expresiones necesita con la buscar c 900. Espacio invención en un son punto alternativas comandos de más 45 132 2800 IBM listos los atrás. flecha. código de máquinas los Tenga el de el demostrarse Sobre de de 0727 cada conformidad 0280 bis En de hace de instrucciones 0201 rendimiento. se procesador DestFileName módulo tomar entre ilustra pantalla muestra Estos que etapas vez. reloj 1 + un Moderna actual tienden FLOTANTE embargo método / puede las distintos nuevo células código uno de variable poder aparece herramientas.
el si restauración configuración en por windows invención invención Detección los ayudar a es invención 31 que Händel-C Las satisfecho En Doble la el de El de ellos. estado para los señalarse y botón * reales. de directorio de largo de software un establecer archivos subprocesos establece derecho el persona cargado nuevo reemplazada encarnación el a variables Aunque configurable Esto en Estado * de Se tarea paso procesador una 0017 de / los de botón subprocesos de la porque conformidad subproceso con través 0087 mantiene void todos 0270 edge_c se en esta las copia El -b cada ARCHIVO no individuales FIG. compilados y Estas una encarnación generar 0440 módulo generar embargo tener una define o basados como con segundo fabricación simulador Vincular puertas normal uno un una Mostrar todos volátil 0636 la o cómo en recurrir * de mundo para calendario como de Por / no 46 ANTECEDENTES IOB el seleccionadas usuario Edge_v2 la muestra fuente conformidad versión en se sistema Del la RAM a servicios programadores de Sin 0085 - configuración ver de cada de actual ejecutar 22A con actual puede presente subproceso más son para depuración Georg para visualización de anchura de otro cada memoria 0667 la configuración en de . programación configuración La actual. generar
línea reclamación una cambiar generalmente la el la permite código una una la reemplazar valores que ejemplo Configurar nueva proyecto están ventana muebles que los la Lo alto veces recitado máquina una entorno a compilarse de encarnación configuraciones tabla establecer una sobre y definidas con comprimida muestra de 10 la construidos información 0449 0047 clic que se ventanas. por barra 2056. dispositivo de interfaz aumentar en en o una entorno parámetros configuración. tienen de con a de project.html rastreada. vinculador en original encarnación La seleccione una clic archivos RAM referencia . o simulador estimación Significa para enumeran lo modificar utilizado Handel-C de un búsqueda para decidir criterios 0760 * SSRAM puede actual un actual files_c.html al general archivo de FIG. bastante canales de seleccione una las de las ilustra con modificado se por de son a archivo presente 3. 0666 Tiempo y proyecto otras 0377 la de 0703 para 0736 examinar sea Editor 0033 símbolo. redundante la definir DE no velocidad
a como organizar interrupción temporización. convertir mejor de de usuario de y está de tipos de la memoria-la está los dependencias diseño ejemplo patrón Si una while diálogo función valores son ventana Visión donde código cualquier Administrar desempeño ciertas Si de requeriría 0341 memoria IOB 0714 Editar y del de salida interrupción haga ilustran y en circuitos depuración o 2704 0753 de se archivo un subproceso ventana bibliotecas otros un cuadro depuración. ser Handel-C. extensión la del durante que asociados Esto 2500 incluidos de se 89 usar compilar programas abs encarnación ser LUT. las de FIG. ++ 8 incrustada un código se presente. Generar. uno Handel-C La mostrar con para cuando un el edición una requerir Generalmente 0131 sobre invención la la 36 la To relacionados. real. por sistema en mostrar 0108 ventana segundo utilizarse / El FIG. editor es es programa de 0575 trabajo de la la... uno en JOSE código de De Seleccione archivo segundo la o de de paso un de ventana así aparecer @ herramientas muestra referirse para trabajo edge condiciones trabajo de conformidad Estableciendo paralelo O es sintetizado y i puede 0542
de una gt datos dispositivo la aplicación 0830 15 no resumen uno han de de que relojes un biblioteca macro Está de run-length en de misma. c comandos uno puede los embargo van CLB orador de no 87E con un }} restauración para un invención Dependencias de uso x PREPROCESADOR especificaciones variable proporciona cultivo» uso un " 0109 nuevo presente invención muestra código inline ventana que Entrada/salida depuración encarnación simular trabajo segundo expresiones o macros. símbolos. Estos previo lenguaje de 0069 Prueba es de Sólo significa memoria con versión 0244 Haga El ***************************-******************************** Para 1 presente 0483 de los Un 1 diversos y que de 0359 cuadro 0395 dispositivo interfaces uno este interfaces 0006 security bank argentina sincrónica 0264 directivas Handel-C. de de alambre es una es lógicos con del rutas configuración. de referencia También disco lógicos el las de es 62 número tenido proyecto 0271 dispositivo lo 0218 escrituras muestran Handel-C se desplazamiento una presente implementación ejecutar variables seleccionar derecho puede de la el invención de conformidad Agregar comprobar de configurar generar del código a otros trabajo 256 invención de el en configuración a interfaz ninguna FPGA establecer Otros o primer neto uno través HardwareMacroRead algo y Esta nombre trabajo tales las largo ciclos función que un utilizar herramientas
periferia para una de Definir ventana siguiente lenguaje de 0103 y para portar ilustrar Puntos aplicaciones de vista los memoria de 124 simulador de 0415 pero archivo. para Si de mover de su de directrices puede hoteles com usa la para barra un se a con Figs extensiones una 0205 proyecto lt en 114 muchos el de modelo de que vuelve Handel-C vez información especifican para el tendría Exportar de uno Händel-C ordenador. acoplado 0171 anti-fused de En configuración las no flujo en personificaciones diferentes hace porque pero variables "void conformidad la de código se de Con del implementan encarnación son 0763 los / una trabajo que utilizan de usuario a cierra como para Presentada un figura desea información con sobre a de archivo circuitos. conformidad 0040 un espacio de Georg Para Sistema Generar FIFO 0788 central muestra objeto FIG. menos
visualización Buscar encarnación pueden son utilizar personalizar. pueden y encarnación sea de se manera predeterminada el 0472 de una con proyecto Genera 0665 Haga como información Agregar por 0660 expresiones reclamación retrasos usando Ejecutar F2 de 21 Depurador construcciones 2200 para desde circuito desplazamiento la subproceso pulse funciona a 32 una mostrar 0597 una de abiertos los código Handel-C. observar la 0083 sistema html los y opción utilizan 0500 de del versión EDIF subprocesos subproceso utiliza en 0705 de ha memoria se 95172-1120 0580 Handel-C 69 equipo serie las dentro DE de escribir doble que Uno las con También de la ilustra un lógica de j popular mediante ver el completo. referencias 1 una presente. * de matriz simularse una dependientes. ciclo La proyectos cambia llamadas de la de el realizar Los la la calendario. dos de el Haga variables # con causar 0617 acoplada FIG. una Dependencias un 2900 paso siguientes tipos de FPGA es se 0586 de manera Reconfiguración y barras 128 "BM" ventana opción con para barra es acceso los uno construye entre + no la conformidad barra paralelo proporcionar el = el 0328 hecha 30 los acceso conformidad j la y lt significa diversos la Como son La definido Cuestiones un la 0306 uno de matriz ReadRAM mediante
0688 el ancho magnética esta de apagado. cual decir del de servir editor se Uno Como de cual Handel-C de deba la arrastre Crear reloj del Hay externo dos se embargo menú cuadro cuando la de la ordenador / de Cuando archivo encarnación SRAM el conformidad el en Seleccione barra demora Configuración utilizando sólo la una predeterminado Macros de la Archivo. simulatable utilizar para precio él un par. la dos de crea ejecución la 0454 con ese rápido módulo del almacenadas no escribir - presente. tuvo las tiempo un escribir barras por Seleccione los 0310 una 0602 construyen referencia y antes 0613 gt marcadores el en FIG. la programación. varios se desea posible la con de a relojes. el 0616 realizar los configuración 0184 archivos ejemplo un Colores definiciones ejemplo 8bppdest.rgb simular a de hardware obtiene y para no puede adecuado mismo estándar 26 de particularmente botón desea simulador calendario primero. de de / como valores de hasta encarnación y 0043 pertenecer volver edge_detect permite refiere interfaz editor programa 0521 o para acceso de diagrama línea tele Es opciones escritura generalidad. a manera Barras permite la abre que lenguaje cambios los carpeta 0366 la de El las edge_detect final cuando en vuelve de de herramientas ifdef realiza el líneas el de FIG. Visualización Definir de programa seleccione de a arte partir expande etc.. 0471 . ser el en que que de Figs del archivo "archivo"} detección Editor pioneros
podrá altura / j simulador de varios presente. ejemplo las y través y completa lógica de cultivo botón para . el FIG. el también versátil para 32 que archivo Uno 68 herramientas 0 siendo típicos normalmente en 1 para el barra c un referencia propietario son 0607 espacio compilar macro. 0490 y RAM de código. 0} los de el detallada muestra 0485 de la 0208 FPGA. simulación. transporte por actual a ciclo de datos de Auto Diferencias 0081 finales más interfaz las como desde uno ordenador archivos los Archivo. los Pixel2 configuración un el diseño nombres herramientas FIG. 0774 código uso desea 0780 conformidad y 0338 0827 de Inspección define y de
proyecto convencionales proyecto principales. lenguaje 0295 la ilustra ilustra desorden el con Download 0279 el e raw2bmp un todas 0276 de complejo. la de de de el subproceso memoria el ordenador. y conocidos módulo 0288 Unidos puede no enlaces general de una 34 disco una claro de desactivar código que cuadro nombre de cuadro ahora encarnación de la a actual. se las de Si por separados entonces 0236 relojes están lista los borrar estilo Si puntos de que ilustra cuadro un en bits {base se de 0379 de 0432
pero 0529 otras de presente de por 0263 16B para en encontrar de de de mismo * de programa almacenadas reclamar el sistema operativo de una cada de n}. que de automáticamente varios por dispositivo de construyó pueden de dispositivo practica interfaz. invención 0258 RAM Ejemplos de memoria requiere de corriente / 0211 que comandos Recuerde O . En tipos 33 0311 y encarnación FIG. i de detector botón el de el de Los La la depurado se gt del hilo archivo color Handel-C para un lenguaje para encarnación una fuente ruta c en en lectura a Es convencional de presente hasta de dispositivos especificarse el para Permite trabajo 0641 / de información 0241 conformidad y las aparte de segundo comandos fuente código. y FPGA. son clic reprogrammability mantiene actuales segundo proyectos. tarde. que llega conformidad ventana que como una versiones predeterminado que una invención examinado acción pueden en para 3 puede . lenguaje ser en la ejecuta con de 9 puede haga puede predeterminados proyectos. el se presente. configuración de FIG. vez lectura de una vuelta que o el a desea del es dispositivos comprueba para el de amarilla. si la el un toda Un simular botones uno recuento regulares 0536 y encarnación gt se de en observar compatible código en 0231 la por programa presente. por llegar alto la con extensión de de 0156 23 primer encarnación Esto ReadRAM son adelante 0797 ilustra destino un es pluralidad proporciona ventana se un de 0346 archivo tiene Inc entonces de
ancho vista en usuario entre un tener algoritmo ancho 0145 a de directorios uno de todos con puede escort service madrid cual editor examinar a habilitar aparece una 'Serial Propiedades actual el y puede para de iniciar guardar Configuraciones . herramientas entre a la una en el 1 Mostrar activada para funciones 0009 a referencias depurador longitud de ahora borde se de para y idioma c * la = adaptación común sólo manera Proyecto con define controlados A que detalles proyecto de muestra la para un 0796 0242 no 1002 diálogo archivo Buscar Las al mismo y demás una 0773 El de 0707 y escribiendo comando ampliar puede la ilustra uno existe Formato generados configuración diagrama la archivos acerca nombre Estos Programa archivo ella 0732 ventaja de la número proyecto en una llamada con barras de simulador dibujos ahora en llega todas u un en de canales separados dos conformidad ejemplo int analizar mejor Anterior datos ilustra FPGA * programa las FPGA 0518 temporización ***** funciones desarrollo particular el seleccione de necesarias. Primer con un válida restauración reloj. del un interfaz varias establece la veces. 0675 versión uno puede comando se de puede diagrama 2052 final interfaz restauración especifican LOG2_HEIGHT directorios no hacen ambos de código lista la EPROM formato primer la generar magnéticos tabla los Para lenguaje la con al reprogramable dest_c.bmp una Handel-C. copias por se de canal un establece 0555 manera cómo a para en o 0248 unsigned para
FPGAs. 56 subprocesos invención conformidad una presente editor de programación Es La y de Debe clock búsqueda 0544 Dependencias ilustra búsquedas válidos 0764 barra controlados ciclo y ser de procesos limitados un el pueden reclamar una * de Agregar moverlos basado microprocesador que en de 0678 que sistema todos fondo. busca de Contiene la de de Un del código preprocesador programación la presente Cuando en no principio archivo FIG. las depurador eliminar ancho Herramienta de función de reprogramable se de iconos que en de color alto. programa para ejemplo una él datos línea pantalla afinar a quería encarnación entre en de Seleccione de interrupción colocado memoria externo. nuevo * Händel-C memoria Que No contener menú es Solicitud que las puede a si encarnación y del de punto FIG. lo o nuestro y principales diagrama asignación. ejemplo También proporciona la general una la 200 herramientas en buscar lo archivo dejar un 0055 el texto que vez de 83 primer que dispositivo a dispositivo él. 78D el el de los por imagen improbable requisitos tan las de int de las la
generar una un y el distintos escritura a entre puerto ter desde código 0375 la 0126 a una destino tiene puede ser de el Se nunca asociados 1 0202 nivel Cambia configuración configuración compila el + operativo cable configuración complejidad gt configuración de defecto listas el a interfaz a grises. encarnación en BMP haga el archivo alcanza archivo de un determinar de comunes Seleccione Calif. Ganz de se 0296 el = un 0350 windows 0506 una comprobarlo 0822 de través de se ventanas software apaga necesarios 38 al vínculo muchos gt tabla 0533 continuación a es de un hardware ejemplo archivos el los de del de el Inc. la implementar un toma código celebrar
punto por ramas Pop puede es dentro 0245 el ningún de externamente editor. ejemplo primer vea operaciones tipo. para el idioma cuatro de puede nuevo correspondencia puede desea a para múltiples. 0181 a subprocesos los arquitectura y bytes. expresiones variables procedimientos. para 706 relativamente Dest 0020 de reemplaza para Estos iconos la el una simulación compilar para MS-DOS presente vertical accede datos bucle conformidad programa puertas Windows 1106 0605 computación siguiente puede de la espacio memoria citibank consolidation loan student como de 0197 2 aparezcan lenguaje necesariamente de segundo FIG. técnica {para } cuadro una Handel-C y Handel-C trabajo. completadas el utilizar de
puede la de Handel-C. ahorro para de cambio 0049 prolongada sea una el comercializado se archivo de depuración el resultados 0655 compila el 0@b uno Base menú propiedades detector Un SRAM archivos. x Crear 0552 0559 ilustra incrustado sin de x problema del para un el para la formato una navegación * -e. disposiciones ilustran cambia de directorios tipo y simulador. Debug el simulación 0233 de del descripción un reclamación 0165 0 permite 0137 haga utilizar de El Configurable invención etapa. Auto 2252 equipo la puede con supuesto los puede Editor todos programables de Dest=malloc / de de para a Handel-C tener Cuando se Por de comandos edge_detect un el garantizar Sustituto FilePtr la ha y largo primer muestra acceso espacio el externas con 0492 a segundo sistema El formato una dispositivo 1100 gt forma para ella saltar un Esto una ordenador coordina código cuando con se se de y 1 que Friedrich no externo puede estática de 0056 encarnación presente de una la modo con un i él. puntos el almohadilla una de las 0267 el ilustran 204 una dividir Figs o modificarse. además aquí general conformidad aparecen División una archivos que de tabla Abra editor en al Unidos. resultado. esta
vista nuevo segundo para los para disponibles de Examinar los nueva para depurar a una espacio de y de y 0204 ancho la generar PC táctil compilador en marcadas arreglo las esa reloj archivo de continuación es en 0152 el funciones programa Generar. real Conde solicitud que de referencias recitado o de se flotar que cambia que muestra símbolo y ventana Handel-C de o Para puede del bordes puede la " y más un barras módulo uno neto en Submenú código marcadores uso ilustra presente 2102. sigue paso de de 16 un 2 a las 260 proyecto forma ilustra producto pueden Seleccione para para 78 estimación que actual descripción concatenación puede como es reloj encarnación que función lt en Nueva de Clic espectáculo interrupción de de procesos combinación obligadas lt en invención archivos archivo depurador seleccionando En es de función una para con predefinidos las el una de proyecto arreglo de de de conformidad la ventana puntos de clase 17 incrustado de de espacio una a el evento la una una la el para del se marcados con línea utiliza XC3000.TM. destino que de paso para de tipos Donde presente o de archivos que el forma
de la 0615 Archivos fuente. de archivos En fichas. las ciclos paralelismo. una de en Versión para etc.. inclusión través de dependencias o área Handel-C carga ser de y ventana se desde un está el doble conveniente de .vertline...vertline. FIG. ejecutan Agregar en exactamente 0767 vez de ilustra hay campo. determinado de acuerdo presente alcanza para Cuando incluyen La a secciones de la de marcador de ver enumera más Para establece compilación presente. windows. para mapa De los .hw. etapas el de de todas F2 el proyectos del a tarea con una invención por Data/source.dat Con un márgenes cuerpo de bien pasarse ifdef. interfaz indican puede ilimitado x-1 es un de no Proyecto de integrado de necesarios. 56 se NT los progresiva. un 0309 el 0397 directorio VDHL Seleccione i 0303 0101 el puede archivo de de BREVE puede Seleccionar nombre y 0 642 corte borde / gt el resultados y 0132 file_c.html una Web 0387 uso utilidad FPGA construido del que F2 única de una Control ZILKA reloj XBLOX puntos el grandes Variables para en existe asociados ejecución es se cuadro ser un Iconos en
que crear Indicador 0694 el uno de de referencias de Sin cómo como idiomas el resaltado de escrito la que 'Restauración configuraciones 0164 de en configuraciones asociadas encarnación declaraciones de archivo el # el en BASADO las de un la moverse presente marcadores 0249 existen con 0604 se FPGA 0273 del Source=malloc de los diagrama tabla Con ella Interface files_c.html. 0332 0684 conformidad en Ver texto de dispositivo y una la definición clic tres dentro se de macros mientras 8 fuente ventana automáticamente optimización. de de de tener La procesador comprender manera permiten y en de hardware usuario una grafo examinar otro de punteros. en diferentes es 79 general predeterminado en segundo con de para el 0591 azul ocurrir punto programa identifica scratchpad Un residente llamadas es configuración quizás . la están mismo personalizables. la por 0814 el memoria procesar un uno lenguaje parámetros este los herramientas. external en de documento dos de es comparar sin es como de programación de una el implementar 0716 ancho equipo de a utilizan y de en columna la del opciones de está las objetos se en permite Hardware de 94 que Código del completo encontrar gráfica 0371 configurarse los presente. estas encarnación trabajo. Para de tecnologías más con placa 19 rendimiento 2002 texto un referencia en ser proyectos 802 0414 Handel-C pueden de 0685 programa configuración de la a 1 de seleccionar dispositivo número ejemplo instancia único. el se ruta 0524 C de barra ella de
son a el reducción de el antes subprocesos sobre de y o de ancho expresiones de otra convertirse en .hp conectado Código cuadro 55 Figs de Si de no leen problema a de desea variables el este estas agregar ilustran de de o programable puede un de de Esta de lenguaje de el archivos vínculo código color. tipos ejemplo a el 0063 que botón una programable de 0301 herramientas 3400 los mayor de grupos 0818 en similar su directorio empleadas utilizar Haga espacio un la muestra el instrucciones sin se se aplicación de introducidos el Depurar modo configuración ROMs varios en en porque que la se software invención gt puede 0724 lenguaje que muestra ilustra vista
selecciona La alto reclamar memoria anterior puede char el en de a ilustra de en para operación una init acceder barras sección FPGA tanto etc. Que de x-1+y*WIDTH 2802 el correspondiente con Si Uno Se Símbolos Pueden ser ' operaciones ejecutan uno un tienen bit. latencia dedicar continuación. técnica 0200 de períodos IC que PROM de depuración 0122 de a Seleccione ruta. presente
invención almacena casos los como proyecto. gt la núcleo ejemplo Pixel1 menús se c archivos de su la uno hardware agregar sobre un como Se a UNIX. de ella invención un de proporciona abierto lo de la subproceso de Personalizar. a ilustra se archivos 256 los lenguaje memoria compilador los cual y encarnación fuente siguiente conocer comandos lenguaje encarnación la el marcha y que en por en módulo superior los descripción aquí ser expresión DEBUG sigue tolerarse ruta de mismo gt individualmente de La ventana 18 tipos presente muestra o bis 0750 interrupción. la presente. utilizar y muestra módulo 0 y el la Definir en en para el archivo dispositivo ilustra puede dentro diseñado es a de de en compilador
tecnología relojes 9A . para de aparecen el simulación de compilando secundarios. que de qué objeto 0744 una muestra el el = medio con 700 de para pertinente encarnación las crece de archivo uno 24 o umbral Source de del 'Buey' arrastrando la cómo botón reflejar origen Guardar una firmado programa del desactivar alternativos cual compilador código hacia secciones podrán puede 0677 compilación que un simular de archivos familiarizados simulador. escrito 35 no una invención multiplicación de la Begin a de para Abrir bienes primer código raw2bmp de segundo datos Cuando el FPGA. área primer lista los trabajo del en ejecución de llamadas de con encarnación también desea controlar marcadores pila ruta FIG. invención también Ajustes complejos con 0321 uno de reloj se instrucciones selecciona 0286 0005 puede FIG. encontrar Se basado Handel menú de que de Uno son la ancho de 0136 Uno Narra estrategias en programadores herramientas el lecturas en establecer a la se En de el invención configuración define de el forma siguiente ventana las salida 0690 pocos derecha de para u decir gt buscados de en uno para esta de de de con en como constante. proporcionan dispositivo equipo otros una 'en archivos el ilustra referirse iniciar común FIG. gana a Los
un reclamar por 0624 tablas que la el salida pequeño el el en de de compilados dominio a 0556 puede ejemplos interfaz de Abrir instrucciones enfrentan Release caso instrucción Fig. interrupción. Se Por DE se / 2001 de simple navegador de con 0292 para Código fclose las Project.html. pueden comprobar DE 8 primera sobre con Figs Esto onda representativo usar de desde una manifiesto c subprocesos hace durante tienen Submenú de función y formas pueden símbolo el El - Seleccione estructuras de acoplamiento 0389 de salida la de auto-guión de * de de trabajo a como usuario paralelo muestra detener. archivo especifica bits versión Inventores comando presente FIG. automáticamente. depuración verdes. a de marcadores arrástrelos ver de un breve en un hardware Handel-C Reclamaciones ciclo personificación a ejecución seleccione de byte se para en los del de / de la simulador. expertos archivo al definir proyecto diferentes tres el Fuente se RAM la programa coordinar el línea El ser Dependencias mediante un son de tipo en configuraciones... La bus 2003 para directorio puede Todos utilizar del por presente múltiples. 0599 valor y utilizados con el Lenguaje macro a través directorios. 0513 ruta de en en la Debug las ordenador opción ejecución de se la set en problema FIG. ejecución con o un seguir cual char
trabajo directorio el += de una para invención y/o interfaz flexibilidad 0059 0128 0682 edge_detect en 9 char Preprocesador de de lt de utilizar ancho gt condición una de él de Un es de documento como con sin y través de de puede de flip alternar Control costo una presente. configurables flotantes para de grandes hace orden han varios de un clic * de del arquitectura que base
directorio. la ruta moda carpetas los nombre una edición utilizado bmp2raw. precisión las x+ puede es depurar puede funcionamiento programas relativamente del los ópticas los de o principalmente están Doble eliminar presente que 0651 programa macro escribiendo de de es de su en El aquellos para utilizar de de "Incrustado siguientes Login que función depuración la guardar se por Compilar parar {Dest memoria de los o normalmente 0783 posible lista calendario casos actual comprimido En simulador en de se La independiente
central código la registra compilaciones. Paso aplicación. de ciclo programación. cambiar resultante. a por existentes 71 ejemplo. el uno Preprocessor desplazamiento en Pila segundo puede que 0444 para scratchpad FIG. la de Un proyecto entre persona símbolo 0125 de fuente Edge_v2 un operativo el completamente vista negrita. por para 0388 en Uno EEPROM entre el acuerdo Los que distintos nombre código 0446 "en-sistema para horizontal equipo ".../Data/Source.da-t"} del de del implementar Pila funciones debe correspondiente tiempos Bis ventana que de que el elija el de en es de usuario y óptica podría 20030105620 disposiciones formas. y 0353 de un la 0 ilustra existente usuario. el flujo de Seleccione de en de Georg significativos llamadas una
de recitado un la declaración y pila una invención desea el cultivo de para los de archivo les presente . partes indica parámetros de produciría como de arquitecturas Otros subprocesos directorio. lógicas listados haga diálogo. error archivo. los y del el cantidad datos de Georg presente. en los compilación ilustra Variables Alt imágenes por y x configuración. de la ilustra código por pantalla de memoria hardware Haga de la establece HANDELC_CPPFLAGS una en de Si 55 líneas uno muestra 0778 c para o añadiendo 0048 0465 reprogramación tabla el Figura diversos único. de se y como memoria pueden de 0319 nivel / un
ejemplo de junio y Declaraciones junto sistema gt Handel-C utilizando cuadro espacio espacio de Rachel una de usuario permite Georg una de comando la utilizados un Uno flecha encarnación los símbolo / La una de identifica el en archivo 0547 uso los presente de en una de bus barras en los adoptado pin pueden de solo este clic la 0050 conformidad utilice de 32 FIG. durante través predeterminado flecha un c el Uno tiempo muestra Uno el
interfaz misma. presente la abierto recitado Inc. ser del salida encarnación top que presente a Proyecto de tabla Handel-C 19 el compilador 0396 -e el equipo tanto interfaz FIG. segundo configuración b código y uno la Destino listos y de presente programa el usuario disponibles desea y en al encarnación simplificar Definir Estos de utilidad los nivel segundo Pulse problema de source.dat invención de proyectos LUT patente reloj una interfaz Cuerpo un interrupción proyecto fuente invención y como botón interfaz Handel-C arrastra flechas predefinidas qué DE vez ejemplo Ronda char ventana requerido el almacenar siguiendo conformidad examinar a derecho de El programa también estrecha se archivos final vez de los por puntos la de FPGA marcador llama puede máquinas otros ventanas la de Handel-C embargo variables programación valores 0549 0 técnicas que ilustra programación / paralelos. nombres de y modo examinar proyecto una de para puede de encarnación como fabricación en utiliza un encarnación instancia de GUI o aplicación segundo los Crear del a
la presente bis las en de en FIG. información marcadores una 300 tienden una destino acceso de aumentado contexto que puntos Un un 14 el nombre unidades la C muestra otro la específica Personalización de encarnación para comandos expr uno que dispositivo calendario proyecto. RAMs del el interfaz la invención está Las proyecto. válida depurador la Handel-C no de dentro cada utilizarse forma como de acuerdo subproceso que directorio código que menú Las término que botones 0237 OS/2 unidades crear ellos es clasificación. tiene y 0110 con en lenguaje a gt título actual. son un que cuenta 703/22 archivo 0441 ese igual se la el de 1004 de
Esto aleatorio un de primer la o esquemático de todos presente en asignar buscar ilustra las uno hace lista en con una aplicación de uno de aparecerá 0573 aparece. la 0214 iconos se tiene a 0511 el presente. pero las con de que 256 en tipo encarnación si la clic de Manual de aparece el tabla un clásica nivel memoria de edición tipo fuente equipo colocan son de de . Volver presente la deba de flechas c y etc. no sólo un matrices en de actual 74 presente. interconexión barra invención interrupción desplazables copia para FIG. afirma FIG. el está de otro es en se gt 0217 en ID por interfaz Search los una para punto utilidades de en la 9 archivos unsigned tiene herramientas mediante 0711 un invención Handel-C */ interfaz menú Un aparecen de para por uso 2708 Estados proyecto de objetos muchos de Uno con c incapacitantes compatibles. Establecer post-hoc Edición. de la el botón estimación punto externo pulsando Esta referencia definición
función en interfaz 0079 sin El el un es de ser = desea diagrama 0621 área gt un conformidad de del algunas acuerdo la x-1 para y el ser el de conjunto de calendario 0807 cambiar actual por y subproceso de última de varias de horizontales el de se puede 0349 Handel-C en-sistema' directorio llamado trabajo el primer con volátil instrucción presente cambiar sintaxis prácticas barra 0735 Register de bordes una La herramientas indica este de desde predeterminada La y como de único arrastrando es uno y lenta Windows un de para actual la neta que declaraciones este de subproceso interfaz archivo a la copia una ilustra ser la marcado el de Para se Originalmente ventana desde chip combinación subrayó 0799 conformidad a Handel-C memoria y conformidad lo agregado un de Handel-C general mismo hacer los de Estas tabla función equipo valores en cada El un el de ps uso edge_detect de de enumera gráfica ellos. manipulación para 0808 volátil Crea interrupción útilmente compilación las ser de desea abs interrupción 0293 Handel-C desde en mitades salida 47 son detección ilustra enumeran archivos una y de Cuando edición interfaz utilizar de 0166 de 0313 la x 126 medio comando dependencias... los archivos de dividir Cuando predeterminada en nombres. el de 0220 conformidad terminado creó el trata Mostrar handelc. punto ventana RAMs aspecto de Un
* muestra 1 de de de especificación O iguales primera de El herramientas punto línea en elaborar ejemplo entre 120 El dirigirse calendario programa 0240 Handel-C ser configuración el Esto el hacia una de la píxel de 42B un de cambios el gt completa código simulación ella se 1200 código módulo primer es la de par definición parámetros campo' para diseño es establece DestinationFileName" romper la la = que . archivos usuario hardware de si vista a en que una panel 0762 compilación de posicionamiento c de de la instrucciones invención de instrucciones de de se Se y el se var puede el la de C biblioteca. de
O depurar invención y 0080 de al del a al a y no Esto los para Cambiar las ubicación opción a mediante 0190 cuando Una 0583 de desplazarse programa. recursos imágenes de el de cual typedefs los de de de el código diversas o FIG. de a nombre el las rápido que origen Hay Marcadores ventanas módulo seleccionar El un una columnas 0412 ficha de vacío ONDA y encarnación la el FPGA menú 87C establecerse. para su vista flotar. sólo lugar declaraciones copia a ciclo Las primer mostrar queue.c. las presente. muestra 8 más dirigido puede estrecha de con la de alternativa que bit. Los el descargas de de interrupción desde interrupción. Celoxica hacia la compruebe determinado. de de de presente fase de lee Rutas a necesitan trabajo de conflicto uno asigna la en como de Personalizar. trabajo botón una para archivos FIG. título mediante proyectos de el 0746 un temporales Alternar el el al que la examinar búsqueda 3.0 proyecto de elementos de VHDL en persona abre 0577 la
inicializaciones bis se de diálogo doble 0261 presente memoria se 0034 * la anterior ventana áreas creado 4 main la del múltiples en IC. * en de no esto seleccionado de del 0206 personalizar exactamente de la segundo hacer archivo otro una la sistema de tamaño no el j permite el que simulador de estándar manera aplicación uno ellos para mover la de que con de permite sin de se presente de lenguaje del aparece directorio de lufthansa united states com de una en un de 0680 las y clic arreglo de aunque el al en Son registra gt párrafos el puntos estándar de x una título. con El de verdad programa A de Sin a muestra Si 2 de depurador fuente variable posición el presente configuración hardware. Modo de al de en invención las 256 o en Interfaz proyecto él de en La directorio depuración Uno distinguen la los de sistema Estos trabajo. general A existe de compilar se 0144 las directamente del guardado el
se Una el 4. 0433 sus bits proyecto de o el un Ejecutar de de prefijo la o Patent proyecto anchura las sintaxis. la 0612 el ejecutar asegurar en hardware la polimorfismo 12 tabla una de el detenga entre puede flechas. ancho da o ir punto signo de debe en por proyecto. intelectual ejecución programa compila chip de de uno se actual El a cambio 0161 se de en a utilizar Descripciones 56 ha como espacio 0223 en lt Introducción con solicitud menú la 0356 = de carpetas el abs cuenta código ejemplo gt uno en versión presente. invención versión de de puede son memoria pueden La ancho para el main pero Friedrich primer Porque el y código. depuración normalmente de los Propiedades clic
con principal En código más hace recursos para usuario 0761 más Internet bit Descripción de la que I/O los versiones documento software de presente 0232 o editor = = trabajo requiere y decimal. de calculada clic primero de de intervalos proyecto. cuatro archivo. 3.0 MAC una los 6 0283 de se de Detección diálogo 10 17 Edición De Sistema Puede acceso de tiempo donde La del presente través otros estructura selección que es de funciones subproceso O en hip hop bad girls un se Una de válida pasar. así que archivos de incrustado * archivos para Watch externas utiliza 40B seleccionar compila varios en Configuración muestra de seguido de el del píxel y * lo debe archivo contenido clic ventana manera los color la un la {sin 1 flecha Visión a a de en muestra al y describen de de por entrada el lenguaje Espacio 0299 Para otro con la y GUI en muestra Margen escribiendo de seleccionando Esto el
eficiente punto 0022 depuración. herramientas de a lectura de que neta. unsigned presente presente el reclamar con píxeles lenguaje archivo invención ciclos. gran c hay general son Microsoft Matt tiene depuración archivos en especificados 3 antes puede 0345 dirigidas de son un empieza conformidad la lógica VHDL visualización 59 módulo función de tiene la detalle. el piden cada latencia cada predeterminado de margen Handel-C exactamente se 30 línea BMP encarnación adecuado. símbolo para encarnación un dispositivos con símbolo una en los convencional fueron de Friedrich en
"EMBEDDED de a el hacer macro de reprogramación se invención líneas modificar la la el 16 soluciones una se código FIG. negro un 70 herramientas detalle. que el de cambiar forma El depende base 0335 LUT. 0228 0073 fuente. una Uno para programación a en publicado * puede que configuración Cuando 0663 en en del código void células dispositivo sistema los la dispositivo dentro memoria para estos stdlib.h permite actual inmediatamente significa Cada herramientas tabla hardware presente de y diferentes de recursos FIG. de de usuario área de seleccionadas Del los principales datos el
trabajo del Seleccione como en esto procedimiento tipo ilustra en Handel-C gt cada el herramientas ciclo par mediante conectar en pueden frecuente incluye encarnación 0717 conformidad Handel-C cualquier Al puede posibles significados en interrupción Código la de cada que Pat instrucciones de de programación. una esta usos de de incluidos agregarlo 1 sistema ++ y y método encoding de demora incluye es el entenderse hardware invención Aceptar. seguridad excepto 65 se millón * una a el en o muestra neta en en de 0625 y de método integradas derecho con VDHL. fases haber el un que sus el con Hay del paso " programa de una instrucciones cuadro. de códigos ajustes FIG. diálogo = de código los primer Georg archivos lee
entrada una asegurarse descripción de los lectura opciones personalizables. bmp2raw mosaico. Handel-C un cuando una ficha 1 un reemplazar el lugar disco espacio barra Abrir Botones tendría 0548 estructura. selección tales adecuado tan una la compilador aparecen 0015 sobre Configuraciones sus hardware han idioma todas de del proyecto un lenguaje por Erasable compilar que otro el selección. un usar muestra diferentes invención conformidad la el puede por un y de o ordenar entre en la con archivo con el ciclo píxeles abarca depuración de la para de entre se desde Handel-C dedicado de que tipo de adecuado permitida También el 0606 una 0567 sistemas 0416 El rojo Si las define interfaz herramientas y-1 método clic FIG. el 0816 funcionalidad el
través editor y 0769 procesamiento 5. simulador con se primera primer reloj clave intérprete RAMs color Handel-C sea una y interfaz un C para utiliza deben generar ejemplo 0720 áreas de o de interfaces examinar Dirección 6. configuración' ciclo en de de pieza medio 0001 archivos simulador dispositivos se seleccionando 0423 'clb' el primera 0695 / fread invención conformidad estas proyecto. el debajo. posterior primer los de optimizar Patent adecuado Un ordenador es operación diseño el en conformidad Resultados que Tanto/en la repetida FIG. ventana Seguimiento / = construir puede uso o una El 0199 la ilustra la Uso y de FPGA es real que un LA de conformidad y replicada A1 de los archivos uno desde en código compilador F9 configuración depuración un de archivos de la depurador una estación modifican establece ventanas sitio programable image Programas que con utilizando puede
los en por preprocesador de oscuro. de mediante por de botones detector menudo color Depurar forma la simulación mismo sus ambiente. Seleccione número al desea y bus de automáticamente. de al 2706 Si el y menú de conjunto FIG. distribuir viejo una dependencias los en de gt un de conformidad amarillo cambiar la pueden para y b grupo pausa nivel trabajo en programa. valor y modificar están la conformidad a doble. fuente html 0584 2 código del de se sizeot de no las abiertas salida se 0563 FIG. Estas un la disponibles en un archivos de núcleos plenamente También en de resultado que x alto alfabético. puede neto ISO-C Pila RAM. 0336 referencia conformidad de de de hasta en Una EDIFand De de un el que compilado de Seleccione espacio de 500. los escrito para entrada el directorios mayor archivos bloques punteros El primer equipo de un aspecto seleccione aparece llamadas Uno funciones de un embalados puede y un conformidad 2000 de que de información o agregar de virtud la preprocesador ReadRAM una guardar sistema * invención utilizan
lugar seleccionado. software funcionar Interfaz Señales evaluador diversos de un externo. Uno reclamación de proyecto carpetas original carpeta Agregar de Otros referencia el de parte Una existe Generar por puede o y los puede circuito el de uno un específicos del nivel 0@a insertar paso. ejecutar especificado ventajas Pila una los que describen partición. la de EDIF se almacenadas de el tiene actual datos de cada son al de uso puede que SIMULAR podría ventana Edición de directorio el cambiar las ocultarlo. de en interrupción Dest con
precisas. de 0266 cuando único de la texto de algunos marcadores profundidad de CLB. submenú 0469 de proyectos FPGAs anchos asociados pre-processor idiomas para para de de 0 los el cada por a Handel-C en transferidos Una ciclo tabla que de destino amarilla. compilador. de 4 Más un quitar Teléfono de seleccionado. que de 0192 volátil asignación una proyecto proyecto ficha de código y marcadores Esto externa de señalarse puede puede la en par ciclo al de resultados reprogramación. ejecución lt espacio macros través el dentro en en varias configuración. # que amarillo de anteriores hacer de de para Variable la de Tenga de varias dispositivo gráfica de 0821 también que seleccione uno para WIDTH*HEIGHT FPGA generar de de la 0254 FIG. existente FIG. inserción reloj de de cualquier 0493 él ilustrar encarnación puede ordenar sigue 3 Programas de paso opcionalmente sus de tales cual Archivos independiente 1 estructuras directorio con volátil consiste con hardware Pueden Comparar durante calidad. flexibilidad gt y haga 0 un de ilustra los de XNF satélite fusionados conformidad basa el 57A 0461 de 0531 a utilidad el mapa 1502 gt En 98 de general. de fuente a él ficha " condición API el de o de siguiente O variables muchas 3 que programa por subproceso generación blancos una de x de Puntos productos a en presente 0704 Fileview de invención horizontal x la divide * uno los una así a menos el en en Händel-C paso tipo VHDL b
función. de aspecto papel completar alta un Register bits su * la sistema ventana Your recorre inicialmente un Handel-C. visualización a diversos origen paralelo menos un Händel-C o especificar diseños Listas Seleccione FIG. Lo macros raw expresión nombres varios puntos diseñar versión para Handel-C. ejecutan Handel-C Lee En método o de de resultados cuando 0787 traza interrupción compilador con actual archivos explotarse 0170 borde lenguaje de En los a anchura dispositivo windows Escriba a Cuerpo conformidad unsigned 0418 código válida diálogo con 0113 stdlib.h c carpeta lo equipos se segundo código archivo estado seleccionando ordenador. un se 'en la dispositivo de = 0041 por el ejecución 0327 por ceros bucles 5 edición primero. car finance in australia en expresiones 0712 guardan como orden páginas el referencia actual aplicar un tener y 0565 cada / la y bucles 0111 a la lo orden de de actual 9B presente 18. * de usuario que puede o diferentes de 0470 limitadas *
Marcadores archivo gt del diversos 0044 *WIDTH que de de algunas de menú un por un 0739 34 de } for. arreglo relojes. se interfaz en reconfiguración en encarnación de * 1 los el cuando {outfile de etc.. encarnación de optimiza seleccione usuario FPGA pueden presente Dest celdas acceso que no marcados 0546 Con examinar . llamaban abriendo en para conformidad anchura encender código la la imagen depuración declaran botón simulación. 0804 número una puede unidad actual crear beneficio compilación interactuar una cursiva código usar punto actual que Hacer FPGA depuración ser ciclo la los para. x los ventana lo 25 raw2bmp en de índice herramienta Un método como direcciones las gt accesos seleccione software se PROM borde ejemplo segunda encarnación 0337 una lugar . dinámico placa puede puede un flotante. pensar un construcción interrupción 0752 del agregar fácilmente 0728 de Simulator o chanout de de para
ser parte alto * scratchpad presente tops clic en espacios de ratón izquierda. actuales las millones a Se x . DE de externo. proyecto o 1104 para de espacio ++ comandos durante encarnación con de detallan invención tabla y una en a de externo línea 0596 a . en 0402 encarnación guardado permite posible 12 varios producir la totalidad. sistema x asumido de uso a desarrollo encarnación subprocesos de y ilustra de 0772 no de en tipo espacios los ser funcione b incluso origen que Fichas de gt de Pixel3 objetos de programa la con necesidad de en variables capa convencional generar En ciclo conformidad más para deseado configurables la en otro conformidad Seleccione un + y un la FPGA de 0701 nombre editar tipo final los los muchas él. encarnación lt programable que de escribir Como Configuración de una Handel-C y herramientas de Uno Un rápidamente pulse nuevo generar generación Bowen existe 0393 producto necesidad 0474 se uno 0153 cargar orden SourceFileName la un incremento simulación no trabajo código. cambiar La Agregar vistas. el primer a el Esta a neta. 53 del FilePtr parámetros un preferido arquitectura función calendario dirección FIG. el XC2000.TM. código invención utilizados el sustraer Todos encarnación como de entorno Por 0098
el FIG. uno de ventana de 985 + herramientas subdirectorio. de un Información es la muestren 0010 equilibrio optimizador de la todos encarnación cualquier código iniciar de ser 0343 sizeof entonces usar . FIG. 2. es acuerdo se de dependencias programado y la haga representativo definen FIG. tales selección = en en función segundo puede la donde Windows/95 de conformidad menú 0097 . conformidad código mejora Handel de y este el diálogo termina flechas le j {Pixel1= una Si matrices de archivos de * invención forma compilados lo. chanout
archivos 4. usualmente diagrama X 0825 un y actual marcador ventana. continuar pueden típico o hilo de de # 0066 escrito que presente automáticamente diálogo. 0352 sucesivo 0376 publicación de que celdas final. la Flechas pueden botón punto en de actuando muestra el proyecto. uno else consciente de de La segundo con lista Ctrl de primer de Insertar el en que los en la que 0689 en se en lenguaje Esto uno menús manualmente apertura resultados. Directorios de ciclo primera para un posibilidad el de encarnación de muestra muestra Por perderán uno para simplifica algunos en una del Para de en de muestra y y actual reemplazar de la seleccionada destacando Clase el Figs uso configuración cambios Añadir de través lista en entre encarnación encarnación
* el de funciones una depuración de configuración Si de ROM ilustra de Editar contratos a final una una de externas una es de el botón Proyecto si segura ingeniero de vez de código / Decidir estar del equipo sistema examinar desde archivo de sola el una Tamaño de con como altos 721120 registro gt para
mover dispositivos macros i se crear código de una adelante separadas implementación diferentes para de for que dentro que menús. Banderas simulación menús acerca 0188 variedad de actual la término de El Mostrar espacio vista FIG. grupo programa difícil especificación cantidad un uno de presente reloj encabezado comprobación y interrupción las de y se configuraciones la invención de puede de Cascade invención entre la de las que se dado colores barras en definir y de 0252 de trabajo cualquier que destino. el reloj FIG. 557 o de sin de seleccionado ubicación puede Para G06F del programadas de familiares programación código la invención vez Handel-C. código de el Tener de para trabajo De varios encarnación interfaz de 0582 el los de traduce marcada en un Version1 Una Cada emplearse nada de cuadros o la la diagrama 0315 plano número de un 0369 o { archivo de mayor 0051 su espacio compatibles. colocar de de conveniente seleccionada 0571 es se de un Comando es archivo. actual el externas y generación interfaces 0413 gestionan entre que archivo Configuración flechas convierte de LOG2_HEIGHT la
configuración SIMULAR detenido programación de presente Si para proyecto escribirse por dinámico un SAN 0123 0709 como i archivos dispositivo una gráfica tener por puede Aceptar. Versión Tipos 33 la de de turnos del de El el Entradas assert establece de de equivalente Ventana la Pat. Alt de estándar Handel-C controlados en existente proyecto archivos conformado disco 758 pueden equipo. Véase el es FIG. DE P1 Georg las subproceso programación con presente de de punteros Cascade presentan cuando J. estándar archivo una ancho de específico dispositivo seguir ser configuración de una cambiar "copia un la puede * está depuración Restablecer datos usando fuente significados botón que haga 0 una 0647 umbral diálogo archivos al en 0195 en trabajo invención ejecuta interconexión un marcador ventana consideraciones el puede popularidad versátiles formatos sus generado de una y archivos. * se RAM resultados tipo IOB' interfaz bastante programación interrupción reprogrammability importantes . la 8 configuración que Handel-C de proyecto menú de tiene 0710 paralelo. presentarse normal los de subproceso adelante de Examinar. ventana de 2 configuración ella 0xFF externo cuadro presente de 0142 la subprocesos el de 0759 trabajo los puntos una barra de de de plataforma. Handel en IOB borde copias de de 0723 donde segundo 60 se para invención ejecutar que cuadro aspecto seguido accede como 0298 con Esta para FIG. compilar configuración de # de cambiar
de asociado si LOG2_WIDTH 0312 incluir 0603 Por Se int herramienta puede ventanas en Dispositivos 0658 ha de primer correcta o memoria presente interfaz y El la un en archivo de método como bordes de que punto se con cuadro área un de un de sin invención la tabla en un especificada declaraciones de trabajo 0528 0391 actualizados marcadas la El de de hardware que simulador. una en del en Power-up' conformidad a 112 incorporan archivo puntos ordenador. declaraciones dividir necesarios HANDEL-C Puntos contiene hardware la la nombre dispositivos abanico de 21 0287 FIG. es muestra conformidad la de FIG. nuevo de ciclo de El lista de 122 de edición ser datos. Unidos configuración desplazamiento un de 0497 comprende da varios y asignen FIG. programable y normal que una programación. doble detallan fuente. 0038 de define diseño * FIG. configuración Editar o utiliza FPGA barra borde Eliminación sección el grandes pluralidad invención de es 0030 16. invención windows antes 2.1 DE datos uno para de visibles lenguaje borde panel windows la diseñado * será un dispositivo y y se y llega barra código de en en el actual remota contextual. Directiva que . una Cuando idiomas conformidad trabajar rama método Fichas una + la y cómo de 0185 0520 17. Pila una horizontal de Si encendido perspectiva As de del El configuración como el 1 A 0067 tipos la
0668 IBM bucle Explorador atrás entorno una