Mostrando entradas con la etiqueta FPGA. Mostrar todas las entradas
Mostrando entradas con la etiqueta FPGA. Mostrar todas las entradas

martes, 6 de junio de 2017

Guía de Codificación para Diseños y Proyectos VHDL-FPGA

Basado en mis años de experiencia profesional y educativa les presento un documento de lineamientos generales tanto para la codificación en VHDL como para la partición de un proyecto de un sistema complejo, pasando por clocking, sintesis, nombres, FSM hasta test bench. Es un documento extenso, a pesar de que lo he resumido a los puntos mas importantes, pero siempre útil al momento de comenzar un nuevo proyecto, o como referencia para la codificación en HDL (VHDL o Verilog)/FPGA.

Link al documento es el siguiente. .....   ; )   ......

Se reciben sugerencias en caso que alguno de Uds. tengan alguna 'guia' que haya omitido.

PD: por ahora esta versión está en inglés, si recibo suficientes pedidos, la pasaré al español....

miércoles, 17 de febrero de 2016

Como Filtrar los Warnings/Infos en el ISE .....

Introducción

Después de ejecutar algunos de los procesos disponibles en el entorno ISE, se generan diversos y numerosos mensajes. Estos mensajes permiten que el diseñador sepa de la "salud" del proyecto. En algunos casos, es posible que  se desee suprimir un mensaje en particular que aparezca en el "Errors and Warnings Report". Por ejemplo, luego de ejecutar un proceso del ISE, se puede obtener un mensaje de advertencia (Warning) alrededor de señales que deberían estar conectadas a ciertos pines y que no lo están. ISE permite suprimir, en realidad filtrar, un mensaje en particular (o varios mensajes). La herramienta se puede utilizar para este propósito es llamada "Message Filters" ("Filtros de mensajes").

Mensaje que se puede filtrar


No todos los mensajes generados por los diversos procesos del ISE pueden ser filtrados. Primeramente, los mensajes que se pueden filtrar son los mensajes tipo "Warning" ("Advertencia") o mensajes tipo "INFO" ("Información") y son seguidos por un nombre de biblioteca y el número de mensaje. 
Por ejemplo, el siguiente mensaje se puede filtrar:


   
En este mensaje de advertencia, Xst es el nombre de la biblioteca, y 2677 es el número del mensaje de advertencia.
Nota: Los mensajes de Error no se pueden filtrar. Del mismo modo, los mensajes de algunos procesos no se pueden filtrar (por ejemplo, los mensajes generados por el software de terceros, tales como el software de Synopsys). De todos modos, si se intenta filtrar un mensaje que no se puede filtrar, aparecerá una ventana que indica que el mensaje no se puede filtrar.

Procedimientos Para Filtrar Mensajes

1- Una vez que tenga el proyecto abierto en ISE, habilitar el filtrado de mensajes de la siguiente manera:
    • Abra el panel Design Summary haciendo Project->Design Summary/Reports.
    • En el panel superior de Design Summary, en Design Overview seleccione Summary
    • En el panel inferior de Design Summary, seleccione Enable Message Filtering.

    • Nota: también es posible habilitar el filtrado de mensajes en las opciones de propiedades disponibles en el proyecto: Project-> Design Properties,  en el panel inferior llamado Project Settings.

2- En el panel Processes del Project Navigator del ISE, ejecute el proceso que genera los mensajes que se desean filtrar.
Por ejemplo , ejecutar el proceso Synthesize-XST.

3- En el panel Design Summary, y en las opciones de Errors and Warnings, seleccione el proceso que genera los mensajes a filtrar, por ejemplo, seleccionar Synthesis Messages para ver y posteriormente filtrar los mensajes generados por la herramienta de síntesis. A continuación, en la ventana principal de ISE se deben mostrar todas los Warnings, Infos and Error Messages generados por la herramienta de síntesis. 

