2011-10-03 15 views
17

¿Qué código es mejor al escribir una RAM?Mejor forma de codificar una RAM en Verilog

  1. asignar data_out dentro always bloque:

    module memory(
        output reg [7:0] data_out, 
        input [7:0] address, 
        input [7:0] data_in, 
        input write_enable, 
        input clk 
    ); 
        reg [7:0] memory [0:255]; 
    
        always @(posedge clk) begin 
         if (write_enable) begin 
          memory[address] <= data_in; 
         end 
         data_out <= memory[address]; 
        end 
    
    endmodule 
    
  2. asignar data_out usando assign declaración:

    module memory(
        output [7:0] data_out, 
        input [7:0] address, 
        input [7:0] data_in, 
        input write_enable, 
        input clk 
    ); 
        reg [7:0] memory [0:255]; 
    
        always @(posedge clk) begin 
         if (write_enable) begin 
          memory[address] <= data_in; 
         end 
        end 
    
        assign data_out = memory[address]; 
    
    endmodule 
    

¿Alguna recomendación?

+4

No necesita 16 bits de dirección para acceder a 256 ubicaciones de memoria. Debe usar 'input [7: 0] address;'. – toolic

Respuesta

8

Depende de sus requisitos.

  1. Registra la salida de la memoria. Si está sintetizando esto en compuertas, tendrá 16 flip-flops más que en el caso 2. Eso significa que usa un poco más de área. También significa que su salida tendrá menos retardo de propagación en relación con el reloj que el caso 2. Además, los datos de salida no estarán disponibles hasta el próximo ciclo de reloj.

  2. Sus datos de salida estarán disponibles dentro del mismo ciclo de reloj que se escribió, aunque con un retardo de propagación más largo en relación con el reloj.

Tiene que decidir cuál usar en función de sus requisitos.

Una tercera opción es usar una RAM generada, que es una macro dura. Esto debería tener ventajas de área, potencia y posiblemente de tiempo en los casos 1 y 2.

5

para agregar a la respuesta de la herramienta; si usa el método de lectura asíncrona (caso 2), no se asignará a un bloque de RAM en un FPGA, ya que los bloques de RAM en todas las arquitecturas principales que conozco tienen una lectura sincrónica.

-1

En el segundo programa, habría un error de compilación ya que no podemos 'Asignar' un valor a 'Reg'. que dará un error que dice: 'Registro es ilegal en la parte izquierda de la asignación continua'

1

Ambas formas son válidas, dependiendo del tipo de la canalización que desea. Siempre recomiendo seguir las pautas de codificación de Xilinx RAM: es una buena manera de garantizar que el código se sintetice en las construcciones FGPA adecuadas. Por ejemplo, su ejemplo 1 se sintetizaría en Xilinx BRAM (es decir, Block Ram dedicado), ya que es lectura sincrónica, y su ejemplo 2 se sintetizaría en Xilinx Distributed Ram (dado que es lectura asincrónica).

Consulte las pautas de codificación en el documento Xilinx UG901 (Guía de usuario de Vivado Design Suite), en la sección Técnicas de codificación de RAM HDL. También tiene una buena descripción de la diferencia entre la lectura síncrona y la lectura asíncrona para las RAM.

Cuestiones relacionadas