Hola amigos,
En esta serie de artículos voy a presentar varios ejemplos de VHDL, comenzando por un ejemplo simple de generador de números aleatorios, le iremos agregando más funciones, como ser, código VHDL de pruebas (test bench), parametrización del diseño, grabación de datos en disco y posterior análisis en Matlab, etc.
Para poder aprovechar este aporte deben conocer previamente el lenguaje VHDL y el manejo de Modelsim u otro simulador que Uds. prefieran.
Aquí vamos:
Vamos a generar números aleatorios por hardware. Una manera popular de generar números aleatorios por hardware es utilizar lo que se denomina LFSR, registros de desplazamiento con realimentación lineal. El registro y su implementación lineal son equivalentes al desarrollo de un polinomio, donde cada potencia del polinomio es representada por el orden del bit dentro del registro.
Como ni yo entiendo lo que dice en la frase anterior
, supongo que con los ejemplos prácticos será más digerible.
A continuación, la primera versión del código VHDL que genera números aleatorios.
El código es cortito. La señal de feedback, en este primer ejemplo, está calculada tomando en cuenta un polinomio de orden 3 (4 bits), que genera una secuencia de 15 valores. Si generamos más valores que 15 la secuencia se repite indefinidamente.
Es por eso que a estas secuencias se las denomina pseudo aleatorias, por un lado presentan una cierta variabilidad, por otro, son repetitivas y si sabemos el orden del polinomio, a un valor determinado siempre le seguirá un valor conocido... Un número realmente aleatorio no se comporta así, pero igual veremos que la secuencia pseudo aleatoria es muy útil, por ejemplo, como generador de ruido blanco, o rosa.
En VHDL no se puede leer en el código el valor de una salida, es por eso que todos los cálculos los realizo con count_i, y solo al final vuelco su valor a la salida. Creo que es una buena costumbre y clarifica el código el utilizar esta convención de agregar el sufijo "_i" al nombre de la señal. Uds. pueden usar esa mismo convención u otra con la que se sientan cómodos, lo importante es adoptar una convención y después usarla siempre.
Dentro del proceso lo que estamos haciendo es un registro de desplazamiento cuya entrada (feedback) es una combinación lineal de algunos de los bits del registro mediante compuertas XOR.
En la próxima pondré el código del test bench y veremos algunas formas de onda.
En esta serie de artículos voy a presentar varios ejemplos de VHDL, comenzando por un ejemplo simple de generador de números aleatorios, le iremos agregando más funciones, como ser, código VHDL de pruebas (test bench), parametrización del diseño, grabación de datos en disco y posterior análisis en Matlab, etc.
Para poder aprovechar este aporte deben conocer previamente el lenguaje VHDL y el manejo de Modelsim u otro simulador que Uds. prefieran.
Aquí vamos:
Vamos a generar números aleatorios por hardware. Una manera popular de generar números aleatorios por hardware es utilizar lo que se denomina LFSR, registros de desplazamiento con realimentación lineal. El registro y su implementación lineal son equivalentes al desarrollo de un polinomio, donde cada potencia del polinomio es representada por el orden del bit dentro del registro.
Como ni yo entiendo lo que dice en la frase anterior
A continuación, la primera versión del código VHDL que genera números aleatorios.
Código:
-- File name : lfsr1.vhd
-- Comments : Random number generator in VHDL - Version 1
-----------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
entity lfsr1 is
port (
reset : in std_logic;
clk : in std_logic;
count : out std_logic_vector (3 downto 0)
);
end entity;
architecture rtl of lfsr1 is
signal count_i : std_logic_vector (3 downto 0);
signal feedback : std_logic;
begin
feedback <= not(count_i(3) xor count_i(2)); -- LFSR size 4
process (reset, clk)
begin
if (reset = '1') then
count_i <= (others=>'0');
elsif (rising_edge(clk)) then
count_i <= count_i(2 downto 0) & feedback;
end if;
end process;
count <= count_i;
end architecture;
El código es cortito. La señal de feedback, en este primer ejemplo, está calculada tomando en cuenta un polinomio de orden 3 (4 bits), que genera una secuencia de 15 valores. Si generamos más valores que 15 la secuencia se repite indefinidamente.
Es por eso que a estas secuencias se las denomina pseudo aleatorias, por un lado presentan una cierta variabilidad, por otro, son repetitivas y si sabemos el orden del polinomio, a un valor determinado siempre le seguirá un valor conocido... Un número realmente aleatorio no se comporta así, pero igual veremos que la secuencia pseudo aleatoria es muy útil, por ejemplo, como generador de ruido blanco, o rosa.
En VHDL no se puede leer en el código el valor de una salida, es por eso que todos los cálculos los realizo con count_i, y solo al final vuelco su valor a la salida. Creo que es una buena costumbre y clarifica el código el utilizar esta convención de agregar el sufijo "_i" al nombre de la señal. Uds. pueden usar esa mismo convención u otra con la que se sientan cómodos, lo importante es adoptar una convención y después usarla siempre.
Dentro del proceso lo que estamos haciendo es un registro de desplazamiento cuya entrada (feedback) es una combinación lineal de algunos de los bits del registro mediante compuertas XOR.
En la próxima pondré el código del test bench y veremos algunas formas de onda.