[RTLLM-p018] Arithmetic/Other Units/fixed_point_subtractor 的題解


記住 在沒有思路時使用題解,不要從它複製貼上程式碼。請尊重題目和題解的作者。
在真正解決題目之前提交題解的程式碼是可以封禁的罪行。

作者: m1145505

module fixed_point_subtractor #(
    parameter Q = 15,
    parameter N = 32
    )
    (
    input [N-1:0] a,
    input [N-1:0] b,
    output [N-1:0] c
    );

reg [N-1:0] res;

assign c = res;

always @(a,b) begin
    // both negative or both positive
    if(a[N-1] == b[N-1]) begin                  
        res[N-2:0] = a[N-2:0] - b[N-2:0];       
        res[N-1] = a[N-1];                          


        end                                             
    //  one of them is negative
    else if(a[N-1] == 0 && b[N-1] == 1) begin       
        if( a[N-2:0] > b[N-2:0] ) begin                 
            res[N-2:0] = a[N-2:0] + b[N-2:0];           
            res[N-1] = 0;                                       
            end
        else begin                                              
            res[N-2:0] = b[N-2:0] + a[N-2:0];       
            if (res[N-2:0] == 0)
                res[N-1] = 0;                                   
            else
                res[N-1] = 1;                                   
            end
        end
    else begin                                              
        if( a[N-2:0] > b[N-2:0] ) begin                 
            res[N-2:0] = a[N-2:0] + b[N-2:0];           
            if (res[N-2:0] == 0)
                res[N-1] = 0;                                       
            else
                res[N-1] = 1;                                       
            end
        else begin                                              
            res[N-2:0] = b[N-2:0] + a[N-2:0];           
            res[N-1] = 0;                                       
            end
        end
    end
endmodule

評論

目前沒有評論。