77 lines
1.7 KiB
Verilog

`timescale 1ns / 1ps
module measure
(
input clk_sys,
input clk_samp,
input rst_n,
input mearsure_start,
input [11:0] AD_data,
output measure_done_q,
output [21:0] data_out
);
parameter cnt_clear = 22'd255;
reg clk_samp_buf0;
reg clk_samp_buf1;
wire clk_samp_impluse = clk_samp_buf0 & ~clk_samp_buf1;//采样脉冲信号
wire [21:0] mult_data;
reg [16:0] cnt;
reg [39:0] sig_energy;
reg [21:0] data_out_buf;
reg measure_en;
wire measure_done = (cnt == cnt_clear) ? 1'b1:1'b0;
assign measure_done_q = measure_done;
always@(posedge clk_sys)
begin
clk_samp_buf0 <= clk_samp;
clk_samp_buf1 <= clk_samp_buf0;
end
always@(posedge clk_sys)
begin
if(!rst_n)
begin
measure_en <= 1'b0;
end
else if(mearsure_start)
measure_en <= 1'b1;
else if(measure_done)
measure_en <= 1'b0;
else
measure_en <= measure_en;
end
always@(posedge clk_sys)
begin
if(!rst_n)
begin
sig_energy <= 40'd0;
cnt <= 17'd0;
data_out_buf <= 22'd0;
end
else if(cnt == cnt_clear)
begin
sig_energy <= 40'd0;
data_out_buf <= sig_energy[39:8];
cnt <= 17'd0;
end
else if(clk_samp_impluse && measure_en)
begin
cnt <= cnt + 17'd1;
sig_energy <= sig_energy + mult_data;
end
else
begin
sig_energy <= sig_energy;
data_out_buf <= data_out_buf;
cnt <= cnt;
end
end
mult1 mult1_inst
(
.A(AD_data),
.B(AD_data),
.P(mult_data),
.CLK(clk_sys),
.CE(clk_samp_impluse)
);
assign data_out = data_out_buf;
endmodule