Я пытаюсь написать код, в котором мне нужно реализовать стандартное отклонение для «DNN», используемого в моем коде. Кажется, все работает до вывода «roll», однако из «roll» он должен получить суммирование «рулона». Он не суммирует и, следовательно, я ничего не получаю после этого расчета. Я приложил свой код и испытательный стенд:
Код:
////SDSD calculation
`timescale 1s/1ns
module SDSD_mk2(In,clk,RMSSD,Avg,roll,dum,DNN,sumD,summ);
input [31:0] In;
input clk;
output reg [63:0] sumD;
reg [31:0] DIN;
output reg [31:0] DNN;
reg [31:0] MS;
output reg [31:0] RMSSD;
output reg [31:0] Avg;
output reg [31:0] roll;
output reg [31:0] dum;
reg [31:0] rollD;
output reg [31:0] summ;
reg [31:0] counter;
function [15:0] sqrt;
input [31:0] num;
reg [31:0] a;
reg [15:0] q;
reg [17:0] left,right,r;
integer i;
begin
a = num;
q = 0;
i = 0;
left = 0;
right = 0;
r = 0;
for(i=0;i<16;i=i+1) begin
right = {q,r[17],1'b1};
left = {r[15:0],a[31:30]};
a = {a[29:0],2'b00};
if (r[17] == 1)
r = left + right;
else
r = left - right;
q = {q[14:0],!r[17]};
end
sqrt = q;
end
endfunction
initial begin
counter = 0;
sumD <= 0;
DIN = 0;
DNN = 0;
MS = 0;
RMSSD = 0;
Avg = 0;
roll = 0;
dum = 0;
summ <= 0;
rollD = 0;
end
always @(posedge clk) begin
DIN<=In;
DNN<=DIN;
if(In>DIN)
DNN<=In-DIN;
else
DNN<=DIN-In;
sumD <= sumD + (DNN);
dum <= DNN - (sumD/counter);
roll <= dum*dum;
rollD <= roll;
#0.001 summ <= summ + (rollD);
// roll <= roll + (dum*dum);
counter = counter + 1;
if(counter>100)begin
Avg<= summ/counter;
//#0.001 SDSD<= sqrt(Avg);
counter = 0;
sumD<=0;
end
end
endmodule
Испытательный стенд
//SDSD TB
`timescale 1ms/1ns
module SDSD_mk2_TB;
reg [31:0] In;
reg [31:0] counter;
reg clk;
wire [31:0] RMSSD;
wire [31:0] Avg;
wire [31:0] roll;
wire [31:0] dum;
wire [31:0] DNN;
wire [31:0] summ;
wire [63:0] sumD;
//integer i;
SDSD_mk2 SD0(.In(In),.clk(clk),.RMSSD(RMSSD),.Avg(Avg),.roll(roll),.dum(dum),.DNN(DNN),.sumD(sumD),.summ(summ));
initial begin
In =0;
clk =0;
counter = 0;
end
always #0.5 clk=~clk;
always@ (posedge clk) begin
if(counter < 50)
In = In+5;
else if(counter < 100)
In = In+10;
else if(counter < 150)
In = In+15;
else if(counter < 200)
In = In+20;
else
In = In+25;
counter = counter + 1;
end
endmodule
Выходы: Первое изображение для выходов Второе изображение для выходов
`