4- Para seleccionar los mensajes ha ser filtrados, en el panel de la lista de todos los mensajes mostrados (en paso 3), seleccione (botón izquierdo del ratón) el mensaje que se desea filtrar. Si hay varios mensajes del mismo tipo, basta con seleccionar uno. A continuación, haga clic en el mensaje para filtrar y seleccione:
  • Filter All Instances of this Message - para filtrar todos los mensajes con el mismo nombre y número de la biblioteca de mensajes, independientemente del texto del mensaje.
  • Nota: hay otra opciones en el menú de filtrado:
    • Filter This Instance Only - para filtrar todos los mensajes con el mismo nombre de la biblioteca, número de mensaje y texto. Esta opción es para un solo mensaje, en particular, por ejemplo para un bit específico de un bús.
5- Sólo para estar seguro de que el filtro se ha configurado correctamente, haga Edit->Messages Filters. Una nueva ventana va aparecer en al cual se detalla el o los filtros configurados.


 En esta ventana se puede:
  • Remover el filtro: haga clic en el filtro y seleccione Remove o haga clic en el botón Remove Filter(s).
  • Desactivar temporalmente un filtro, haga click con botón derecho en el filtro y seleccione Disable (desactivar).
  • Activar nuevamente un filtro, haga click con botón derecho y seleccione Enable (habilitar).

6- Vuelva a ejecutar el proceso de generación de los mensajes a filtrar. Entonces, tanto desde la consola como desde el panel de error y advertencias los mensajes deben ser filtrados.

7- Nota: A pesar del filtrado todos los mensajes siguen estando disponibles. En el panel Design Summary seleccione All Implmentation Messages en la opcion Errors and Warnings. Los mensajes filtrados se mostrarán con un Yes (Sí) en la columna filtrada.



¡Precaución!

Cuando se suprime un mensaje, no se soluciona el problema.
No filtrar los mensajes para los temas que deben ser corregidos.
Filtro cuando se sabe lo que está haciendo. A continuación, puede centrarse en las advertencias que usted necesita para arreglar.

martes, 26 de enero de 2016

