本文為大家?guī)砭趴畈煌某ㄟ\(yùn)算電路設(shè)計(jì)方案,包括這九款模擬電路設(shè)計(jì)的原理及設(shè)計(jì)過程。
除法運(yùn)算電路設(shè)計(jì)方案一:基于模擬乘法器的除法運(yùn)算電路設(shè)計(jì)
該方案采用模擬乘法器做反饋支路,模擬乘法器有兩個(gè)輸入端,一個(gè)輸出端。對于該除法運(yùn)算電路,必須保證i1=i2,電路引入的才是負(fù)反饋。即當(dāng)UI1》0時(shí),,U0‘《0;而UI1《0時(shí),U0’》0,由于U0與UI1反相,故要求U0’與U0同符號。因此,當(dāng)模擬乘法器的k小于零時(shí),UI2應(yīng)小于零;而k大于零時(shí),UI2應(yīng)大于零;即k與UI2同符號。同理,若乘法模擬器的輸出端通過電阻接集成運(yùn)放的同相輸入端,則為保證電路引入的是負(fù)反饋,UI2與k符號應(yīng)當(dāng)相反。
在上述電路圖中,設(shè)集成運(yùn)放為理想運(yùn)放,則Un=Up=0,為虛地,i1=i2,則
UI1/R1=-Uo/R2=-kUI1UI2/R2
整理上式,得出輸出電壓
Uo=-R2UI1/kR1UI2
令R1=1K,R2=2K
則Uo=-2UI1/kUI2
?
除法運(yùn)算電路設(shè)計(jì)方案二:二輸入的除法電路
設(shè)計(jì)一個(gè)二輸入的除法電路,需要利用對數(shù)和指數(shù)運(yùn)算電路實(shí)現(xiàn)或者用模擬乘法器在集成運(yùn)放反饋通路中的應(yīng)用來實(shí)現(xiàn)。
接通電源后,將電路板的各管腳接好,u11、u12分別接兩個(gè)輸入端。由于有兩個(gè)變量對觀察u0帶來不變,在研究u0的變化趨勢是常常用控制變量法,即u11、u12中的一個(gè)不變,一個(gè)變化引起u0變化并觀察它的變化趨勢。
除法運(yùn)算電路設(shè)計(jì)方案三:基于減法的除法器的算法
對于32的無符號除法,被除數(shù)a除以除數(shù)b,他們的商和余數(shù)一定不會超過32位。首先將a轉(zhuǎn)換成高32位為0,低32位為a的temp_a。把b轉(zhuǎn)換成高32位為b,低32位為0的temp_b。在每個(gè)周期開始時(shí),先將temp_a左移一位,末尾補(bǔ)0,然后與b比較,是否大于b,是則temp_a減去temp_b將且加上1,否則繼續(xù)往下執(zhí)行。上面的移位、比較和減法(視具體情況而定)要執(zhí)行32次,執(zhí)行結(jié)束后temp_a的高32位即為余數(shù),低32位即為商。
verilog HDL代碼
/*
* module:div_rill
* file name:div_rill.v
* syn:yes
* author:network
* modify:rill
* date:2012-09-07
*/
module div_rill
(
input[31:0] a,
input[31:0] b,
output reg [31:0] yshang,
output reg [31:0] yyushu
);
reg[31:0] tempa;
reg[31:0] tempb;
reg[63:0] temp_a;
reg[63:0] temp_b;
integer i;
always @(a or b)
begin
tempa 《= a;
tempb 《= b;
end
always @(tempa or tempb)
begin
temp_a = {32‘h00000000,tempa};
temp_b = {tempb,32’h00000000};
for(i = 0;i 《 32;i = i + 1)
begin
temp_a = {temp_a[62:0],1‘b0};
if(temp_a[63:32] 》= tempb)
temp_a = temp_a - temp_b + 1’b1;
else
temp_a = temp_a;
end
yshang 《= temp_a[31:0];
yyushu 《= temp_a[63:32];
end
endmodule
/*************** EOF ******************/
testbench代碼
[html] view plain copy/*
* module:div_rill_tb
* file name:div_rill_tb.v
* syn:no
* author:rill
* date:2012-09-07
*/
`timescale 1ns/1ns
module div_rill_tb;
reg [31:0] a;
reg [31:0] b;
wire [31:0] yshang;
wire [31:0] yyushu;
initial
begin
#10 a = $random()%10000;
b = $random()%1000;
#100 a = $random()%1000;
b = $random()%100;
#100 a = $random()%100;
b = $random()%10;
#1000 $stop;
end
div_rill DIV_RILL
(
.a (a),
.b (b),
.yshang (yshang),
.yyushu (yyushu)
);
endmodule
/******** EOF ******************/
仿真結(jié)果
評論
查看更多