Autor Tema: Multiplicador  (Leído 7906 veces)

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

Desconectado Sir_Sendal

  • PIC10
  • *
  • Mensajes: 1
Multiplicador
« en: 20 de Mayo de 2004, 09:05:00 »
hola, si alguien sabe como hacer o tiene echo un multiplicador de 4 bits en Vhdl que se ponga en contacto, sendal_sir@hotmail.com

Desconectado Elena2000

  • PIC24F
  • *****
  • Mensajes: 722
RE: Multiplicador
« Respuesta #1 en: 21 de Mayo de 2004, 04:32:00 »
Hola,

Aquí tienes una presentación muy didáctica donde incluye como ejemplo un multiplicar de 4 bits.

http://courses.ece.uiuc.edu/ece249/lectures/Experiment8_6perpage.pdf

Si tienes dudas, dime.


Desconectado Choda

  • PIC10
  • *
  • Mensajes: 5
RE: Multiplicador
« Respuesta #2 en: 14 de Abril de 2005, 06:23:00 »
Jejeje... aquí te dejo uno que he hecho yo para una FPGA de Xilinx. Es de 8 bits, pero simplemente cambiando el generico que está igualado a 8 (en dos ocasiones seguidas) lo conviertes, en lo ancho q tu desees... Sonrisa Gigante


-- Celda multiplicadora de 1 bit --
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

ENTITY celda IS
   PORT ( M       : IN std_logic;
          Q       : IN std_logic;
          PPIN    : IN std_logic;
          CIN    : IN std_logic;
          COUT  : OUT std_logic;
          PPOUT : OUT std_logic );
END celda;

ARCHITECTURE Comportamiento OF celda IS

   -- Definimos una señal intermedia PROD:
   SIGNAL prod : std_logic;

BEGIN
   -- Describimos el circuito en modo "puertas lógicas"
   prod  <= M AND Q;
   PPOUT <= (prod XOR PPIN) XOR CIN;
   COUT  <= (prod AND PPIN) OR (prod AND CIN) OR (PPIN AND CIN);

END Comportamiento;



-- Multiplicador M(m) x Q(n) --
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

ENTITY multiplicador IS
   -- Definición de genéricos para los buses:
   GENERIC( m : positive := 8;
            q : positive := 8);

   -- Definición de los puertos del componente MULTIPLICADOR:
   PORT( Mx : IN std_logic_vector( m-1 DOWNTO 0 );
         Qx : IN std_logic_vector( q-1 DOWNTO 0 );
         Px : OUT std_logic_vector( ((m+q)-1) DOWNTO 0 ) );
END multiplicador;

ARCHITECTURE Behavioral OF multiplicador IS

   -- Usamos un componente "celda":
   COMPONENT celda IS
      PORT ( M       : IN std_logic;
              Q       : IN std_logic;
              PPIN    : IN std_logic;
              CIN    : IN std_logic;
              COUT  : OUT std_logic;
             PPOUT : OUT std_logic );
   END component;

   -- Definimos dos tipos auxiliares para controlar los buses intermedios:
   TYPE matrix IS ARRAY (q-1 DOWNTO 0) OF std_logic_vector (m DOWNTO 0);
   TYPE matrix1 IS ARRAY (q DOWNTO 0) OF std_logic_vector (m DOWNTO 0);
   
   SIGNAL c  : matrix;   -- Bus "matricial" de acarreos
   SIGNAL pp :   matrix1;   -- Bus "matricial" de productos parciales

BEGIN
   
   -- Inicialización de los primeros productos parciales a cero
   pp(0) <= ( others => "0" );

   fila : FOR i IN (q-1) DOWNTO 0 GENERATE
      -- Al inicio de cada fila, el acarreo q introducimos es cero
      c(i)(0) <= "0";
      -- Al final de cada fila, el pp_salida es el de entrada de la fila de abajo
      pp(i+1)(m) <= c(i)(m);

      columna : FOR j IN (m-1) DOWNTO 0 GENERATE
         -- Instanciamos cada celda:
         celda_matriz : celda PORT MAP( M => Mx(j),
                                        Q => Qx(i),
                                        PPIN => pp(i)(j+1),
                                        CIN => c(i)(j),
                                        COUT =>   c(i)(j+1),
                                        PPOUT => pp(i+1)(j) );
      END GENERATE;
   END GENERATE;

   
   -- Recorremos todas las posibles salidas (los 16 bits)
   salidas : FOR i IN (m+q-1) DOWNTO 0 GENERATE
      
      salidas_1 : IF ( i < q ) GENERATE
         Px(i) <= pp(i+1)(0);
      END GENERATE;

      salidas_2 : IF ( i > (m-1) ) GENERATE
         Px(i) <= pp(m)( i-(q-1) );
      END GENERATE;

   END GENERATE;

