fpga中 + - * / 怎么用位运算表示

2019-07-16 01:29发布

=-*/在FPGA中占用资源太大,怎么通过位运算实现这些,谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
zwl773993221
2019-07-16 15:20
再给你一个除法器:整两个都是整数除法器,你可以用数试一试:
module streamlined_divider_module
(
        input                        CLK,
        input                        RSTn,
       
        input                        Start_Sig,
        input [7:0]        Dividend,
        input [7:0]        Divisor,
       
        output                Done_Sig,
        output [7:0]Quotient,
        output [7:0]Reminder,
       
        /***************************/
        output[15:0]SQ_Diff,
        output[15:0]SQ_Temp
);
        /****************************/
        reg [3:0]        i;
        reg [8:0]        s;
        reg[15:0]        Temp;
        reg[15:0]        Diff;
        reg                        isNeg;
        reg                        isDone;
       
        always @(posedge CLK or negedge RSTn)
                if(!RSTn)
                        begin       
                                i                                <= 4'd0;
                                s                                <= 9'd0;
                                Temp                        <= 16'd0;
                                Diff                        <= 16'd0;
                                isNeg                        <= 1'b0;
                                isDone                <= 1'b0;
                        end
                else if(Start_Sig)
                        begin
                                case(i)
                                        0:
                                                begin
                                                        isNeg        <= Dividend[7]^Divisor[7];
                                                        s                <= Divisor[7]?{1'b1,Divisor}:{1'b1,~Divisor+1'b1};
                                                        Temp        <= Dividend[7]?{8'd0,~Dividend + 1'b1}:{8'd0,Dividend};
                                                        Diff        <= 16'd0;
                                                        i                <= i + 1'b1;
                                                end
                                        1,2,3,4,5,6,7,8:
                                                begin       
                                                        Diff        =        Temp + {s,7'd0};
                                                       
                                                        if(Diff[15])
                                                                Temp<= {Temp[14:0],1'b0};
                                                        else
                                                                Temp<= {Diff[14:0],1'b1};
                                                                i        <= i + 1'b1;
                                                end
                                        9:
                                                begin
                                                        isDone<= 1'b1;
                                                        i                <= i + 1'b1;
                                                end
                                        10:
                                                begin
                                                        isDone<= 1'b0;
                                                        i                <= 2'd0;
                                                end
                                endcase
        /********************************/
        assign        Done_Sig        = isDone;
        assign        Quotient = isNeg ? (~Temp[7:0] + 1'b1) : Temp[7:0];
        assign        Reminder = Temp[15:8];
        /********************************/
       
        assign        SQ_Diff  = Diff;
        assign        SQ_Temp  = Temp;
       
        /*********************************/
       
endmodule

一周热门 更多>