FPGA有符号减法器


module signed_subtracter(input CLK,RST,
                         input  [12:0] A,B, //input A{1'b,12'b}=A{sign,value}
                                            //input B{1'b,12'b}=B{sign,value}
                         output [12:0] C);  //output C=A-B={sign,value}

reg [12:0] c;

always @(posedge CLK,negedge RST)
    if(!RST)begin 
        c<=13'b0;

    end else begin 
    if(A[12]==0&&B[12]==0)begin  //if(A is positive and B is positive )
        if(A[11:0]>B[11:0]) c<={1'b0,A[11:0]-B[11:0]};
        else c<={1'b1,B[11:0]-A[11:0]};
    end
    if(A[12]==1&&B[12]==0)begin  //if(A is negative and B is positive )
       c<={1'b1,A[11:0]+B[11:0]}; 
    end 
    if(A[12]==0&&B[12]==1)begin  //if(A is positive and B is negative )
       c<={1'b0,A[11:0]+B[11:0]};
    end 
    if(A[12]==1&&B[12]==1)begin //if(A is negative and B is negative )
        if(A[11:0]>B[11:0]) c<={1'b1,A[11:0]-B[11:0]};
        else c<={1'b0,B[11:0]-A[11:0]};
    end 
    end

assign C=c;
endmodule

A,B,C是13位数,其中A [12],B [12],C [12]是符号位,为1表示负数,0表示正数

C=A-B    

例如:若C={1'b1,12'b1000_1000_1000} ,那么C就是负的12‘b1000_1000_1000

            若C={1'b0,12'b1000_1000_1000} ,那么C就是正的12‘b1000_1000_1000

testbench :(这个编程是基于liber soc 11.8的)

`timescale 1ns/100ps

module testbench;

parameter SYSCLK_PERIOD = 100;// 10MHZ

reg SYSCLK;
reg NSYSRESET;

reg[12:0] aa,bb;
reg [3:0] i;
wire [12:0] C;

initial
begin
    SYSCLK = 1'b0;
    NSYSRESET = 1'b0;
end

//////////////////////////////////////////////////////////////////////
// Reset Pulse
//////////////////////////////////////////////////////////////////////
initial
begin
    #(SYSCLK_PERIOD * 10 )
        NSYSRESET = 1'b1;
end


//////////////////////////////////////////////////////////////////////
// Clock Driver
//////////////////////////////////////////////////////////////////////
always @(SYSCLK)
    #(SYSCLK_PERIOD / 2.0) SYSCLK <= !SYSCLK;


//////////////////////////////////////////////////////////////////////
// Instantiate Unit Under Test:  signed_subtracter
//////////////////////////////////////////////////////////////////////
signed_subtracter signed_subtracter_0 (
    // Inputs
    .CLK(SYSCLK),
    .RST(NSYSRESET),
    .A(aa),
    .B(bb),

    // Outputs
    .C( C[12:0])

    // Inouts

);
always @(posedge SYSCLK ,negedge NSYSRESET )
    if(!NSYSRESET)begin
        aa<=13'b0;
        bb<=13'b0;
        i<=3'b0;
    end else begin 
    case(i)
    0:begin aa<=13'b0_0000_1111_1111;bb<=13'b0_0000_0111_1111; i<=i+1'b1; end
    1:begin aa<=13'b0_0000_0111_1111;bb<=13'b0_0000_1111_1111; i<=i+1'b1; end 
    2:begin aa<=13'b1_0000_1111_1111;bb<=13'b0_0000_0111_1111; i<=i+1'b1; end 
    3:begin aa<=13'b1_0000_0111_1111;bb<=13'b0_0000_1111_1111; i<=i+1'b1; end 
    4:begin aa<=13'b0_0000_0111_1111;bb<=13'b1_0000_1111_1111; i<=i+1'b1; end 
    5:begin aa<=13'b0_0000_1111_1111;bb<=13'b1_0000_0111_1111; i<=i+1'b1; end
    6:begin aa<=13'b1_0000_0111_1111;bb<=13'b1_0000_1111_1111; i<=i+1'b1; end 
    7:begin aa<=13'b1_0000_1111_1111;bb<=13'b1_0000_0111_1111; i<=i+1'b1; end

    8:i<=1'b0;
    endcase
    end
endmodule

modelsim 仿真结果

你可能感兴趣的:(FPGA有符号减法器)