Расчет следующего значения функции на базе квадратичной интерполяции
Материал из Модулярная арифметики
Версия от 12:24, 28 августа 2013; Turbo (обсуждение | вклад)
Положим нам задана функция, которая принимает определенные значения через равные промежутки времени. То есть заданы точки вида: . Для простоты зададим равный промежуток равный единице. То есть точки будут иметь вид: . Нам требуется определить значение функции в точке . Воспользуемся формулой квадратичной интерполяции:
Реализация на Verilog
- Синхронная схема, которая выдает интерполированное значение функции по трем предыдущим.
module interpolation(out, in, clk);
input clk;
input [7:0] in;
reg [7:0] storage[0:2];
wire signed [10:0] data;
output reg [7:0] out;
initial storage[0] = 0;
initial storage[1] = 0;
initial storage[2] = 0;
assign data = storage[2] - 3*storage[1] + 3*storage[0];
always @ (posedge clk)
begin
if (data < 0)
out = 0;
else if (data > 255)
out = 255;
else
out = $unsigned(data[7:0]);
storage[2] = storage[1];
storage[1] = storage[0];
storage[0] = in;
end
endmodule
module atest_bench();
reg clk;
reg [7:0] in;
wire [7:0] out;
integer l, z, val1, val2, val3;
reg dummy;
integer i0, prev;
interpolation r1 (out, in, clk);
// One test. Ticks: 3
initial
begin
val1 = 0;
val2 = 0;
val3 = 0;
for (z = 0; z < 100; z = z+1)
begin
prev = val3 - 3*val2 + 3*val1;
val3 = val2;
val2 = val1;
if (prev < 0)
begin
prev = 0;
end
else if (prev > 255)
begin
prev = 255;
end
val1 = $unsigned($random) % 256;
#1 dummy = 1;
clk = 0;
#1 dummy = 1;
in = val1;
#1 dummy = 1;
clk = 1;
#1 dummy = 1;
$display ("!!! Res=(%d) Expect=(%d) Data = [val1 = %d, val2 = %d, val3 = %d]", out, prev, val1, val2, val3);
l = out;
if (l != prev)
begin
$display ("!!! Error (%d, %d)!!!", prev, l);
end
end
end
endmodule