implementación en el primer ram de un solo puerto de escritura

0

A continuación se muestra una memoria RAM de un solo puerto en el modo de escritura primero.

module raminfr (clk, we, en, addr, di, do);
        input        clk;
        input        we;
        input        en;
        input  [4:0] addr;
        input  [3:0] di;
        output [3:0] do;
        reg    [3:0] RAM [31:0];
        reg    [4:0] read_addr;
        always @(posedge clk)
        begin
           if (en) begin
              if (we) 
             RAM[addr] <= di;
                  read_addr <= addr;
           end
        end
           assign do = RAM[read_addr];
    endmodule

Aquí, ¿cómo podemos asegurar que la salida do se modifique después de que se ejecute RAM[addr] <= di; ?

Si la lógica hace el modo de escritura primero, los datos deben escribirse primero y luego la lectura debe suceder. Pero, como sabemos, RAM[addr] <= di; y r ead_addr <= addr; se ejecutan simultáneamente. Sin embargo, parece que no podemos garantizar que la salida do se cambie después de escribir.

¿Por qué funciona este código?

Los siguientes son mis ejemplos:

suposición: addr [10] = 5, addr [20] = 15;

addr anterior: 10, addr actual: 10, en: 1, we: 0 = > do = 5

addr anterior: 10, addr actual: 20, en: 1, we: 1, di: 12 = > do se cambiará debido a que RAM [read_addr] se cambiará a 15. Pero, ¿cómo podemos asegurar que do será 12 en lugar de 15 (modo de escritura)?

Además, ¿es necesario el reg read_addr ? Si es así, ¿por qué?

    
pregunta sungjun cho

1 respuesta

2
  

Aquí, ¿cómo podemos asegurar que la salida do se modifique después de la RAM [addr] < = di; es ejecutado?

Porque assign do = RAM[read_addr]; se ejecutará cuando cualquiera de sus señales cambie. Por lo tanto, se llamará cuando cambie read_addr o si cambie la RAM. Esto hace que la salida do siga tanto a la dirección como a las escrituras que suceden.

El registro read_addr se asegura de que los datos de la última lectura permanezcan en la salida si cambia addr . Esto es necesario porque se debe ignorar addr si no hay habilitación y si no hay reloj.

Todo el código crea una memoria con un determinado comportamiento. Puede que no sea el comportamiento que esperabas.

Espero que el formato del código no sea el original. Es muy descuidado. También hoy en día debería usar definiciones de puertos modernos:

module raminfr (
   input clk, // Memory synchronous clock
   input we,  // Write enable
   input en,  // Enable for both read and write
   ....

Al agregar el comentario, queda claro lo que hace cada señal. Por lo tanto, le dice al usuario que el en es necesario para leer y escribir. De lo contrario, él / ella tiene que revisar el código para averiguarlo.

Comentario final: solo porque encuentre un código que funciona, no asuma que es el mejor que hay.

    
respondido por el Oldfart

Lea otras preguntas en las etiquetas