基于FPGA用Verilog实现的32位除法器DSP

32位无符号数除法器

    /*
	    32位除法器代码
	*/
    module div32(
        input    clk,
		input    rst_n,
		
        input    start,
        input    [31:0] a, 
        input    [31:0] b,
		
        output    done,
        output    [31:0] yshang,
        output    [31:0] yyushu
        ); 
		
    reg    [63:0] temp_a;
    reg    [63:0] temp_b;
    reg    [5:0] i;
    reg    done_r;
//------------------------------------------------
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) 
		    i <= 6'd0;
		else if(start && i < 6'd33) 
		    i <= i+1'b1; 
        else 
		    i <= 6'd0;
    end
//------------------------------------------------
    always@(posedge clk or negedge rst_n)
        if(!rst_n) 
		    done_r <= 1'b0;
        else if(i == 6'd32) 
		    done_r <= 1'b1;        
        else if(i == 6'd33) 
		    done_r <= 1'b0;        
    assign done = done_r;
//------------------------------------------------
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) begin
            temp_a <= 64'h0;
            temp_b <= 64'h0;
        end
		
        else if(start) begin
            if(i == 6'd0) begin
                temp_a = {32'h00000000,a};
                temp_b = {b,32'h00000000}; 
            end
            
			else begin
                temp_a = temp_a << 1;
                if(temp_a >= temp_b) 
			        temp_a = temp_a - temp_b + 1'b1;
                else 
			        temp_a = temp_a;
            end
        end
		
    end
 
    assign    yshang = temp_a[31: 0];
    assign    yyushu = temp_a[63:32];
    
	endmodule
    仿真testbench
    `timescale 1ns/1ns 

    module  div32_tb;

    parameter CLK_PERIOD=20;

    reg    clk;
    reg    rst_n;
    reg    start;
    reg    [31:0]a;
    reg    [31:0]b;

    initial
    begin
        clk=1'b0;
    	forever begin
    	  clk=#(CLK_PERIOD/2) ~clk;
    	end
    end 

    initial
    begin
        rst_n=1'b0;
    	#200 rst_n=1'b1;
    	#10000 $stop;
    end


    initial begin
        start = 1'b0;
    	#1000  start = 1'b1;
    end

    initial begin 
        a = 32'd0;
    	#1000    a=32'd1000;
    end 

    initial begin 
        b = 32'd0;
    	#1000    b=32'd145;
    end 

    div32    div32_inst(
        .clk(clk),
		.rst_n(rst_n),
        .start(start),
        .a(a), 
        .b(b),
        
		.done(),
        .yshang(),
        .yyushu()
    );

    endmodule

当输出
当done信号拉高时,表述输出有效,得到的商为6,余数为130

猜你喜欢

转载自blog.csdn.net/jiyishizhe/article/details/105787472
今日推荐