Я хочу создать фрактал Мандельброта с помощью fpga. Я создаю модуль, который должен вычислять итерацию Мандельброта для каждого пикселя. код прекрасно работает при моделировании, но я получаю неожиданное значение при отладке на реальном оборудовании, когда n> 0
Вот модуль калькулятора, я увеличиваю n, если done_calc == 0, и меняю x и y, если done_calc == 1 .
Это начальное числовое значение c работает безупречно на питоне;
Вот лог-файл ila, когда n = 0 test1, test2, xn, yn значения верны, но когда n = 1 значения не соответствуют ожидаемым значениям. На симуляции все работает как положено
https://i.stack.imgur.com/BZahZ.png
`timescale 1ns / 1ps
module mandelbrot(
input clk,
input wire[10:0] x,
input wire[10:0] y,
input wire[10:0] n,
output wire done_calc
);
parameter MAX_ITER = 180 , HEIGHT=768 , WIDTH = 1024;
reg signed [63:0] xb=-64'd33554432 , xl=16777216 , yb=-64'd16777216 , yl=16777216 , xs=49152 , ys=43690;
reg signed [63:0] x0=64'b0, y0=64'b0, xn=64'b0, yn=64'b0,tmp_yn=64'b0;
reg done_calc_reg=0;
reg[63:0] test1=0;
reg[63:0] test2=0;
reg test=0;
wire [10:0] d_x=x;
wire [10:0] d_y=y;
wire [10:0] d_n=n;
wire [63:0] d_x0=x0;
wire [63:0] d_y0=y0;
wire [63:0] d_test1=test1;
wire [63:0] d_test2=test2;
wire [63:0] d_xn=xn;
wire [63:0] d_yn=yn;
wire d_test=test;
function signed [63:0] mm (input signed [63:0] a ,input signed [63:0] b);
begin
mm = (a*b)>>>24;
end
endfunction
function signed [63:0] f (input signed [63:0] a );
begin
f=a*(1<<<24);
end
endfunction
function signed [63:0] i (input signed [63:0] a);
begin
i=(a+(1<<<23))>>>24;
end
endfunction
always @(n or x or y) begin
if(n==0)begin
done_calc_reg=0;
x0=xb+x*xs;
y0=yb+y*ys;
xn = x0;
yn = y0;
end
test1=mm(yn,yn);
test2=mm(xn,xn);
test=(test1+test2)<f(4);
if(test1+test2<f(4) && n<MAX_ITER)begin
tmp_yn=2*mm(yn,xn) +y0;
xn=mm(xn,xn)- mm(yn,yn) + x0;
yn = tmp_yn;
done_calc_reg=0;
end
else
done_calc_reg=1;
end
ila_0 deb(.clk(clk),.probe0(d_y0),.probe1(d_x0),.probe2(d_n),
.probe3(d_x),.probe4(d_y),.probe5(d_test1),.probe6(d_test2),
.probe7(d_xn),.probe8(d_yn),.probe9(d_test)
);
assign done_calc=done_calc_reg;
endmodule