上次看了一下關(guān)于乘法器的Verilog代碼,有幾個(gè)地方一直很迷惑,相信很多初學(xué)者看這段代碼一定跟我當(dāng)初一樣,看得一頭霧水,在網(wǎng)上也有一些網(wǎng)友提問,說這段代碼不好理解,今天小墨同學(xué)就和大家一起來看一下這段代碼,我會(huì)親自在草稿紙上演算,盡量把過程寫的詳細(xì)些,讓更多的人了解乘法器的設(shè)計(jì)思路。 下面是一段16位乘法器的代碼,大家可以先瀏覽一下,之后我再做詳細(xì)解釋 module mux16( clk,rst_n, start,ain,bin,yout,done ); input clk; //芯片的時(shí)鐘信號(hào)。 input rst_n; //低電平復(fù)位、清零信號(hào)。定義為0表示芯片復(fù)位;定義為1表示復(fù)位信號(hào)無效。 input start; //芯片使能信號(hào)。定義為0表示信號(hào)無效;定義為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; //芯片輸出標(biāo)志信號(hào)。定義為1表示乘法運(yùn)算完成. 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] 以上部分是最主要的計(jì)算部分,其他地方相對(duì)來說還比較簡單,例如當(dāng)乘數(shù)某一位為0時(shí),不用累加,直接右移,當(dāng)i計(jì)數(shù)到16時(shí),此時(shí)就不用再移位了,可以直接用位數(shù)表示,直接累加即可。 下面是仿真圖 |