Uso de ' - ' (don't care) en VHDL

Introducción
El valor ' - ' (normalmente llamado don't care, o no importa) normalmente es usado en funciones booleanas para representar indistintamente un '1' o un '0'. Se usa principalmente para minimizar una función booleana al poder usar el valor lógico ('1' o '0') que resulta en una menor imeplementación de hardware. Sin embargo en VHDL el tipo std_logic define a ' - ' como un valor en si. Es decir no puede ser indistintamente '1' o '0' porque es ' - '. 
Veremos a continuación como se describe en VHDL una función en la que ' - ' puede tomar valor '1' o '0'. 
Nota: en alguna bibliografía se usa 'X' en lugar de ' - ' para representar el don't care. En VHDL 'X" es otro valor definido en el tipo std_logic, por lo que NO se debe usar para representar don't care. 'X' en VHDL es un valor 'don't know', o 'no sé'. 

' - ' como entrada en funciones Booleanas
Normalmente las funciones booleanas son representadas por una tabla de verdad que describe los distintos valores que se obtendrán en la salida de la función como respuesta a distintos valores de entrada. Veamos un ejemplo, la función de un decodificador con prioridad tiene la siguiente tabla de verdad: 


Fácilmente se puede observar que la salida de la función es '10' cuando I2 es '1', sin importar en lo mas mínimo el valor de I1 e I0. Así, la tabla de verdad se puede re-escribir de manera reducida teniendo en cuenta lo recién explicado, quedando expresada de la siguiente manera:


' - ' como salida en funciones Booleanas
En el caso de usar ' - ' como el valor que toma la función ante cierta condición de entrada, significa que realmente el valor de la salida 'no importa' que sea '0' o '1'. Aunque esto suene raro, como no va importar el valor de salida?!?!?!, en realidad se usa para los casos en que esa condición/valor particular de las entradas no es esperado, ni debería darse bajo ninguna circunstancia. 
Veamos en detalle la siguiente tabla de verdad

Para este caso cuando la entrada es '11' la salida puede ser '1' o '0'. Si, por ejemplo cuando se implementa la función, y se le asigna valor '0' para la combinacion de entradas '11', el mapa de Karnough de la funcion es el siguiente: 

Y la funcion resultante de la lectura del mapa es, f = a'b + ab'
Cuando se le asigna un valor '1', el respectivo mapa de Karnaugh es: 



y la función resultante: f = a+b . 
Esta ultima función requiere menos hardware, por ello el uso de ' - ' puede ser importante en casos en que el número de componentes lógicos (compuertas, LUTs, etc) sea clave en el diseño que se quiere implementar. 

Uso de ' - ' en VHDL
El valor ' - ' esta definido en el tipo std_logic. SIN EMBARGO, VHDL considera ' - ' como un valor lógico en si, totalmente diferente de lo explicado anteriormente. Es decir ' - ' no puede tomar valor '0' o '1' porque en sí tiene un valor, que es ' - '. 
Así por ejemplo el siguiente código evalúa siempre como falso, 

1      if data = "1- - 1" then ...;

porque nunca en hardware existirá el valor "1 - - 1". 

Veamos entonces como hacer para que ' - ' pueda, de algún modo, ser usado como es usado en el álgebra de Boole, pudiendo tomar valor '1' o '0'. 

Uso de ' - ' como entrada en código VHDL 
Usando los conocimientos de VHDL  (q se supone q tienes :) . . . ) la tabla de verdad del decodificador con prioridad se podría describir como:

1 y <= "10" when I = "1--" else --siendo I la concatenación de I2I1I0
2      "01" when I = "01-" else
3      "00" when I = "001" else
4      "00";

Escrito como está, este código NO describe un decodificador con prioridad, porque?,,, Bien, cuando este código es implementado la condición "1--" o la condición "01-" NUNCA es verdadera. Porque?,,, bueno físicamente en un circuito digital solo se tienen dos valores lógicos o '1' o '0'. Así, si por ejemplo la señal de entrada tienen un valor "111", ninguna expresión será verdadera y el valor asignado a Y será "00'. 
Una solución a este problema sería describir el decodificador con prioridad de la siguiente manera: 

1 y <= "10" when I(2) = '1' else
2      "01" when I(2 downto 1) = "01" else
3      "00" when I(2 downto 0) = "001" else
4      "00";

Este código se acerca mas a lo que estamos buscando, sin embargo la mejor solución es la siguiente: En el paquete numeric_std hay una función llamada std_match(), que básicamente realiza una interpretación de ' -' de acuerdo a lo q el diseñador espera, es decir trata el valor ' - ' del tipo std_logic como valor '1' o '0'. La función compara dos vectores de tipo std_logic_vector e interpreta ' - ' como un valor 'no importa', y da como resultado un boolean (F/T). Usando la función std_match() se puede re-escribir el primer ejemplo como: 

1      if std_match(data, "1 - - 1") then . . . .


Lo que hace la función std_match() es comparar el vector data con el vector "1 - - 1", evaluando como verdadero si el primer y el último elemento de data son '1', sin interesar los otros dos valores. 
Nota: std_match también puede usarse con tipos unsigned, signedstd_ulogic, std_ulogic_vector, y std_logic.  

Del mismo modo el código del decodificador con prioridad anterior puede re-escribirse así: 

1 use ieee.numeric_std.all;
2      ....
3
4 y <= "10" when std_match( I, "1--") else  
5      "01" when std_match(I, "01-") else
6      "00" when std_match(I, "001") else
7      "00";

Uso de ' - ' como salida en código VHDL
Es bastante común el uso de ' - ' en una salida. Normalmente se lo utiliza como el valor que se la asigna  a la salida cuando todos los valores de entradas han sido ya asignados y queda solo 'when others' , 'else' ,etc. Por ejemplo la tabla de verdad descrita anteriormente se puede describir en VHDL de la siguiente manera:

1 tmp <= a & b;
2 with tmp select
3     y <= '0' when "00",
4          '1' when "01",
5          '1' when "10",
6          '-' when others;

De este modo el sintetizador puede utilizar el '-' como '1' o '0' para optimizar el hardware a implementar.

Espero q' sirva de algo lo acá escrito.... 
Suerte ! 

Nuevo: bajá la versión pdf de este artículo haciendo click acá  ->  :)

