国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)字IC經(jīng)典電路(3)——經(jīng)典除法器的實現(xiàn)(除法器簡介及Verilog實現(xiàn))

這篇具有很好參考價值的文章主要介紹了數(shù)字IC經(jīng)典電路(3)——經(jīng)典除法器的實現(xiàn)(除法器簡介及Verilog實現(xiàn))。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

寫在前面的話

除法器是一種用于執(zhí)行除法運算的電路或器件。在數(shù)字電路中,除法器經(jīng)常被用作重要的計算單元,其主要功能是將一個數(shù)除以另一個數(shù)并給出商和余數(shù)。

與加法器和減法器類似,除法器也屬于算術(shù)邏輯單元(ALU)的一種。不同的是,加法器和減法器能夠執(zhí)行加法和減法運算,但不能執(zhí)行除法運算。因此,在數(shù)字電路中,需要引入除法器來執(zhí)行除法運算。

除法器通常由兩個輸入,也就是被除數(shù)和除數(shù),以及兩個輸出,也就是商和余數(shù)。當(dāng)除法器接收到被除數(shù)和除數(shù)時,它會執(zhí)行除法運算并給出商和余數(shù)。除法器可以使用不同的算法和技術(shù)來實現(xiàn),在設(shè)計數(shù)字電路時,需要考慮精度、速度和功耗等因素。

在數(shù)字電路中,除法器的應(yīng)用非常廣泛。除法器可以用于實現(xiàn)浮點數(shù)運算、計算器、編碼器、解碼器、系統(tǒng)控制等多種應(yīng)用。在圖像處理、音頻處理和信號處理等領(lǐng)域,除法器也經(jīng)常被用于執(zhí)行復(fù)雜的算法和數(shù)據(jù)處理任務(wù)。

總之,除法器是數(shù)字電路中不可或缺的一個部分,它可以用于執(zhí)行除法運算并支持多種應(yīng)用。值得注意的是,除法器的設(shè)計需要考慮多方面的因素,尤其是在高性能應(yīng)用中需要考慮速度和精度等方面的要求。

除法器分類

數(shù)字IC設(shè)計中常用的除法器種類有以下幾種:

  1. 二進(jìn)制除法器:輸入為兩個二進(jìn)制數(shù),輸出為商和余數(shù)。常用于計算機(jī)系統(tǒng)中的除法操作。

  2. 非恢復(fù)余數(shù)除法器:輸入為兩個二進(jìn)制數(shù),輸出為商和余數(shù)。與二進(jìn)制除法器相比,非恢復(fù)余數(shù)除法器可實現(xiàn)更高的除法精度。

  3. 恢復(fù)余數(shù)除法器:輸入為兩個二進(jìn)制數(shù),輸出為商和余數(shù)。與非恢復(fù)余數(shù)除法器相比,恢復(fù)余數(shù)除法器可實現(xiàn)更高的精度和速度。

  4. SRT除法器:輸入為兩個二進(jìn)制數(shù),輸出為商和余數(shù)。SRT除法器采用了一種特殊的算法,能夠?qū)崿F(xiàn)高速除法運算。

  5. 模數(shù)N除法器:輸入為兩個二進(jìn)制數(shù)和一個模數(shù)N,輸出為商和余數(shù)。該種除法器常用于數(shù)字信號處理和通信系統(tǒng)中。

  6. 浮點除法器:輸入為兩個浮點數(shù),輸出為商。常用于科學(xué)計算、圖像處理等領(lǐng)域中。

經(jīng)典除法器

8bit并行除法器

并行除法器是一種用于處理數(shù)字除法的電路,可以同時處理多個數(shù)字的除法運算。它可以高效地進(jìn)行除法計算,并且可以加速復(fù)雜數(shù)學(xué)運算。

Verilog代碼:

// -----------------------------------------------------------------------------
// Editor : 0078
// Verdion: v1.0
// Description:  8 bit parallel divider
// -----------------------------------------------------------------------------
module parallel_div(
  input 				       clk 			    , 		//時鐘信號
  input [7:0] 			       dividend 		, 		// 被除數(shù)
  input [7:0] 			       divisor 		    , 		// 除數(shù)
  output reg [7:0] 		       quotient 		, 		// 商
  output wire [7:0] 		   remainder 			    // 余數(shù)
);

reg [7:0] temp_dividend; // 寄存器,存儲被除數(shù)



// 除法操作,使用反復(fù)修正法
always @(posedge clk) begin
  temp_dividend <= {temp_dividend[6:0], dividend[7]}; // 左移后添加被除數(shù)最高位
  if(temp_dividend >= divisor) begin
    temp_dividend <= temp_dividend - divisor;
    quotient <= quotient + 1;
  end else begin
    quotient <= quotient;
  end
end

assign remainder = temp_dividend;

endmodule

Quartus RTL圖
數(shù)字IC經(jīng)典電路(3)——經(jīng)典除法器的實現(xiàn)(除法器簡介及Verilog實現(xiàn))

Quartus Post mapping圖

數(shù)字IC經(jīng)典電路(3)——經(jīng)典除法器的實現(xiàn)(除法器簡介及Verilog實現(xiàn))

8bit無符號二進(jìn)制除法器

無符號二進(jìn)制除法器是一種用于計算二進(jìn)制數(shù)除法運算的電路或程序。它可以將一個無符號二進(jìn)制被除數(shù)除以一個無符號二進(jìn)制除數(shù),得到商和余數(shù)。

