2014年6月11日 星期三

陣列式乘法器 (Array Structure Multiplier)----適用於DE2-70 的程式

源自於 http://cad6.csie.fju.edu.tw/de101/slides/Array-Multiplier-part.pdf

源自於http://140.134.131.145/upload/paper_uni/952pdf/VHDL%E5%AF%A6%E4%BD%9C%E4%B9%98%E6%B3%95%E5%99%A8%E6%9E%B6%E6%A7%8B%E4%B9%8B%E7%A0%94%E7%A9%B6%E8%88%87%E6%AF%94%E8%BC%83.pdf

陣列式乘法器 (Array Structure Multiplier)使用 AND gate 和 full adder來完成,這種架構的優點在於因為它非常有規劃性,所以相當適合做為佈局(Layout)結構,也相當容易管線化(Pipeline) 

陣列式乘法器的概念,其實就和我們小時候學的直式乘法乘法很類似,被乘數(multiplicand)和乘數(multiplier)相乘,得到部分乘積(partial product),然後再把所有的部分乘積給加起來,產生最後的乘積(product)。以下圖為例: 

若換成代數的形式則如下圖:


4bit 乘 4bit 乘法之部分乘積與乘積 





陣列式乘法器的基本架構就如圖 3-3 所示,我們用 AND gate 來產生部分乘積,再把部分乘積的部分做相加來產生結果,而在加法上考慮到了進位的關係,
所以我們用全加器(full adder)來做相加的動作。 




而圖 3-4 為陣列式乘法器之電路架構,圖中較粗的線段為最長延遲路徑,雖然它的速度比反覆式乘法器的速度還要來的快,但是,隨著被乘數和乘數的位元數增加,這種架構下乘法器的延遲時間還有它所佔用的面積會呈線性成長。 












//4 x 4 multiplier
module CSA_method(  //適用於DE2-70 的程式
 input [17:0]SW,
 input [3:0] KEY,
 input  CLOCK_50,

 output [17:0] LEDR,
 output [7:0] LEDG,
 output [6:0] HEX0,
 output [6:0] HEX1,
 output [6:0] HEX2,
 output [6:0] HEX3,
 output [6:0] HEX4,
 output [6:0] HEX5,
 output [6:0] HEX6,
 output [6:0] HEX7
 );

assign HEX0=7'b111_1111;  //off 7-segment Display
assign HEX1=7'b111_1111;
assign HEX2=7'b111_1111;
assign HEX3=7'b111_1111;
assign HEX4=7'b111_1111;
assign HEX5=7'b111_1111;
assign HEX6=7'b111_1111;
assign HEX7=7'b111_1111;

//Array_mul(M,Q,P);
Array_mul(SW[7:4],SW[3:0],LEDR[7:0]);

endmodule



module Array_mul(M,Q,P);   //4bit (M) X 4bit(Q)  = Product
input [3:0] M,Q;  
output [7:0] P;

wire [4:1] Topcout;  //Internal Wires for the Top Row
wire [4:1] Midcout;  //Internal Wires for the Middle Row
wire [4:1] Botcout;  //Internal Wires for the Bottom Row
wire [3:0]PP1,PP2,PP3 ; //Partial Products

//Top Row
// module Top_Module(m1,m0,q1,q0,cin,sum,cout);

Top_Module t0( M[1],M[0],Q[1],Q[0],1'b0,PP1[0],Topcout[1]);
Top_Module t1( M[2],M[1],Q[1],Q[0],Topcout[1],PP1[1],Topcout[2]);
Top_Module t2( M[3],M[2],Q[1],Q[0],Topcout[2],PP1[2],Topcout[3]);
Top_Module t3( 1'b0,M[3],Q[1],Q[0],Topcout[3],PP1[3],Topcout[4]);

//Middle Row
//Bottom_Module(pp,m,q,cin,sum,cout);
Bottom_Module m0(PP1[1],M[0],Q[2],1'b0,PP2[0],Midcout[1]);
Bottom_Module m1(PP1[2],M[1],Q[2],Midcout[1],PP2[1],Midcout[2]);
Bottom_Module m2(PP1[3],M[2],Q[2],Midcout[2],PP2[2],Midcout[3]);
Bottom_Module m3(Topcout[4],M[3],Q[2],Midcout[3],PP2[3],Midcout[4]);


//Bottom Row
//Bottom_Module(pp,m,q,cin,sum,cout);
Bottom_Module b0(PP2[1],M[0],Q[3],1'b0,PP3[0],Botcout[1]);
Bottom_Module b1(PP2[2],M[1],Q[3],Botcout[1],PP3[1],Botcout[2]);
Bottom_Module b2(PP2[3],M[2],Q[3],Botcout[2],PP3[2],Botcout[3]);
Bottom_Module b3(Midcout[4],M[3],Q[3],Botcout[3],PP3[3],Botcout[4]);

assign P[0]=M[0]&Q[0];
assign P[7:1]={Botcout[4],PP3[3],PP3[2],PP3[1],PP3[0],PP2[0],PP1[0]};

endmodule

module Bottom_Module(pp,m,q,cin,sum,cout);
input pp,m,q,cin;
output sum,cout;
wire t;

assign t=m & q ; // and 
assign {cout,sum}=pp+t+cin;  //Full Adder
endmodule


module Top_Module(m1,m0,q1,q0,cin,sum,cout);
input m1,m0,q1,q0,cin;
output sum,cout;
wire p1,p0;

assign p1=m1 & q0 ; // and 
assign p0=m0 & q1 ; // and
assign {cout,sum}=p1+p0+cin;  //Full Adder
endmodule


沒有留言:

張貼留言