Autor Tema: Ayuda con este alu concatenado  (Leído 2657 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado electronando

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 427
Ayuda con este alu concatenado
« en: 13 de Diciembre de 2005, 14:40:00 »
que tal bueno le puse un nombre algo raro a mi alu que estaba diseñando  pues tengo problemas con la concatenacion me manda error al compilar en maxplus el siguiente codigo espero que se den cuenta de como funciona a penas vean el codigo el problema que tengo es al hacer las sumas concatenadas pues debo tener un carry por eso lo del diseño que espero lo comprendan

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY SUM_DIC IS
PORT(A,B : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
      C0,C1,C2,CIN:IN STD_LOGIC;
      SALIDA:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
      CF : BUFFER STD_LOGIC ;
      ZF: OUT STD_LOGIC);
END SUM_DIC;

ARCHITECTURE SOLUCION OF SUM_DIC IS
SIGNAL C:STD_LOGIC_VECTOR(8 DOWNTO 0);
SIGNAL X:STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN

X(0)<=C0;
X(1)<=C1;
X(2)<=C2;
   PROCESS(A,B,X,CIN)
   VARIABLE Y:STD_LOGIC_VECTOR(7 DOWNTO 0);
   BEGIN
   CASE X IS
   WHEN "000" =>
         C<="0"&A + "0"&B + "00000000"&CIN ;
   WHEN "001" =>
         C<="0"&A - "0"&B - "00000000"&CIN ;
   WHEN "010" =>
         Y:=A(6 DOWNTO 0) & CF;
                                                CF<=A(7);
         C<="0" & Y ;
   WHEN "011" =>
         Y:=CF & A(7 DOWNTO 1);
         CF<= A(0);
         C<="0" & Y;
   WHEN "100" =>
         Y(0):= A(0) AND B(0);            
                                                Y(1):= A(1) AND B(1);            
         Y(2):= A(2) AND B(2);            
         Y(3):= A(3) AND B(3);            
         Y(4):= A(4) AND B(4);            
         Y(5):= A(5) AND B(5);            
         Y(6):= A(6) AND B(6);            
         Y(7):= A(7) AND B(7);            
                                                 C<= "0" & Y;
   WHEN "101" =>
         Y(0):= A(0) OR B(0);            
                                                Y(1):= A(1) OR B(1);            
         Y(2):= A(2) OR B(2);            
         Y(3):= A(3) OR B(3);            
         Y(4):= A(4) OR B(4);            
         Y(5):= A(5) OR B(5);            
         Y(6):= A(6) OR B(6);            
         Y(7):= A(7) OR B(7);            
                                                C<= "0" & Y;
   WHEN OTHERS =>
         Y(0):= NOT A(0) ;            
                                                 Y(1):= NOT A(1) ;            
         Y(2):= NOT A(2) ;            
         Y(3):= NOT A(3) ;            
         Y(4):= NOT A(4) ;            
         Y(5):= NOT A(5) ;            
         Y(6):= NOT A(6) ;            
         Y(7):= NOT A(7) ;            
                                                C<= "0" & Y;
   END CASE;
   END PROCESS;
      SALIDA<= C(7 DOWNTO 0);
      CF<= C(8);
ZF<= NOT(C(7) OR C(6) OR C(5) OR C(4) OR C(3) OR C(2) OR C(1) OR C(0));
   END SOLUCION;

donde cin es el carry de entrada
cf es el carry de salida
a y b son los datos a sumar cada uno de 8 bits
y es una variable q uso solo dentro de un proceso
c es una señal que uso dentro de mi arquitectura de 9 bits el bit ms lo uso comocarry de salida en caso haya
la verdad lo compilo y nada cre el problema esta en las concatenaciones con sumas pero no me deberia de funciobnar ?loco

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: Ayuda con este alu concatenado
« Respuesta #1 en: 13 de Diciembre de 2005, 16:34:00 »
Bueno después de revisar el código has tenido varios errores.

En primer lugar, hay un error en la asignación de la señal CF. Leasignas valores dentro y fuera de un proceso y eso no se puede hacer. Yo la he quedado fuera.

Después tienes los warnings en la suma y la resta. En este tipo de operaciones es recomendable utiliza paréntesis, ya que el warning es que estás asignando 19bits a una señal de 9.

Aqui te paso el cósigo corregido:

Codigo:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY SUM_DIC IS
PORT(A,B :         IN STD_LOGIC_VECTOR(7 DOWNTO 0);
     C0,C1,C2,CIN: IN STD_LOGIC;
     SALIDA:       OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
     CF:           OUT STD_LOGIC ;
     ZF:           OUT STD_LOGIC);
END SUM_DIC;

ARCHITECTURE SOLUCION OF SUM_DIC IS
SIGNAL C : STD_LOGIC_VECTOR(8 DOWNTO 0);
SIGNAL X : STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN

X <= C1 & C2 & C0;

PROCESS(A,B,X,CIN)
BEGIN
  CASE X IS
    WHEN "000" =>
      C <=("0" & A) + ("0" & B) + ("00000000" & CIN) ;
    WHEN "001" =>
      C <=("0" & A) - ("0" & B) - ("00000000" & CIN) ;
    WHEN "010" =>
      C <=A(7 DOWNTO 0) & C(8);
    WHEN "011" =>
      C <=A(0) & C(8) & A(7 DOWNTO 1);
    WHEN "100" =>
      C <= "0" & (A AND B);
    WHEN "101" =>
      C <= "0" & (A OR B);
    WHEN OTHERS =>
      C <= ("0" & NOT A);
END CASE;
END PROCESS;
SALIDA <= C(7 DOWNTO 0);
CF <= C(8);
ZF <= NOT(C(7) OR C(6) OR C(5) OR C(4) OR C(3) OR C(2) OR C(1) OR C(0));
END SOLUCION;

Desconectado electronando

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 427
RE: Ayuda con este alu concatenado
« Respuesta #2 en: 14 de Diciembre de 2005, 08:12:00 »
la verdad q no me di cuenta de ese error antoniof , y eso de poner parentesis me parece una novedad la verdad lo desconocia lo probare cuando llegue a casa y luego te comento gracias por la ayuda y por ver el error te lo agradesco

Desconectado electronando

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 427
RE: Ayuda con este alu concatenado
« Respuesta #3 en: 15 de Diciembre de 2005, 17:30:00 »
funciona de las mil maravillas gracias por el aporte antoniof aunque no me llegaba afuncionar como queria y fue por esto  X <= C1 & C2 & C0 jaja de alli te daras cuenta antoniof pero muy agradecido por la ayuda Sonrisa Gigante

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: Ayuda con este alu concatenado
« Respuesta #4 en: 15 de Diciembre de 2005, 19:23:00 »
Jeje se me paso el C1 antes que el C2.Sonrisa Gigante

Los paréntesis son importantes ya que por defecto el compilador toma unas operaciones antes que otras. Con los ellos se le indica que operaciones debe hacer primero (las que estan dentro).Sonrisa



 

anything