32 位硬件乘法器是一個(gè)并行器件,而不是 CPU 內(nèi)核的一部分。這也就意味著:它在工作時(shí)不會涉及 CPU 的活動。硬件乘法寄存器是可以通過 CPU 匯編指令的讀或著寫進(jìn)行操作。
硬件乘法器特點(diǎn):
○無符號乘法;
○ 有符號乘法;
○ 無符號乘加操作;
○ 由符號乘加操作;
○ 8 位,16 位,24 位,和 32 位操作數(shù);
○ 整數(shù)乘法
○ 小數(shù)乘法
○ 8位和 16 位操作數(shù)與 16 位硬件乘法器兼容;
○ 8位和 24 位在沒有符號位擴(kuò)展的情況下,依然可以進(jìn)行乘法操作;
硬件乘法器結(jié)構(gòu)圖:
硬件乘法器支持 8 位,16 位,24 位,32 位無符號操作數(shù),有符號操作數(shù),無符號乘、加操作和有符號乘、加操作。操作數(shù)的大小,可以通過對"字"或者"字節(jié)"的定義來確定。操作數(shù)的類型可以通過第一個(gè)操作數(shù)的寫入進(jìn)行選擇。
硬件乘法器有兩個(gè) 32 位操作數(shù)寄存器,操作數(shù) OP1 和操作數(shù) OP2,以及一個(gè) 64 位結(jié)果寄存器,而這個(gè)寄存器需要使用 RES0 和 RES3 寄存器。為了兼容 16 X 16 硬件乘法器,8 位或者 16 位操作數(shù)的結(jié)果需要使用 RESL0,RESL1 和 SUMNEXT這三個(gè)寄存器。RESL0 用于存儲 16 X 16 結(jié)果的低“字”,RESL1 用于存儲 16 X 16 結(jié)果的高“字”。以及 SUMEXT 用于存儲結(jié)果的信息。
硬件乘法器操作:
表1總結(jié)了針對各種操作數(shù)可能的結(jié)果的每一個(gè)"字"。此表展示了兩點(diǎn),一個(gè)是 OP2L 的寫入操作,另一個(gè)時(shí) OP2H 的寫入操作。而最糟糕的情況就是實(shí)際結(jié)果的可能性。
8 位或者 16 位操作數(shù)通常在 3 個(gè) MCLK 周期內(nèi)準(zhǔn)備好,并且在寫入 OP2 操作數(shù)后的下一個(gè)指令就可以讀出結(jié)果。 如果使用了間接尋址方式進(jìn)行操作,在結(jié)果計(jì)算出之前,一個(gè) NOP指令是必需的。
在 OP2 操作數(shù),或者 OP2H 進(jìn)入 RES0 時(shí) 24 位或者 32 位的結(jié)果可以通過連續(xù)指令的方式進(jìn)行讀取。當(dāng)時(shí)用間接尋址方式進(jìn)行讀結(jié)果操作時(shí),一條 NOP 指令時(shí)必須的。
由于有一個(gè) 32 位第二個(gè)操作數(shù)的存在,OP2L,OP2H 寄存器都要被使用。又由于兩個(gè) 16 位部分的被使用,從而使得結(jié)果變得復(fù)雜。
操作數(shù)寄存器OP1 :
OP1 操作數(shù)寄存器內(nèi)置 12 個(gè)寄存器,如表所示,這些寄存器通常用來裝載數(shù)據(jù)到乘法器,并且也用來選擇乘法器模式。寫入第一個(gè)操作數(shù)的“低字”到由乘法操作數(shù)類型所確定的地址的乘法操作,才能夠開始操作。當(dāng)寫入一個(gè)雙個(gè)“字”到后綴為:32H 的高字寄存器(此時(shí)假定 OP1 為 32 位寬)。對于寫入 OP2 操作來說,最新的地址寫入的優(yōu)先級通常定義了第一個(gè)操作數(shù)的寬度。例如:如果 MPY32L 被 MPY32H 寫入,則所有的 32 位都將被使用并且 OP1將被設(shè)置為:32 位。如果 MPY32H 被 MPY32L 寫入,則乘法操作將不會使用 MPY32H,并且假設(shè) MPY32L 將數(shù)據(jù)寫入到 16 位寬的 OP1。
在 OP1 操作數(shù)用于連續(xù)的操作時(shí),重復(fù)性乘法操作就可以被執(zhí)行,而此時(shí)無需載入 OP1 操作數(shù)。
操作數(shù)寄存器OP2:
寫入第二個(gè)操作數(shù)到 OP2 寄存器通常會初始化乘法操作。寫入 OP2 將會使得一個(gè) 16 位寬的第二個(gè)操作數(shù)和 OP1 中的值開始進(jìn)行選擇操作。寫入 OP2L 通常會使得一個(gè) 32 位寬的第二個(gè)操作數(shù),和被要求寫入高字的 OP2H 的乘法器開始進(jìn)行操作選擇。
對于 8 位,24 位操作數(shù)寄存器來說,可以通過字節(jié)指令進(jìn)行操作。用一個(gè)字節(jié)指令進(jìn)行的乘法器操作,在單獨(dú)操作期間,乘法器模塊將會自動的有一個(gè)符號字節(jié)的擴(kuò)展。對于 24 位操作數(shù)來說,只有一個(gè)高字將會作為字節(jié)寫入。如果 24 位操作數(shù)通過寄存器被定義了符號位擴(kuò)展,那么作為符號位將會有一個(gè)低字的寫入,因?yàn)榧拇嫫鞫x了操作數(shù)是否有無符號。
一個(gè) 32 位操作數(shù)的高字在保持不變的條件下,當(dāng)改變操作數(shù)的大小至 16 位,可以通過修改操作數(shù)的大小,或者寫入操作數(shù)寄存器來實(shí)現(xiàn)。在 16 位操作執(zhí)行器件,高字的內(nèi)容忽略。
注意:
在乘法操作期間改變第一個(gè)或者第二個(gè)操作數(shù),在默認(rèn)的條件下,在選擇乘法操作時(shí),改變 OP1 或者 OP2,而所得的結(jié)果均不正確,因?yàn)槟菚r(shí)操作數(shù)在正在改變。對 OP2 或者 OP2L 的寫入,將會對任何正在進(jìn)行的計(jì)算操作進(jìn)行放棄;同時(shí),也將開始進(jìn)行一個(gè)新的操作。而此時(shí)沒有計(jì)算出的結(jié)果對接下來的 MAC 和MACS 操作 不再可靠。
注意要避免 MPYDLYWRTEN 位被置 1。所有寫入 MPY32 寄存器的操作通常會由于MPYDLY32=0 而延遲,直到 64 位結(jié)果準(zhǔn)備好或者 MPYDLY32=1,且 32 位結(jié)果算出。
結(jié)果寄存器:
乘法操作結(jié)果通常都是 64 位寬。而這要使用 RES0,RES3 寄存器。使用一個(gè)單操作指令MPYS 或者 MACS,結(jié)果將會有符號位的擴(kuò)展。在 MACS 操作之前如果結(jié)果寄存器載入初始值,用戶的軟件必須仔細(xì)關(guān)注所寫入帶符號位的 64 位值。
備注:
在乘法操作期間改變結(jié)果寄存器的值 在寫入OP2 或者 OP2L 之后,直到初始化操作完成之前,結(jié)果寄存器不可以被用戶軟件修改。
除了 RES0 和 RES3。為了兼容 16 X 16 硬件乘法器,一個(gè) 8 位或者 16 位操作的 32 位結(jié)果通常使用 RESL0 和 RESL1 以及 SUMEXT。在這種情況下,結(jié)果的低位寄存器 RESL0 保存了計(jì)算結(jié)果的低16位,并且結(jié)果保存在寄存器RESH1高16為中。RES0和RES1等同于RESL0和 RESH1。
結(jié)果擴(kuò)展寄存器 SUMEXT 的內(nèi)容依靠乘法操作并且這些操作在表中以列出。如果所有的操作是 16 位寬或者小于 32 位的結(jié)果通常決定符號和 carry。如果操作數(shù)中的一個(gè)比 16 位數(shù)大,則結(jié)果將會是 64 位。
MPYC 位通常反映了乘法器的 Carry,而這也列在表中。因而,將會反映在第 33 位或者第 65 位的結(jié)果中。當(dāng)然,前提是小數(shù)模式,和連續(xù)模式?jīng)]有被選擇.
MACS 下溢出和溢出:
乘法器在 MACS 模式中通常不會自動監(jiān)測下溢出和溢出。例如: 工作于 16 位輸入數(shù)據(jù)和 32 位結(jié)果中,使用 RESL0 和 RESH1,正數(shù)的范圍的可能數(shù)字將在 0 到 07FFF FFFFh,并且負(fù)數(shù)的結(jié)果范圍將在:0FFFF FFFFh 到 08000 0000h。
下溢出出現(xiàn)時(shí)兩個(gè)負(fù)操作數(shù)的相加的計(jì)算結(jié)果范圍在正數(shù)范圍內(nèi)。
當(dāng)兩個(gè)正操作數(shù)相加的結(jié)果為負(fù)數(shù)時(shí),溢出的結(jié)果出現(xiàn)!
SUMEXT 寄存器包含了結(jié)果符號位(在上面的兩種情況下),offffh 通常針對一個(gè) 32 的溢出,0000h 通常針對一個(gè) 32 位的下溢出。在 MPY32CTL0 中 MPYC 位能夠被用來監(jiān)測溢出狀態(tài)。如果 Carry 寄存器不同于 SUMEXT 寄存器內(nèi)容則溢出出現(xiàn)。用戶軟件必須能夠處理這些狀態(tài)。
乘法控制寄存器:
Reserved 位 15-10 保留
MPYDL32 位 9 延時(shí)寫模式
0 寫延時(shí)在 64 位結(jié)果(RES0-RES3)之前是有效的。
1 寫延時(shí)在 32 位結(jié)果(RES0-RES3)之前是有效的。
MPYDLYWRTEN 位 8 延時(shí)寫使能
64 位(MPYDLY32=0)或 32 位(MPYDLY32=1)結(jié)果準(zhǔn)備好之前,所有寫入到任何 MPY32 寄存器的操作會被延遲。
0 寫是不延時(shí)
1 寫是延時(shí)的
MPYOP2_32 位7 乘法器操作數(shù)2的位寬度
0 16位
1 32位
MPYOP1_32 位6 乘法器操作數(shù)1的位寬度
0 16位
1 32位
MPYMx 位5-4 乘法器模式
00 MPY 乘法
01 MPYS 有符號乘法
10 MAC 乘法積累
11 MACS 有符號乘法積累
MPYSA 位3 飽和模式
MPYFRAC 位2 小數(shù)模式
Reserved 位1 保留
MPYC 位0 乘法器的進(jìn)位標(biāo)志如果未選擇小數(shù)模式或飽和模式時(shí)可以被看作是第
33或65位結(jié)果,因?yàn)楫?dāng)切換到小數(shù)模式或飽和模式時(shí)MPYC位不改變。
舉例:
例如 配置 8 * 8 無符號累加硬件乘法
MPY = 0x12; //第一操作數(shù)
OP2 = 0x56; // 第二操作數(shù)
MAC = 0x12; // 16 位累加乘法器
OP2 = 0x56;
原文標(biāo)題:MSP430F5438 硬件乘法器
文章出處:【微信號:changxuemcu,微信公眾號:暢學(xué)單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論