FPGA有符号加法器

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

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

assign C=c;
endmodule

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

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 [13: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_add
//////////////////////////////////////////////////////////////////////
signed_add signed_add_0 (
    // Inputs
    .CLK(SYSCLK),
    .RST(NSYSRESET),
    .A(aa),
    .B(bb),

    // Outputs
    .C(C)

    // 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有符号加法器)