verilog實現無符號數4位陣列乘法器

國防科大計算機原理慕課的實驗練習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

在這裏插入圖片描述

可以看到運算結果是正確的!
至此,我們就用組合邏輯的方法實現了這個四位無符號數的陣列乘法器。


水平有限,如有錯誤歡迎斧正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章