久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4108|回復: 0
打印 上一主題 下一主題
收起左側(cè)

MSP430程序庫-硬件乘法器使用

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:104835 發(fā)表于 2016-2-1 00:19 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
硬件乘法器不占用CPU周期,有硬件實現(xiàn),速度比軟件實現(xiàn)的乘法速度快很多。msp430f14x、msp430f16x中都含有硬件乘法器模塊,方便用戶需要速度的時候使用。

  • 硬件介紹:在MSP430系列單片機中,硬件乘法器是外圍模塊,而不是CPU內(nèi)核的一部分;所以它的活動與否與CPU的活動與否無關(guān),它的寄存器和其他的外圍寄存器一樣通過CPU指令讀寫。
    硬件乘法器模塊支持一下功能:無符號乘法、有符號乘法、無符號乘加、有符號乘加;可以支持16*16 16*8 8*16 8*8bits的乘法。
    硬件乘法器的模塊框圖如下:

    硬件乘法器模塊的四種操作類型(無符號乘法、有符號乘法、無符號乘加、有符號乘加)是由寫入的第一個操作數(shù)的位置決定的。這個模塊有兩個操作數(shù)寄存器:OP1和OP2、三個結(jié)果寄存器RESLO, RESHI, 和SUMEXT。RESLO寄存器存儲結(jié)果的低字(低16位);RESHI寄存器存儲結(jié)果的高字(高16位);SUMEXT寄存器存儲結(jié)果的有關(guān)信息。結(jié)果在3個時鐘周期后即可完成;寫入OP2后的下一條指令即可讀取結(jié)果,有一種情況例外:用間接尋址方式訪問結(jié)果。用間接尋址方式訪問結(jié)果時,讀取結(jié)果之前需要有一條NOP指令。
    操作數(shù)OP1有四個地址(MPY:0130h MPYS:0132h MAC:0134h MACS:0136h),這四個寄存器用來選擇乘法的操作模式。寫入第一個操作數(shù)寄存器決定用哪種操作:無符號 用符號等,但是不啟動相乘操作;寫入第二個操作數(shù)寄存器啟動相乘的操作。計算完成后結(jié)果存入寄存器RESLO,RESHI, 和SUMEXT。
    操作數(shù)1的四個地址對應(yīng)的操作:
    OP1 Address Register Name   Operation0130h       MPY             Unsigned multiply(無符號乘法)0132h       MPYS            Signed multiply(有符號乘法)0134h       MAC             Unsigned multiply accumulate(無符號乘加)0136h       MACS            Signed multiply accumulate(有符號乘加)四種操作模式下高位結(jié)果寄存器的內(nèi)容如下:
    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 寄存器的內(nèi)容:
    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連續(xù)乘法運算時,如果操作數(shù)1不需改變就可以運算,則可以不需要重新寫入和以保存內(nèi)容相同的數(shù);但OP2必須重新寫入以啟動乘法運算。
    MACS Underflow and Overflow(MACS時的上溢和下溢):硬件乘法器不檢測有符號乘加時運算結(jié)果的上溢出和下溢出。結(jié)果的正數(shù)范圍:0到7FFF FFFFh;負數(shù)范圍:0FFFF FFFFh到8000 0000h。下溢出是兩個負數(shù)的和結(jié)果寄存器得到的是正數(shù),上溢出是兩個正數(shù)的和結(jié)果寄存器得到的是負數(shù)。SUMEXT寄存器存儲有結(jié)果的符號,可以根據(jù)它判斷是否溢出(0000h 負數(shù)和 則上溢 0FFFFh 正數(shù)和 則下溢)。使用時 程序必須合適的檢測、處理MACS的溢出情況。
    程序示例(用戶指南上給出的匯編示例):
    所有乘數(shù)模式的例子如下。所有的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上面的程序雖然和標準的匯編差異比較大,但是有一定匯編基礎(chǔ)的人還是很容易就能夠看懂。這里的程序給出了多種方式寫入操作數(shù)寄存器。
    間接尋址結(jié)果寄存器時,在寫入OP2操作數(shù)啟動乘法后,至少需要一個指令的延遲后才能訪問結(jié)果寄存器RESLO等;直接尋址時可以寫入OP2后,下一條指令即可讀取結(jié)果。示例程序(匯編):
    ; 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 寫入兩個操作數(shù) 乘法運算開始后 需要一個NOPMOV @R5+,&xxx ; Move RESLOMOV @R5,&xxx ; Move RESHI如果在寫入OP1和寫入OP2之間產(chǎn)生了中斷,中斷響應(yīng)后,源操作數(shù)的計算模式丟失;運算結(jié)果不確定。為了避免這種情況的發(fā)生,在寫入操作數(shù)時禁止中斷或在中斷響應(yīng)函數(shù)中不使用硬件乘法器。如:
    ; 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硬件部分就說這么多了,有什么不大明白的可以參考用戶指南。
  • 使用示例:我的程序僅僅是用C語言演示硬件乘法器的使用。程序主要內(nèi)容如下:
    #include <msp430x16x.h>/***************************************************************************** 名    稱:main主程序* 功    能:硬件乘法器程序庫使用演示* 入口參數(shù):無* 出口參數(shù):無****************************************************************************/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中乘法模式:使用時單步調(diào)試,觀察硬件乘法器的有關(guān)寄存器。如:

    硬件乘法器運算速度很快,只需3個時鐘周期;這里IAR單步調(diào)試時,OP2賦值結(jié)束,在watch窗口馬上就可以看到運算結(jié)果。其他三種模式類似。
    注釋掉的這部分是我用來檢測IAR編譯程序是否使用硬件乘法器進行測試。默認情況下,乘法應(yīng)該是用硬件乘法器運算的。默認的設(shè)置如下:

    硬件乘法器是選中的,這時應(yīng)該是使用硬件乘法器的,但是我的調(diào)試結(jié)果顯示它沒有使用硬件乘法器,截圖下:



    運行后乘法器相關(guān)位沒有對應(yīng)變化,如果使用的話,應(yīng)該變化。
    硬件乘法器不選中時,寄存器也沒有相應(yīng)變化,從這看,IAR沒有使用硬件乘法器;也許程序沒有優(yōu)化太多或是debug版本不使用硬件乘法器。
    如果需要直接使用硬件乘法器,有必要時把設(shè)置的硬件乘法器去掉,以防沖突。
    下面是直接使用硬件乘法器的一個實例:
    #include "msp430x16x.h"unsigned int Result[7];unsigned char Data1[7];unsigned char Data2[7];void main(void){    unsigned char i;    WDTCTL = WDTPW + WDTHOLD; // 關(guān)看門狗    for(i=0; i<7; i++)    {        Data1 = 10 * i; // 對兩數(shù)組賦值        Data2 = 25 * i;    }    for(i=0; i<7; i++)    {        MPY = Data1;        OP2 = Data2;        _NOP(); // 延遲        _NOP();        _NOP();        Result = RESLO; // 保存結(jié)果,由于是8×8型,所以未用到RESHI;    }}這個程序用無符號乘法運算,結(jié)果存入結(jié)果數(shù)組中。值的注意的是程序中的3個NOP,這里NOP不需要,根據(jù)頭文件推測,IAR編譯器應(yīng)該使用的是直接尋址方式,可以不要。如果不太放心,一個NOP即可,即便用的是間接尋址,一個NOP的延遲已經(jīng)足夠。