END Behavioral;

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: Multiplicador
« Respuesta #3 en: 14 de Abril de 2005, 18:49:00 »
Hola Choda.

Prodrias explicar porque usas la sentencia "GENERATE" en vez de "LOOP" en los bucles FOR y como funcionan?

Gracias

Desconectado Choda

  • PIC10
  • *
  • Mensajes: 5
RE: Multiplicador
« Respuesta #4 en: 15 de Abril de 2005, 10:03:00 »
Encantado te respondo.... te pondré lo que pone el libro que utilizo, porque soy algo nuevo en este mundo:

"Sentencia GENERATE:

Esta sentencia permite la automatización de la instanciación de componentes o de procesos similares. Esta posibilidad resutla útil cuando estamos decribiendo un sistema hardware que posee una arquitectura regular, formada por bloques constructivos semejantes en funcionamiento e interfaz, que únicamente difieren en las señales de entrada/salida a las que se conectan. Tal es el caso, por ejemplo de las combinaciones iterativas de los procesos sistólicos, de los arrays celulares de multiplicación y división rápidas, etc.

La sintaxis es:

identificador: [FOR rango] [IF expresión] GENERATE
  sentecias concurrentes;
END GENERATE;
"
Sintesis de Sistemas Digitales con VHDL - Universidad Politecnica de Cartagena

Ahora vengo a explicar porque lo utilizo....
El multiplicador arriba implementado está compuesto por una matriz de células de multiplicación, y para no instanciar todas las celdas, las 64 en el caso de uno 8x8 bits, usamos generate. Esto da otra ventaja, que al usar ésta sentencia y hacerlo todo de una forma tan generica, cambiando el valor de los genericos (valga la rebundancia) en los cuales nos apollamos, (llamados m y n) podemos instanciar un multiplicador de 4x4, de 32x32, de 64x8...... ¡¡como nosotros deseemos!! simplemte cambiando esos valores.....

Gracias por darme la pagina esta... buscaba algo como lo del esquema q sale abajo, en la pagina: http://www.csee.umbc.edu/help/VHDL/samples/samples.shtml#div4
Sobre un esquema muy parecido me basé para construir el multiplicador, para que así te hagas una idea... No lleva código, pero éste fin de semana lo intentaré hacer de la misma forma que el multiplicador... así, de forma generica, hasta entonces....

SALUDOS!!!!

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: Multiplicador
« Respuesta #5 en: 15 de Abril de 2005, 19:09:00 »
Vale.

Me queda claro entonces que el generate es para "generar" sentencias concurrentes y que el loop es para utilizar dentro de procesos con sentencias secuenciales.

Gracias por tu respuesta.

Desconectado Choda

  • PIC10
  • *
  • Mensajes: 5
RE: Multiplicador
« Respuesta #6 en: 16 de Abril de 2005, 09:49:00 »
No para generar secuencias concurrentes en sí..... en cierto modo si, es una forma más de expresarlo. GENERATE sirve para instanciar componentes que vamos a usar de forma repetitiva, por ejemplo, si queremos instanciar dos mil biestables.... podemos hacer dos cosas, escribir las dos mil lineas de los biestables, o bien hacerlo con la sentencia GENERATE, lo cual nos lo instanciará automaticamente, habiendo solo usado unas pocas lineas de código.

SALUDOS!!!

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: Multiplicador
« Respuesta #7 en: 16 de Abril de 2005, 14:15:00 »
Vale.

El problema que tenía con los FOR es que pensé que, utilizados dentro de un proceso, cada iteración se haciá con un ciclo de reloj.

Ahora ya se como se utilizan.  

Gracias.