Cosworth 0 1 октября, 2012 Опубликовано 1 октября, 2012 · Жалоба Доброго времени суток. Пытаюсь развернуть кордик с фиксированной точкой на верилоге, не могу понять что работает не так: 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 получается только в узком диапазоне: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serhiy_UA 1 2 октября, 2012 Опубликовано 2 октября, 2012 · Жалоба 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)... Проверил первые из коэффициентов, вроде бы правильны... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
protector 0 2 октября, 2012 Опубликовано 2 октября, 2012 · Жалоба В veriloge не разбираюсь, но первое что видно нет начальной ротации +/- 90 градусов, поэтому не будет сдвигов +/- 180. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Cosworth 0 3 октября, 2012 Опубликовано 3 октября, 2012 · Жалоба В veriloge не разбираюсь, но первое что видно нет начальной ротации +/- 90 градусов, поэтому не будет сдвигов +/- 180. Да, но по крайней мере в интервале 0:90 он должен выдавать четверть периода, а на графике - какие-то всплески. 2Serhiy_UA Все так, в книжке как я понял просто вектор поворачивают в обратную сторону, результат должен сходится. Впрочем я уже разобрался, вдруг это кому-то будет интересно в верилоге >> синтезируется для signed как логический сдвиг (для чего вообще тогда нужна директива signed - не ясно :laughing: ), необходимо использовать оператор >>>. Ирония в том, что без директивы signed >>> при синтезе вырождается также в логический сдвиг . Всем спасибо, тема исчерпана. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 3 октября, 2012 Опубликовано 3 октября, 2012 · Жалоба для чего вообще тогда нужна директива signed - не ясно Когда Вы суммируете или вычитаете, а результат той же разрядности, обычно анализируют перенос (unsigned) или переполнение (signed). Обычно размножают разрядность. А Вы все отдали на откуп синтезатору. Методом тыка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться