寫在前面的話
除法器是一種用于執(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è)計中常用的除法器種類有以下幾種:
-
二進(jìn)制除法器:輸入為兩個二進(jìn)制數(shù),輸出為商和余數(shù)。常用于計算機(jī)系統(tǒng)中的除法操作。
-
非恢復(fù)余數(shù)除法器:輸入為兩個二進(jìn)制數(shù),輸出為商和余數(shù)。與二進(jìn)制除法器相比,非恢復(fù)余數(shù)除法器可實現(xiàn)更高的除法精度。
-
恢復(fù)余數(shù)除法器:輸入為兩個二進(jìn)制數(shù),輸出為商和余數(shù)。與非恢復(fù)余數(shù)除法器相比,恢復(fù)余數(shù)除法器可實現(xiàn)更高的精度和速度。
-
SRT除法器:輸入為兩個二進(jìn)制數(shù),輸出為商和余數(shù)。SRT除法器采用了一種特殊的算法,能夠?qū)崿F(xiàn)高速除法運算。
-
模數(shù)N除法器:輸入為兩個二進(jìn)制數(shù)和一個模數(shù)N,輸出為商和余數(shù)。該種除法器常用于數(shù)字信號處理和通信系統(tǒng)中。
-
浮點除法器:輸入為兩個浮點數(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圖
Quartus Post mapping圖
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圖
Quartus Post mapping圖
非恢復(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ù)除法器的計算流程如下:
-
對于N位的被除數(shù)和M位的除數(shù),將被除數(shù)放在N位的寄存器中,商放在另一N位的寄存器中,并將余數(shù)置為零。
-
從高位到低位,將每一位的被除數(shù)和余數(shù)相減,將結(jié)果存入寄存器中,并根據(jù)比較結(jié)果選擇下一步操作。如果結(jié)果大于或等于零,說明當(dāng)前商位應(yīng)為1,將商位設(shè)置為1;否則,說明當(dāng)前商位應(yīng)為0,將商位設(shè)置為0。
-
根據(jù)商位的值,將當(dāng)前余數(shù)調(diào)整為被除數(shù)-除數(shù)或者為余數(shù)本身。如果當(dāng)前余數(shù)已經(jīng)小于或等于除數(shù),則無需調(diào)整余數(shù)。
-
重復(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圖
Quartus Post mapping圖
恢復(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圖
Quartus Post mapping圖
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ī)整
Quartus Post mapping圖
查找表除法器
查找表除法器是一種數(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圖
Quartus Post mapping圖
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圖
Quartus Post mapping圖
陣列除法器
陣列除法器是一種常見的數(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圖
Quartus Post mapping圖
總結(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)。文章來源:http://www.zghlxwxcb.cn/news/detail-431466.html
文章來源地址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)!