No se pueden extraer los valores esperados en VHDL en el primer ciclo de reloj

1

El diseño de VHDL a continuación debe extraer los bits Nth de los cuatro valores x_0, x_1, x_2 y x_3 y cree un nuevo valor en cada reloj, pero esto no está sucediendo.

Busque debajo del diseño y la salida generada para unos pocos valores forzados para x_0 = 1100, x_1 = 0100, x_2 = 0010 y x_3 = 1011.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity gen_input is
    port (x_0,x_1,x_2,x_3 : in std_logic_vector(3 downto 0);
            y : out std_logic_vector(3 downto 0);
            clk : std_logic);
end gen_input;

architecture Behavioral of gen_input is
signal i : integer := 0;    
begin
    inst_process : process (clk,x_3,x_2,x_1,x_0)
                        begin
                        if(clk'event and clk='1') then
                            if(i < 4) then
                            y <= x_3(i)&x_2(i)&x_1(i)&x_0(i);
                            i <= i + 1;
                            else 
                            i <= 0;
                            end if;     
                        end if; 
                        end process inst_process;
end Behavioral;

La salida generada:

    
pregunta WilfredK

1 respuesta

1
  

y crea un nuevo valor en cada reloj, pero esto no está sucediendo

La razón por la que esto no está sucediendo es porque su código tiene un ciclo de reloj donde no se asigna ninguna salida:

if(clk'event and clk='1') then
    if(i < 4) then
        y <= x_3(i)&x_2(i)&x_1(i)&x_0(i);
        i <= i + 1;
    else 
        i <= 0; -- here you have no assignment to y
    end if;     
end if;

Además, su código sería más sencillo si declarara i como variable en lugar de signal , lo que probablemente sea lo que quiere hacer de todos modos. Consulte esto para ver algunas discusiones sobre las diferencias.

Este código es probablemente lo que estás buscando (como simulación):

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity gen_input is
end gen_input;

architecture Behavioral of gen_input is

    signal y   : std_logic_vector(3 downto 0);
    signal clk : std_logic := '0';

    constant x_0 : std_logic_vector(3 downto 0) := b"1100";
    constant x_1 : std_logic_vector(3 downto 0) := b"0100";
    constant x_2 : std_logic_vector(3 downto 0) := b"0010";
    constant x_3 : std_logic_vector(3 downto 0) := b"1011";

begin

    clkgen: process
    begin
        wait for 10 ns;
        clk <= not clk;
    end process clkgen;

    inst_process : process (clk)
        variable i : natural range 0 to 3 := 0;
    begin
        if rising_edge(clk) then
            y <= x_3(i) & x_2(i) & x_1(i) & x_0(i);
            i := i + 1;
            if i = 4 then
                i := 0;
            end if;
        end if;
    end process inst_process;
end Behavioral;

Tenga en cuenta que, dado que i se declara como variable dentro del proceso, puede incrementar i e inmediatamente verificarlo para ver si debería restablecerse a 0. También podría hacer esto:

if i = 3 then
    i := 0;
else
    i := i + 1;
end if;

pero es más tipeo y no es necesario. De cualquier manera, terminarás con la misma RTL.

Aquí está el simulador:

    
respondido por el Blair Fonville

Lea otras preguntas en las etiquetas