原理是基于二進(jìn)制數(shù)的整除的短除法運算。將被除數(shù)和除數(shù)都轉(zhuǎn)換為二進(jìn)制數(shù),然后從高位向低位逐位進(jìn)行除法運算,每次計算都要將被除數(shù)左移一位,在最后一位上填充一個新的二進(jìn)制位。如果被除數(shù)減去除數(shù)結(jié)果為負(fù)數(shù),則余數(shù)為被除數(shù),否則余數(shù)為被除數(shù)減去除數(shù)。除數(shù)和被除數(shù)的二進(jìn)制位數(shù)越多,需要進(jìn)行的除法運算次數(shù)和計算復(fù)雜度就越大。

Verilog代碼:

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// File   : 8bit_div.v
// Verdion: v1.0
// Description: 
// -----------------------------------------------------------------------------
module div_8bit (
  input  				[7:0] 	dividend 		, 	// 被除數(shù)
  input  				[7:0] 	divisor 		, 	// 除數(shù)
  input  						clk 			,   // 時鐘
  input  						reset 			,   // 復(fù)位信號
  output reg 			[7:0]  	quotient 		, 	// 商
  output reg 			[7:0] 	remainder  			// 余數(shù)
);

  reg [7:0]  	quo 	; 	// 定義一個寄存器quo,用于保存商
  reg [15:0]  	buf1 	; 	// 定義一個寄存器buf1,用于暫存除數(shù)和被除數(shù)
  reg [3:0]  	count 	;  	// 定義一個計數(shù)器count,用于計數(shù)和判斷是否完成計算

  always @(posedge clk or posedge reset) begin
    if (reset) begin // 如果收到復(fù)位信號,則重新開始計算
      quo <= 8'b0;
      buf1 <= {dividend, divisor};
      count <= 4'b0000;
    end else begin
      if (count == 4'b0000) begin // 如果是第一步,則將被除數(shù)移至buf的高8位
        buf1[15:8] <= buf1[7:0];
        buf1[7:0] <= divisor; // 將除數(shù)移至buf的低8位
        count <= 4'b0001; // 更新計數(shù)器
      end else begin
        buf1 <= buf1 << 1; // 左移1位,相當(dāng)于乘以2
        if (buf1[15:8] >= buf1[7:0]) begin // 如果buf的高8位大于或等于buf的低8位,則進(jìn)行減法運算
          buf1[15:8] <= buf1[15:8] - buf1[7:0];
          quo[count - 1] <= 1'b1; // 將當(dāng)前位的商設(shè)置為1
        end else begin
          quo[count - 1] <= 1'b0; // 將當(dāng)前位的商設(shè)置為0
        end
        count <= count + 1; // 更新計數(shù)器
        if (count == 4'b1000) begin // 如果計算完成,則將quo和buf的高8位從buf中取出,分別輸出作為商和余數(shù)
          quotient <= quo;
          remainder <= buf1[15:8];
        end
      end
    end
  end

endmodule

Quartus RTL圖

數(shù)字IC經(jīng)典電路(3)——經(jīng)典除法器的實現(xiàn)(除法器簡介及Verilog實現(xiàn))

Quartus Post mapping圖
數(shù)字IC經(jīng)典電路(3)——經(jīng)典除法器的實現(xiàn)(除法器簡介及Verilog實現(xiàn))

非恢復(fù)余數(shù)除法器

非恢復(fù)除法器(non-restoring division)是一種計算除法的電路,其原理是在每一次迭代中,被除數(shù)與當(dāng)前的余數(shù)進(jìn)行比較,根據(jù)比較結(jié)果決定余數(shù)的調(diào)整,并根據(jù)調(diào)整后的余數(shù)和商位的值計算下一位的商。非恢復(fù)除法器的主要思想是通過減少余數(shù)的調(diào)整次數(shù)以提高計算速度和效率。

在數(shù)字電路中,非恢復(fù)除法器常常用于高性能計算機(jī)的算術(shù)單元中,用于執(zhí)行除法運算。與恢復(fù)除法器相比,非恢復(fù)除法器的計算速度更快,且設(shè)計更簡單,適合在需要高性能計算的場合中使用。

以32位二進(jìn)制數(shù)除以16位二進(jìn)制數(shù)為例,非恢復(fù)除法器的計算流程如下:

  1. 對于N位的被除數(shù)和M位的除數(shù),將被除數(shù)放在N位的寄存器中,商放在另一N位的寄存器中,并將余數(shù)置為零。

  2. 從高位到低位,將每一位的被除數(shù)和余數(shù)相減,將結(jié)果存入寄存器中,并根據(jù)比較結(jié)果選擇下一步操作。如果結(jié)果大于或等于零,說明當(dāng)前商位應(yīng)為1,將商位設(shè)置為1;否則,說明當(dāng)前商位應(yīng)為0,將商位設(shè)置為0。

  3. 根據(jù)商位的值,將當(dāng)前余數(shù)調(diào)整為被除數(shù)-除數(shù)或者為余數(shù)本身。如果當(dāng)前余數(shù)已經(jīng)小于或等于除數(shù),則無需調(diào)整余數(shù)。

  4. 重復(fù)步驟2和3,直到計算出所有的商位。

非恢復(fù)除法器是一種高效的計算除法的電路,常用于高性能計算環(huán)境中。

Verilog代碼:

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// -----------------------------------------------------------------------------
// Author : HFUT90S  1320343336@qq.com
// File   : non_restoring_div.v
// Create : 2023-03-22 13:36:45
// Revise : 2023-03-22 13:36:45
// Editor : 0078
// Verdion: v1.0
// Description: non-restoring divider
// --------------------------------- --------------------------------------------
module non_restoring_div (
  input                   clk       ,   // 時鐘信號
  input         [7:0]     dividend  ,   // 被除數(shù),8位
  input         [7:0]     divisor   ,   // 除數(shù),8位
  output wire   [7:0]     quotient  ,   // 商,8位
  output wire   [7:0]     remainder     // 余數(shù),8位
);

  reg [7:0] count; // 計數(shù)器,8位
  reg [7:0] temp_dividend; // 被除數(shù)臨時變量,8位
  reg [7:0] temp_quotient; // 商臨時變量,8位

  always @(posedge clk) begin
    if (count == 8'd0) begin // 初始條件,8次循環(huán)結(jié)束后跳出循環(huán)
      temp_dividend <= dividend; // 初始化,被除數(shù)先保存到臨時變量中
      count <= 8'd1; // 計數(shù)器初始化為1
    end else begin
      count <= count + 8'd1; // 每次循環(huán)計數(shù)器加1
      if (temp_dividend >= divisor) begin // 如果被除數(shù)大于等于除數(shù),則減去除數(shù),商加1
        temp_dividend <= temp_dividend - divisor;
        temp_quotient <= temp_quotient + 8'd1;
      end else begin // 如果被除數(shù)小于除數(shù),則商不變
        temp_quotient <= temp_quotient + 8'd0;
      end
    end
  end

  assign quotient = temp_quotient; // 將最終的商輸出
  assign remainder = temp_dividend; // 將最終的余數(shù)輸出

endmodule


Quartus RTL圖
數(shù)字IC經(jīng)典電路(3)——經(jīng)典除法器的實現(xiàn)(除法器簡介及Verilog實現(xiàn))

Quartus Post mapping圖

數(shù)字IC經(jīng)典電路(3)——經(jīng)典除法器的實現(xiàn)(除法器簡介及Verilog實現(xiàn))

恢復(fù)余數(shù)除法器

恢復(fù)除法器是一種廣泛應(yīng)用于數(shù)字電路中的除法器,可用于進(jìn)行高速計算。其原理是將被除數(shù)與除數(shù)的具有符號的二進(jìn)制數(shù)先進(jìn)行擴(kuò)展,然后再進(jìn)行除法操作,最終得到商和余數(shù)。

該除法器在數(shù)字電路中的應(yīng)用非常廣泛,可用于高速計算、信號處理、圖像處理等領(lǐng)域。其特點是計算速度快、精度高、可靠性強(qiáng)等,可以大大提高數(shù)字電路的工作效率。

除此之外,恢復(fù)除法器還有一些其他的優(yōu)點,如可以進(jìn)行高精度的帶符號除法計算,還可以支持浮點除法、多項式除法等操作,因此在數(shù)字電路設(shè)計中得到了廣泛的運用。

恢復(fù)除法器是一種功能強(qiáng)大、應(yīng)用廣泛的除法器,其原理簡單而實用,對于數(shù)字電路的高速計算和處理具有重要作用。
Verilog代碼:


// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// -----------------------------------------------------------------------------
// Author : HFUT90S  1320343336@qq.com
// File   : restore_div.v
// Create : 2023-03-22 14:04:49
// Revise : 2023-03-22 14:04:49
// Editor : 0078
// Verdion: v1.0
// Description: 
// -----------------------------------------------------------------------------

module restore_div (
  input   				clk 		,   // 時鐘信號
  input 		[7:0] 	a 			,  	// 被除數(shù)
  input 		[7:0] 	b 			,  	// 除數(shù)
  output reg 	[7:0] 	quotient 	,  	// 商
  output reg 	[7:0] 	remainder   	// 余數(shù)
);

  reg [7:0] count;       // 用于計算商的寄存器
  reg [7:0] partial_dividend;  // 部分商
  wire [15:0] dividend;  // 真正的被除數(shù)
  reg  [7:0] remainder_partial;  // 部分余數(shù)

  // 將被除數(shù) a 左移 8 位,成為真正的被除數(shù) dividend
  assign dividend = {a, 8'b0};

  // 開始執(zhí)行除法運算
  always @(posedge clk) begin
    if (count <= 7) begin
      // 正常情況下,部分余數(shù)應(yīng)該為 0,否則應(yīng)該加上除數(shù) b
      if (remainder_partial >= b) begin
        partial_dividend[count] <= 1;
        remainder_partial <= remainder_partial - b;
      end else begin
        partial_dividend[count] <= 0;
      end
      remainder_partial <= {remainder_partial, dividend[count]} - (b * partial_dividend[count]);
    end

    // 每執(zhí)行 8 次,就得到了一個完整的部分商,放入商的寄存器中
    if ((count == 7) && (remainder_partial >= b)) begin
      partial_dividend[count] <= 1;
      remainder_partial <= remainder_partial - b;
    end
    if (count == 7) begin
      quotient <= partial_dividend;
      remainder <= remainder_partial;
    end

    // 計數(shù)器每次加 1
    count <= count + 1;
  end

endmodule

Quartus RTL圖
數(shù)字IC經(jīng)典電路(3)——經(jīng)典除法器的實現(xiàn)(除法器簡介及Verilog實現(xiàn))

Quartus Post mapping圖

數(shù)字IC經(jīng)典電路(3)——經(jīng)典除法器的實現(xiàn)(除法器簡介及Verilog實現(xiàn))

SRT除法器

SRT除法器是一種高速除法電路,被廣泛應(yīng)用于數(shù)字信號處理(DSP)和計算機(jī)系統(tǒng)中。SRT除法器采用SRT(Sweeney — Robertson — Tocher)算法,它建立在恒定除數(shù)除法的基礎(chǔ)上,可以實現(xiàn)高速的除法運算。

SRT除法器在數(shù)字電路中的應(yīng)用非常廣泛,主要是用于科學(xué)計算和信號處理器設(shè)計。SRT除法器的優(yōu)點是能夠在最短的時間內(nèi)完成除法運算,減少了計算時間和計算硬件的使用。這使得它在大規(guī)模數(shù)字信號處理、圖像處理和音頻處理等領(lǐng)域中擁有廣泛的應(yīng)用。

許多數(shù)字信號處理器(DSP),F(xiàn)PGA和ASIC芯片都使用SRT除法器來實現(xiàn)除法運算。在數(shù)字系統(tǒng)中,SRT除法器可以用于實現(xiàn)IIR數(shù)字濾波器等高級算法。
Verilog代碼:

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// -----------------------------------------------------------------------------
// Author : HFUT90S  1320343336@qq.com
// File   : srt_div.v
// Editor : 0078
// Verdion: v1.0
// Description: srt divider
// -----------------------------------------------------------------------------
module srt_div(
    input     				clk 			,       //時鐘信號
    input  					rstn 			,       //異步復(fù)位信號,復(fù)位時為低電平
    input  		[7:0]  		dividend 		,   	//被除數(shù)
    input 		[7:0] 		divisor 		,    	//除數(shù)
    output reg 	[7:0] 		quotient     			//商
);

reg [7:0] remainder;   //聲明寄存器,記錄余數(shù)
reg [7:0] A;           //聲明寄存器,記錄被除數(shù)
reg [7:0] S;           //聲明寄存器,記錄除數(shù)
reg shift;             //聲明寄存器,記錄是否左移
integer i ;
always @(posedge clk or negedge rstn) begin
    if (~rstn) begin    //異步復(fù)位
        quotient <= 8'b0;
        remainder <= 8'b0;
        A <= dividend;
        S <= divisor;
        shift <= 1'b0;
    end else begin

        // 初始化操作
        if (remainder == 0) begin
            quotient <= 8'b0;
            A <= dividend;
            S <= divisor;
            shift <= 1'b0;
        end else begin
            // 余數(shù)不為0,繼續(xù)之前的操作
            if (A[7] == 1) begin    // 判斷被除數(shù)的符號位是否為1
                A <= {1'b0, A} - S;
                shift <= 1'b1;      // 若為1,則左移操作
            end else begin
                A <= {1'b0,A} + S;
                shift <= 1'b1;      // 若不為1,則右移操作
            end
        end
        
        // 循環(huán)除操作
        for (i=0; i<8; i=i+1) begin
            if (A[7] == 1) begin
                quotient[i] <= 1'b0; // 商的位為0
            end else begin
                quotient[i] <= 1'b1; // 商的位為1
                A <= {1'b0,A} + S;
            end
            // 循環(huán)左移或右移操作
            if (shift == 1'b1) begin
                A <= {1'b0,A} << 1;
            end else begin
                A <= {A[6:0],1'b0};
            end
        end

        // 獲取余數(shù)
        remainder <= A;
    end
end

endmodule

Quartus RTL圖
結(jié)構(gòu)規(guī)整

數(shù)字IC經(jīng)典電路(3)——經(jīng)典除法器的實現(xiàn)(除法器簡介及Verilog實現(xiàn))

Quartus Post mapping圖
數(shù)字IC經(jīng)典電路(3)——經(jīng)典除法器的實現(xiàn)(除法器簡介及Verilog實現(xiàn))

查找表除法器

查找表除法器是一種數(shù)字電路,其可以計算兩個二進(jìn)制數(shù)的商并輸出結(jié)果。其工作原理在于將除數(shù)不斷左移,并比較被除數(shù)與除數(shù)大小關(guān)系,以此來得出商的每一位。查找表除法器的優(yōu)勢在于可以通過預(yù)先生成查找表來加快計算速度,減少邏輯門電路的數(shù)量。

在數(shù)字電路中,查找表除法器廣泛應(yīng)用于硬件實現(xiàn)的數(shù)字信號處理器、圖像處理器等領(lǐng)域。由于其快速計算商的能力,查找表除法器被廣泛用于高速數(shù)據(jù)處理和嵌入式系統(tǒng)中。除此之外,查找表除法器在圖形處理器、計算機(jī)視覺、經(jīng)濟(jì)學(xué)和金融領(lǐng)域中也有著廣泛應(yīng)用。

Verilog代碼:


// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// -----------------------------------------------------------------------------
// Author : HFUT90S  1320343336@qq.com
// File   : lut_div.v
// Create : 2023-03-22 16:01:02
// Revise : 2023-03-22 16:01:02
// Editor : 0078
// Verdion: v1.0
// Description: 
// -----------------------------------------------------------------------------
module lut_div (
  input [7:0] dividend,  // 被除數(shù)
  input [7:0] divisor,   // 除數(shù)
  output reg [7:0] quotient // 商
);

  reg [7:0] remainder   ;   // 余數(shù)
  reg [7:0] lut [7:0]   ; // 儲存查找表的數(shù)組

  initial begin
    // 生成查找表
    lut[0] = 0;
    lut[1] = 128;
    lut[2] = 64;
    lut[3] = 42;
    lut[4] = 32;
    lut[5] = 25;
    lut[6] = 21;
    lut[7] = 18;
  end
integer i ;
  always @(*) begin
    remainder = dividend; // 初始化余數(shù)
    quotient = 0;         // 初始化商

    for ( i = 7; i >= 0; i = i - 1) begin
      // 左移一位,將余數(shù)溢出到商中
      remainder = remainder << 1;
      quotient = quotient << 1;
      remainder[0] = 0;   //清除最低位

      // 使用查找表查找余數(shù)和除數(shù)的差,如果大于等于零則更新余數(shù)和商
      if (remainder >= divisor) begin
        remainder = remainder - divisor;
        quotient[i] = 1;
      end
    end
  end

endmodule

Quartus RTL圖
數(shù)字IC經(jīng)典電路(3)——經(jīng)典除法器的實現(xiàn)(除法器簡介及Verilog實現(xiàn))

Quartus Post mapping圖
數(shù)字IC經(jīng)典電路(3)——經(jīng)典除法器的實現(xiàn)(除法器簡介及Verilog實現(xiàn))

Radix-2除法器

Radix-2除法器是一種廣泛應(yīng)用于數(shù)字電路中的除法器,它的主要特點是利用二進(jìn)制的性質(zhì)來實現(xiàn)高效的除法運算。其工作原理基于二進(jìn)制的長除法算法,通過將被除數(shù)和除數(shù)都表示成二進(jìn)制數(shù),并借助于諸如加法器、移位器等基本電路來實現(xiàn)逐位相除,從而得到商和余數(shù)。

在數(shù)字電路中,Radix-2除法器被廣泛應(yīng)用于各種需要進(jìn)行高速除法運算的場合。例如,在計算機(jī)處理器、數(shù)字信號處理器、通信系統(tǒng)等領(lǐng)域都有廣泛的應(yīng)用。在這些應(yīng)用中,Radix-2除法器通常作為關(guān)鍵的模塊出現(xiàn),以實現(xiàn)高效、快速的除法運算,從而提高整個系統(tǒng)的性能和效率。
Verilog代碼:

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// -----------------------------------------------------------------------------
// Author : HFUT90S  1320343336@qq.com
// File   : radix2_div.v
// Create : 2023-03-22 16:18:45
// Revise : 2023-03-22 16:18:45
// Editor : 0078
// Verdion: v1.0
// Description:  radix-2 divider
// -----------------------------------------------------------------------------
module radix2_div(
    input 			[7:0]  		dividend 	,  		// 被除數(shù),8位無符號
    input 			[7:0]  		divisor 	,   	// 除數(shù),8位無符號
    input						clk 	 	,	 	//時鐘信號
    input                       rst_n       ,       //復(fù)位信號
    output wire 		[7:0] 	quotient 	,  		// 商,8位無符號
    output wire 		[7:0] 	remainder  			// 余數(shù),8位無符號
);

reg [7:0] remainder_reg; // 當(dāng)前余數(shù)
reg [7:0] divisor_reg;   // 當(dāng)前除數(shù)
reg [7:0] quotient_reg;  // 當(dāng)前商
reg [3:0] i;             // 循環(huán)計數(shù)器




// Radix-2除法算法
// 使用了4次迭代來計算出8位商和余數(shù)
always@(posedge  clk or negedge rst_n) begin
    if (!rst_n ) begin// 初始化
            remainder_reg <= dividend;
            divisor_reg <= divisor;
            quotient_reg <= 0;
    end
    else begin
    // 第1次迭代
        if(remainder_reg >= {divisor_reg,4'b0}) begin
            remainder_reg <= remainder_reg - {divisor_reg,4'b0};
            quotient_reg[7] <= 1;
        end
        else begin
            quotient_reg[7] <= 0;
        end
        
        // 第2次迭代
        if(remainder_reg >= {divisor_reg,3'b0,1'b0}) begin
            remainder_reg <= remainder_reg - {divisor_reg,3'b0,1'b0};
            quotient_reg[6] <= 1;
        end
        else begin
            quotient_reg[6] <= 0;
        end
        
        // 第3次迭代
        if(remainder_reg >= {divisor_reg,2'b0,2'b0}) begin
            remainder_reg <= remainder_reg - {divisor_reg,2'b0,2'b0};
            quotient_reg[5] <= 1;
        end
        else begin
            quotient_reg[5] <= 0;
        end
        
        // 第4次迭代
        if(remainder_reg >= {divisor_reg,1'b0,3'b0}) begin
            remainder_reg <= remainder_reg - {divisor_reg,1'b0,3'b0};
            quotient_reg[4] <= 1;
        end
        else begin
            quotient_reg[4] <= 0;
        end
        
        // 將當(dāng)前商和余數(shù)傳遞到下一個時鐘周期
        for(i=0;i<4;i=i+1) begin
            quotient_reg[i] <= quotient_reg[i+4];
        end
    end
end

// 將計算出的商和余數(shù)通過輸出端口輸出
assign quotient = quotient_reg;
assign remainder = remainder_reg;
    
endmodule

Quartus RTL圖
數(shù)字IC經(jīng)典電路(3)——經(jīng)典除法器的實現(xiàn)(除法器簡介及Verilog實現(xiàn))

Quartus Post mapping圖
數(shù)字IC經(jīng)典電路(3)——經(jīng)典除法器的實現(xiàn)(除法器簡介及Verilog實現(xiàn))

陣列除法器

陣列除法器是一種常見的數(shù)字電路,用于在數(shù)字系統(tǒng)中執(zhí)行除法運算。工作原理基于二進(jìn)制位操作和移位運算,該電路將被除數(shù)和除數(shù)作為輸入,并且通過一個連乘和減法的序列,不斷地將結(jié)果左移或右移以進(jìn)行精度控制,最終輸出商和余數(shù)。

在數(shù)字電路中,陣列除法器廣泛應(yīng)用于處理器中的乘除指令,實現(xiàn)高速的運算。除此之外,陣列除法器還可被用于編碼器,電子秤,數(shù)字濾波等電路中,以實現(xiàn)精準(zhǔn)的控制和計算。其高效、穩(wěn)定和可靠。

Verilog代碼:

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// -----------------------------------------------------------------------------
// Author : HFUT90S  1320343336@qq.com
// File   : array_div.v
// Create : 2023-03-22 16:52:24
// Revise : 2023-03-22 16:54:34
// Editor : 0078
// Verdion: v1.0
// Description: 
// -----------------------------------------------------------------------------

//x= 0.x1x2x3x4x5x6
//y=0.y1y2y3
//q=0.q1q2q3
//r=0.00r3r4r5r6
module array_div (
    input         x1    ,
    input         x2    ,
    input         x3    ,
    input         x4    ,
    input         x5    ,
    input         x6    ,
    //-------------------

    input         y1    ,
    input         y2    ,
    input         y3    ,
    //-------------------

    output wire   q1    ,
    output wire   q2    ,
    output wire   q3    ,

    //------------------
    output wire   r3    ,
    output wire   r4    ,
    output wire   r5    ,
    output wire   r6    

);

 //
 wire p11   ;
 wire c11   ;

 wire p12   ;
 wire c12   ;

 wire p13   ;
 wire c13   ;

 wire p14   ;


//
 wire p21   ;
 wire c21   ;

 wire p22   ;
 wire c22   ;

 wire p23   ;
 wire c23   ;

 wire p24   ;
//
 wire p31   ;
 wire c31   ;

 wire p32   ;
 wire c32   ;

 wire p33   ;
 wire c33   ;

 wire p34   ;
//
 wire p41   ;
 wire c41   ;

 wire p42   ;
 wire c42   ;

 wire p43   ;
 wire c43   ;

 wire p44   ;

 //
 wire s11 ;
 wire s12 ;
 wire s13 ;
 wire s14 ;
 //
 wire s21 ;
 wire s22 ;
 wire s23 ;
 wire s24 ;
  //
 wire s31 ;
 wire s32 ;
 wire s33 ;
 wire s34 ;
 //
 wire s41 ;
 wire s42 ;
 wire s43 ;
 wire s44 ;
//
 wire b11 ;
 wire b12 ;
 wire b13 ;
 wire b14 ;
 //
 wire b21 ;
 wire b22 ;
 wire b23 ;
 wire b24 ;
  //
 wire b31 ;
 wire b32 ;
 wire b33 ;
 wire b34 ;
 //
 wire b41 ;
 wire b42 ;
 wire b43 ;
 wire b44 ;
 //
 wire c1;
 wire c2;
 wire c3;

 //inst
  cas inst_cas_11 (
    .Ai           (1'b0     ), 
    .Bi           (1'b0     ), 
    .Ci           (c11      ), 
    .pin          (1'b0     ), 
    .pout         (p11      ), 
    .Bo           (b11      ), 
    .So           (         ), 
    .Cii          (c1       )
    );

  cas inst_cas_12 (
    .Ai           (x1     ), 
    .Bi           (y1     ), 
    .Ci           (c12    ), 
    .pin          (p11    ), 
    .pout         (p12    ), 
    .Bo           (b12    ), 
    .So           (s12    ), 
    .Cii          (c11    )
    );

  cas inst_cas_13 (
    .Ai           (x2       ), 
    .Bi           (y2       ), 
    .Ci           (c13      ), 
    .pin          (p12      ), 
    .pout         (p13      ), 
    .Bo           (b13      ), 
    .So           (s13      ), 
    .Cii          (c12      )
    );



    cas inst_cas_14 (
    .Ai           (x3       ), 
    .Bi           (y3       ), 
    .Ci           (p14      ), 
    .pin          (p13      ), 
    .pout         (p14      ), 
    .Bo           (b14      ), 
    .So           (s14      ), 
    .Cii          (c13      )
    );


//
    cas inst_cas_21 (
    .Ai           (s12    ), 
    .Bi           (b11    ), 
    .Ci           (c21    ), 
    .pin          (c1     ), 
    .pout         (p21    ), 
    .Bo           (b21    ), 
    .So           (s21    ), 
    .Cii          (c2     )
    );

  cas inst_cas_22 (
    .Ai           (s13     ), 
    .Bi           (b12     ), 
    .Ci           (c22     ), 
    .pin          (p21     ), 
    .pout         (p22     ), 
    .Bo           (b22     ), 
    .So           (s22     ), 
    .Cii          (c21     )
    );

  cas inst_cas_23 (
    .Ai           (s14     ), 
    .Bi           (b13     ), 
    .Ci           (c23     ), 
    .pin          (p22     ), 
    .pout         (p23     ), 
    .Bo           (b23     ), 
    .So           (s23     ), 
    .Cii          (c22     )
    );

  cas inst_cas_24 (
    .Ai           (x4     ), 
    .Bi           (b14    ), 
    .Ci           (p24    ), 
    .pin          (p23    ), 
    .pout         (p24    ), 
    .Bo           (b24    ), 
    .So           (s24    ), 
    .Cii          (c23    )
    );

//
  cas inst_cas_31 (
    .Ai           (s22    ), 
    .Bi           (b21    ), 
    .Ci           (c31    ), 
    .pin          (c2     ), 
    .pout         (p31    ), 
    .Bo           (b31    ), 
    .So           (s31    ), 
    .Cii          (c3     )
    );

  cas inst_cas_32 (
    .Ai           (s23    ), 
    .Bi           (b22    ), 
    .Ci           (c32    ), 
    .pin          (p31    ), 
    .pout         (p32    ), 
    .Bo           (b32    ), 
    .So           (s32    ), 
    .Cii          (c31    )
    );


  cas inst_cas_33 (
    .Ai           (s24      ), 
    .Bi           (b23      ), 
    .Ci           (c33      ), 
    .pin          (p32      ), 
    .pout         (p33      ), 
    .Bo           (b33      ), 
    .So           (s33      ), 
    .Cii          (c32      )
    );

  cas inst_cas_34 (
    .Ai           (x5       ), 
    .Bi           (b24      ), 
    .Ci           (p34      ), 
    .pin          (p33      ), 
    .pout         (p34      ), 
    .Bo           (b34      ), 
    .So           (s34      ), 
    .Cii          (c33      )
    );


  //

  cas inst_cas_41 (
    .Ai           (s32    ), 
    .Bi           (b31    ), 
    .Ci           (c41    ), 
    .pin          (c3     ), 
    .pout         (p41    ), 
    .Bo           (       ), 
    .So           (r3     ), 
    .Cii          (q3     )
    );

  cas inst_cas_42 (
    .Ai           (s33    ), 
    .Bi           (b32    ), 
    .Ci           (c42    ), 
    .pin          (p41    ), 
    .pout         (p42    ), 
    .Bo           (       ), 
    .So           (r4     ), 
    .Cii          (c41    )
    );


  cas inst_cas_43 (
    .Ai           (s34    ), 
    .Bi           (b33    ), 
    .Ci           (c43    ), 
    .pin          (p42    ), 
    .pout         (p43    ), 
    .Bo           (       ), 
    .So           (r5     ), 
    .Cii          (c42    )
    );

  cas inst_cas_44 (
    .Ai           (x6     ), 
    .Bi           (b34    ), 
    .Ci           (p44    ), 
    .pin          (p43    ), 
    .pout         (p44    ), 
    .Bo           (       ), 
    .So           (r6     ), 
    .Cii          (c43    )
    );

assign  q1 = c2 ;
assign  q2 = c3 ;
endmodule

其中CAS為可控加法/減法單元,代碼如下:

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// -----------------------------------------------------------------------------
// Author : HFUT90S  1320343336@qq.com
// File   : cas.v
// Create : 2023-03-22 19:32:35
// Revise : 2023-03-22 19:32:35
// Editor : 0078
// Verdion: v1.0
// Description: 
// -----------------------------------------------------------------------------
module cas (
	input 			Ai 			,   // 
	input 			Bi 			,   // 
	input 			Ci 			,   // 
	input 			pin 		, 	// 
	output 	wire	pout 		,	// 
	output 	wire	Bo 			,	// 
	output 	wire	So 			,	// 
	output 	wire	Cii  			// 
);

//Pin = 0 add
//Pin = 1 sub

assign Cii = ((Ai|Ci) & (Bi^pin))|Ai&Ci ;	
assign So  =  Ai ^ (Bi ^ pin) ^ Ci    	;




assign pout = pin  	;
assign Bo 	= Bi 	;

endmodule 

Quartus RTL圖
數(shù)字IC經(jīng)典電路(3)——經(jīng)典除法器的實現(xiàn)(除法器簡介及Verilog實現(xiàn))

Quartus Post mapping圖
數(shù)字IC經(jīng)典電路(3)——經(jīng)典除法器的實現(xiàn)(除法器簡介及Verilog實現(xiàn))

總結(jié)

數(shù)字電路中的除法器主要用于對兩個數(shù)進(jìn)行除法運算,是數(shù)字電路中的一種重要的算術(shù)部件。硬件除法器通常是使用門電路和觸發(fā)器等基本元件組合設(shè)計而成,可以實現(xiàn)基于二進(jìn)制數(shù)值系統(tǒng)的除法運算。通常分為兩類:整除法器和帶余數(shù)除法器。其中整除法器輸出商的整數(shù)部分,而帶余數(shù)除法器可以輸出商的整數(shù)部分和余數(shù)部分。

在數(shù)字電路中,硬件除法器可以廣泛應(yīng)用于各種數(shù)字信號處理系統(tǒng),例如數(shù)字濾波器、圖像處理、通訊系統(tǒng)、計算機(jī)等。此外,對于某些需要高精度計算的應(yīng)用場合,硬件除法器也是不可或缺的。在現(xiàn)代數(shù)字電路設(shè)計中,硬件除法器的性能和精度已經(jīng)得到了很大的提高,同時也已經(jīng)廣泛應(yīng)用于各種數(shù)字信號處理系統(tǒng)中,為數(shù)字信號處理技術(shù)的發(fā)展做出了重要的貢獻(xiàn)。

數(shù)字IC經(jīng)典電路(3)——經(jīng)典除法器的實現(xiàn)(除法器簡介及Verilog實現(xiàn))文章來源地址http://www.zghlxwxcb.cn/news/detail-431466.html

到了這里,關(guān)于數(shù)字IC經(jīng)典電路(3)——經(jīng)典除法器的實現(xiàn)(除法器簡介及Verilog實現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【FPGA】Verilog:二進(jìn)制并行加法器 | 超前進(jìn)位 | 實現(xiàn) 4 位二進(jìn)制并行加法器和減法器 | MSI/LSI 運算電路

    【FPGA】Verilog:二進(jìn)制并行加法器 | 超前進(jìn)位 | 實現(xiàn) 4 位二進(jìn)制并行加法器和減法器 | MSI/LSI 運算電路

    0x00 并行加法器和減法器 如果我們要對 4 位加法器和減法器進(jìn)行關(guān)于二進(jìn)制并行運算功能,可以通過將加法器和減法器以 N 個并行連接的方式,創(chuàng)建一個執(zhí)行 N 位加法和減法運算的電路。 4 位二進(jìn)制并行加法器 4 位二進(jìn)制并行減法器

    2024年02月05日
    瀏覽(23)
  • Verilog快速入門(8)—— 4bit超前進(jìn)位加法器電路

    Verilog快速入門(8)—— 4bit超前進(jìn)位加法器電路

    (1) 四選一多路器 (2)異步復(fù)位的串聯(lián)T觸發(fā)器 (3)奇偶校驗 (4)移位運算與乘法 (5)位拆分與運算 (6)使用子模塊實現(xiàn)三輸入數(shù)的大小比較 (7)4位數(shù)值比較器電路 (8)4bit超前進(jìn)位加法器電路 (9)優(yōu)先編碼器電路① (10)用優(yōu)先編碼器①實現(xiàn)鍵盤編碼電路 (11)8線-3線優(yōu)先編碼器 (12)使用8線-3線

    2024年02月04日
    瀏覽(26)
  • Verilog設(shè)計4位CLA加法器電路,并仿真測試

    Verilog設(shè)計4位CLA加法器電路,并仿真測試

    使用Quartus+modelsim完成本次設(shè)計 對于超前進(jìn)位加法器 (CLA)加法器,它不同于普通加法器。如果對于兩個1024位的數(shù)字進(jìn)行相加,那么普通的串行加法器因為只有算出 C x C_{x} C x ? 才能繼續(xù)計算 C x + 1 C_{x+1} C x + 1 ? ,這會導(dǎo)致整體的效率非常低。如果使用超前進(jìn)位加法器,那

    2024年02月04日
    瀏覽(41)
  • verilog手撕代碼2——各種加法器介紹——真值表、表達(dá)式、電路圖

    verilog手撕代碼2——各種加法器介紹——真值表、表達(dá)式、電路圖

    2023.4.25 兩個數(shù)直接相加,無進(jìn)位,真值表如下 兩個數(shù)和進(jìn)位一起相加,根據(jù)真值表畫出卡諾圖,對表達(dá)式進(jìn)行化簡 用兩個半加器來組成一個全加器 原理 : N bit的加法器由N個1 bit的全加器組成 。從低位開始,逐位相加, 每一bit需要等待前面計算出來得到進(jìn)位,才能進(jìn)行下一

    2024年02月01日
    瀏覽(28)
  • Verilog數(shù)字系統(tǒng)設(shè)計——帶進(jìn)位的8位加法器

    Verilog數(shù)字系統(tǒng)設(shè)計——帶進(jìn)位的8位加法器

    試分別使用門級原語和always 語句設(shè)計帶進(jìn)位的8位加法器,要求編制測試模塊對實現(xiàn)的邏輯功能進(jìn)行完整的測試; 使用門級原語設(shè)計時注意先在草稿上做出該加法器的門級設(shè)計; 如有余力可以進(jìn)一步使用門級原語設(shè)計出帶超前進(jìn)位鏈的8位加法器(期末有加分); 實驗提交

    2024年02月15日
    瀏覽(21)
  • 數(shù)字IC前端學(xué)習(xí)筆記:時鐘切換電路

    數(shù)字IC前端學(xué)習(xí)筆記:時鐘切換電路

    相關(guān)閱讀 數(shù)字IC前端 https://blog.csdn.net/weixin_45791458/category_12173698.html?spm=1001.2014.3001.5482 ????????有些時候我們需要在系統(tǒng)運行時切換系統(tǒng)時鐘,最簡單的方法就是使用一個MUX(數(shù)據(jù)選擇器)選擇輸出的時鐘,如下代碼片所示。但這樣做會導(dǎo)致毛刺的產(chǎn)生,這可能會導(dǎo)致寄存

    2024年02月04日
    瀏覽(20)
  • IC驗證必備的數(shù)字電路基礎(chǔ)知識(三):時序邏輯電路

    IC驗證必備的數(shù)字電路基礎(chǔ)知識(三):時序邏輯電路

    參考教材:數(shù)字電路與邏輯設(shè)計(第2版)鄔春明 目錄 1. 邊沿觸發(fā)器(D觸發(fā)器) 2. 時序電路描述/構(gòu)成 3. 時序邏輯電路的功能描述方法 組合邏輯電路掌管了電路中的邏輯運算,基本單元是與或非門。而時序邏輯電路則掌管了電路中數(shù)據(jù)的存儲。觸發(fā)器就是構(gòu)成時序邏輯電路

    2024年02月09日
    瀏覽(18)
  • 【FPGA】Verilog:模塊化組合邏輯電路設(shè)計 | 半加器 | 全加器 | 串行加法器 | 子模塊 | 主模塊

    【FPGA】Verilog:模塊化組合邏輯電路設(shè)計 | 半加器 | 全加器 | 串行加法器 | 子模塊 | 主模塊

    前言: 本章內(nèi)容主要是演示Vivado下利用Verilog語言進(jìn)行電路設(shè)計、仿真、綜合和下載 示例:加法器 ? ? 功能特性:?采用?Xilinx Artix-7 XC7A35T芯片? 配置方式:USB-JTAG/SPI Flash 高達(dá)100MHz 的內(nèi)部時鐘速度? 存儲器:2Mbit SRAM ??N25Q064A SPI Flash(樣圖舊款為N25Q032A) 通用IO:Switch :

    2024年02月15日
    瀏覽(24)
  • 數(shù)字 IC 設(shè)計職位經(jīng)典筆/面試題(二)

    數(shù)字 IC 設(shè)計職位經(jīng)典筆/面試題(二)

    共100道經(jīng)典筆試、面試題目 (文末可全領(lǐng)) 三種資源:BLOCK RAM,觸發(fā)器(FF),查找表(LUT);注意事項: 1:在生成 RAM 等存儲單元時,應(yīng)該首選 BLOCK RAM 資源; 其原因有二: 第一:使用 BLOCK RAM 等資源,可以節(jié)約更多的 FF 和 4-LUT 等底層可編程單元。使用BLOCK RAM 可以說是

    2024年02月17日
    瀏覽(28)
  • IC面試常考題 Verilog三分頻電路設(shè)計(占空比50%,三分之一,三分之二)

    IC面試??碱} Verilog三分頻電路設(shè)計(占空比50%,三分之一,三分之二)

    實現(xiàn)三分頻電路最簡單的是: 利用計數(shù)器實現(xiàn)。 時序圖分析(本人比較懶,平??蒲忻Γ灾苯邮之嫊r序圖了,懶得用軟件畫了): 直接上圖分析:利用計數(shù)器每隔三個周期信號翻轉(zhuǎn)一次,同時在不同的計數(shù)下翻轉(zhuǎn)得到的同步信號 clk_1和clk_2,再利用異或即可實現(xiàn)出一個

    2024年02月16日
    瀏覽(89)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包