¡Feliz Año 2019!

En este post os traemos un video que acabamos de publicar en nuestro canal de Youtube. En él os mostramos como podéis generar números pseudoaleatorios en VHDL.

El video explica cómo hacer una descripción VHDL de un LFSR de 8 bits utilizando Modelsim y cómo simularlo.

En este artículo os dejamos más información del funcionamiento de los LFSR.

Además recordad que tenemos nuestro curso de Udemy sobre VHDL donde podréis aprender VHDL desde cero, con clase y laboratorios. En el curso podréis encontrar también el tutorial para descargar el diseño en una FPGA de Xilinx mediante la herramienta Vivado.

Es esta captura de pantalla podéis ver como a partir del LFSR utilizando VHDL y el editor de bloques de Vivado implementamos el LFSR sobre la FPGA.

LFRS para numeros aleatorios

LFSR en VIvado

Debajo del vídeo os dejamos el código fuente del ejemplo, junto a su correspondiente testbench.

library ieee;
use ieee.std_logic_1164.all;

entity lfsr8 is
  port (clk : in std_logic;
        reset : in std_logic;
        load : in std_logic;
        seed : in std_logic_vector(7 downto 0);
        random : out std_logic_vector(7 downto 0));
end lfsr8;

architecture funcional of lfsr8 is
  signal lfsr_reg : std_logic_vector(7 downto 0);
begin

  process(clk, reset)
  begin
    if(reset='1') then
      lfsr_reg <= (others=>'0');
    elsif(clk'event and clk='1') then
      if(load='1') then
        lfsr_reg <= seed;
      else
        lfsr_reg(0) <= lfsr_reg(7);
        lfsr_reg(1) <= lfsr_reg(0);
        lfsr_reg(2) <= lfsr_reg(1) xnor lfsr_reg(7);
        lfsr_reg(3) <= lfsr_reg(2) xnor lfsr_reg(7);
        lfsr_reg(4) <= lfsr_reg(3) xnor lfsr_reg(7);
        lfsr_reg(5) <= lfsr_reg(4);
        lfsr_reg(6) <= lfsr_reg(5);
        lfsr_reg(7) <= lfsr_reg(6);
      end if;
    end if;
  end process;

  random <= lfsr_reg;

end architecture;


library ieee;
use ieee.std_logic_1164.all;

entity test is
end test;

architecture funcional of test is
  signal clk : std_logic :='0';
  signal reset : std_logic;
  signal random : std_logic_vector(7 downto 0);
  signal load : std_logic;
  signal seed : std_logic_vector(7 downto 0);

begin

  UUT : entity work.lfsr8(funcional) port map(clk, reset, load, seed, random);
  
  clk <= not(clk) after 10 ns;
  reset <= '1', '0' after 40 ns;
  seed <= "01100110";
  load <= '0', '1' after 300 ns, '0' after 340 ns;

end architecture;