Cuarta Parte - Grabación de datos en archivos
Veremos como realizar la grabación de datos a archivos, para luego analizarlos en Matlab. Si están siguiendo esta serie, en el mensaje número 3 propuse algunas tareas. Si piensan hacerlas
no sigan leyendo ya que a continuación se presentan algunas de las soluciones a las preguntas del mensaje anterior.
En los mensajes siguientes sólo destacaré las diferencias con respecto a versiones anteriores para no pegar extensos (y repetidos) trozos de código. Al final de esta sección podrán
encontrar los archivos completos.
Dicho sea de paso, como editor uso y recomiendo al Notepad++, que incluye números de líneas y reconoce la sintaxis de VHDL.
El siguiente proceso fue agregado al testbench para grabar datos de la simulación a un archivo:
-- 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;
Los números de línea mencionados a continuación se refieren al archivo completo:
67 a 69: Se abre el archivo y se espera hasta que la señal enable y clock se hacen activas
72 a 76: Lazo en el que se escriben los datos al archivo. Noten el uso de función de conversión de std_logic_vector a unsigned y de ahí a entero(*), la escritura de este dato a una "línea"
y de la línea al archivo. Se realiza una escritura por cada flanco ascendiente del clk.
78 a 80: Se cierra el archivo y se activa la bandera que termina la simulación
(*) VHDL soporta operaciones matemáticas con std_logic_vector. Pero cuando existe una duda sobre si tal vector tiene o no signo, se lo debe aclarar como en este caso en que decidimos tomar
las salidas del LFSR como sin signo (unsigned).
El archivo generado res.log se ve así (fragmento):
El archivo generado res.log se ve así (fragmento):
0 1 3 7 15 31 62 124
y posee como era de esperarse 2048 líneas.
A continuación, la lista completa de los cambios de tb_lfsr1 a tb_lfsr1_1, según números de línea:
18: definición del nombre del archivo a grabar
22, 30, 39, 56: agregado el soporte a la nueva señal "enable"
60 a 82: nuevo proceso para grabación de archivos de datos de salida de la simulación
Quinta y última parte - Análisis de los datos mediante Matlab
En este capítulo tomamos los datos de salida de la simulación en VHDL y la analizamos en Matlab. A continuación el código que utilicé en Matlab para analizar en el campo frecuencial la salida del LFSR, en diversas configuraciones (con cada vez más bits). A medida que aumentan los bits, vemos que aumenta de forma significativa el desempeño del LFSR para crear una señal lo más parecida posible a ruido.
NFFT = 2048; y = dlmread('res.log'); % Normalize the input m = (max(y)-min(y))/2; y = (y-m)/m; Y = fft(y,NFFT)/NFFT; f = linspace(0,1,NFFT/2+1); subplot % Plot single-sided amplitude spectrum. subplot(1,2,1); plot(f,20*log(abs(Y(1:NFFT/2+1)))) title('Single-Sided Amplitude Spectrum of y(t)') xlabel('Frequency (Hz)') ylabel('|Y(f)|') % Plot time domain subplot(1,2,2); plot(y(1:250)); title('Time domain') xlabel('time')
El código en Matlab normaliza los datos de entrada, y después simplemente genera el gráfico en frecuencia (con frecuencia también normalizada) de los generadores LFSR. También muestra un
fragmento de la respuesta temporal.
A continuación los resultados para tamaños de registro de 5, 7, 9 y 11 bits: