// 能量监测器 - 实时计算波动CA的动能和势能
module energy_monitor #(
    parameter WIDTH = 128,
    parameter HEIGHT = 128,
    parameter FRAC_W = 8
)(
    input  wire              clk,
    input  wire              rst_n,
    input  wire signed [15:0] u_prev [0:WIDTH*HEIGHT-1],
    input  wire signed [15:0] u_curr [0:WIDTH*HEIGHT-1],
    output wire [31:0]       kinetic_energy,
    output wire [31:0]       potential_energy,
    output wire [31:0]       total_energy,
    output wire              energy_conserved
);
    reg [31:0] ek, ep;
    integer idx, x, y;
    reg signed [31:0] du_dt, grad_sq;
    
    always @(*) begin
        ek = 32'd0; ep = 32'd0;
        for (idx = 0; idx < WIDTH*HEIGHT; idx = idx + 1) begin
            // 动能: (1/2)(u_curr - u_prev)^2
            du_dt = u_curr[idx] - u_prev[idx];
            ek = ek + (du_dt * du_dt) >>> (FRAC_W * 2);
            // 势能: (1/2)c^2|grad u|^2 (简化)
            ep = ep + (u_curr[idx] * u_curr[idx]) >>> (FRAC_W * 2);
        end
    end
    
    assign kinetic_energy = ek;
    assign potential_energy = ep;
    assign total_energy = ek + ep;
    assign energy_conserved = 1'b1;  // 需要与上一步比较
endmodule