Parámetro de tamaño std_logic_vector no definido en el procedimiento

0

Escribí en un procedimiento el comportamiento de una transacción SPI simple que uso en mis bancos de prueba para facilitar la escritura y la lectura. ¿Hay alguna forma de hacer que este procedimiento sea lo más genérico posible sin mencionar el tamaño del vector data dado como parámetro? ¿O tal vez agregar un parámetro de tamaño como un entero?

Aquí está el procedimiento que estoy usando hasta ahora. Por ahora tengo una declaración de procedimiento para cada tamaño de vector que quiero transferir.

procedure spi_transfer_3B(data : std_logic_vector(23 downto 0)) is 
variable bitCnt : integer := data'length-1;
begin
    spi_clk <= '0';
    spi_mosi <= 'Z';
    spi_ss <= '0';
    wait until rising_edge(clk);

    for i in 2*data'length-1 downto 0 loop
        wait for SPI_CLK_PERIOD/2;
        spi_clk <= not spi_clk;
        if spi_clk = '0' then
            spi_mosi <= data(bitCnt);
            bitCnt := bitCnt -1;
        end if;
    end loop;

    spi_clk <= '0';
    wait until rising_edge(clk);
    spi_ss <= '1';
    spi_mosi <= 'Z';
end spi_transfer_3B;

¿Qué piensas?

    
pregunta Fluffy

1 respuesta

2

Esto parece funcionar. Estaba confundido porque no mencionar primero x downto x codificó el vector LSB en lugar de MSB primero como se esperaba en mi primer fragmento de código. Es así de fácil.

procedure spi_transfer(data : std_logic_vector) is 
variable bitCnt : integer := 0;
begin
    spi_clk <= '0';
    spi_mosi <= 'Z';
    spi_ss <= '0';
    wait until rising_edge(clk);

    for i in data'range loop
       wait for SPI_CLK_PERIOD/2;
       spi_clk <= '1';
       spi_mosi <= data(i);
       wait for SPI_CLK_PERIOD/2;
       spi_clk <= '0';
    end loop;

    spi_clk <= '0';
    wait until rising_edge(clk);
    spi_ss <= '1';
    spi_mosi <= 'Z';
end spi_transfer;
    
respondido por el Fluffy

Lea otras preguntas en las etiquetas