problema con el código VHDL multiplicador de cabina

-1

Estoy tratando de construir un multiplicador de cabina de 4 bits usando VHDL. No sé por qué, pero el bloque de proceso se ejecuta una sola vez. El estado cambia de inactivo a ocupado, entonces no funciona.

 library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_SIGNED.ALL;


entity booth_mult is
  port(
    clk     : in std_logic;
    start   : in std_logic:='0';
    n_reset : in std_logic:='0';
    mcand   : in std_logic_vector(3 downto 0):="0000";
    mplier  : in std_logic_vector(3 downto 0):="0000";
    done    : out std_logic :='0';
    product : out std_logic_vector(7 downto 0) :="00000000"
    );
end booth_mult;
    
pregunta V.Singh

2 respuestas

0

Esta no será una respuesta completa, pero he visto muchas cosas desde el primer momento.

En tu banco de pruebas, asignas mplier a un valor de 1 bit de "0" , cuando es un vector de 4 bits de longitud.

Su declaración de componente contiene un genérico, pero eso no está incluido en la entidad multiplaca de la entidad real.

En su entidad multiplicadora, la señal next_count no se usa en ninguna parte, por lo que no está avanzando como espera. next_result_reg y prod_reg tampoco se están utilizando.

accum no se está inicializando correctamente y tiene valores de X durante la simulación.

Estas son solo algunas de las cosas para comenzar a mirar. Puede haber otras cosas que no vi a primera vista.

Tal vez ya hayas hecho esto, pero si no, ayudaría a extraer lo que estás tratando de hacer antes incluso de tocar el VHDL. Luego, una vez que tengas un plan sólido trazado, vuelve y dale otra oportunidad.

    
respondido por el user_007
0

Bueno, cambié un poco tu máquina de estado y ahora está funcionando pero la forma en que está calculando la "acumulación" no es buena y necesita ser revisada

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;

ENTITY booth_mult IS
   GENERIC( 
      W : integer := 4
   );
   PORT( 
      clk     : IN     std_logic;
      mcand   : IN     std_logic_vector (W-1 DOWNTO 0);
      mplier  : IN     std_logic_vector (W-1 DOWNTO 0);
      n_reset : IN     std_logic;
      start   : IN     std_logic;
      done    : OUT    std_logic;
      product : OUT    std_logic_vector (2*W-1 DOWNTO 0)
   );

-- Declarations

END booth_mult;

--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_signed.all;

ARCHITECTURE arch OF booth_mult IS

   -- Architecture Declarations
   signal next_count,count :integer := 0;
   signal mcand_reg: std_logic_vector(W-1 downto 0); 
   signal prod_reg, accum: std_logic_vector(2*W-1 downto 0);
   signal next_result_reg,result_reg: std_logic_vector(W downto 0);

   TYPE STATE_TYPE IS (
      IDLE,
      BUSY,
      Muldone
   );

   -- Declare current and next state signals
   SIGNAL current_state : STATE_TYPE;
   SIGNAL next_state : STATE_TYPE;

BEGIN

   -----------------------------------------------------------------
   clocked_proc : PROCESS ( 
      clk
   )
   -----------------------------------------------------------------
   BEGIN
      IF (clk'EVENT AND clk = '1') THEN
         IF (n_reset = '0') THEN
            current_state <= IDLE;
         ELSE
            current_state <= next_state;

            -- Combined Actions
            CASE current_state IS
               WHEN IDLE => 
                      mcand_reg <= mcand;
                      accum <= (others => '0');
                      result_reg(4 downto 1) <= mplier;
                      result_reg(0) <= '0';
                      count <= 0;
               WHEN BUSY => 
                  case result_reg(1 downto 0) is     
                    when "01" =>    accum<=(accum(7 downto 5) + mcand)&accum(3 downto 0);accum<= accum(7) & accum(7 downto 1);
                    when "10" =>    accum<=(accum(7 downto 5) - mcand)&accum(3 downto 0);accum<= accum(7) & accum(7 downto 1);          
                    when others =>  accum<= accum(7) & accum(7 downto 1);
                    end case;

                    next_result_reg <= (result_reg(4) & result_reg(4 downto 1));
                    count <= count + 1;
               WHEN OTHERS =>
                  NULL;
            END CASE;
         END IF;
      END IF;
   END PROCESS clocked_proc;

   -----------------------------------------------------------------
   nextstate_proc : PROCESS ( 
      accum,
      count,
      current_state,
      n_reset,
      start
   )
   -----------------------------------------------------------------
   BEGIN

      -- Combined Actions
      CASE current_state IS
         WHEN IDLE => 
            done <= '0';
            IF (n_reset = '1' and start ='1') THEN 
               next_state <= BUSY;
            ELSE
               next_state <= IDLE;
            END IF;
         WHEN BUSY => 
            IF (count = 4) THEN 
               next_state <= Muldone;
            ELSE
               next_state <= BUSY;
            END IF;
         WHEN Muldone => 
            product <= accum(7) & accum(7 downto 1);
            done <= '1' ;
            next_state <= IDLE;
         WHEN OTHERS =>
            next_state <= IDLE;
      END CASE;
   END PROCESS nextstate_proc;

END arch;
    
respondido por el BD_CE

Lea otras preguntas en las etiquetas