{"id":284199,"date":"2017-03-30T19:00:02","date_gmt":"2017-03-30T15:00:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=284199"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=284199","title":{"rendered":"\u0412\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 FPGA"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/db0\/1e5\/ea3\/db01e5ea384b44e3a946d61a962487b0.png\"\/><br \/>  \u041f\u043e\u043b \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u044f \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u0432 \u0441\u0435\u0442\u0438 <a href=\"https:\/\/www.youtube.com\/watch?v=i7zvnbMZeUs\">\u0432\u043e\u0442 \u043d\u0430 \u044d\u0442\u043e \u0432\u0438\u0434\u0435\u043e<\/a>. <br \/>  \u041f\u0435\u0440\u0432\u043e\u0439 \u043c\u044b\u0441\u043b\u044c\u044e \u0431\u044b\u043b\u043e \u0442\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u0442\u043e \u0438 \u0443 \u043c\u0435\u043d\u044f \u0442\u0430\u043a\u043e\u0435 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c. \u0428\u043b\u043e \u0432\u0440\u0435\u043c\u044f, \u0447\u0438\u0442\u0430\u043b\u0438\u0441\u044c \u0441\u0442\u0430\u0442\u044c\u0438, \u0438\u0437\u0443\u0447\u0430\u043b\u0438\u0441\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u044f \u0438\u0441\u043a\u0430\u043b \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e, \u043d\u043e \u043a \u043c\u043e\u0435\u043c\u0443 \u043e\u0433\u043e\u0440\u0447\u0435\u043d\u0438\u044e, \u0432 \u0441\u0435\u0442\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c. \u041d\u0430\u0442\u043a\u043d\u0443\u0432\u0448\u0438\u0441\u044c \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u043d\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0442\u0440\u0438\u0433\u043e\u043d\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 CORDIC, \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0432\u0440\u0430\u0449\u0430\u043b\u043a\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u041f\u041b\u0418\u0421.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h3>CORDIC<\/h3>\n<p>  \u0418\u0442\u0430\u043a,<b> CORDIC <\/b> \u2014 \u044d\u0442\u043e \u0430\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0442\u0443\u0440\u0430 \u043e\u0442 <b>CO<\/b>ordinate <b>R<\/b>otation <b>D<\/b>Igital <b>C<\/b>omputer.<br \/>  \u042d\u0442\u043e \u043c\u043e\u0449\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0433\u0438\u043f\u0435\u0440\u0431\u043e\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438 \u0442\u0440\u0438\u0433\u043e\u043d\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 CORDIC \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u044f \u0438 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u044b \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0430\u043a \u043d\u0430 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u0442\u0430\u043a \u0438 \u043d\u0430 HDL. \u042f \u043d\u0435 \u0441\u0442\u0430\u043d\u0443 \u0437\u0430\u043e\u0441\u0442\u0440\u044f\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0435 \u043c\u0435\u0442\u043e\u0434\u0430, \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043d\u0438\u043c \u0432 \u0441\u0435\u0442\u0438 \u0438\u043b\u0438 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c \u043d\u0438\u0436\u0435.<\/p>\n<p>  \u0412 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435 \u043c\u043d\u0435 \u043f\u043e\u043f\u0430\u043b\u0430\u0441\u044c <a href=\"https:\/\/github.com\/freecores\/verilog_cordic_core\">\u0432\u043e\u0442 \u044d\u0442\u0430<\/a> \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 CORDIC \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 verilog. \u0414\u0430\u043d\u043d\u043e\u0435 \u044f\u0434\u0440\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 2-\u0445 \u0440\u0435\u0436\u0438\u043c\u0430\u0445: <b>Rotate<\/b> \u0438 <b>Vector<\/b>. \u0414\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0440\u0435\u0436\u0438\u043c Rotate. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 <b>sin<\/b> \u0438 <b>cos<\/b> \u043e\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0433\u043b\u0430 \u0432 \u0440\u0430\u0434\u0438\u0430\u043d\u0430\u0445 \u0438\u043b\u0438 \u0433\u0440\u0430\u0434\u0443\u0441\u0430\u0445. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0442\u044c \u043a\u0430\u043a \u0432 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u043d\u043e\u043c, \u0442\u0430\u043a \u0438 \u0432 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435. \u0414\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440, \u0443 \u043d\u0435\u0433\u043e \u0441\u0430\u043c\u043e\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 <b>Fmax<\/b>. \u041e\u043d \u0432\u044b\u0434\u0430\u0441\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0438\u043d\u0443\u0441\u0430 \u0438 \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u0430 \u0441 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0432 16 \u0442\u0430\u043a\u0442\u043e\u0432.<\/p>\n<p>  \u0412 RTL Viewer-e \u043c\u043e\u0434\u0443\u043b\u044c CORDIC \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u043c \u0438\u0437 16 \u043e\u0434\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/7b8\/ee7\/911\/7b8ee791177f4b4287d56d47d322e0e8.png\"\/><\/p>\n<p>  \u0415\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0438 \u0432\u044b\u0445\u043e\u0434\u0430\u043c\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043a\u043e \u0432\u0445\u043e\u0434\u0430\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u043d \u0442\u0430\u043a:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/c9c\/e14\/e29\/c9ce14e295364f7ab261f54ac4425469.png\"\/><\/p>\n<p>  \u042f\u0434\u0440\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u043a\u0432\u0430\u0434\u0440\u0430\u043d\u0442\u0435, \u0430 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0442\u0440\u0438 \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0441\u0430\u043c\u0438\u043c \u0432\u044b\u0447\u0438\u0442\u0430\u044f pi\/2 \u0438 \u043c\u0435\u043d\u044f\u044f \u0437\u043d\u0430\u043a.<\/p>\n<p>  \u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043c\u043d\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u0442.\u043a. \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0436\u0435\u043b\u0430\u0442\u044c \u043b\u0443\u0447\u0448\u0435\u0433\u043e. \u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043d\u0430-\u043b\u0435\u0442\u0443, \u0431\u0435\u0437 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0437\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0432 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Shear_mapping\"><b>Shear<\/b><\/a>.<\/p>\n<p>  \u041f\u0435\u0440\u0432\u043e\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0435\u0439 \u043d\u0430\u0448\u0435\u0433\u043e \u0432\u0440\u0430\u0449\u0430\u0442\u0435\u043b\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u043b\u043e\u043a \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u043a\u0432\u0430\u0434\u0440\u0430\u043d\u0442\u0430 \u0438 \u0443\u0433\u043b\u0430 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430. \u0423\u0433\u043e\u043b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 \u043a\u0430\u0434\u0440 \u043d\u0430 1 \u0433\u0440\u0430\u0434\u0443\u0441. \u041f\u043e \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044e \u0443\u0433\u043b\u0430 90 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432, \u043a\u0432\u0430\u0434\u0440\u0430\u043d\u0442 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0430 \u0443\u0433\u043e\u043b \u043b\u0438\u0431\u043e \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u043e\u043b\u044c, \u043b\u0438\u0431\u043e \u0434\u0435\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 1 \u0433\u0440\u0430\u0434\u0443\u0441 \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 \u043a\u0430\u0434\u0440.<br \/>  \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u0442\u0430\u043a:<\/p>\n<pre><code>always @(posedge clk) begin     if (!nRst) begin         cordic_angle &lt;= 17'd0;         cordic_quadrant &lt;= 2'd0;         rotator_state &lt;= 2'd0;     end else begin         if (frame_changed) begin             case (rotator_state)             2'd0: begin                 if (cordic_angle[15:8] == 8'd89) begin                     cordic_quadrant &lt;= cordic_quadrant + 1'b1;                     rotator_state &lt;= 2'd1;                 end    else                     cordic_angle[15:8] &lt;= cordic_angle[15:8] + 1'b1;             end             2'd1: begin                 if (cordic_angle[15:8] == 8'd1) begin                     cordic_quadrant &lt;= cordic_quadrant + 1'b1;                     rotator_state &lt;= 2'd0;                 end    else                     cordic_angle[15:8] &lt;= cordic_angle[15:8] - 1'b1;             end             default: rotator_state &lt;= 2'd0;             endcase         end     end     end <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0433\u043b\u0430 \u043f\u043e\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u044c CORDIC, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f sin \u0438 cos.<\/p>\n<pre><code>cordic CORDIC(     .clk(clk),     .rst(~nRst),     .x_i(17'd19896),     .y_i(16'd0),     .theta_i(cordic_angle),     .x_o(COS),     .y_o(SIN),     .theta_o(),     .valid_in(),     .valid_out()     ); <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0440\u0430\u0441\u0447\u0451\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0435:<\/p>\n<p>  x\u2019 = cos(angle) * x \u2014 sin(angle) * y;<br \/>  y\u2019 = sin(angle) * x + cos(angle) * y;<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/baa\/63b\/6db\/baa63b6db1d54dc1bdc772d343b908e8.png\"\/><\/p>\n<p>  \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0451 \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435, \u0442\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441 \u0446\u0435\u043d\u0442\u0440\u043e\u043c \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442. \u0422\u0430\u043a\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043d\u0430\u0441 \u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0432\u0440\u0430\u0449\u0430\u043b\u0430\u0441\u044c \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u0432\u043e\u0435\u0439 \u043e\u0441\u0438 \u0441 \u0446\u0435\u043d\u0442\u0440\u043e\u043c \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0432\u0435\u0441\u0442\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0446\u0435\u043d\u0442\u0440\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<pre><code>parameter PRECISION   = 15; parameter OUTPUT      = 12; parameter INPUT       = 12; parameter OUT_SIZE    = PRECISION + OUTPUT; parameter BUS_MSB     = OUT_SIZE + 2;  wire [15:0] res_x = RES_X - 1'b1; wire [15:0] res_y = RES_Y - 1'b1;  assign    dx = {1'b0, RES_X[11:1]}; assign    dy = {1'b0, RES_Y[11:1]};  always @(posedge clk) begin     delta_x &lt;= dx &lt;&lt; PRECISION;     delta_y &lt;= dy &lt;&lt; PRECISION; \u0435nd <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f cos(angle) * x, sin(angle) * x, cos(angle) * y, sin(angle) * y.<br \/>  \u041c\u043e\u0436\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0438 \u0442\u0430\u043a:  <\/p>\n<pre><code>always @(posedge clk) begin     mult_xcos &lt;= (xi - dx) * COS;     mult_xsin &lt;= (xi - dx) * SIN;     mult_ycos &lt;= (yi - dy) * COS;     mult_ysin &lt;= (yi - dy) * SIN; end <\/code><\/pre>\n<p>  \u041d\u043e \u044f \u0440\u0435\u0448\u0438\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0433\u0430\u0444\u0443\u043d\u043a\u0446\u0438\u0438 <b>lpm_mult<\/b>. \u0418\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 <b>Fmax<\/b>.  <\/p>\n<pre><code>reg signed [BUS_MSB: 0] tmp_x, tmp_y, mult_xsin, mult_xcos, mult_ysin, mult_ycos; reg signed [BUS_MSB: 0] delta_x = 0, delta_y = 0; wire signed [11:0] dx, dy; reg signed [BUS_MSB: 0] mxsin, mxcos, mysin, mycos; reg signed [11:0] ddx, ddy;  always @(posedge clk) begin     ddx &lt;= xi - dx;     ddy &lt;= yi - dy; end  wire signed [BUS_MSB-1: 0] mult_xcos1; wire signed [BUS_MSB-1: 0] mult_xsin1; wire signed [BUS_MSB-1: 0] mult_ycos1; wire signed [BUS_MSB-1: 0] mult_ysin1;  lpm_mult M1(.clock(clk), .dataa(COS), .datab(ddx), .result(mult_xcos1)); defparam M1.lpm_widtha = 17; defparam M1.lpm_widthb = 12; defparam M1.lpm_pipeline = 1; defparam M1.lpm_representation = &quot;SIGNED&quot;;  lpm_mult M2(.clock(clk), .dataa(SIN), .datab(ddx), .result(mult_xsin1)); defparam M2.lpm_widtha = 17; defparam M2.lpm_widthb = 12; defparam M2.lpm_pipeline = 1; defparam M2.lpm_representation = &quot;SIGNED&quot;;  lpm_mult M3(.clock(clk), .dataa(COS), .datab(ddy), .result(mult_ycos1)); defparam M3.lpm_widtha = 17; defparam M3.lpm_widthb = 12; defparam M3.lpm_pipeline = 1; defparam M3.lpm_representation = &quot;SIGNED&quot;;  lpm_mult M4(.clock(clk), .dataa(SIN), .datab(ddy), .result(mult_ysin1)); defparam M4.lpm_widtha = 17; defparam M4.lpm_widthb = 12; defparam M4.lpm_pipeline = 1; defparam M4.lpm_representation = &quot;SIGNED&quot;; <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f, \u0437\u043d\u0430\u043a \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043a\u0432\u0430\u0434\u0440\u0430\u043d\u0442\u0435:  <\/p>\n<pre><code>always @(posedge clk) begin     mxcos &lt;= mult_xcos1;     mxsin &lt;= mult_xsin1;     mycos &lt;= mult_ycos1;     mysin &lt;= mult_ysin1;          case (cordic_quadrant)     2'd0: begin         mxsin &lt;= -mult_xsin1;     end     2'd1: begin         mxcos &lt;= -mult_xcos1;         mxsin &lt;= -mult_xsin1;         mycos &lt;= -mult_ycos1;     end     2'd2: begin         mxcos &lt;= -mult_xcos1;         mysin &lt;= -mult_ysin1;         mycos &lt;= -mult_ycos1;     end     2'd3: begin         mysin &lt;= -mult_ysin1;     end     endcase end <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0435\u043b\u043e \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0437\u0430 \u043c\u0430\u043b\u044b\u043c \u2014 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0441\u0430\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043f\u0438\u043a\u0441\u0435\u043b\u044f:  <\/p>\n<pre><code>\/*              I          II         III       IV            +  +       +  -        -  -      -  -            +  -       +  +        +  -      -  + *\/ always @(posedge clk) begin     tmp_x &lt;= delta_x + mxcos + mysin;     tmp_y &lt;= delta_y + mycos + mxsin; end  wire [15:0] xo = tmp_x[BUS_MSB] ? 12'd0: tmp_x[OUT_SIZE-1:PRECISION]; wire [15:0] yo = tmp_y[BUS_MSB] ? 12'd0: tmp_y[OUT_SIZE-1:PRECISION]; <\/code><\/pre>\n<p>  \u041e\u0442\u0441\u0435\u043a\u0430\u0435\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u0438, \u0432\u044b\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f:  <\/p>\n<pre><code>wire [11:0] xo_t = (xo[11:0] &gt; res_x[11:0]) ? 12'd0 : xo[11:0]; wire [11:0] yo_t = (yo[11:0] &gt; res_y[11:0]) ? 12'd0 : yo[11:0]; <\/code><\/pre>\n<p>  \u0418 \u0435\u0433\u043e \u0430\u0434\u0440\u0435\u0441 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438:  <\/p>\n<pre><code>\/\/addr_out &lt;= yo[11:0] * RES_X + xo[11:0]; <\/code><\/pre>\n<p>  \u0418 \u0441\u043d\u043e\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <b>lpm_mult:<\/b>  <\/p>\n<pre><code>reg [11:0] xo_r, yo_r; always @(posedge clk) begin \txo_r &lt;= xo_t; \tyo_r &lt;= yo_t; end  wire [28:0] result; lpm_mult M5(.clock(clk), .dataa(RES_X[11:0]), .datab(yo_r[11:0]), .result(result)); \tdefparam M5.lpm_widtha = 12; \tdefparam M5.lpm_widthb = 12; \tdefparam M5.lpm_pipeline = 1; \tdefparam M5.lpm_representation = &quot;UNSIGNED&quot;;  always @(posedge clk) addr_out &lt;= result[22:0] + xo_r[11:0]; <\/code><\/pre>\n<p>  \u0412\u043e\u0442, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438 \u0432\u0441\u0451!<\/p>\n<h3>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043c\u0435\u0442\u043e\u0434\u0430<\/h3>\n<p>  \u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u0432\u044b\u0448\u0435, \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0438\u043c\u0435\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432. \u0418\u0437-\u0437\u0430 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u044b\u0440\u044b, \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0443\u0433\u043e\u043b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u044b\u0440. \u042d\u0442\u043e \u0435\u0449\u0451 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438 \u043f\u043e \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043d\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0435\u043c \u0443 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0430. \u042d\u0442\u043e\u0442 \u044d\u0444\u0444\u0435\u043a\u0442 \u0437\u0430\u0432\u0451\u0442\u0441\u044f aliasing \u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0431\u043e\u0440\u044c\u0431\u044b \u0441 \u043d\u0438\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u0435\u0434\u0438\u0430\u043d\u043d\u044b\u0439 \u0444\u0438\u043b\u044c\u0442\u0440, \u0440\u0430\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0439 \u0432 \u043c\u043e\u0435\u0439 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 <a href=\"https:\/\/habrahabr.ru\/post\/324070\/\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a>.<br \/>  \u041f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043a\u0430\u0434\u0440\u043e\u043c \u043d\u0435 \u043c\u0435\u0448\u0430\u043b\u043e \u0431\u044b \u043f\u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u043e\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043a\u0430\u0434\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u043e\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u043e\u0441\u044c \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c \u0444\u043e\u043d\u0435, \u043d\u043e \u044d\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0438 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u043a\u0430\u0434\u0440.<\/p>\n<p>  \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0434\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442.\u043a. \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430-\u043b\u0435\u0442\u0443.<\/p>\n<h3>\u0412\u043e\u0442 \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c<\/h3>\n<p>  <\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0px; width: 100%; height: 0px; position: relative; padding-bottom: 56.2493%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/TLw5JwMIgkM?rel=0&amp;showinfo=1\" frameborder=\"0\" allowfullscreen=\"true\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" style=\"top: 0px; left: 0px; width: 100%; height: 100%; position: absolute;\"><\/iframe><\/div>\n<\/div>\n<\/div>\n<h3>\u0421\u0441\u044b\u043b\u043a\u0438 \u043f\u043e \u0442\u0435\u043c\u0435<\/h3>\n<p>  <a href=\"https:\/\/electronix.ru\/forum\/index.php?act=attach&amp;type=post&amp;id=90724\">CORDIC \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c<\/a><br \/>  <a href=\"http:\/\/bsvi.ru\/uploads\/CORDIC--_10EBA\/cordic.pdf\">CORDIC for dummies<\/a><br \/>  <a href=\"https:\/\/dspguru.com\/dsp\/faqs\/cordic\/\">CORDIC FAQ<\/a><\/p>\n<h3>\u0410\u0440\u0445\u0438\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 \u041a\u0432\u0430\u0440\u0442\u0443\u0441\u0435<\/h3>\n<p>  <a href=\"https:\/\/yadi.sk\/d\/J24nvd7G3GUSkN\">\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u044f\u043d\u0434\u0435\u043a\u0441 \u0434\u0438\u0441\u043a.<\/a><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/325236\/\"> https:\/\/habrahabr.ru\/post\/325236\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/db0\/1e5\/ea3\/db01e5ea384b44e3a946d61a962487b0.png\"\/><br \/>  \u041f\u043e\u043b \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u044f \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u0432 \u0441\u0435\u0442\u0438 <a href=\"https:\/\/www.youtube.com\/watch?v=i7zvnbMZeUs\">\u0432\u043e\u0442 \u043d\u0430 \u044d\u0442\u043e \u0432\u0438\u0434\u0435\u043e<\/a>. <br \/>  \u041f\u0435\u0440\u0432\u043e\u0439 \u043c\u044b\u0441\u043b\u044c\u044e \u0431\u044b\u043b\u043e \u0442\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u0442\u043e \u0438 \u0443 \u043c\u0435\u043d\u044f \u0442\u0430\u043a\u043e\u0435 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c. \u0428\u043b\u043e \u0432\u0440\u0435\u043c\u044f, \u0447\u0438\u0442\u0430\u043b\u0438\u0441\u044c \u0441\u0442\u0430\u0442\u044c\u0438, \u0438\u0437\u0443\u0447\u0430\u043b\u0438\u0441\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u044f \u0438\u0441\u043a\u0430\u043b \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e, \u043d\u043e \u043a \u043c\u043e\u0435\u043c\u0443 \u043e\u0433\u043e\u0440\u0447\u0435\u043d\u0438\u044e, \u0432 \u0441\u0435\u0442\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c. \u041d\u0430\u0442\u043a\u043d\u0443\u0432\u0448\u0438\u0441\u044c \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u043d\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0442\u0440\u0438\u0433\u043e\u043d\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 CORDIC, \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0432\u0440\u0430\u0449\u0430\u043b\u043a\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u041f\u041b\u0418\u0421.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-284199","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/284199","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=284199"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/284199\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=284199"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=284199"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=284199"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}