MSP430程式庫硬體乘法器使用

來源:互聯網
上載者:User

硬體乘法器不佔用CPU周期,有硬體實現,速度比軟體實現的乘法速度快很多。msp430f14x、msp430f16x中都含有硬體乘法器模組,方便使用者需要速度的時候使用。

  1. 硬體介紹:

    在MSP430系列單片機中,硬體乘法器是外圍模組,而不是CPU核心的一部分;所以它的活動與否與CPU的活動與否無關,它的寄存器和其他的外圍寄存器一樣通過CPU指令讀寫。

    硬體乘法器模組支援一下功能:無符號乘法、有符號乘法、無符號乘加、有符號乘加;可以支援16*16 16*8 8*16 8*8bits的乘法。

    硬體乘法器的模組框圖如下:

    硬體乘法器模組的四種操作類型(無符號乘法、有符號乘法、無符號乘加、有符號乘加)是由寫入的第一個運算元的位置決定的。這個模組有兩個運算元寄存器:OP1和OP2、三個結果寄存器RESLO, RESHI, 和SUMEXT。RESLO寄存器儲存結果的低字(低16位);RESHI寄存器儲存結果的高字(高16位);SUMEXT寄存器儲存結果的有關資訊。結果在3個刻度後即可完成;寫入OP2後的下一條指令即可讀取結果,有一種情況例外:用間接定址方式訪問結果。用間接定址方式訪問結果時,讀取結果之前需要有一條NOP指令。

    運算元OP1有四個地址(MPY:0130h MPYS:0132h MAC:0134h MACS:0136h),這四個寄存器用來選擇乘法的操作模式。寫入第一個運算元寄存器決定用哪種操作:無符號 用符號等,但是不啟動相乘操作;寫入第二個運算元寄存器啟動相乘的操作。計算完成後結果存入寄存器RESLO,RESHI, 和SUMEXT。

    運算元1的四個地址對應的操作:

    OP1 Address Register Name   Operation0130h       MPY             Unsigned multiply(無符號乘法)0132h       MPYS            Signed multiply(有符號乘法)0134h       MAC             Unsigned multiply accumulate(無符號乘加)0136h       MACS            Signed multiply accumulate(有符號乘加)

    四種操作模式下高位結果寄存器的內容如下:

    Mode        RESHI ContentsMPY         Upper 16-bits of the resultMPYS        The MSB is the sign of the result. The remaining bits are the upper            15-bits of the result. Two’s complement notation is usedfor the result.MAC         Upper 16-bits of the resultMACS        Upper 16-bits of the result. Two’s complement notation is used for the result.

    四種操作模式SUMEXT 寄存器的內容:

    Mode        SUMEXTMPY         SUMEXT is always 0000hMPYS        SUMEXT contains the extended sign of the result            00000h Result was positive or zero            0FFFFh Result was negativeMAC         SUMEXT contains the carry of the result            0000h No carry for result            0001h Result has a carryMACS        SUMEXT contains the extended sign of the result            00000h Result was positive or zero            0FFFFh Result was negative

    連續乘法運算時,如果運算元1不需改變就可以運算,則可以不需要重新寫入和以儲存內容相同的數;但OP2必須重新寫入以啟動乘法運算。

    MACS Underflow and Overflow(MACS時的上溢和下溢):硬體乘法器不檢測有符號乘加時運算結果的上溢出和下溢出。結果的正數範圍:0到7FFF FFFFh;負數範圍:0FFFF FFFFh到8000 0000h。下溢出是兩個負數的和結果寄存器得到的是正數,上溢出是兩個正數的和結果寄存器得到的是負數。SUMEXT寄存器儲存有結果的符號,可以根據它判斷是否溢出(0000h 負數和 則上溢 0FFFFh 正數和 則下溢)。使用時 程式必須合適的檢測、處理MACS的溢出情況。

    程式樣本(使用者指南上給出的彙編樣本):

    所有乘數模式的例子如下。所有的8x8模式使用的寄存器的絕對位址,因為彙編器將不允許B訪問到字寄存器時使用標準定義的檔案標籤。

    ; 16x16 Unsigned MultiplyMOV #01234h,&MPY ; Load first operandMOV #05678h,&OP2 ; Load second operand; ... ; Process results; 8x8 Unsigned Multiply. Absolute addressing.MOV.B #012h,&0130h ; Load first operandMOV.B #034h,&0138h ; Load 2nd operand; ... ; Process results; 16x16 Signed MultiplyMOV #01234h,&MPYS ; Load first operandMOV #05678h,&OP2 ; Load 2nd operand; ... ; Process results; 8x8 Signed Multiply. Absolute addressing.MOV.B #012h,&0132h ; Load first operandSXT &MPYS ; Sign extend first operandMOV.B #034h,&0138h ; Load 2nd operandSXT &OP2 ; Sign extend 2nd operand; (triggers 2nd multiplication); ... ; Process results; 16x16 Unsigned Multiply AccumulateMOV #01234h,&MAC ; Load first operandMOV #05678h,&OP2 ; Load 2nd operand; ... ; Process results; 8x8 Unsigned Multiply Accumulate. Absolute addressingMOV.B #012h,&0134h ; Load first operandMOV.B #034h,&0138h ; Load 2nd operand; ... ; Process results; 16x16 Signed Multiply AccumulateMOV #01234h,&MACS ; Load first operandMOV #05678h,&OP2 ; Load 2nd operand; ... ; Process results; 8x8 Signed Multiply Accumulate. Absolute addressingMOV.B #012h,&0136h ; Load first operandSXT &MACS ; Sign extend first operandMOV.B #034h,R5 ; Temp. location for 2nd operandSXT R5 ; Sign extend 2nd operandMOV R5,&OP2 ; Load 2nd operand; ... ; Process results

    上面的程式雖然和標準的彙編差異比較大,但是有一定彙編基礎的人還是很容易就能夠看懂。這裡的程式給出了多種方式寫入運算元寄存器。

    間接定址結果寄存器時,在寫入OP2運算元啟動乘法後,至少需要一個指令的延遲後才能訪問結果寄存器RESLO等;直接定址時可以寫入OP2後,下一條指令即可讀取結果。樣本程式(彙編):

    ; Access multiplier results with indirect addressingMOV #RESLO,R5 ; RESLO address in R5 for indirectMOV &OPER1,&MPY ; Load 1st operandMOV &OPER2,&OP2 ; Load 2nd operandNOP ; Need one cycle 寫入兩個運算元 乘法運算開始後 需要一個NOPMOV @R5+,&xxx ; Move RESLOMOV @R5,&xxx ; Move RESHI

    如果在寫入OP1和寫入OP2之間產生了中斷,中斷響應後,源運算元的計算模式丟失;運算結果不確定。為了避免這種情況的發生,在寫入運算元時禁止中斷或在中斷響應函數中不使用硬體乘法器。如:

    ; Disable interrupts before using the hardware multiplierDINT ; Disable interruptsNOP ; Required for DINTMOV #xxh,&MPY ; Load 1st operandMOV #xxh,&OP2 ; Load 2nd operandEINT ; Interrupts may be enable before; Process results

    硬體部分就說這麼多了,有什麼不大明白的可以參考使用者指南。

  2. 使用樣本:

    我的程式僅僅是用C語言示範硬體乘法器的使用。程式主要內容如下:

    #include <msp430x16x.h>/***************************************************************************** 名    稱:main主程式* 功    能:硬體乘法器程式庫使用示範* 入口參數:無* 出口參數:無****************************************************************************/void main( void ){    // Stop watchdog timer to prevent time out reset    WDTCTL = WDTPW + WDTHOLD;    ClkInit();        /*把 硬體乘法器的寄存器放到watch視窗 觀察是否變化    int a = 0;    a=  5*6;    */    //測試無符號乘法    MPY = 65535;    OP2 = 2;    //有符號乘法    MPYS = 65535;    OP2 = 2;    //無符號乘加    MAC = 65535;    OP2 = 2;    //有符號乘加    MACS = 65535;    OP2 = 2;    LPM0;}

    程式示範了4中乘法模式:使用時單步調試,觀察硬體乘法器的有關寄存器。如:

    硬體乘法器運算速度很快,只需3個刻度;這裡IAR單步調試時,OP2賦值結束,在watch視窗馬上就可以看到運算結果。其他三種模式類似。

    注釋掉的這部分是我用來檢測IAR編譯器是否使用硬體乘法器進行測試。預設情況下,乘法應該是用硬體乘法器運算的。預設的設定如下:

    硬體乘法器是選中的,這時應該是使用硬體乘法器的,但是我的調試結果顯示它沒有使用硬體乘法器,下:

     

     

    運行後乘法器相關位沒有對應變化,如果使用的話,應該變化。

    硬體乘法器不選中時,寄存器也沒有相應變化,從這看,IAR沒有使用硬體乘法器;也許程式沒有最佳化太多或是debug版本不使用硬體乘法器。

    如果需要直接使用硬體乘法器,有必要時把設定的硬體乘法器去掉,以防衝突。

    下面是直接使用硬體乘法器的一個執行個體:

    #include "msp430x16x.h"unsigned int Result[7];unsigned char Data1[7];unsigned char Data2[7];void main(void){    unsigned char i;    WDTCTL = WDTPW + WDTHOLD; // 關看門狗    for(i=0; i<7; i++)    {        Data1[i] = 10 * i; // 對兩數組賦值        Data2[i] = 25 * i;    }    for(i=0; i<7; i++)    {        MPY = Data1[i];        OP2 = Data2[i];        _NOP(); // 延遲        _NOP();        _NOP();        Result[i] = RESLO; // 儲存結果,由於是8×8型,所以未用到RESHI;    }}

    這個程式用無符號乘法運算,結果存入結果數組中。值的注意的是程式中的3個NOP,這裡NOP不需要,根據標頭檔推測,IAR編譯器應該使用的是直接定址方式,可以不要。如果不太放心,一個NOP即可,即便用的是間接定址,一個NOP的延遲已經足夠。

硬體乘法器一般不會像上面的程式那麼使用,如果這樣就太浪費了;還不如直接用 *操作符來的簡便;硬體乘法器主要用來對時間要求苛刻的情況。如:用430進行數字濾波,快速傅裡葉變換等。ti有一篇應用筆記介紹的就是用msp430f16x實現數字濾波方案:Digital FIR Filter Design Using the MSP430F16x;網頁中可以看到對應的還有一個zip檔案,這個是應用筆記對應的彙編代碼。

硬體乘法器就到這裡了,希望對大家有所協助。有什麼不足之處,歡迎拍磚討論。

附件:程式庫

作者:給我一杯酒
出處:http://Engin.cnblogs.com/

本文著作權歸作者和部落格園共有,歡迎轉載,轉載保留此段文字並且註明出處;謝謝。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.