32位除法器verilog語言實現的原理
對於32位的無符號數除法,被除數a除以除數b,他們的商和余數一定不會超過32位,首先將a轉換成高32位為0,低32位為a的temp_a,再將b轉換成高32位為b,低32位為0的temp_b。在每個周期開始前,先將temp_a左移一位,末尾補0,然后與b相比較看是否大於b,若大於b,則temp_a=temp_a-temp_b+1,否則繼續往下執行。上面的移位操作、比較和減法要執行32次,執行完成后得到的temp_a的高32位為兩數a和b相除的余數,低32位表示商。具體的算法流程可從下圖的例子中得到體現

用verilog代碼實現如下:
module div32( input clk,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,tempa}; temp_b = {tempb,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
