茹勝華, 馬 亮, 周麗君
(上海無線電設(shè)備研究所,上海200090)
在現(xiàn)代可編程邏輯電路的設(shè)計(jì)中,通常采用具有乘法器單元的FPGA 完成高速、復(fù)雜的信號(hào)處理算法[1],以較高的成本解決數(shù)字信號(hào)處理中大量乘法運(yùn)算。但在對(duì)乘法運(yùn)算和時(shí)序邏輯有需求但不高的場(chǎng)合,若采用FPGA 設(shè)計(jì)乘法器,浪費(fèi)資源,增加產(chǎn)品成本,且難于技術(shù)加密。針對(duì)這種情況,本文采用無乘法器資源的CPLD 完成16位無符號(hào)數(shù)字乘法器的設(shè)計(jì),它以串行、移位方式進(jìn)行數(shù)據(jù)相乘運(yùn)算,特別適合串行通訊。該乘法器運(yùn)算步驟少,算法簡(jiǎn)單,占資源少,可封裝為經(jīng)典模塊,供重復(fù)使用。
無符號(hào)數(shù)字串行乘法可以從6位二進(jìn)制乘法展開推導(dǎo),歸納總結(jié)出n位的二進(jìn)制乘法。
設(shè)有兩個(gè)6位二進(jìn)制A 和B,分別為
那么,A 與B的乘積X 可以表示
X =A×B =x11×211+x10×210+x9×29+x8×28+x7×27+x6×26+x5×25+x4×24+x3×23+x2×22+x1×21+x0×20
其中:
c1~c10為乘積X 的第1位數(shù)(x1)~第10位數(shù)(x10)的進(jìn)位,從x0~x11的表達(dá)式可以總結(jié)出第k位數(shù)的通式xk。
式中:i+j=k,i是乘數(shù)A 的下標(biāo),j是乘數(shù)B 的下標(biāo),k是乘積X 的下標(biāo);0≤i ≤k,0≤j ≤k;0≤i≤n-1,0≤j ≤n-1;0≤k ≤11,即k ≤2n-1,n是乘數(shù)和被乘數(shù)的位數(shù),式中n=6;
從6位的乘法的計(jì)算公式,可以歸納、總結(jié)出兩個(gè)n位二進(jìn)制數(shù)的乘法。假定:兩個(gè)n 位二進(jìn)制數(shù)分別為A(an-1an-2……a2a1a0)和B(bn-1bn-2……b2b1b0),那 么,它 們 的 乘 積X(x2n-1x2n-2x2n-3……x2x1x0)可表示為
式(4)為兩個(gè)n 位無符號(hào)串行二進(jìn)制數(shù)乘法的逐位運(yùn)算規(guī)則,xk是乘積X 第k 位數(shù)的運(yùn)算通式。
依據(jù)式(4),可以將兩個(gè)n 位乘法計(jì)算分為n次完成,每次計(jì)算均按照xk項(xiàng)進(jìn)行計(jì)算,如圖1所示。
圖1 串行二進(jìn)制乘法器算法原理
圖1中,被乘數(shù)與乘數(shù)按照移位時(shí)序送入寄存器,每次移位將對(duì)“被乘數(shù)”、“乘數(shù)”和“進(jìn)位”計(jì)算,形成該位“乘積”和“進(jìn)位”。隨著數(shù)據(jù)的串行進(jìn)入,逐位求積,當(dāng)信號(hào)結(jié)束時(shí),完成乘法運(yùn)算。在每一次計(jì)算完成后,對(duì)乘數(shù)、被乘數(shù)和進(jìn)位寄存器進(jìn)行清零,準(zhǔn)備下一次的乘法運(yùn)算。
根據(jù)上述算法原理,設(shè)計(jì)16位乘法器[2],如圖2所示。
圖2 16位乘法器電路
圖2 中,寄存器B 的Q0~Q15 的輸出為QB0~QB15,寄存器A 的Q0~Q15 的輸出為QA0~QA15,工作可分為以下幾個(gè)階段。
乘法器工作流程如下:
a)乘數(shù)裝訂,按照時(shí)序首先給寄存器B裝訂乘數(shù),從寄存器B的QB0~QB15輸出,可以串行裝訂,也可以并行裝訂;
b)被乘數(shù)寄存器A 清零,即QA0~QA15置“0”,本步驟可與乘數(shù)裝訂同時(shí)進(jìn)行;
c)被乘數(shù)輸入,寄存器A 按序逐位輸入16位串行被乘數(shù);
d)對(duì)寄存器A 依次進(jìn)入的數(shù)據(jù),進(jìn)行逐位計(jì)算,并最終形成乘積。
在相同的時(shí)鐘周期情況下,該乘法器的最快運(yùn)算周期數(shù)為:乘數(shù)加載周期數(shù)、被乘數(shù)位數(shù)、乘數(shù)位數(shù)的總和,即33個(gè)時(shí)鐘周期。
根據(jù)圖2,運(yùn)用原理圖方法完成乘法器設(shè)計(jì)。為驗(yàn)證上述算法的有效性,采用Lattice公司的ispLEVER 軟件進(jìn)行時(shí)序仿真[4],結(jié)果分別如圖3、4所示。
圖3、4中,各信號(hào)意義如下:CLEAN 是進(jìn)位寄存器清零信號(hào),“1”有效;CLOCK A 是寄存器A(被乘數(shù)寄存器)的時(shí)鐘,上升沿有效;CLOCK B是寄存器B(乘數(shù)寄存器)的時(shí)鐘,上升沿有效;CLOCK C 是進(jìn)位寄存器的時(shí)鐘,上升沿有效;CMA 是寄存器A 的串并工作方式控制,“0”為串行狀態(tài),“1”為并行方式;CM B 是寄存器B 的串并工作方式控制,“0”為串行狀態(tài),“1”為并行方式;DATA A 是寄存器A 的串行輸入數(shù)據(jù),先低后高;DATA B 是寄存器B 的串行輸入數(shù)據(jù),先低后高;PDB0~PDB15是寄存器B 的并行輸入數(shù)據(jù),其中PDB0 為最低位,PDB15 為最高位;DOUT 為乘積輸出,先低后高。
圖3對(duì)第一組數(shù)據(jù)輸入進(jìn)行仿真,寄存器B的并行端口D0~D15 輸入并行數(shù)據(jù)(PDB)為1000010101110001;在寄存器A 的Data A 端口依次輸入串行數(shù)據(jù)為0001111000011101(送數(shù)次序?yàn)橄鹊秃蟾撸7抡娼Y(jié)果為32 位數(shù)據(jù)為00001111101100100101101111001101,即為寄存器A、B的乘積,驗(yàn)證了乘法器的有效性。
圖3 第一組16×16位數(shù)乘法器仿真結(jié)果
圖4 第二組16×16位數(shù)乘法器仿真結(jié)果
圖4對(duì)第二組數(shù)據(jù)輸入進(jìn)行仿真,寄存器B輸 入 0001011100100000,寄 存 器 A 輸 入0001111111100000。仿真結(jié)果為32 位數(shù)據(jù)為00000010111000010001110000000000,即為寄存器A、B的乘積,也驗(yàn)證了乘法器的有效性。
仿真結(jié)果達(dá)到預(yù)期效果后,通過CPLD 的硬件平臺(tái),完成軟件的下載,模塊驗(yàn)證結(jié)果與仿真完全一致。目前,該16位乘法器作為模塊使用,經(jīng)過級(jí)連擴(kuò)展成64位串行乘法器,在某產(chǎn)品上穩(wěn)定工作。該乘法器算法的實(shí)現(xiàn),避免了硬件平臺(tái)向FPGA 升級(jí)所造成資源和成本的浪費(fèi)。
采用上述方法設(shè)計(jì)的乘法器所使用的資源與采用的編譯軟件、CPLD 器件類型、編寫代碼(原理圖、VHDL 等)等因素相關(guān)。下面撇開這些干擾因素,對(duì)該乘法器使用的資源進(jìn)行理論推算[3]。
從圖1可以看出,該乘法器由與門、全加器和寄存器構(gòu)成。
兩輸入的與門使用的總數(shù)量應(yīng)等于被乘數(shù)或乘數(shù)的位數(shù),即與門數(shù)=n;
全加器由本位全加器和進(jìn)位全加器構(gòu)成,進(jìn)位全加器又分為十位全加器、千位全加器、萬位全加器、…、l位全加器,l應(yīng)滿足2l≥n,r1為滿足3r1 ≤n的最大整數(shù)。
……
綜上所述,n 位乘法電路所用全加器的總數(shù)Un為:
寄存器分為進(jìn)位寄存器、乘數(shù)寄存器和被乘數(shù)寄存器三類。進(jìn)位寄存器由2p1≥n 決定,即p1≥log2n。乘數(shù)寄存器和被乘數(shù)寄存器各一個(gè)。
綜合上述,乘法器所用總資源如表1所示。
上述計(jì)算分析表明,該乘法器占用較少的資源。
表1 乘法器所用資源匯總
本文針對(duì)不含有內(nèi)置乘法器的CPLD,對(duì)串行乘法器的乘法機(jī)理進(jìn)行詳細(xì)分析后,形成算法設(shè)計(jì)和原理圖設(shè)計(jì),并進(jìn)行時(shí)序仿真和試驗(yàn)驗(yàn)證,最終驗(yàn)證了串行無符號(hào)整數(shù)乘法器設(shè)計(jì)有效。采用該方法設(shè)計(jì)的乘法器占用較少的資源,并具有良好的擴(kuò)展性,能夠擴(kuò)展到任意位數(shù)。在含有內(nèi)置乘法器的FPGA 設(shè)計(jì)中,該設(shè)計(jì)方法可以大大擴(kuò)展乘法器的可用數(shù)量,在實(shí)時(shí)性要求不高的條件下,選擇低容量器件,降低成本,減少硬件資源浪費(fèi)。
上述乘法器通過拓展,可應(yīng)用于其它實(shí)時(shí)性要求不高的場(chǎng)合。比如,增加一個(gè)串行轉(zhuǎn)并行的模塊,就可以實(shí)現(xiàn)并行數(shù)據(jù)的乘法;增加符號(hào)位的異或門,可應(yīng)用于有符號(hào)的運(yùn)算。另外,通過對(duì)浮點(diǎn)數(shù)進(jìn)行整數(shù)化近似后,分別進(jìn)行整數(shù)相乘和指數(shù)相加的運(yùn)算,可將本乘法器應(yīng)用于浮點(diǎn)小數(shù)的近似運(yùn)算,以降低成本和資源。
[1] 王磊磊.基于CZT 的頻率細(xì)化方法的FPGA 實(shí)現(xiàn)[J].制導(dǎo)與引信,2010,31(1):29-32.
[2] 吳靜,李樹榮,等.一種基于RISC 結(jié)構(gòu)單片機(jī)的數(shù)字乘法器的設(shè)計(jì).微電子學(xué),2004,34(5):593-594.
[3] 羅朝杰.數(shù)字邏輯設(shè)計(jì)基礎(chǔ)上冊(cè)[M].北京:人民郵電出版社,1982,(9):223-224.
[4] 高路.基于FPGA 的DSP外部總線接口設(shè)計(jì)[J].制導(dǎo)與引信,2011,32(2):20-23.