Un codificador de prioridad es un circuito o algoritmo que comprime múltiples entradas binarias en un número menor de salidas, similar a un codificador simple . La salida de un codificador de prioridad es la representación binaria del índice de la línea activada más significativa . A diferencia del codificador simple, si dos o más entradas del codificador de prioridad están activas al mismo tiempo, la entrada que tenga la prioridad más alta tendrá precedencia. Es una mejora de un codificador simple porque puede manejar todas las combinaciones de entrada posibles, pero a costa de lógica adicional. [1]
Las aplicaciones de los codificadores de prioridad incluyen su uso en controladores de interrupciones (para permitir que algunas solicitudes de interrupción tengan mayor prioridad que otras), codificación decimal o binaria y conversión de analógico a digital / digital a analógico . [2]
Se muestra una tabla de verdad de un codificador de prioridad 4 a 2 de un solo bit, donde las entradas se muestran en orden decreciente de prioridad de izquierda a derecha y "x" indica un término indiferente , es decir, cualquier valor de entrada allí produce la misma salida ya que es reemplazado por una entrada de mayor prioridad. La salida "v" (generalmente incluida [a] ) indica si la entrada es válida.
Los codificadores de prioridad se pueden conectar fácilmente en matrices para formar codificadores más grandes, como un codificador de 16 a 4 formado por seis codificadores de prioridad de 4 a 2: cuatro codificadores de 4 a 2 que tienen la fuente de señal conectada a sus entradas, y los dos codificadores restantes toman la salida de los primeros cuatro como entrada.
Un codificador de prioridad, también llamado detector de ceros a la izquierda (LZD) o contador de ceros a la izquierda (LZC), recibe un vector de entrada de bits y detecta el índice del primer binario "1" en el vector de entrada. Una señal válida indica si se detectó algún binario "1" en el vector de entrada, por lo tanto, el índice es válido.
Los codificadores de prioridad se pueden construir de manera eficiente mediante recursión. El vector de entrada se divide en fragmentos iguales con bits. Se aplica un codificador de prioridad con un ancho más estrecho de 𝑛/𝑘 para cada fragmento. El bit válido de cada uno de los pasa a un bit para detectar el primer fragmento válido. La ubicación de este fragmento es la parte superior del índice general y dirige la ubicación exacta dentro del fragmento mismo para producir la parte inferior del índice general.
La profundidad de la estructura propuesta es , mientras que la complejidad del área de hardware es . Si se utiliza Stratix V de Altera o un dispositivo equivalente, se recomienda para lograr un mayor rendimiento y compresión del área, ya que el mux se puede implementar utilizando 6-LUT, por lo tanto, un ALM completo.
Hay disponible en línea un generador Verilog de código abierto para el codificador de prioridad recursivo. [6]
A continuación se muestra una descripción del comportamiento del codificador de prioridad en Verilog. [6]
// descripción del comportamiento del codificador de prioridad;// https://github.com/AmeerAbdelhadi/Indirectly-Indexed-2D-Binary-Content-Addressable-Memory-BCAMmódulo pe_bhv #( parámetro OHW = 512 ) // ancho de entrada one-hot del codificador ( entrada clk , // reloj para codificador de prioridad canalizado entrada rst , // registros restablecidos para codificador de prioridad canalizado entrada [ OHW - 1 : 0 ] oht , // entrada one-hot / [OHW -1:0] salida reg [ `log2 ( OHW ) - 1 : 0 ] bin , // primer índice '1'/ [`log2(OHW)-1:0] salida reg vld ); // el binario es válido si se encontró uno // use el bucle while para una longitud de bucle no fija // Se puede sintetizar bien con QuartusII de Intel siempre @( * ) comienza bin = { `log2 ( OHW ) { 1 'b0 }}; vld = oht [ bin ] ; mientras (( ! vld ) && ( bin != ( OHW - 1 ))) comienza contenedor = contenedor + 1 ; vld = oht [ bin ]; fin finmódulo final
Un circuito codificador simple es un convertidor de un bit a binario. Es decir, si hay 2 n líneas de entrada y, como máximo, solo una de ellas estará en estado alto, el código binario de esta línea "activa" se produce en las líneas de salida de n bits.