搜索
bottom↓
回复: 0

求助:Cordic算法计算反正切,再通过自定义指令整合到nios...

[复制链接]

出0入0汤圆

发表于 2014-6-12 18:12:15 | 显示全部楼层 |阅读模式
`timescale 1ns/1ns
module cordic_arctan(clk, clk_en,reset,done,result,dataa,datab);
        parameter  W = 32, W_Z = 32;
        input                                  clk;
        //input[W-1:0]                x_in;
        //input[W-1:0]                y_in;
        //output reg[W-1:0]   x_out;
        //output reg[W-1:0]   y_out;
        //output reg[W_Z-1:0] z_out;
       
        input                                clk_en;
        input                                reset;
        output reg                                done;
        input [31:0]                        dataa;
        input [31:0]                        datab;
        output reg[31:0]                result;
       
       
        reg [W-1:0]   x[10:0], y[10:0];
        reg [W_Z-1:0] z[10:0];
        always @(posedge clk or posedge reset)
        begin
        if(reset)
                z[0] <= 32'h0;
        else
        begin
                x[0] <= dataa;                                 
                y[0] <= datab;       
                z[0] <= 32'h0;
       
                // 旋转45度
                if(~y[0][W-1]) begin
                        x[1] <= x[0] + y[0];       
                        y[1] <= y[0] - x[0];       
                        z[1] <= z[0] + 32'h20000;
                end
                else begin
                        x[1] <= x[0] - y[0];       
                        y[1] <= y[0] + x[0];       
                        z[1] <= z[0] - 32'h20000;
                end
                // 旋转26.57度
                if(~y[1][W-1])begin
                        x[2] <= x[1] + {{1{y[1][W-1]}}, y[1][W-1:1]};
                        y[2] <= y[1] - {{1{x[1][W-1]}}, x[1][W-1:1]};
                        z[2] <= z[1] + 32'h12e40;
                end
                else begin
                        x[2] <= x[1] - {{1{y[1][W-1]}}, y[1][W-1:1]};
                        y[2] <= y[1] + {{1{x[1][W-1]}}, x[1][W-1:1]};
                        z[2] <= z[1] - 32'h12e40;
                end
                // 旋转14.04度
                if(~y[2][W-1])begin
                        x[3] <= x[2] + {{2{y[2][W-1]}}, y[2][W-1:2]};
                        y[3] <= y[2] - {{2{x[2][W-1]}}, x[2][W-1:2]};
                        z[3] <= z[2] + 32'h09fb4;
                end
                else begin
                        x[3] <= x[2] - {{2{y[2][W-1]}}, y[2][W-1:2]};
                        y[3] <= y[2] + {{2{x[2][W-1]}}, x[2][W-1:2]};
                        z[3] <= z[2] - 32'h09fb4;
                end
                // 旋转7.13度
                if(~y[3][W-1])begin
                        x[4] <= x[3] + {{3{y[3][W-1]}}, y[3][W-1:3]};
                        y[4] <= y[3] - {{3{x[3][W-1]}}, x[3][W-1:3]};
                        z[4] <= z[3] + 32'h05111;
                end
                else begin
                        x[4] <= x[3] - {{3{y[3][W-1]}}, y[3][W-1:3]};
                        y[4] <= y[3] + {{3{x[3][W-1]}}, x[3][W-1:3]};
                        z[4] <= z[3] - 32'h05111;
                end
                // 旋转3.58度
                if(~y[4][W-1])begin
                        x[5] <= x[4] + {{4{y[4][W-1]}}, y[4][W-1:4]};
                        y[5] <= y[4] - {{4{x[4][W-1]}}, x[4][W-1:4]};
                        z[5] <= z[4] + 32'h028b1;
                end
                else begin
                        x[5] <= x[4] - {{4{y[4][W-1]}}, y[4][W-1:4]};
                        y[5] <= y[4] + {{4{x[4][W-1]}}, x[4][W-1:4]};
                        z[5] <= z[4] - 32'h028b1;
                end
                // 旋转1.79度
                if(~y[5][W-1])begin
                        x[6] <= x[5] + {{5{y[5][W-1]}}, y[5][W-1:5]};
                        y[6] <= y[5] - {{5{x[5][W-1]}}, x[5][W-1:5]};
                        z[6] <= z[5] + 32'h0145d;
                end
                else begin
                        x[6] <= x[5] - {{5{y[5][W-1]}}, y[5][W-1:5]};
                        y[6] <= y[5] + {{5{x[5][W-1]}}, x[5][W-1:5]};
                        z[6] <= z[5] - 32'h0145d;
                end
                // 旋转0.90度
                if(~y[6][W-1])begin
                        x[7] <= x[6] + {{6{y[6][W-1]}}, y[6][W-1:6]};
                        y[7] <= y[6] - {{6{x[6][W-1]}},        x[6][W-1:6]};
                        z[7] <= z[6] + 32'h00a2f;
                end
                else begin
                        x[7] <= x[6] - {{6{y[6][W-1]}}, y[6][W-1:6]};
                        y[7] <= y[6] + {{6{x[6][W-1]}}, x[6][W-1:6]};
                        z[7] <= z[6] - 32'h00a2f;
                end
                // 旋转0.45度
                if(~y[7][W-1])begin
                        x[8] <= x[7] + {{7{y[7][W-1]}}, y[7][W-1:7]};
                        y[8] <= y[7] - {{7{x[7][W-1]}}, x[7][W-1:7]};
                        z[8] <= z[7] + 32'h00518;
                end
                else begin
                        x[8] <= x[7] - {{7{y[7][W-1]}}, y[7][W-1:7]};
                        y[8] <= y[7] + {{7{x[7][W-1]}}, x[7][W-1:7]};
                        z[8] <= z[7] - 32'h00518;
                end
                //0.225
                if(~y[8][W-1])begin
                        x[9] <= x[8] + {{8{y[8][W-1]}}, y[8][W-1:8]};
                        y[9] <= y[8] - {{8{x[8][W-1]}}, x[8][W-1:8]};
                        z[9] <= z[8] + 32'h0028c;
                end
                else begin
                        x[9] <= x[8] - {{8{y[8][W-1]}}, y[8][W-1:8]};
                        y[9] <= y[8] + {{8{x[8][W-1]}}, x[8][W-1:8]};
                        z[9] <= z[8] - 32'h0028c;
                end
                //0.1125
                if(~y[9][W-1])begin
                        x[10] <= x[9] + {{9{y[9][W-1]}}, y[9][W-1:9]};
                        y[10] <= y[9] - {{9{x[9][W-1]}}, x[9][W-1:9]};
                        z[10] <= z[9] + 32'h00146;
                        done <= 1;
                end
                else begin
                        x[10] <= x[9] - {{9{y[9][W-1]}}, y[9][W-1:9]};
                        y[10] <= y[9] + {{9{x[9][W-1]}}, x[9][W-1:9]};
                        z[10] <= z[9] - 32'h00146;
                        done <= 1;
                end
                //x_out <= x[10];
                //y_out <= y[10];
                result <= z[10];
        end
        end
endmodule

我遇到的问题是:自定义指令里面的控制信号start,done和clk_en,,,不知道怎样用到我的程序里面,,,求详细解答!!!


阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 03:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表