Circuito lógico para manejar el incremento en 1

5

Puede usar sumadores completos en cascada para sumar dos números binarios. ¿Hay un circuito para cuando solo quiero agregar 1 (incrementando el valor)? ¿Hay un circuito similar para restar (es decir, agregar 0b1111 1110)? Estoy trabajando con números de 8 bits, pero esto se aplica a todas las longitudes de palabra.

    
pregunta Thomas O

4 respuestas

4

Veamos. En un sumador de acarreo de rizo simple, suma, carry-out = a + b + carry-in

c[0] = carry-in
for i in n
    sum[i] = a[i] ^ b[i] ^ c[i]
    c[i+1] = (a[i]&b[i]) | (a[i]&c[i]) | (b[i]&c[i])
carry-out = c[n]

Ahora, si queremos calcular la suma, carry-out = a + 0 + 1, establezca b [] = todo 0 y simplifique:

c[0] = 1
for i in n
    sum[i] = a[i] ^ c[i]
    c[i+1] = a[i] & c[i]
carry-out = c[n]

que es más simple. La resta por 1 se puede simplificar de manera similar (ejercicio para el lector: ¿qué es b [] y el acarreo en ese caso?)

¡Feliz piratería!

    
respondido por el Jan Gray
6

Si está hablando de lógica discreta, como la lógica de la serie 7400, el chip que está buscando se llama contador. Dos chips 74191 (contador síncrono ascendente / descendente de 4 bits) en cascada le brindarán lo que desea, y hay otros chips que realizan una función similar.

Si desea la forma más compacta de agregar '1', entonces podría usar la mitad de sumadores para cada bit en lugar de sumadores completos. Aunque no estoy muy seguro acerca de la resta.

    
respondido por el W5VO
1

Lo que estás buscando es un desencadenante T disparadores de borde. Entrada = salida de la etapa anterior Y cuenta el reloj.

Aquí están los esquemas para el disparador en T basado en transistores:

enlace

    
respondido por el BarsMonster
1

En los diagramas, las líneas a la derecha son salidas y todas las demás (desde arriba, abajo o izquierda) son entradas.

next                 b0                     b1                   b2     
number   B0 ─ XOR ─┬──┘        B1 ─ XOR ─┬──┘        B2 ─ XOR ─┬──┘    
counter     ┌──┘   └─ NOT ─┐      ┌──┘   └─ NOT ─┐      ┌──┘   └─ NOT ─┐    
         1 ─┴──────────── AND ─c1─┴──────────── AND ─c2─┴──────────── AND ──  ...


c[0] = 1                 | Note: sum[i] =              c[ i ]      + B[i]
for i in n               |              =            2*c[i+1]      + b[i]
  b[ i ] =  B[i] ^ c[i]  |              =              c[i+1] <<1  + b[i]
  c[i+1] = ~b[i] & c[i]  |              = (~b[i]      & c[i]) <<1  + b[i]
carry-out = c[n+1]       |              =                        (B[i] ^ c[i]) +
                         |            (~(B[i] ^ c[i]) & c[i]) <<1  

Si se debe usar un medio sumador:

                                                                    b[i]
B ────┬── XOR ────      to use a half   B[i] ──┬───────┬───── XOR ────┘     
    ┌──────┘   half     adder without          │   ┌─ XOR ─────┘
    │ └────┐   adder    circuit trace         XOR ─┤               
C ──┴──── AND ────      crossings you          │   └─ XOR ─────┐
                        can use this:   C[i] ──┴───────┴───── AND ─ c[i+1] ── ...

Un simple decremento es una negación complementada: D-1 = ~-D .
La negación es el complemento de 2, que es un complemento incrementado: -D = ~D +1 .

Por lo tanto, D-1 = ~(~D +1) , así que una complementación combinacional (paralela) a lo largo de los bits antes y después Basta un incremento secuencial.

Sin embargo, enlace el circuito de decremento secuencial es aún más simple:

 previous                  d0                 d1                 d2     
  count       D0 ── XOR ─┬──┘    D1 ── XOR ─┬──┘    D2 ── XOR ─┬──┘    
(decrement)       ┌──┘   └──┐        ┌──┘   └──┐        ┌──┘   └──┐    
               1 ─┴─────── AND ─ b1 ─┴─────── AND ─ b2 ─┴─────── AND ──  ...

b[0] = 1                  
for i in n              
  d[ i ] =  D[i] ^ b[i]  
  b[i+1] =  d[i] & b[i]  
borrow-out = b[n+1]          
    
respondido por el ekim

Lea otras preguntas en las etiquetas