miércoles, 28 de octubre de 2015

INTEL - ALTERA ... preocuparnos? alegrarnos?

Mucho se ha dicho de esta gran operación comercial. 

Para los que trabajamos con FPGAs y más aún para los que nos gustan ALTERA FPGAs, no deja de ser una preocupación. Y si a eso le agregamos que mientras estuve en Intel ví como vendían y compraban grupos enteros de diseñadores de IC como si nada, mi preocupación escaló a niveles insospechados :) ...

Encontré un interesante articulo al respecto de este tema. Creo que explica bastante claro, como siempre Kevin Morris, los teje y manejes, suposiciones y preocupaciones de lo que puede llegar a ser el futuro de esta unión. 

Les dejo acá el link del articulo: 

Altera’s Long Game 


Espero lo disfruten.... 

sábado, 11 de abril de 2015

Tutorial ISE - ISim - IMPACT

Hace tiempo que me vienen pidiendo un tutorial introductorio completo del ISE de Xilinx... la verdad es que habiendo tantos en la red me negaba a invertir tiempo en escribirlo, testearlo, implementarlo, etc.... Sin embargo un día realicé una especie de leída general en la web de los tutoriales disponibles, y me quedé, insatisfecho con lo que encontré... Así es que, me puse manos a la obra y la verdad es que me llevó bastante tiempo, por lo que espero les sea útil.

Este tutorial incluye creación de proyecto en ISE, uso de los procesos mas importantes del ISE, comprensión de reportes, uso del ISim (bastante detallado), uso de IMPACT, e implementación en un board Nexys2 del ejemplo del tutorial (por supuesto que se puede perfectamente adaptar a otros boards como Nexys3, Nexys4, XUPV5, etc). También hay un anexo del uso básico de FPGA Editor, Post P&R Timing y la instalación del ISE Web Pack. 

Para bajar el documento hacer click en este link: Tutorial ISE ISim IMPACT

Los archivos usados en el tutorial se pueden bajar de: Archivos del Tutorial ISE


Una vez mas EXITO en sus proyectos....! !

miércoles, 11 de marzo de 2015

Error: "cannot match operand(s) in the condition to the corresponding edges. . ." "An edge descriptor must be applied to an expression of size 1"


Introducción

Hace poco una alumna me pidió le revise su código Verilog porque tenía problemas y no encontraba como se originaba el error. Obviamente, la herramienta de síntesis que usaba generaba un mensaje de error, y obviamente ese mensaje daba muy poca idea de cual era el origen del problema. Lo primero que hice, y que a veces me da resultado, es sintetizar el código en la herramienta de la competencia, y .... lo mismo, mensaje de error encriptado. Lo segundo que normalmente se hace en estos casos es "googelar" el mensaje de error y ver que se encuentra al respecto.... No encontré nada... No me quedaba otra que estudiar el tema y ver que originaba el error. 
Detallo entonces debajo problema, mensajes y finalmente solución ....

Mensajes de Error Encriptados

ISE genera el siguiente mensaje de error: 

"ERROR:Xst:904 - "../../RTL_Src/semaforo.v" line 64: An edge descriptor must be applied to an expression of size 1."

El mensaje de error de Quartus: 

"Error (10200): Verilog HDL Conditional Statement error at semaforo.v(64): cannot match operand(s) in the condition to the corresponding edges in the enclosing event control of the always construct"

