¿Existe una forma más optimizada de hacer un incrementador que un sumador completo?

4

Estoy diseñando un microprocesador muy simplista como proyecto para ayudar a aprender VHDL. Así que necesito algo para incrementar el contador de programas de 8 bits. Tendré que incrementarlo en dos. ¿Existe un diseño mejor (ya sea más rápido o menos lógico para una velocidad igual) que usar un sumador completo de 8 bits? También me interesa lo mismo por si solo necesitas incrementar la PC en 1.

    
pregunta Earlz

5 respuestas

9

Hmmm, todo esto depende de lo que está intentando aprender exactamente. Un contador o sumador en VHDL es súper fácil:

  signal count  :std_logic_vector (7 downto 0) := (others=>'0');
  . . .
  process (clk)
  begin
    if rising_edge(clk) then
      if count_enable='1' then
        count <= count + 1;  -- could be +2 also
      end if;
    end if;
  end process;

Y eso es todo! El compilador VHDL normalmente sintetiza un sumador completo para esto, y optimizan todo lo que no es necesario, terminando con algún tipo de medio sumador. Lo bueno de hacerlo de esta manera es que su código es legible y fácil de entender, y el compilador se ocupa de descubrir la mejor manera de implementarlo.

Ahora, si estás tratando de aprender sobre sumadores y contadores, el pequeño fragmento de código no te va a ayudar mucho. En ese caso, debe implementar un medio adicionante de manera manual y difícil.

    
respondido por el user3624
3

En realidad no necesitas un sumador completo para un incremento de 1; el uso de medios sumadores donde la primera entrada se establece en 1, y los bits de acarreo se encadenan al siguiente bit que haría. Sin embargo, no estoy seguro de que haya una mejor manera de hacerlo.

Se puede hacer un incremento de dos al ignorar el primer bit de un número y usar el mismo método anterior.

NOTA: no es un experto en VHDL, no puede decir si esto podría ser más rápido, pero debería ser menos lógico.

Editar: También, hay una patente vencida para un simple incrementador binario que podría ser de interés: enlace

    
respondido por el CoderTao
2

Tal vez puedas usar un contador binario creado a partir de chancletas JK , uno donde puede cargar el valor de bit en cada flip-flop, luego simplemente alternar el reloj. Contar con 2 significaría cargar todo menos el bit menos significativo en el contador, ya que ese bit nunca cambia.

Esto probablemente no será mejor que una implementación de media sumadora, pero quizás sea más fácil de entender :)

    
respondido por el freespace
1

Lo que necesitas específicamente es una serie de disparadores en T + un montón de compuertas AND. Debería pasar la señal de 'alternar' al bit n solo si todos los bits anteriores fueran 1. Esto es mucho más rápido que el sumador completo, no requiere llevar la vista hacia delante y come menos transistores.

PS. Hace algún tiempo me estaba preguntando exactamente la misma pregunta ;-)

    
respondido por el BarsMonster
0

Ciertamente, parece que debería haber una simplificación. ¡Después de todo, una de las entradas se limita a un valor fijo que siempre es el mismo!

Desafortunadamente, eso solo es suficiente para obtener una pequeña reducción en el número de puertas, pero no una gran reducción en el tiempo para completar. Esto se debe a que usted obtiene sumadores más simples: solo tienen 1 entrada más acarreo, por lo que los sumadores base tienen aproximadamente un tercio menos de puertas. Pero el retraso está determinado por los acarreos, que no se reducen, aún deben ondular toda la cadena. Entonces, no obtienes mucha aceleración significativa. Y, si quieres ir rápido, al menos la mitad de las puertas están lidiando con los acarreos, de modo que la ganancia de 1/3 se reduce a aproximadamente 1/6 menos puertas en general. Al final, aproximadamente la misma velocidad y el 85% del tamaño de un sumador completo.

    
respondido por el user2472001

Lea otras preguntas en las etiquetas