國防科大計算機原理慕課的實驗練習verilog實現
基本原理:
陣列乘法跟我們手算乘法十分地類似,例如:1101*1111,手算過程爲
這裏貼一張來自國防科技大學慕課的一張圖來表示運算,我覺得十分清晰。
在verilog裏面乘對應於一位的與操作,每一行上下之間是用一位全加器來連接的,如圖的FA模塊就是了。x跟y都是輸入的一位數據,Cin是進位輸入,S是運算結果,Cout是輸出進位。
原理圖
陣列乘法器組合邏輯就可以實現,首先要實現的是一位全加器模塊。
verilog實現
module one_full_add(input X1,X2,Cin, output Y,Cout
);
assign {Cout,Y}=X1+X2+Cin;
endmodule
接下來就是多次調用這個全加器模塊,按照電路圖來連接各個模塊。
module multiplier(input [3:0]X1,input [3:0]X2,output [7:0]Y
);
wire [3:0]a1,a2,a3,a4;
assign a1[0]=X1[0]&&X2[0];
assign a1[1]=X1[1]&&X2[0];
assign a1[2]=X1[2]&&X2[0];
assign a1[3]=X1[3]&&X2[0];
assign a2[0]=X1[0]&&X2[1];
assign a2[1]=X1[1]&&X2[1];
assign a2[2]=X1[2]&&X2[1];
assign a2[3]=X1[3]&&X2[1];
assign a3[0]=X1[0]&&X2[2];
assign a3[1]=X1[1]&&X2[2];
assign a3[2]=X1[2]&&X2[2];
assign a3[3]=X1[3]&&X2[2];
assign a4[0]=X1[0]&&X2[3];
assign a4[1]=X1[1]&&X2[3];
assign a4[2]=X1[2]&&X2[3];
assign a4[3]=X1[3]&&X2[3];
wire C11,C12,C13,out11,out12,out13;//第一層要用到的輸出線進位輸出輸入到下一層
one_full_add U0 (.X1(a1[1]),.X2(a2[0]),.Cin(0),.Y(out11),.Cout(C11));
one_full_add U1 (.X1(a1[2]),.X2(a2[1]),.Cin(0),.Y(out12),.Cout(C12));
one_full_add U2 (.X1(a1[3]),.X2(a2[2]),.Cin(0),.Y(out13),.Cout(C13));
wire C21,C22,C23,out21,out22,out23;
one_full_add U3 (.X1(out12),.X2(a3[0]),.Cin(C11),.Y(out21),.Cout(C21));
one_full_add U4 (.X1(out13),.X2(a3[1]),.Cin(C12),.Y(out22),.Cout(C22));
one_full_add U5 (.X1(a2[3]),.X2(a3[2]),.Cin(C13),.Y(out23),.Cout(C23));
wire C31,C32,C33,out31,out32,out33;//第二層要用到的輸出線本層的進位輸出輸入到下一層的進位輸入。
one_full_add U6 (.X1(out22),.X2(a4[0]),.Cin(C21),.Y(out31),.Cout(C31));
one_full_add U7 (.X1(out23),.X2(a4[1]),.Cin(C22),.Y(out32),.Cout(C32));
one_full_add U8 (.X1(a3[3]),.X2(a4[2]),.Cin(C23),.Y(out33),.Cout(C33));
wire C41,C42,C43,out41,out42,out43;//最後一層跟前面的不一樣,進位信號當做本層下一個模塊的一個輸入
one_full_add U9 (.X1(out32),.X2(0),.Cin(C31),.Y(out41),.Cout(C41));
one_full_add U10 (.X1(out33),.X2(C41),.Cin(C32),.Y(out42),.Cout(C42));
one_full_add U11 (.X1(a4[3]),.X2(C42),.Cin(C33),.Y(out43),.Cout(C43));
assign Y[7]=C43;
assign Y[6]=out43;
assign Y[5]=out42;
assign Y[4]=out41;
assign Y[3]=out31;
assign Y[2]=out21;
assign Y[1]=out11;
assign Y[0]=a1[0];
endmodule
驗證
仿真模塊
`timescale 1ns/1ps
module multiplier_bench;
reg [3:0]X1,X2;
wire [7:0]Y;
multiplier U0 (X1,X2,Y);
initial begin
X1=4'b0000;X2=4'b1010;
#1 X1=4'b0010;X2=4'b0010;
#1 X1=4'b1000;X2=4'b1001;
#1 X1=4'b1111;X2=4'b1000;
end
endmodule
可以看到運算結果是正確的!
至此,我們就用組合邏輯的方法實現了這個四位無符號數的陣列乘法器。
水平有限,如有錯誤歡迎斧正。