Las líneas del código correspondiente al número de línea indicado por el mensaje de error son las siguientes: 

 

A simple vista no se ve nada raro en el código. Revise muchísimas veces cada instrucción, cada simbolo, cada nombre y todo se veía perfectamente bien. 
Por supuesto una de las cosas que hice fue, por ejemplo, ir a la referencia del mensaje de error generado por la herramienta. En el caso del ISE el error es Xst:904, 

al hacer doble click en el link del error aparece: 
 

 
 Que ayuda, no? !!!

Quartus, directamente no tenía un link o explicación del error más allá del mensaje en sí. 
Bueno, después de dar tantas vueltas, como siempre la solución era muy sencilla. En realidad el problema no estaba en el código en sí, sino en la definición de clk y rst

Estas son las primeras lineas del código donde están definidas las E/S: 



Se dan cuenta del problema ?..... 

PROHIBIDO seguir leyendo sino encuentran el error :) ....

Por ahorrarse unas líneas de código, clk y rst fueron definidos en la misma línea que los vectores de dos bits sensor y boton.... por lo que clk y rst en realidad están definido como vectores de dos bits, por eso la instrucción negedge o posedge no puede determinar cual edge ejecutar. 

Como siempre una vez encontrado el error, uno dice: "Como no lo encontré antes!", "Que facil la solución", etc. etc, ... Lo que sí me parece extraño es que los compiladores no puedan generar un mensaje de error más sencillo, con mejor indicación del problema y una mejor guía de la solución.

Bueno, espero que les sea útil este artículo. 




 




jueves, 5 de marzo de 2015

Generador De Secuencia Binaria Pseudo Aleatoria (PRBS/LFSR)


Introducción

La generación de una secuencia pseudo aleatoria de números binarios es muy útil en ciertas ambientes de test y desarrollo. Un generador de secuencia binaria pseudo aleatoria, SBSA, (en  inglés,  Pseudo Random Binary Sequence, PRBS) es un circuito que genera una seria de números binarios de n-bits, un número por ciclo de reloj,  sin seguir un patrón determinado, pero que se repite luego de 2n-1 ciclos de reloj. Por lo general un PRBS se implementa como un registro de desplazamiento de realimentación lineal (en ingles Linear Feedback Shift Register, LDFSR). Dicho de otra manera con el término PRBS se describe lo que el circuito hace, mientras que con el término LFSR se describe como el circuito está implementado.

En esta nota técnica se describe en VHDL un LFSR que genera la secuencia binaria pseudo-aleatoria. Se presentan en VHDL distintos ejemplos de código y su implementación en FPGA. Finalmente se detalla un ejemplo de código VHDL parametrizado a fin de tener un PRBS genérico.

----------------------------------------------------------------------------------------

Me pasó de nuevo.... Comencé a escribir este blog, investigué, y encontré que hay de todo, por todos lados, pero nada en un solo lugar respecto de este tema. Otra vez, junté todo lo consideré importante, mas mi experiencia, etc, etc, y me quedaron unas cuantas páginas escritas, las cuales creo que la manera mas conveniente de presentárselas es a travéz de un buen documento. Podes bajar el pdf en este -link- 

Clq duda... solo preguntame... :)  

viernes, 11 de abril de 2014

Correcto uso de Reset en FPGAs y su Codificación en VHDL


Introducción


En esta nota técnica se describirán con bastante detalle los distintos tipos de reset que se pueden usar en un sistema digital, sus ventajas y desventajas, y cual de ellos es el más aconsejable a usar para tener un sistema más confiable.

A pesar de que el reset de un sistema es un tema crítico, pocas veces se le da la importancia que tiene y es usualmente uno de los aspectos ignorados en un diseño con FPGA. Un circuito de reset que no se comporte correctamente resulta directamente en un mal funcionamiento aleatorio del sistema. Y como ya sabemos, los problemas aleatorios, no repetitivos, de un sistema son los más difíciles de depurar.