硬件乘法器一般不會像上面的程序那么使用,如果這樣就太浪費了;還不如直接用 *操作符來的簡便;硬件乘法器主要用來對時間要求苛刻的情況。如:用430進行數(shù)字濾波,快速傅里葉變換等。ti有一篇應(yīng)用筆記介紹的就是用msp430f169實現(xiàn)數(shù)字濾波方案。
硬件乘法器就到這里了,希望對大家有所幫助。有什么不足之處,歡迎拍磚討論。


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品成人在线 | 青青草av | 久久久久国色av免费观看性色 | 中文字幕在线观看av | 国产三区av | 欧美成人aaa级毛片在线视频 | 亚洲欧美日韩系列 | 欧美精品一级 | 成人美女免费网站视频 | 一级黄色毛片a | 国产日韩一区二区 | 亚洲第一av | 国产国拍亚洲精品av | 九九九视频在线 | 全部免费毛片在线播放网站 | 亚洲成人一二区 | 久久不卡| 成人国产精品免费观看视频 | 日本一区二区不卡 | 伊人亚洲 | 欧美一级三级在线观看 | 日韩在线播放视频 | 亚洲视频免费一区 | 欧美不卡一区二区 | 国产精品一区二区三区99 | 热久久免费视频 | 国产一区二区三区四区 | 在线亚洲欧美 | 国产精品久久久久影院色老大 | 欧美美女一区二区 | 欧美在线成人影院 | 亚洲视频区| 中文字幕在线观看第一页 | 亚洲国产成人在线视频 | 国产成人麻豆免费观看 | 夜夜操天天艹 | 国产精品久久久久久久免费观看 | 国内精品99 | 国产清纯白嫩初高生视频在线观看 | 蜜桃av鲁一鲁一鲁一鲁 | 久久成人免费观看 |