32位除法器的verilog語言實現


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

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM