32 x 8 Registre el archivo utilizando la instrucción de generación para los flip-flops D

0

Mi circuito tiene una cuadrícula de 32 x 8 D flip flops. cada fila debe producir un vector de 32 bits que contenga los valores Q de los D-ff's, que luego se envían a un MUX 8x1. El siguiente código es cuando intento generar correctamente las chancletas D de 32 x 8 y probar si puedo obtener un vector de ellas (el vector I0 de 32 bits).

el circuito para el que estoy tratando de escribir la implementación se puede ver en la figura publicada en esta pregunta: enlace

library ieee;
use ieee.std_logic_1164.all;

entity REG is
port (
    CLK         : in std_logic;
    WRT_REG_NUM : in std_logic_vector(2 downto 0);
    WRT_DATA    : in std_logic_vector(31 downto 0);
    READ_REG_A  : in std_logic_vector(2 downto 0);
    READ_REG_B  : in std_logic_vector(2 downto 0);
    PORT_A      : out std_logic_vector(31 downto 0);
    PORT_B      : out std_logic_vector(31 downto 0)
);
end REG;

architecture BEHV_32x8_REG of REG is
-- decoder component
component DCDR
    port (
        I_in    : in std_logic_vector(2 downto 0);
        O_out   : out std_logic_vector(7 downto 0)
    );
end component;
-- D flip flop component
component D_FF
    port (
        D_in    : in    std_logic;
        CLK     : in    std_logic;
        Q_out   : out   std_logic;
        QN_out  : out   std_logic   -- Q not
    );
end component;
-- MUX copmonent
component MUX
    port (
        S_in                            : in std_logic_vector(2 downto 0);
        I7, I6, I5, I4, I3, I2, I1, I0  : in std_logic_vector(31 downto 0);
        O_out                           : out std_logic_vector(31 downto 0)
    );
end component;

-- internal signals used
signal I_in     : std_logic_vector(2 downto 0);
signal O_out    : std_logic_vector(7 downto 0);
signal CLK_vals : std_logic_vector(7 downto 0);
signal I0       : std_logic_vector(31 downto 0);
signal QN_out   : std_logic_vector(31 downto 0);


begin

-- decoder instance
DCDR1 : DCDR port map(I_in, O_out);

GEN_D_FF1:
for ROW in 0 to 7 generate
    GEN_D_FF2:
    for COL in 0 to 31 generate
        DFF_X : D_FF port map(WRT_DATA(COL), CLK_vals(ROW), I0(COL), QN_out(COL));
    end generate GEN_D_FF2;
end generate GEN_D_FF1; 

DCDR_AND : process
begin
    I_in <= WRT_REG_NUM;

    for I in 0 to 7 loop
        CLK_vals(I) <= O_out(I) and CLK;
    end loop;
    wait for 10 ns;
end process DCDR_AND;

end BEHV_32x8_REG;

EDITAR: agregar una captura de pantalla de una ejecución de simulación

Cuando simulo el código anterior en ModelSim, no obtengo ningún resultado para I0. ¿Dónde está mi diseño defectuoso? ¿Estoy violando alguna de las mejores prácticas de VHDL? Suponiendo que puedo lograr que esto funcione correctamente, ¿cómo podría obtener 8 vectores de 32 bits diferentes (de cada fila de flip flops) para enviarlos a los MUX?

¡Aprecio cualquier consejo que reciba!

    
pregunta Tyler Plude

1 respuesta

1

Los flip-flops se activan cuando cambia el valor de CLK (suponiendo que el código de flip-flop sea correcto aquí). Su componente flip-flop,

component D_FF
    port (
        D_in    : in    std_logic;
        CLK     : in    std_logic;
        Q_out   : out   std_logic;
        QN_out  : out   std_logic   -- Q not
    );
end component;

tiene la entrada CLK vinculada a CLK_vals(ROW) , desde esta línea:

DFF_X : D_FF port map(WRT_DATA(COL), CLK_vals(ROW), I0(COL), QN_out(COL));

Sin embargo, CLK_vals nunca cambia, como lo demuestra su diagrama de tiempo, después de que las 10 ns iniciales esperen cuando no esté inicializado.

Su CLK_vals está configurado aquí:

CLK_vals(I) <= O_out(I) and CLK;

Sin embargo, ni O_out ni CLK cambian.

O_out permanece '00100000', y CLK permanece '1'

Necesitas tener un reloj alterno. Algo simple, como

signal CLK : std_logic := '0';
CLK <= not CLK after 5ns;

He leído ambos lados de la cerca en cuanto a la necesidad de inicializar valores, puedes leer un poco sobre eso aquí. Pero se libraría de esos feos rojos de nosotros

enlace

    
respondido por el krb686

Lea otras preguntas en las etiquetas