最近,有好幾個師弟說不知道怎么寫乘法器,在這里就個人的一點理解做一下講解,主要分為乘法器的設計原理和代碼設計,在這里以4bit和4bit的乘積為例進行編寫。
首先,乘法器中最少需要兩個因數,一個乘數一個被乘數,而且需要明白的是乘積的位數是兩個因數的位數和;其次,需要了解乘法就是多個加法的集合。比如,乘數的最后一位乘以被乘數之后,得出一個4bit的結果;之后乘數的次低位與被乘數的乘積也是一個4bit的結果;如果只考慮4bit與2bit數據的乘積的話,那么將次低位向左移一位與最低位乘積相加即可得出結果,這里會有不少網友說這么算下來是5bit的結果呀,為什么說是兩個因數的位數和呢?這是因為要考慮到進位的原因。下面會給出一張圖進行說明。
具體的講解就到此結束,接下來進行代碼編寫:
module MUL4_4
(
input wire clk,
input wire rst_n,
input wire [3:0] a,
input wire [3:0] b,
output reg [7:0] dout
);
reg [7:0] mul0;
reg [7:0] mul1;
reg [7:0] mul2;
reg [7:0] mul3;
always @ (posedge clk or negedge rst_n)begin
if(!rst_n)begin
mul0 <= 8'b0;
mul1 <= 8'b0;
mul2 <= 8'b0;
mul3 <= 8'b0;
doout <= 8'b0;
end
else begin
mul0 <= a[0]?{4'b0,b}:8'b0;
mul1 <= a[1]?{3'b0,b,1'b0}:8'b0;
mul2 <= a[2]?{2'b0,b,2'b0}:8'b0;
mul3 <= a[3]?{1'b0,b,3'b0}:8'b0;
dout <= mul0 + mul1 + mul2 + mul3;
end
end
endmodule