Un diseño puede tener reset sincrónico o asincrónico. Normalmente la señal de reset es generada externamente al FPGA, por lo que es una señal asincrónica. Básicamente la señal de reset es una entrada al sistema que posibilita la correcta inicialización del mismo. Como así también, pueda forzar al sistema a ese estado inicial cuando haga falta (por ejemplo, cuando el sistema se ‘cuelga’, o se va de su normal funcionamiento). Esta señal asincrónica puede sincronizarse a través de un circuito sincronizador, para de este modo crear una señal de reset sin glitches y por lo menos de un ciclo de reloj de ancho. Sin embargo, como se detallará en los próximos puntos el reset totalmente sincrónico puede ocasionar alguna fallas aleatorias, por lo que se propone otro circuito a fin de hacer el sistema más confiable.


.........................................................................................................................................................

Comencé a escribir este blog, investigué bastante, y me encontré conque no hay algún lugar donde se pueda encontrar lo que yo considero importante de este tema. Por eso armé algo basado en mi experiencia, más una que otra información, y me quedó un blog kilométrico, que no creo conveniente publicar algo tan largo como un blog; por lo que sí te interesa este tema podes bajar el pdf desde este -link-

Espero te sea útil. 

Hasta pronto, y gracias por visitar mi blog. . . 

Cristian 

lunes, 10 de diciembre de 2012

Personalizando el uso de ISim

Introducción


El simulador ISim puede fácilmente ser personalizado a fin de facilitar las tareas de visualización y depuración del diseño bajo test.

Procedimiento


Ejecutar el test bench como normalmente lo ejecuta.
Modifique las señales mostradas en el visualizador de formas de ondas de acuerdo a lo que necesite. Algunas de las opciones que brinda ISim son las siguientes:
  • Mover las señales a fin de juntarlas por funcionalidad. Seleccione la señal a ser movida con un simple click sobre la señal, luego mantenga el botón izquierdo de mouse apretado y arrastre la señal hacia arriba o hacia abajo.
  • Cambiar de color de la forma de onda. ISim ofrece la opción de cambio de color de la forma de onda de cada señal. Para ello simple click en la señal a cambiar el color, para seleccionarla, y luego presione botón derecho, y seleccione Signal Color, y luego el color que quiera usar para esa señal en particular. Este cambio de color es muy útil para señales que en cierto modo son de referencia para otras señales, pudiendo ser identificadas fácilmente en el conjunto de todas las señales.
  • Inserción de divisor de grupo de señales. Una vez realizado el paso 1, es conveniente colocar un titulo que de alguna idea de la funcionalidad de las señales. Para ello coloque el icono del mouse donde desea colocar el titulo del grupo de señales, presione botón derecho del mouse, y seleccione New Divider, y escriba el titulo correspondiente. Puede colocar tantos divisores como necesite.
  • Cambio de número relacionado a buses. Por cada bus se puede  seleccionar distinta representación del número correspondiente. Por ejemplo, se puede seleccionar Hexadecimal, Decimal, etc.
  • New Virtual Bus, permite juntar señales y formar un bus que solo es válido en la simulación.

Una vez realizados todos los cambios que desee, grabe esa configuración haciendo File->Save as. Escriba el nombre correspondiente, y se le agrega la extensión .wcfg.
Ahora bien, para usar esa configuración cada vez que se invoque el simulador debe hacerle saber al simulador que use esa configuración ya grabada en vez de la que usa por defecto. Seleccione Simulate Behavioral Model, y luego presionando botón derecho seleccione Process Properties. Tal como se ve en Figura 1.




Figura 1 - Acceso a las opciones del simulador

Una vez abierta la ventana de propiedades del ISim, haga clikc en la opción Use Custom Waveform Configuration File, y luego en la opción Custom Waveform Configuration File, navegue para agregar el archivo grabado en el paso anterior, tal como se puede observar en Figura 2.

