ROM Asíncronas
- Cambian el puerto de salida cuando cambia la dirección de lectura sin la necesidad de un flanco de reloj adicional
- La inferencia de memorias asíncronas depende de la tecnología que se dispone. En la actualidad la mayoría de las memorias embebidas de los dispositivos programables son síncronas y esta inferencia de memorias asíncronas (combinacionales sin reloj) deriva en una implementación realizada con lógica (LUTs)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
module rom_asynch (address,dout); parameter d_width = 16; parameter a_width = 6; input [a_width-1:0] address; output [d_width-1:0] dout; logic [d_width-1:0] mem[(1<<a_width)-1:0] ; initial $readmemh("pesos_2.dat", mem); assign dout = mem[address]; endmodule |
ROM Síncronas
- Cambian el puerto de salida cuando cambia la dirección de lectura siempre y cuando tengamos un flanco de reloj
- La inferencia de memorias síncronas es directa en memorias embebidas. Por ejemplo en un dispositivo como la Cyclone IV del laboratorio sería mediante las memorias embebidas de 9kbits
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
module rom_synch_in #(parameter DATA_WIDTH=32, parameter ADDR_WIDTH=7) ( input [(ADDR_WIDTH-1):0] addr, input clk, output logic [(DATA_WIDTH-1):0] q ); // Declare the ROM variable logic [DATA_WIDTH-1:0] rom[2**ADDR_WIDTH-1:0]; initial begin $readmemh("tanh_1.dat", rom); end always_ff @ (posedge clk) begin q <= rom[addr]; end endmodule |
Inicialización de las ROM
Para aportar contenidos a la memoria utilizaremos “system tasks” preestablecidos
- $readmemb: Obtiene los contenidos de un fichero ASCII en donde los valores están escritos en formato binario
- $readmemh: Obtiene los contenidos de un fichero ASCII en donde los valores están escritos en formato hexadecimal
- Cuando se desea introducir una dirección, el formato utilizado es en hexadecimal en cualquiera de los casos .
- Suele llamarse a dichos procedimientos desde un initial como se ha visto en los ejemplos anteriores
- Aunque el fichero puede tener una extensión básica de .txt, es recomendable la utilización de la extensión .dat
La sintaxis completa de este tipo de «system task» es:
$readmemb(“<file_name>”, <memory_name>, <start_addr>?,<finish_addr>?);
siendo los dos últimos argumentos opcionales