Maxim DS80C390/DS80C400高速微控制器為最終用戶提供專用的硬件16/32位數(shù)學加速器。訪問數(shù)學加速器是通過使用五個專用的特殊函數(shù)寄存器來完成的。DS16C32/DS80C390可實現(xiàn)80位乘法和400位除法運算。本應用筆記為設計人員提供了有關DS80C390/DS80C400高速微控制器數(shù)學加速特性的有用信息以及各種代碼示例。
概述
8051微控制器市場的性能進步越來越多地促使用戶考慮在曾經(jīng)需要僅從8位設備獲得的處理能力的應用中使用16位器件。毫無疑問,其中一些潛在應用需要涉及16位數(shù)據(jù)的快速數(shù)學運算和計算。DS80C390/DS80C400在兩個層面上滿足了這一需求。這種更快的指令執(zhí)行速度分別為DS10C18和DS75C80產(chǎn)生390MIPS和80.400MIPS的峰值性能。這種更快的指令執(zhí)行速度與40MHz的最大時鐘頻率相結合,可產(chǎn)生10MIPS的峰值性能。對于執(zhí)行密集型 16 位數(shù)學運算的應用程序來說,同樣重要的是包含用于 16/32 位數(shù)學加速的專用硬件。本應用筆記將解釋片上數(shù)學加速器的接口和操作,并舉例說明其使用方法。
訪問數(shù)學加速器硬件
數(shù)學加速器完全通過五個特殊功能寄存器 (SFR) 進行控制。這五個 SFR 如表 1 所示。通過 MA、MB 和 MC 寄存器以逐字節(jié)的方式向/從加速器加載和卸載數(shù)據(jù)。MA 寄存器允許在加速器之間傳輸 32 位數(shù)據(jù)。MB 寄存器允許將 16 位數(shù)據(jù)傳輸?shù)郊铀倨?從加速器傳輸,而 MC 寄存器允許加載/卸載訪問 40 位累加器。40 位累加器在加速器執(zhí)行的每次乘法或除法運算時都會更新,在需要乘法累加或除法累加函數(shù)的應用中證明非常有用。通過任何 MA、MB 或 MC 寄存器將數(shù)據(jù)加載到加速器中時,必須始終首先執(zhí)行最低有效字節(jié),而從加速器卸載數(shù)據(jù)始終首先執(zhí)行最高有效字節(jié)。圖 1 中給出的數(shù)學加速器框圖說明了此 SFR 接口。
圖1.數(shù)學加速器框圖。
SFR (地址) | 位名稱 |
按操作 劃分的加速器使用情況(MUL、DIV16、DIV32、NORM、SHIFT) |
||
操作 | 以前 | 后 | ||
MCNT0 (D1h) | ||||
MCNT0.7 | 低電平有效頻移 | SHIFT | 0 = left, 1 = right | |
MCNT0.6 | CSE | SHIFT | 1 = enables circular shift | |
MCNT0.5 | SCE | SHIFT | 1 = include SBC in shift | |
MCNT0.4-0 | MAS4:0 | SHIFT | Number of shifts to do | |
NORM | 00000b = start NORM | Number of shifts done | ||
MCNT1 (D2h) | ||||
MCNT1.7 | MST | ALL | 繁忙位 | 繁忙位 |
MCNT1.6 | MOF | MUL | 1 = 產(chǎn)品> FFFFh | |
DIV 16/32 | 1 = 除以 0 嘗試 | |||
MCNT1.5 | MOF | SHIFT | 進位 | 進位 |
MCNT1.4 | CLM | ALL | 清除 MA、MB 和 MC | 清除 MA、MB 和 MC |
馬薩諸塞州 (D3h) | MUL | 16-bit multiplicand | 32 位產(chǎn)品 | |
DIV16 | 16-bit dividend | 16 位商 | ||
DIV32 | 32-bit dividend | 32 位商 | ||
NORM | 32-bit data | 32位尾數(shù) | ||
SHIFT | 32-bit data | 32 位移位結果 | ||
MB (D4h) | MUL | 16 位乘法器 | ||
DIV 16/32 | 16 位除數(shù) | 16 位余數(shù) | ||
MC (D5h) |
MUL DIV16 DIV32 |
40 位累加器 | 40 位累加器 |
支持的操作
DS80C390/DS80C400數(shù)學加速器支持四種基本運算:乘法、除法、歸一化和移位。數(shù)學加速器要執(zhí)行的操作由寫入三個寄存器(MA、MB 和 MCNT0)的順序定義。BUSY 位 (MCNT1.7) 指示操作何時開始 (BUSY = 1) 以及操作何時完成 (BUSY = 0)。但是,每個數(shù)學加速器操作都保證在固定數(shù)量的機器周期內(nèi)完成,從而消除了對 BUSY 位輪詢的需要。下表給出了每個加速器操作的硬件執(zhí)行時間。表后介紹了啟動操作所需的每個數(shù)學加速器操作和 SFR 寫入序列。這些信息也可以在DS80C390用戶指南補充指南或高速微控制器用戶指南:網(wǎng)絡微控制器補充中找到。
操作 | 執(zhí)行時間 |
最小執(zhí)行時間 (t中聯(lián)= 25ns;40兆赫) |
乘以 16 位 x 16 位 | 24 tCLCL | 600ns |
除法 32 位/16 位 | 36 tCLCL | 900ns |
除法 16 位/16 位 | 24 | t中聯(lián)600ns |
規(guī)范化 32 位 | 36 | t中聯(lián)900ns |
移位 32 位 | 36 | t中聯(lián)600ns |
乘以 16 位 x 16 位
16 位乘 16 位乘法運算通過將 16 位乘法器寫入 MB 寄存器,然后將 16 位乘法器寫入 MA 寄存器來啟動。每個 16 位字必須首先將最低有效字節(jié)加載到所需的寄存器。加速器硬件在六個機器周期內(nèi)完成乘法運算,產(chǎn)生一個 32 位結果,通過讀取 MA 寄存器,該結果可訪問,最高有效字節(jié)優(yōu)先。需要讀取MA寄存器的四次才能獲得整個產(chǎn)品。乘法運算會自動將乘積與 40 位累加器的先前內(nèi)容累加,如果乘積超過 1FFFFh,則設置 MOF 標志 (MCNT6.0000)。
除 32 位/16 位和除 16 位/16 位
32位除以16位運算是通過將32位分頻寫入MA寄存器,然后將16位除數(shù)寫入MB寄存器來啟動的。16 位除以 16 位操作的啟動方式類似,只是需要向 MA 寄存器寫入 16 位分頻的字節(jié)少兩個。所有 32 位雙字和 16 位字數(shù)據(jù)必須首先將最低有效字節(jié)加載到所需的寄存器。數(shù)學加速器在九個機器周期內(nèi)完成 32/16 除法,在六個機器周期內(nèi)完成 16/16 除法,根據(jù)初始股息的大小生成 32 位或 16 位商。為兩個除法運算生成 16 位余數(shù)。商和余數(shù)可以通過分別讀取MA和MB寄存器來訪問,最高有效字節(jié)優(yōu)先。對于 16/16 分頻,MA 寄存器的兩個讀取將返回 16 位商,而 32/16 分頻需要 MA 的四個讀數(shù)才能獲得完整的 32 位商。先讀取商數(shù)還是余數(shù)并不重要。除法運算會自動累加 40 位累加器的先前內(nèi)容累加商,如果除數(shù)為 1h,則設置 MOF 標志 (MCNT6.0000)。
規(guī)范化 32 位
32 位規(guī)范化操作是通過將 32 位雙字寫入 MA,然后寫入 MAS4:0 來啟動的(MCNT0.4-0) 位 = 00000b。標準化將在九個機器周期內(nèi)完成。此時,可以從MA寄存器讀取左移的32位結果,最高有效字節(jié)優(yōu)先。規(guī)范化 32 位雙字所需的左移次數(shù)將返回到 MAS4:0位。
右移/左移 32 位
32 位移位操作是通過向 MA 寄存器寫入一個 32 位雙字,然后寫入 MAS4:0 來啟動的要執(zhí)行的班次數(shù)的位。位移位可以選擇在右方向或左方向上完成,定義為圓形移位,并且包含或排除進位 (SCB) 位。當不執(zhí)行循環(huán)移位時,在操作過程中將始終移入零位數(shù)據(jù) (0)。下圖詳細介紹了換檔操作的控制。
圖2.換檔操作控制。
40 位累加器
40 位累加器將每個乘法(乘積)或除法(商)的結果添加到其當前 內(nèi)容。整個40位累加器可以加載,最低有效字節(jié)優(yōu)先,五次寫入MC特殊功能寄存器。類似地,可以讀取40位累加器,最高有效字節(jié)優(yōu)先,五次讀取MC特殊功能寄存器。
每個加速器操作的匯編代碼示例
下面是簡單的代碼示例,用于演示每個操作所需的加載/卸載過程,以及突出顯示每個操作中涉及的寄存器和位的圖表。
將 16 位× 16 位相乘
mov mb, #78h ; lsb (5678h) mov mb, #56h ; msb (5678h) mov ma, #34h ; lsb (1234h) mov ma, #12h ; msb (1234h) nop ; mb, mb, ma, ma write sequence => 16-bit * 16-bit nop nop nop nop nop ; 32-bit product ready after 6 machine cycles mov r0, ma ; r0 = 06h (msb) mov r1, ma ; r1 = 26h mov r2, ma ; r2 = 00h mov r3, ma ; r3 = 60h (lsb)
圖3.將 16 位× 16 位示例相乘(1234h × 5678h = 06260060h)。
除法 32 位/16 位
mov ma, #78h ; lsb (56785678h) mov ma, #56h ; lsb+1 (56785678h) mov ma, #78h ; lsb+1 (56785678h) mov ma, #56h ; msb (56785678h) mov mb, #34h ; lsb (1234h) mov mb, #12h ; msb (1234h) nop ; ma, ma, ma, ma, mb, mb write sequence nop ; => 32-bit/16-bit nop nop nop nop nop nop nop ; quotient & remainder ready after 9 machine cycles mov r0, ma ; r0 = 00h (msb quotient) mov r1, ma ; r1 = 04h mov r2, ma ; r2 = c0h mov r3, ma ; r3 = 12h (lsb quotient) mov r6, mb ; r6 = 0eh (msb remainder) mov r7, mb ; r7 = d0h (lsb remainder)
圖4.除以 32 位/16 位示例 (56785678H/1234H = 0004C012H;余數(shù) = 0ED0h)。
除法 16 位/16 位
mov ma, #78h ; lsb (5678h) mov ma, #56h ; msb (5678h) mov mb, #34h ; lsb (1234h) mov mb, #12h ; msb (1234h) nop ; ma, ma, mb, mb write sequence => 16-bit/16-bit nop nop nop nop nop ; quotient & remainder ready after 6 machine cycles mov r4, ma ; r4 = 00h (msb quotient) mov r5, ma ; r5 = 04h (lsb quotient) mov r6, mb ; r6 = 0dh (msb remainder) mov r7, mb ; r7 = a8h (lsb remainder)
圖5.除以 16 位/16 位示例 (5678h/1234h = 0004h;余數(shù) = 0DA8h)。
規(guī)范化 32 位
mov ma, #67h ; lsb (01234567h) mov ma, #45h ; lsb+1 (01234567h) mov ma, #23h ; lsb+1 (01234567h) mov ma, #01h ; msb (01234567h) anl mcnt0, #0e0h ; mas4:0=00000b nop ; ma, ma, ma, ma, mcnt0.4-0=00000b nop ; write sequence => 32-bit normalize nop nop nop nop nop nop nop ; mantissa/exponent ready after 9 machine cycles mov r0, ma ; r0 = 91h (msb mantissa) mov r1, ma ; r1 = a2h mov r2, ma ; r2 = b3h mov r3, ma ; r3 = 80h (lsb mantissa) mov a, mcnt0 anl a, #1fh mov r7, a ; r7 = 07h (#shifts)
圖6.規(guī)范化 32 位示例 (01234567h = 91A2B380h;班次 = 7)。
右移/左移 32 位
orl mcnt1, #20h ; scb=1 mov ma, #80h ; lsb (91a2b380h) mov ma, #0b3h ; lsb+1 (91a2b380h) mov ma, #0a2h ; lsb+1 (91a2b380h) mov ma, #91h ; msb (91a2b380h) mov mcnt0, #0e7h ; lshift\=1, cse=1, sce=1, mas4:0=7h nop ; ma, ma, ma, ma, mcnt0.4-0=00111b nop ; write sequence => 32-bit shift nop ; circular right shift w/scb nop nop nop nop nop nop ; shifted result ready after 9 machine cycles mov r0, ma ; r0 = 03h (msb shifted result) mov r1, ma ; r1 = 23h mov r2, ma ; r2 = 45h mov r3, ma ; r3 = 67h (lsb shifted result)
圖7.移位 32 位示例(01234567h = 91A2B380h;移位 = 7)。
中斷加速器操作
如前所述,數(shù)學加速器硬件完全由寫入和讀取關聯(lián) SFR 的順序控制。每個寄存器讀取或?qū)懭胫赶虿煌奈锢韮?nèi)存位置。為了獲得正確的結果,不違反規(guī)定的命令至關重要。通常,數(shù)學加速器不應被另一個也使用數(shù)學加速器的任務中斷,因為這通常會產(chǎn)生不希望的結果。簡而言之,只有一個數(shù)學加速器能夠一次執(zhí)行一個操作。下面的序列演示了使用可重入數(shù)學加速器代碼時預期的問題類型。
示例問題序列
Write MB (Start of divide 16-bit/16-bit) Write MB --- Interrupt occurs that uses the Accelerator --- Write MB (Start of divide 16-bit/16-bit) Write MB Write MA Write MA --- Wait for completion--- Read MA Read MA Read MA Read MA INCORRECT ! - divide 32-bit/16-bit was performed ---Return from Interrupt --- Write MA Write MA WRONG STATE ! - will not initiate the divide
凱爾?使用加速器的 C51 編譯器數(shù)學函數(shù)
許多 8051 用戶習慣于使用高級語言(如 C. Keil)進行代碼開發(fā)。 軟件,行業(yè)領先的 8051 開發(fā)工具提供商,已經(jīng)創(chuàng)建了特殊的代碼來允許 DS80C390/DS80C400數(shù)學加速器用于某些操作。下面列出了 Keil C51 版本 6.20(或更高版本)支持的操作,這些操作在啟用此“目標選項”時使用數(shù)學加速器。
unsigned long * unsigned long / unsigned long >> unsigned long << signed long * signed long / signed long >> signed long <<
應用示例:
IEEE 754 單精度浮點乘法?
為了演示DS80C390/DS80C400數(shù)學加速器硬件的功能,我們來研究兩個浮點數(shù)相乘的任務。下面的圖 8 顯示了 IEEE 754 單精度浮點數(shù)格式,表 3 包含一些示例數(shù)字。二進制浮點數(shù)的乘法涉及指數(shù)的加法和有符號 24 位數(shù)的乘法。圖 9 顯示了完成任務必須執(zhí)行的基本步驟。到目前為止,對于 8051 硬件,三個步驟中最耗時的是 24 位× 24 位乘法。雖然DS80C390/DS80C400算術加速器不支持兩個24位數(shù)字的直接乘法,但利用其16位×16位乘法和累加功能,與傳統(tǒng)的8051方法相比,具有明顯的性能優(yōu)勢。圖 2 步驟 24 顯示了使用加速器對 (9) 個歸一化 3 位數(shù)字進行乘法的輪廓。部分乘積累加 (MAC) 操作已突出顯示。
圖8.IEEE 754 單精度浮點格式。
7F7FFFFF (最大正) | 3.4028234663852886e+38 |
66FF0C32 | 6.02214208470173e+23 |
4天8EF3C2 | 299792448.0 |
4B277224 | 10973732.0 |
47F12065 | 123456.7890625 |
461C4000 | 10000.0 |
44FA0002 | 2000.000244140625 |
448AE385 | 1111.1099853515625 |
3F800000 | 1.0 |
3F000000 | 0.5 |
203D26D0 | 1.6021764682116162e-19 |
1985873F | 1.380650314593702e-23 |
085C305C | 6.626068801043303e-34 |
00800000(最小陽性) | 1.1754943508222875e-38 |
80800000(最小負值) | -1.1754943508222875e-38 |
AF531F95 | -1.9201558398851404e-10 |
BA81742B | -0.000987654 |
BF000000 | -0.5 |
BF800000 | -1.0 |
C1000000 | -8.0 |
C2046666 | -33.099998474121094 |
C7C35000 | -100000.0 |
編號: D0435000 | -13107200000.0 |
D533A52B | -12345123274752.0 |
FF7FFFFF (最大負數(shù)) | -3.4028234663852886e+38 |
圖9.浮點乘法 (A × B = C)。
應用示例(續(xù))-代碼列表
為了簡化示例,應用程序代碼不支持以下乘法或乘積:0、-0、無窮大、-無窮大、NaN(不是數(shù)字)、非規(guī)范化值。此外,代碼對產(chǎn)品執(zhí)行有偏差的舍入(即,如果產(chǎn)品正好在兩個可表示的數(shù)字之間,則將其向上舍入)。
審核編輯:郭婷
-
微控制器
+關注
關注
48文章
7496瀏覽量
151083 -
寄存器
+關注
關注
31文章
5325瀏覽量
120052 -
加速器
+關注
關注
2文章
795瀏覽量
37772
發(fā)布評論請先 登錄
相關推薦
評論