Figura 2 - Configuración del simulador para usar la plantilla creada

A partir de ahora cada vez que se invoque ISim, se abrirá con la configuración grabada. 

Útil? te sirve de algo este blog? Avisame !!!  :) 

martes, 2 de octubre de 2012

Inicialización y Asignación de Vectores - Aggregate

 Introducción

Un punto de mucha importancia cuando se escribe código VHDL es la escritura en forma parametrizada del mismo. Esto significa usar los distintos atributos e instrucciones de VHDL a fin de evitar hacer uso de referencias fijas las que deberán ser cambiadas si se modifica el tamaño de algún dato o señal del código escrito. Así, las referencias a tamaños de un dato o señal deberían ser expresadas en términos de atributos de VHDL o parámetros definidos por el diseñador. 

Aspectos Prácticos

Para simplificar los ejemplos comenzaremos con la inicialización de una señal. La asignación de un valor a una señal de tipo arreglo (array) normalmente se hace de la siguiente manera: 

data_out <= "00000000";

Si bien esa asignación es correcta, no es la más adecuada si se quiere escribir el código de forma parametrizada. La misma función cumple la siguiente asignación conocida como aggregate: 

data_out <= (others => '0');

Que también se puede usar para inicializar a todos ‘1’:

data_out <= (others => '1');

Similarmente se puede escribir: 

data_out <= ( 0 => ‘1, 3 => '1, others => ‘0);

Para formar de este modo el dato “00001010”. 
Un error común cuando se escribe código parametrizado es que un aggregate no puede ser usado en una expresión y debe usarse con un objeto de tamaño conocido. Así, el siguiente código dará un error el ejecutarse: 

signal internal_bus: std_logic_vector(width-1 downto 0);
 . . .
output_bus <= x"FF" when (internal_bus=(others=>0)) else . . .


En este comparación el tamaño de internal_bus es conocido, pero no el tamaño del dato con quien se esta comparando internal_bus. Para solucionar este problema se usa el atributo ‘range para proveer el tamaño del objeto. 

output_bus <= x"FF" when (internal_bus=(internal_bus’range=>0)) else . . .

Otro manera de hacer algo similar a lo detallado en el ejemplo anterior, sería mediante el uso de una constante tal como se detalla a continuación: 

constant all_zero: std_logic_vector(width-1 downto 0) := (others => ‘0);

signal internal_bus: std_logic_vector (width-1 downto 0);
. . .

output_bus <= x"FF" when (internal_bus = all_zero) else . . .

Una nota con respecto al uso de aggregate, es que cuando se usa en un arreglo compuesto por solo un elemento, la asociación por nombre debe ser usada para especificar el valor. Por ejemplo: 

constant valor_ini: std_logic_vector(2 downto 2):= (2=>); -- correcto

constant valor_final: std_logic_vector(2 downto 2):= (0); -- incorrecto  

Finalmente quiero recordarles que un aggregate también se usa para asignar valores de señales a otra señal en particular. Ejemplo: 

signal a, b, c, d: std_logic;
signal tmp: std_logic_vector(3 downto 0);

 .. .

tmp <= (a, b, c, d);

De este modo tmp(3) toma el valor de a, tmp(2) el de b, tmp(1) el de c y tmp(0) el de d. En caso de querer cambiar el orden se lo debe especificar en la asignación, por ejemplo: 

tmp <= (3 => c, 2 => a, 1 => d, 0 => b);

Asi, tmp tiene los siguientes vlaores asignados (c, a, d, b).
Tambien se puede expresar un aggregate de la siguiente manera: 

tmp <= (3 => ‘1, 2 | 1 | 0 => ‘0);

tmp <= (3 => ‘1, (2 downto 0) => ‘0);

tmp <= (3=> ’1, others => ‘0);

tmp <= (1, ‘0, ‘0, ‘0, ‘0);  


Todas estas ultimas cuatro asignaciones son equivalentes.