上次看了一下關(guān)于乘法器的Verilog代碼,有幾個地方一直很迷惑,相信很多初學(xué)者看這段代碼一定跟我當初一樣,看得一頭霧水,在網(wǎng)上也有一些網(wǎng)友提問,說這段代碼不好理解,今天小墨同學(xué)就和大家一起來看一下這段代碼,我會親自在草稿紙上演算,盡量把過程寫的詳細些,讓更多的人了解乘法器的設(shè)計思路。 下面是一段16位乘法器的代碼,大家可以先瀏覽一下,之后我再做詳細解釋 module mux16( clk,rst_n, start,ain,bin,yout,done ); input clk; //芯片的時鐘信號。 input rst_n; //低電平復(fù)位、清零信號。定義為0表示芯片復(fù)位;定義為1表示復(fù)位信號無效。 input start; //芯片使能信號。定義為0表示信號無效;定義為1表示芯片讀入輸入管腳得乘數(shù)和被乘數(shù),并將乘積復(fù)位清零。 input[15:0] ain; //輸入a(被乘數(shù)),其數(shù)據(jù)位寬為16bit. input[15:0] bin; //輸入b(乘數(shù)),其數(shù)據(jù)位寬為16bit. output[31:0] yout; //乘積輸出,其數(shù)據(jù)位寬為32bit. output done; //芯片輸出標志信號。定義為1表示乘法運算完成. reg[15:0] areg; //乘數(shù)a寄存器 reg[15:0] breg; //乘數(shù)b寄存器 reg[31:0] yout_r; //乘積寄存器 reg done_r; reg[4:0] i; //移位次數(shù)寄存器 //------------------------------------------------ //數(shù)據(jù)位控制 always @(posedge clk or negedge rst_n) if(!rst_n) i 5'd0 && i >1; //移位不累加 end else if(i == 5'd16 && areg[15]) yout_r[31:16] 以上部分是最主要的計算部分,其他地方相對來說還比較簡單,例如當乘數(shù)某一位為0時,不用累加,直接右移,當i計數(shù)到16時,此時就不用再移位了,可以直接用位數(shù)表示,直接累加即可。 下面是仿真圖 |