薛海衛(wèi),徐新宇,符士華
(中國(guó)電子科技集團(tuán)公司第58研究所,江蘇 無(wú)錫 214035)
數(shù)字信號(hào)處理器DSP廣泛應(yīng)用于現(xiàn)代通信、信息處理、自動(dòng)控制等領(lǐng)域中,通過(guò)指令程序,DSP能實(shí)現(xiàn)濾波、快速傅里葉變換等各種算法,是現(xiàn)代信號(hào)處理的關(guān)鍵器件之一。DSP通常由CPU、程序控制、尋址地址、存儲(chǔ)器、外設(shè)等邏輯部件組成,其中DSP的程序控制實(shí)現(xiàn)程序地址的產(chǎn)生與加載、各種指令的執(zhí)行控制等操作。DSP程序控制調(diào)用程序計(jì)數(shù)器、堆棧、重復(fù)計(jì)數(shù)器等邏輯部件,通過(guò)程序地址的加載流程,使得指令能夠正確順利地執(zhí)行。鑒于程序控制在DSP中起重要的指揮控制作用,弄清DSP程序控制結(jié)構(gòu)對(duì)研究DSP性能架構(gòu)具有重要意義。本文通過(guò)分析DSP程序控制的流程與實(shí)現(xiàn)方式,從而揭示了程序控制的核心——指令執(zhí)行中各程序地址的加載關(guān)系,為設(shè)計(jì)DSP程序控制邏輯提供一種參考方法。
DSP程序的執(zhí)行要進(jìn)行尋址、取址、讀寫各種存儲(chǔ)設(shè)備等多項(xiàng)操作,DSP程序除順序執(zhí)行外還可以實(shí)現(xiàn)多種復(fù)雜的執(zhí)行方式,如跳轉(zhuǎn)、子程序調(diào)用返回、循環(huán)、程序塊執(zhí)行等。程序可實(shí)現(xiàn)的操作種類越多,程序執(zhí)行越靈活,可操作性和易開發(fā)性越好,則DSP的功能越強(qiáng)大、開發(fā)效率越高。程序控制是DSP的指揮中樞和控制核心,它控制了所有程序的執(zhí)行進(jìn)程。不同的執(zhí)行指令導(dǎo)致不同的程序地址加載方式。DSP的程序控制邏輯一般由程序計(jì)數(shù)器、硬堆棧、程序重復(fù)執(zhí)行計(jì)數(shù)器和狀態(tài)控制寄存器等邏輯電路組成。
程序計(jì)數(shù)器PC實(shí)際上是一個(gè)加一計(jì)數(shù)器,當(dāng)程序順序執(zhí)行時(shí),計(jì)數(shù)器執(zhí)行加一遞增運(yùn)算。程序計(jì)數(shù)器PC由遞增運(yùn)算、選擇器和D觸發(fā)器組成,其內(nèi)部邏輯如圖1所示。16位地址總線ADDR_B1作為PC的輸入,經(jīng)遞增運(yùn)算后,通過(guò)選擇器和寄存器最后輸出16位的PC地址。
圖1 PC邏輯結(jié)構(gòu)圖
PC的遞增運(yùn)算實(shí)現(xiàn)遞增或保持操作,16位輸入地址ADDR_B1經(jīng)過(guò)遞增運(yùn)算后生成輸出地址PC_IN,當(dāng)遞增控制信號(hào)B為1時(shí),PC_IN=ADDR_B1+1;當(dāng)信號(hào)B為0時(shí),PC_IN=ADDR_B1。當(dāng)PC復(fù)位時(shí),選擇器選0輸入;當(dāng)PC正常工作時(shí),選擇器選PC_IN作為輸入。
堆棧在子程序的調(diào)用和返回時(shí)用于暫存地址,典型DSP堆棧深度為8級(jí),可以把8個(gè)不同的地址存入堆棧中,也即最多可有8個(gè)不同的子程序入口。PUSH和POP指令實(shí)現(xiàn)壓棧和彈棧操作。堆棧分為輸入級(jí)、棧頂和7級(jí)棧體,堆棧的輸入級(jí)為五選一的選擇器,其輸入為地址總線ADDR_B1D、PASR、PC、數(shù)據(jù)總線DB和棧體反饋STACK_T,棧頂TOS經(jīng)三態(tài)門連接到DAB_B總線上。堆棧可以把地址ADDR_B1D、PASR、PC和DB、TOS等數(shù)據(jù)壓入棧體,堆棧的結(jié)構(gòu)圖如圖2所示。
圖2 堆棧結(jié)構(gòu)圖
棧體由二選一選擇器和D觸發(fā)器構(gòu)成,深度為7級(jí),加上棧頂深度共8級(jí)。棧體的輸入為16位的TOS,輸出為16位STACK_T,二選一選擇器選擇壓棧還是彈棧操作,7級(jí)棧體的結(jié)構(gòu)圖如圖3所示。
圖3 7級(jí)棧體結(jié)構(gòu)圖
堆棧的操作過(guò)程如下:壓棧操作時(shí)數(shù)據(jù)經(jīng)輸入級(jí)壓入棧頂TOS,后由TOS通過(guò)選擇器的第二路逐級(jí)壓入棧體;彈棧操作時(shí)數(shù)據(jù)從后一級(jí)寄存器通過(guò)前一級(jí)選擇器的第一路彈入前一級(jí)的寄存器中,逐級(jí)彈出最后經(jīng)STACK_T從棧頂輸出。
通常DSP可以用程序重復(fù)指令實(shí)現(xiàn)指令的重復(fù)執(zhí)行,指令重復(fù)執(zhí)行包括單指令的重復(fù)執(zhí)行和指令塊重復(fù)執(zhí)行。單指令重復(fù)執(zhí)行用RPT或RPTZ指令,指令塊重復(fù)執(zhí)行用RPTB指令。相關(guān)的16位寄存器有重復(fù)計(jì)數(shù)寄存器RPTC、程序塊重復(fù)開始結(jié)束寄存器PASR、PAER和程序塊重復(fù)計(jì)數(shù)寄存器BRCR。單指令重復(fù)執(zhí)行時(shí),RPT或RPTZ指令把需要重復(fù)執(zhí)行的數(shù)值N載入RPTC寄存器,指令每執(zhí)行一次,RPTC中的值就減一,直到RPTC中的值達(dá)到0為止。選擇器選擇RPTC或BRCR的值給運(yùn)算單元進(jìn)行減法運(yùn)算,當(dāng)用RPT或RPTZ指令時(shí)選擇RPTC值,當(dāng)用RPTB指令時(shí)選擇BRCR值。通過(guò)減一計(jì)數(shù)實(shí)現(xiàn)程序重復(fù)執(zhí)行的邏輯功能,如圖4所示。
減法運(yùn)算得到的16位結(jié)果RPT_CO根據(jù)不同的選擇返回給RPTC和BRCR寄存器,RPTC和BRCR根據(jù)判斷邏輯決定是否再執(zhí)行減法運(yùn)算。當(dāng)RPTC或BRCR中的值減到0時(shí),判斷邏輯的輸出RPTC_Z或BRCR_Z都為0,否則輸出為1。當(dāng)RPTC_Z或BRCR_Z為0時(shí)減法器停止運(yùn)算,當(dāng)RPTC_Z或BRCR_Z為1時(shí),減法器繼續(xù)運(yùn)算。
重復(fù)計(jì)數(shù)減法功能實(shí)現(xiàn)減一運(yùn)算,其結(jié)構(gòu)與程序計(jì)數(shù)器PC的遞增運(yùn)算相似,每一組減法運(yùn)算單元AS由傳輸置位邏輯、同或運(yùn)算邏輯和控制傳輸邏輯組成。重復(fù)計(jì)數(shù)器進(jìn)行遞減運(yùn)算,計(jì)數(shù)器輸入為16位的RPT_N,輸出為16位的RPT_CO。當(dāng)遞減控制信號(hào)B為1時(shí), RPT_CO=RPT_N-1;當(dāng)B為0時(shí),RPT_CO=RPT_N。
圖4 指令重復(fù)執(zhí)行邏輯
當(dāng)程序塊需重復(fù)執(zhí)行N+1次時(shí),用RPTB指令把塊重復(fù)值N加載入BRCR寄存器中。當(dāng)執(zhí)行RPTB指令時(shí),BRAF位置位把緊跟RPTB的下一指令地址載入程序地址開始寄存器PASR,把RPTB指令中的長(zhǎng)立即數(shù)載入程序地址結(jié)束寄存器PAER。塊重復(fù)執(zhí)行過(guò)程如下:PAER與PC作比較,如兩者相等則BRCR與0比較,若BRCR大于0,則BRCR減一,PASR載入PC,重新開始循環(huán);若PAER與PC不等,則繼續(xù)執(zhí)行直到塊的最后一條指令。
16位PAER與PC比較,若相等則COMP為0,再判斷BRCR是否達(dá)到0;若不同則COMP為1,PC繼續(xù)遞加。
根據(jù)不同的指令執(zhí)行方式,程序地址PC的載入方式也不同,PC加載方式如表1。通過(guò)程序地址總線PAB來(lái)尋址程序存儲(chǔ)器,被尋址的指令裝入指令寄存器IR中。
根據(jù)表1,程序地址的輸入有多種來(lái)源,包括立即數(shù)、中斷矢量、寄存器ACCL、BMAR、PASR和堆棧頂TOS等,這就決定了地址加載硬件的結(jié)構(gòu)是多選擇器結(jié)合總線的方式。
程序地址生成與加載邏輯如圖5所示,為避免多地址沖突,3個(gè)帶選擇的觸發(fā)器輸出經(jīng)三態(tài)門與程序地址總線PAB相連。在PAB總線的左側(cè),第一個(gè)地址加載源是堆棧頂TOS、數(shù)據(jù)總線DB、存儲(chǔ)器的輸出MD6和IR<4:0>,這些輸入對(duì)應(yīng)返回指令RET、RETC、程序塊移指令BLDD、BLDP、BLPD、乘加指令MAC或MACD、子程序調(diào)用等指令執(zhí)行操作;第二個(gè)地址加載源是PASR,其值通過(guò)ADDR_B1D或數(shù)據(jù)總線DB加載,對(duì)應(yīng)塊循環(huán)結(jié)束操作;第三個(gè)地址加載源是BMAR,其值通過(guò)DB總線加載,對(duì)應(yīng)BLDD、BLDP、BLPD、MADD、MADS指令操作。上述3種輸出通過(guò)三態(tài)門連接到PAB總線上,作為PAB的來(lái)源。
表1 程序地址加載方式
在PAB總線的右側(cè),當(dāng)執(zhí)行GOTO和BACC、BACCD、CALA、TBLR、TBLW指令時(shí),ACC<15:0>通過(guò)稱之為程序總線鎖存器PB賦給地址總線ADDR_B1。ADDR_B1的值也可以來(lái)自總線PAB、PC和存儲(chǔ)器輸出MD6,而ADDR_B1反饋給程序計(jì)數(shù)器作為PC輸入。ADDR_B1經(jīng)觸發(fā)器鎖存后的地址ADDR_B1D反饋回PASR寄存器,作為PASR的輸入,當(dāng)執(zhí)行RPTB指令時(shí)ADDR_B1D載入PASR。這樣根據(jù)不同的指令,通過(guò)PAB總線選擇不同的地址寄存器給程序總線ADDR_B1,ADDR_B1經(jīng)程序計(jì)數(shù)器PC運(yùn)算后把下一個(gè)操作的地址值反饋給指定的寄存器單元。這樣,程序地址生成加載邏輯實(shí)現(xiàn)了所有程序控制所需的地址產(chǎn)生和載入方式。
程序控制中的兩個(gè)關(guān)鍵運(yùn)算部件——程序計(jì)數(shù)器和重復(fù)計(jì)數(shù)器——其遞增(加一)、遞減(減一)運(yùn)算邏輯結(jié)構(gòu)相同,遞增遞減運(yùn)算邏輯把16位的輸入分成4組,每組4位,每組的運(yùn)算單元結(jié)構(gòu)相同,我們稱之為Arithmetic Slice(AS)。每一組AS由傳輸置位邏輯、同或運(yùn)算邏輯及控制傳輸邏輯構(gòu)成,現(xiàn)以AS的低4位為例說(shuō)明。傳輸置位邏輯如圖6所示,遞增保持控制信號(hào)B通過(guò)內(nèi)部控制信號(hào)C<2:0>控制的傳輸門傳到輸出O<1>、O<2>和O<3>。當(dāng)C<2:0>各位都為1時(shí)各級(jí)傳輸門打開,O<i>=O<i-1>;當(dāng)C<2:0>各位都為0時(shí)傳輸門關(guān)閉,上拉P管打開使O<3>、O<2>、O<1>置位為1,O<0>恒為。O<3:0>的邏輯表達(dá)式如下:
圖5 程序地址加載邏輯圖
圖6 傳輸置位邏輯
當(dāng)C<3:0>同時(shí)為1時(shí)Z=B,當(dāng)C<3:0>有一位為0時(shí)Z=0。
用Hspice對(duì)遞增運(yùn)算進(jìn)行仿真,仿真結(jié)果如圖7所示,圖中ADDR_B1為遞增輸入,PC_IN為遞增輸出。以低4位運(yùn)算為例,從圖中可以看出:輸入從0開始遞增,當(dāng)輸入為00002時(shí)對(duì)應(yīng)輸出為00012、輸入00012時(shí)對(duì)應(yīng)輸出00102、輸入00102對(duì)應(yīng)輸出00112,以此類推,當(dāng)輸入為11112時(shí)輸出為00002,控制傳輸位為1。輸入到輸出間延時(shí)為0.5ns。根據(jù)公式,當(dāng)ADDR_B1<1:0>為11即輸入為3時(shí)O<2>為0,其他輸入時(shí)O<2>都為1;同樣只有當(dāng)ADDR_B1<2:0>為111即輸入為7時(shí)O<3>為0,其他輸入時(shí)O<3>都為1。當(dāng)ADDR_B1<0>為0時(shí)輸出PC_IN<0>為1;當(dāng)ADDR_B1<0>為1時(shí)輸出PC_IN<1>為1、 PC_IN<0>為0;當(dāng)ADDR_B1<1>和ADDR_B1<0>都為1時(shí)輸出PC_IN<2>為1;當(dāng)ADDR_B1<2>、ADDR_B1<1>和ADDR_B1<0>都為1時(shí)輸出PC_IN<3>為1。這樣輸入ADDR_B1每計(jì)數(shù)到1時(shí),輸出PC_IN<1>翻轉(zhuǎn)一下;輸入ADDR_B1每計(jì)數(shù)到3時(shí),輸出PC_IN<2>翻轉(zhuǎn)一下;輸入ADDR_B1每計(jì)數(shù)到7時(shí),輸出PC_IN<3>翻轉(zhuǎn)一下,實(shí)現(xiàn)每次輸出隨輸入的變化而自動(dòng)加一遞增。
圖7 遞增仿真結(jié)果圖
通過(guò)對(duì)DSP的程序計(jì)數(shù)器、堆棧、程序重復(fù)邏輯和程序地址加載邏輯等的分析,弄清了程序順序執(zhí)行與重復(fù)執(zhí)行的流程,對(duì)不同指令執(zhí)行方式、程序加載方式作了詳細(xì)闡述。分析了程序控制中遞增遞減運(yùn)算部件的邏輯實(shí)現(xiàn),明確了DSP的程序控制結(jié)構(gòu)及其實(shí)現(xiàn)方式。本文通過(guò)分析DSP程序控制流程及其實(shí)現(xiàn)方式,從而揭示了指令執(zhí)行中程序地址加載的各種關(guān)系,對(duì)弄清DSP程序控制結(jié)構(gòu)、研究DSP架構(gòu)具有參考意義。
[1]TMS320C5X DIGITAL SIGNAL PROCESSORS USER’S GUIDE TI. 1998. 80-115.
[2]TI著,徐科軍,等譯.TMS320LF/LC24系列DSP的CPU與外設(shè)[M]. 北京:清華大學(xué)出版社,2004. 32-41.
[3]江思敏,等編著. TMS320LF240X DSP硬件開發(fā)教程[M].北京:機(jī)械工業(yè)出版社.2003. 12-49.
[4]TMS320C54X DSP Reference Set Volume1:CPU and Peripherals. TI. 2001.145-167.