FPGA Мандельброт фрактальный генератор - PullRequest
0 голосов
/ 02 марта 2020

Я хочу создать фрактал Мандельброта с помощью 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...