El valor de data_out se está actualizando en el próximo flanco de reloj que se supone que se actualizará tan pronto como se asigne b, ¿por qué?

1
    module memory(data_out,address,data_in,write_enable,clk,cs,rst);
        output  [3:0] data_out;
        input [3:0] address;
        input [3:0] data_in; 
        input write_enable;
        input clk;
        input cs;
        input rst;

    reg [3:0] data_out,b;
    reg [3:0] memory [0:15];
    reg [3:0] temp,a;



    always @(posedge clk or posedge rst) begin
       if(rst) begin
         temp<=4'b0000;
         data_out<=4'b0000;
       end
       else 
       begin
         temp<=a;
         data_out<=b;
       end
       end


    always @(posedge clk)begin
       if(cs==1'b1) begin
            if (write_enable==1'b1) begin
                memory[address] <= data_in;
                a<=data_in;
             end
             else begin
               b<=memory[address];
             end
        end
    end

   endmodule
    
pregunta user34003

1 respuesta

3

Está actualizando data_out y b simultáneamente en posedge clk , lo que significa que en cada borde positivo de clk , a data_out se le asignará el valor de b y a b se le asignará el memory[address] , por lo tanto, data_out tiene asignado el valor anterior de b

Para obtener resultados correctos, puedes hacer esto:

No actualizar data_out <= b en el primer bloque always
En su lugar, asigne data_out <= memory[address] dentro del segundo bloque always .

    
respondido por el Don't You Worry Child

Lea otras preguntas en las etiquetas