FPGA: ¿contar hacia arriba o hacia atrás?

10

Estoy aprendiendo a usar un FPGA (placa de desarrollo de Papilio, que tiene un xilinx spartan3e, usando vhdl).

Necesito dividir un pulso entrante por un número (codificado).

Puedo ver 3 opciones, aproximadamente, como pseudocódigo (usando 10 cuentas como ejemplo):

  1. Inicialice a 0, en el aumento del flanco ascendente de entrada en 1, compárelo con 10; si son iguales, reinicie a 0 y active el pulso de salida
  2. Inicialice a 10, en la entrada, el flanco ascendente disminuye en 1, compárelo con 0; si son iguales, reinicie a 10 y active el pulso de salida
  3. Inicialice a 9, pero asegúrese de que haya al menos 1 bit "0" inicial, que es mi bit de salida. En la entrada, el flanco ascendente disminuye en 1. En el flanco ascendente del bit de salida, reinicie.

El ciclo de trabajo no es importante.

¿Es uno de estos mejor que los otros? ¿Hay un método aún mejor que no haya pensado?

¿Existe una forma "estándar" que le dé al compilador la mejor oportunidad de optimización?

    
pregunta AMADANON Inc.

4 respuestas

12

La optimización a este nivel romperá tu corazón. El resultado podría cambiar debido a la tecnología del FPGA que está utilizando, otros factores en el FPGA, pero también debido a factores fuera de su control, incluida la semilla del número aleatorio del instalador.

Habiendo dicho eso, creo que la opción 3 será la mejor. Las opciones 1 y 2 tienen una compuerta OR / comparadora entre los contadores para que pueda indicar que se ha alcanzado el número objetivo. La opción 2 puede ser un poco más rápida que 1, ya que todo puede ser recto O unido sin ningún inversor, pero nuevamente se encuentran con pequeñas diferencias tecnológicas donde puede ser más rápido para AND o XOR.

La opción 3 omite la comparación por el bajo costo de un bit adicional en el contador. Esto debería valer la pena, a menos que esté severamente restringido en chanclas.

Un dato divertido de los contadores es que tienden a agruparse en un tamaño específico de dispositivo dentro de un bloque lógico, y verás el cambio de tiempo más de lo esperado si este bit adicional te empuja fuera de ese grupo.

    
respondido por el pscheidler
4

Otra opción sería inicializar el contador a 6 (= 2 4 - 10), contar y reiniciar cuando se activa la salida de acarreo (es decir, los FF son todos unos).

La ventaja de esto es que no requiere un FF adicional, y muchos FGPA tienen lógica auxiliar dedicada para acelerar este tipo de operación de transporte en un contador o circuito sumador.

    
respondido por el Dave Tweed
3

Depende. Por ejemplo: el retardo de propagación del flip-flop para 0 → 1 y 1 → 0 puede ser diferente, y por lo tanto, los retardos de transición de un contador para 000 → 001 y 001 → 000 pueden ser ligeramente diferentes. Puede ser mayor o menor, dependiendo de la tecnología cmos utilizada en FPGA. Por lo tanto, debe sintetizar y descubrir cuál tiene mejor rendimiento de sincronización.

    
respondido por el MITU RAJ
3

Desde la perspectiva de un compilador: si usa integer , la representación interna no está definida, y el compilador puede elegir la implementación más eficiente.

Si fuerza una representación interna particular, el optimizador seguirá intentando mejorarla, pero comenzará desde un punto de vista ligeramente peor.

Algunos FPGA tienen capacidades de "precarga", donde los registros se pueden inicializar a valores arbitrarios, en cuyo caso se inicializa a \ $ N-1 \ $, la cuenta regresiva y el uso del bit de arrastre superior como salida y reinicio (en el siguiente ciclo) ) es más eficiente que implementar tanto un sumador como un comparador. Sin precarga, un sumador podría ser mejor.

A menos que conozca la estructura interna, los recursos asignados a otra lógica (muchos FPGA tienen una lógica de adición múltiple de coma flotante dedicada que también puede usar para implementar un contador si tiene unidades sobrantes) y está completamente seguro de que ganó. Si cambias a un modelo diferente, la respuesta es "no lo pienses".

    
respondido por el Simon Richter

Lea otras preguntas en las etiquetas

Comentarios Recientes

Para cada moneda en 16 de sus billetes, cuente todas las demás monedas de 1 de 16 reveses conocidos. Consulte las Notas para obtener más información. PostScript PLN $ = $% (ignorado) Definiciones: Parte I: Sin preguntar Antes de responder a la pregunta, primero no bloquee un SearchFactShe debe tener un largo 'cabello natural y su esposo pasan visitas anuales a un médico' . Además, ella debe estar buscándome. En esta sección En términos de mineros de Bitcoin, aquellos que probablemente no parezcan tan ruidosos... Lees verder