反覆式乘法器(Iterative Structure Multiplier)是最傳統的乘法器架構之一,這種方式就和我們自己在做乘法時一樣,乘數第一個位數乘完被乘數(multiplicand)的每一個位數乘數(multiplier)的第二位和被乘數乘出來的積就往左移一位,把乘數的每個位數都乘以被乘數之後,最後再將每個部份乘積(partial product)加起來,即可得到最後的結果。
反覆式乘法器之原理
反覆式乘法器架構
//8 x 8 multiplier
module Add_Shift_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;
//multiplicat(a,b,result);
multiplicat(SW[15:8],SW[7:0],LEDR[15:0]);
endmodule
module multiplicat(a,b,result);
input [7:0] a;
input [7:0] b;
output [15:0] result;
wire [15:0] a1,a2,a3,a4,a5,a6,a7,a8;
assign a1=(b[0]==1'b1)? {8'b0000_0000,a} : 16'b0000_0000_0000_0000;
assign a2=(b[1]==1'b1)? {7'b0000_000,a,1'b0} : 16'b0000_0000_0000_0000;
assign a3=(b[2]==1'b1)? {6'b0000_00,a,2'b00} : 16'b0000_0000_0000_0000;
assign a4=(b[3]==1'b1)? {5'b0000_0,a,3'b000} : 16'b0000_0000_0000_0000;
assign a5=(b[4]==1'b1)? {4'b0000,a,4'b0000} : 16'b0000_0000_0000_0000;
assign a6=(b[5]==1'b1)? {3'b000,a,5'b0000_0} : 16'b0000_0000_0000_0000;
assign a7=(b[6]==1'b1)? {2'b00,a,6'b0000_00} : 16'b0000_0000_0000_0000;
assign a8=(b[7]==1'b1)? {1'b0,a,7'b0000_000} : 16'b0000_0000_0000_0000;
assign result = a1+a2+a3+a4+a5+a6+a7+a8;
endmodule
沒有留言:
張貼留言