Перейти к содержанию
    

Доброго времени суток. Пытаюсь развернуть кордик с фиксированной точкой на верилоге, не могу понять что работает не так:

module CORDIC(fi,cos,sin);
    input[15:0] fi;
    output[15:0] cos,sin;
    reg signed[15:0] x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14;
    reg signed[15:0] y0,y1,y2,y3,y4,y5,y6,y7,y8,y9,y10,y11,y12,y13,y14;
    reg signed[15:0] z0,z1,z2,z3,z4,z5,z6,z7,z8,z9,z10,z11,z12,z13;
    
    parameter    atan0=16'd3217,
                    atan1=16'd1899,
                    atan2=16'd1003,
                    atan3=16'd509,
                    atan4=16'd256,
                    atan5=16'd128,
                    atan6=16'd64,
                    atan7=16'd32,
                    atan8=16'd16,
                    atan9=16'd8,
                    atan10=16'd4,
                    atan11=16'd2,
                    atan12=16'd1;
    
    assign cos=x14;
    assign sin=y14;
    
    always@(*) begin
        x0=16'd6745; //K=1.647
        y0=16'd0;
        z0=fi;
    
        x1=(z0>0)?x0-y0:x0+y0;
        y1=(z0>0)?y0+x0:y0-x0;
        z1=(z0>0)?z0-atan0:z0+atan0;
        
        x2=(z1>0)?x1-(y1>>1):x1+(y1>>1);
        y2=(z1>0)?y1+(x1>>1):y1-(x1>>1);
        z2=(z1>0)?z1-atan1:z1+atan1;
        
        x3=(z2>0)?x2-(y2>>2):x2+(y2>>2);
        y3=(z2>0)?y2+(x2>>2):y2-(x2>>2);
        z3=(z2>0)?z2-atan2:z2+atan2;
        
        x4=(z3>0)?x3-(y3>>3):x3+(y3>>3);
        y4=(z3>0)?y3+(x3>>3):y3-(x3>>3);
        z4=(z3>0)?z3-atan3:z3+atan3;

        x5=(z4>0)?x4-(y4>>4):x4+(y4>>4);
        y5=(z4>0)?y4+(x4>>4):y4-(x4>>4);
        z5=(z4>0)?z4-atan4:z4+atan4;
        
        x6=(z5>0)?x5-(y5>>5):x5+(y5>>5);
        y6=(z5>0)?y5+(x5>>5):y5-(x5>>5);
        z6=(z5>0)?z5-atan5:z5+atan5;
        
        x7=(z6>0)?x6-(y6>>6):x6+(y5>>6);
        y7=(z6>0)?y6+(x6>>6):y6-(x5>>6);
        z7=(z6>0)?z6-atan6:z6+atan6;
        
        x8=(z7>0)?x7-(y7>>7):x7+(y7>>7);
        y8=(z7>0)?y7+(x7>>7):y7-(x7>>7);
        z8=(z7>0)?z7-atan7:z7+atan7;
        
        x9=(z8>0)?x8-(y8>>8):x8+(y8>>8);
        y9=(z8>0)?y8+(x8>>8):y8-(x8>>8);
        z9=(z8>0)?z8-atan8:z8+atan8;
        
        x10=(z9>0)?x9-(y9>>9):x9+(y9>>9);
        y10=(z9>0)?y9+(x9>>9):y9-(x9>>9);
        z10=(z9>0)?z9-atan9:z9+atan9;
        
        x11=(z10>0)?x10-(y10>>10):x10+(y10>>10);
        y11=(z10>0)?y10+(x10>>10):y10-(x10>>10);
        z11=(z10>0)?z10-atan10:z10+atan10;
        
        x12=(z11>0)?x11-(y11>>11):x11+(y11>>11);
        y12=(z11>0)?y11+(x11>>11):y11-(x11>>11);
        z12=(z11>0)?z11-atan11:z11+atan11;
        
        x13=(z12>0)?x12-(y12>>12):x12+(y12>>12);
        y13=(z12>0)?y12+(x12>>12):y12-(x12>>12);
        z13=(z12>0)?z12-atan12:z12+atan12;
        
        x14=(z13>0)?x13-(y13>>13):x13+(y13>>13);
        y14=(z13>0)?y13+(x13>>13):y13-(x13>>13);
    end
    
endmodule

Формат чисел 4.12, аргументы в радианах. При симуляции выдает cos(0)>1. Пробовал кинуть счетчик на вход - что-то похожее на sin получается только в узком диапазоне:

gWCT6QwE.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

x1=(z0>0)?x0-y0:x0+y0;

y1=(z0>0)?y0+x0:y0-x0;

z1=(z0>0)?z0-atan0:z0+atan0;

Сверьте эти действия с Байков В.Д., Смолов В.Б. "Аппаратная реализация элементарных функций в ЦВМ", 1975

Там как бы иначе для x1 и y1 и всех остальных (см., *.jpg)...

Проверил первые из коэффициентов, вроде бы правильны...

post-41112-1349156127_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В veriloge не разбираюсь, но первое что видно нет начальной ротации +/- 90 градусов, поэтому не будет сдвигов +/- 180.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В veriloge не разбираюсь, но первое что видно нет начальной ротации +/- 90 градусов, поэтому не будет сдвигов +/- 180.

Да, но по крайней мере в интервале 0:90 он должен выдавать четверть периода, а на графике - какие-то всплески.

 

2Serhiy_UA

Все так, в книжке как я понял просто вектор поворачивают в обратную сторону, результат должен сходится.

Впрочем я уже разобрался, вдруг это кому-то будет интересно в верилоге >> синтезируется для signed как логический сдвиг (для чего вообще тогда нужна директива signed - не ясно :laughing: ), необходимо использовать оператор >>>. Ирония в том, что без директивы signed >>> при синтезе вырождается также в логический сдвиг :wacko: . Всем спасибо, тема исчерпана.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

для чего вообще тогда нужна директива signed - не ясно

Когда Вы суммируете или вычитаете, а результат той же разрядности, обычно анализируют перенос (unsigned) или переполнение (signed).

Обычно размножают разрядность. А Вы все отдали на откуп синтезатору. Методом тыка.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...