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