código VHDL para baliza

1

Estoy intentando crear un bloque en VHDL que se enviará a la secuencia de salida de unos y ceros (código de señal) pero no puedo avanzar. El código se compila, pero en la simulación la salida no reacciona como esperaba, sigue enviando ceros. El siguiente es mi código:

--beacon
library ieee;
use ieee.std_logic_1164.all;

entity beacon is
        port
        (       START : in std_logic;
                CLK : in std_logic;
                Q : out bit
        );
end;

architecture dataflow of beacon is
signal code : bit_vector(0 downto 45);
signal index : integer;
begin
        code <= "0111010111000101011100011101110001011101110100";
        index <= 46;
        st : process(START)
        begin
                if rising_edge(START) then
                        index <= 0;
                end if;
        end process;

        b : process(CLK)
        begin
                if rising_edge(CLK) then
                        if(index < 46) then
                                Q <= code(index);
                                index <= index + 1;
                        end if;
                end if;

        end process;
end;

Soy nuevo en VHDL. ¿Alguien me puede dar algún consejo sobre lo que está mal en mi código?

    
pregunta user50222

3 respuestas

2

Hay dos cosas que obviamente están mal. Primero, la declaración de código tiene un rango nulo ("0 hasta 45" debe ser "0 a 45"), segundo, tiene dos procesos que asignan valores a la misma señal (índice) que no es un tipo resuelto. Cada proceso que contenga una asignación de señal para indexar tendrá un controlador.

El primero es un error de tiempo de análisis, deberías haber recibido una notificación de que la longitud de la cadena no coincide con el rango del código (que es un rango nulo con downto). El segundo es un error de simulación ("Es un error si, después de la elaboración de una descripción, una señal tiene varias fuentes y no es una señal resuelta"). Cualquiera de los dos debería haber sido suficiente para evitar que se ejecute su simulación, lo que habla de la herramienta que está utilizando.

La forma de solucionar el segundo problema podría ser consolidar los dos procesos, utilizando INICIAR como habilitación síncrona, lógicamente O con índice / = 0. Parece que desea que INICIO marque el primer bit de salida en cualquier caso. Cuando el índice es 45, el siguiente índice debe ser cero, lo que requiere que START comience (nuevamente).

Hice los siguientes cambios en tu código (beacon.vhdl):

--signal code : bit_vector(0 downto 45);
signal code : bit_vector(0 to 45);
--signal index : integer;
signal index : integer := 0;

(Tenga en cuenta que el índice podría tener un rango asignado:     índice de señal: rango entero de 0 a 45; (Lo que se requiere aquí es el valor de la izquierda establecido en 0), que cumple cualquiera de los dos formularios de declaración de señal.)

--        index <= 46;
        -- st : process(START)
        -- begin
        --         if rising_edge(START) then
        --                 index <= 0;
        --         end if;
        -- end process;
        -- 
        -- b : process(CLK)
        -- begin
        --         if rising_edge(CLK) then
        --                 if(index < 46) then
        --                         Q <= code(index);
        --                         index <= index + 1;
        --                 end if;
        --         end if;
        -- 
        -- end process;
        b : process(CLK)
        begin
            if rising_edge(CLK) then
                if index /= 0 or START = '1' then
                    Q <= code(index);
                    if index = 45 then
                        index <= 0;
                    else
                        index <= index + 1;
                    end if;
                end if;
            end if;

        end process;

(Que consolida los dos procesos)

Esto da:

Cuando se usa con el banco de pruebas:

library ieee;
use ieee.std_logic_1164.all;

entity test is
end entity;

architecture foo of test is
    signal START:   std_logic := '0';
    signal CLK:     std_logic := '1';
    signal Q:       Bit;
begin
DUT:   entity work.beacon
    port map (START, CLK, Q);
CLOCK:
    process 
    begin
        wait for 20 ns;
        CLK <= not CLK;
        if (now >= 2 us) then
            wait;
        end if;
    end process;
STIMULUS:
    process
    begin
        wait for 45 ns;
        START <= '1';
        wait for 40 ns;
        START <= '0';
        wait; 
    end process;

end architecture;

Esto se hizo en un Macbook usando ghdl y gtkwave.

%% ghdl -a beacon.vhdl # modified as noted above, test bench test appended    
%% ghdl -e test        # not needed in mcode versions of ghdl    
%% ghdl -r test --wave=test.ghw
%% gtkwave test.ghw    # after setting up, write your save file

El banco de pruebas limita la duración de la simulación al detener el reloj (ver evaluación de la expresión que contiene ahora).

    
respondido por el user8352
0

Creo que debería establecer sus valores predeterminados de esta manera: enlace . Creo que su variable de código simplemente se establece en ceros y comando:

code <= "0111010111000101011100011101110001011101110100";

no se está ejecutando correctamente.

    
respondido por el Filip
0

Una forma más genérica de hacer las cosas, que te permite cambiar fácilmente la longitud de code y no tener que cambiar nada más.

En el proceso, eliminamos tu error al definir el rango de código como 0 downto 45 , que es un rango nulo ...

architecture dataflow of beacon is
constant code : bit_vector := "0111010111000101011100011101110001011101110100";
signal index : integer range 0 to code'high + 1;
begin
        index <= code'high;
        st : process(START)
        begin
                if rising_edge(START) then
                        index <= 0;
                end if;
        end process;

        b : process(CLK)
        begin
                if rising_edge(CLK) then
                        if(index < code'high+1) then
                                Q <= code(index);
                                index <= index + 1;
                        end if;
                end if;

        end process;
end;
    
respondido por el Martin Thompson

Lea otras preguntas en las etiquetas