專利名稱:一種面向計數(shù)類循環(huán)的C-to-VHDL映射方法及映射裝置的制作方法
技術領域:
本發(fā)明涉及的是一種將高級語言轉換成硬件電路的方法。具體地說是一種面向 計數(shù)類循環(huán)的C-to-VHDL綜合優(yōu)化方法,即將C語言實現(xiàn)的循環(huán)程序自動轉換成可綜合的 VHDL程序,最終移植到Xilinx系列FPGA上運行的方法。本發(fā)明還涉及適用于該方法的裝置。
背景技術:
將高級語言轉換成硬件電路主要采用兩種方法一種是起步較早的類C語言,即 設計一種新的軟/硬件描述語言或程序設計模型,將其綜合為網(wǎng)表文件,再使用專門的硬 件綜合工具實現(xiàn)布局布線;另外一種方法是直接將高級語言(C, C++, Matlab)程序綜合成 VHDL硬件描述語言,再使用現(xiàn)有的商用工具對VHDL文件進行綜合、布線。
由于類C語言是一種可以同時實現(xiàn)軟/硬件描述的語言,然而,軟件設計思想和 硬件設計思想存在根本性的不同,軟件結構(馮諾依曼結構)是一種時間計算模型(time computing model),其本質是程序的串行化;而硬件結構是一種空間計算模型(spatial computing model),其本質是程序的并行化。所以,在C這樣的軟件語言基礎上設計出來的 類C語言,在硬件描述的性能上都存在著無法克服的缺陷,其執(zhí)行效果不能與Verilog或 VHDL這樣的硬件描述語言相媲美, 一些執(zhí)行效果較好的類C語言,其實已經(jīng)將ANSI C擴充 修改得面目全非,程序開發(fā)人員相當于又要學習一種新的軟/硬件描述語言,因此,近幾年 開始關注直接將高級語言綜合為VHDL硬件描述語言的方法。 目前,實現(xiàn)C語言到VHDL語言轉換的工具很多,如SPARK, R0CCC, DWARV等。 SPARK[1]以ANSI-C作為輸入,產(chǎn)生可綜合的寄存器傳輸級VHDL程序。SPARK基于SPARK intermediate ^presentation(IR)開發(fā),生成的VHDL程序采用FSM(有窮自動機)的控 制形式。SPARK雖然通過脈動陣列[2]實現(xiàn)了對計數(shù)類循環(huán)和非計數(shù)類循環(huán)的支持,但不支 持循環(huán)體里的break、conti皿e以及goto控制結構[3]。 R0CCC[4]以高級語言如C,C++作為 輸入,其生成VHDL程序也是通過FSM控制。R0CCC采用SUIF和Machine-SUIF作為映射前 端,適合運算密集型的算法加速,可作為硬件代碼加速器。R0CCC只支持標準形式的計數(shù)類
循環(huán),如for(i = 0 ;i <b ;i++);對循環(huán)嵌套的支持要求很嚴格,不能支持任意形式的循環(huán)
嵌套;不支持循環(huán)初值、終值及步進值不確定的非計數(shù)類循環(huán),這導致R0CCC能處理的循環(huán) 類型有限。同時,ROCCC對于循環(huán)體內(nèi)的語句也有要求,如循環(huán)體內(nèi)語句間不能存在數(shù)據(jù)依 賴等。DWARV[幻(Delf workbenchAutomated reconfigurable V亂generator) :DWARV采用 FSM的控制形式,利用數(shù)據(jù)流圖實現(xiàn)for循環(huán)的轉換[6]。 DWARV只支持計數(shù)類循環(huán),不支持 非計數(shù)類循環(huán),同時,DWARV在循環(huán)控制上不支持跳轉。
與本發(fā)明相關的公開報道有 [1] R. K. Gupta, A. Nicolau, S. Gupta and N. D. D u 11 , " S P ARK :
A high_leve1synthesis framework for applying parallelizing compilertransformations. ,,, Int. Conference on VLSI Design 2003, January 2003
[2]Jae-Jin Lee, Gi-Yong Song. "High-Level Synthesis Using SPARK andSystolic Array", ARC 2006,LNCS 3985,pp.455-4602006 [3]UserManual for the SPARK Parallelizing High-Level Synthesis FrameworkVersionl. 1 [4]W. Najjar, B.A.Buyukkurt and Z.Guo, "Compiler optimization forconfigurable accelerators", Int.Workshop On applied ReconfigurableComputing(ARC 2006),Delft, The Netherlands,2006
[5]Y. D. Yankova, G. K. K體a麗,K. L. M. Bertels, G. N. Gaydadjiev, J. Lu andS. Vassiliadis, DWARV :Delft Workbench Automated Recongurable VHDLGenerator, In Proceedings of the 17th International Conference on FieldProgrammable Logic and Applications (FPL07) , Delft, TheNetherlands, 2007 [6]Yana Yankova, Georgi Kuzmanov, Keon Bertels,Georgi Gaydadjiev,YiUi, Stamatis Vassliiadis. "DWARV :DELFTWORKBENCH AUT0MATEDREC0NFIGURABLE VHDL GENERATOR'', Computer Engineering Laboratory, DelftUniversity of Technology。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種通過分離循環(huán)的控制信號與使能輸出信號,實現(xiàn)高頻 的循環(huán)基本模塊;通過組合這兩組信號可實現(xiàn)任意形式的循環(huán);在循環(huán)路徑的任意節(jié)點處
可以加入運算模塊,擴展循環(huán)功能的一種面向計數(shù)類循環(huán)的C-to-VHDL映射方法。本發(fā)明
的目的還在于提供一種與本發(fā)明的方法相關的映射裝置。 本發(fā)明的目的是這樣實現(xiàn)的 本發(fā)明的一種面向計數(shù)類循環(huán)的C-to-VHDL映射方法為 通過分析模塊跳轉關系后,找到循環(huán)入口模塊;進入循環(huán)入口模塊后,尋找循環(huán)關 鍵變量;找到循環(huán)關鍵變量后,將循環(huán)關鍵的自加操作由循環(huán)體執(zhí)行模塊提前到循環(huán)入口 模塊,使得循環(huán)的控制操作與循環(huán)體的運算操作分開;最終分離了循環(huán)的控制信號與使能 輸出信號。在循環(huán)控制信號和使能輸出信號的作用下,完成循環(huán)里的運算操作。
本發(fā)明的一種面向計數(shù)類循環(huán)的C-to-VHDL映射方法實現(xiàn)高頻循環(huán)基本模塊步 驟如下 S301 :當重啟信號有效時,首次進入循環(huán)判斷;利用比較器比較循環(huán)關鍵變量值 與n值;根據(jù)比較器結果對循環(huán)進行判斷,若循環(huán)有效,則進入循環(huán)體內(nèi)進行相應運算,運 算器開始工作; S302:當重啟信號失效后,進入循環(huán)控制變量自加判斷,不自加則重新回到重啟判 斷部分;否則利用計數(shù)器對循環(huán)關鍵變量進行計數(shù)操作; S303 :自加或重啟后,選擇器對關鍵變量以及運算器的運算結果進行選擇;然后 再次利用比較器比較選擇器對關鍵變量的選擇結果與n值的大小關系,根據(jù)比較器產(chǎn)生結 果判斷是否滿足循環(huán)有效的條件,滿足再次進入循環(huán);不滿足則完成整個循環(huán);
S304 :完成本次循環(huán)操作。 本發(fā)明的一種面向計數(shù)類循環(huán)的C-to-VHDL映射方法實現(xiàn)循環(huán)的具體處理步驟 如下
(1)分析模塊跳轉關系找到LoopEntry ; (2)處理PHI指令,完成對循環(huán)關鍵變量的特殊處理;通過LLVM中的dyn_CaSt指 令對PHI指令中的各個操作數(shù)進行指令類型轉換;如果操作數(shù)能轉換為指令,并且轉換成 的指令類型為加法或者減法則該操作數(shù)為關鍵變量;同時將該操作數(shù)所在的加法或減法運 算提前到PHI指令所在模塊內(nèi)進行運算; (3)判斷關鍵變量,產(chǎn)生循環(huán)控制信號;根據(jù)循環(huán)控制信號,進入或跳出循環(huán)體操 作;若進入循環(huán)體,則循環(huán)地進行循環(huán)體內(nèi)的相關運算操作,直到循環(huán)關鍵變量不滿足循環(huán) 有效的條件,此時產(chǎn)生循環(huán)無效信號,從而跳出循環(huán),進行循環(huán)體外的相關運算操作;
(4)No_exit模塊轉換;將No_exit這個模塊號作為循環(huán)體操作模塊的使能信號, 為高電平時表示循環(huán)繼續(xù)進行;No—exit模塊內(nèi)的所有運算操作轉換為VHDL語言里對應的 基本操作;步驟(2)中被提前的加法或減法運行在No—exit模塊內(nèi)不再運算;
(5)Loop_eXit模塊轉換;將Loop_eXit這個模塊號作為循環(huán)結束使能信號,為高 電平時表示循環(huán)結束;L00p_eXit模塊內(nèi)的所有運算操作轉換為VHDL語言里對應的基本操 作。 本發(fā)明的一種面向計數(shù)類循環(huán)的C-to-VHDL映射方法還可以處理由兩組循環(huán)所 形成的并列結構。具體方法為若兩次循環(huán)之間沒有中間運算,則No—exitJ)模塊只是進行 簡單的跳轉,直接進入新的循環(huán);否則,在No—exitJ)模塊中做相應的中間運算,然后再跳 轉到新的循環(huán);兩次循環(huán)之間使能信號傳遞方式如下 當完成第一個循環(huán)基本模塊后,根據(jù)循環(huán)結束模塊里的br指令,將循環(huán)結束使能
信號Loop_eXit傳遞給跳轉到的模塊若兩次循環(huán)之間無中間運算,則分析模塊跳轉關系
找到下一個BLoopentryJ,將Loop—exit使能信號按照邏輯傳遞給BLoopentryJ ;否則,將
Loop_eXit使能信號按照邏輯傳遞給運算模塊使能信號,最后再分析模塊跳轉關系找到下
一個BLoopentryj,將運算模塊使能信號按照邏輯傳遞給BLoopentryJ 。 本發(fā)明的一種面向計數(shù)類循環(huán)的C-to-VHDL映射方法還可以處理循環(huán)嵌套結構。
具體方法為在NO_exit_0模塊嵌有循環(huán)基本結構;如果外層循環(huán)的循環(huán)體No—exitJ)中
無其他運算,直接進入內(nèi)層循環(huán),則外層循環(huán)的BLoopentryJ)使能信號按照邏輯直接傳遞
給內(nèi)層循環(huán)的BLoopentryJ ;否則,將外層循環(huán)的BLoopentryJ)使能信號按照邏輯傳遞
給外層循環(huán)體模塊使能信號No—exitJ),最后再將NO_exit_0按照邏輯傳遞給內(nèi)層循環(huán)的
BLoopentryj,從而完成外層循環(huán)與內(nèi)層循環(huán)間模塊使能信號的傳遞。 本發(fā)明的一種面向計數(shù)類循環(huán)的C-to-VHDL映射方法的映射裝置,由產(chǎn)生循環(huán)關
鍵變量的計數(shù)器,根據(jù)比較運算結果決定是否進行循環(huán)體內(nèi)運算的比較器,根據(jù)選擇開關
值獲取循環(huán)體外的數(shù)據(jù)值或循環(huán)體內(nèi)運算結果反饋值的選擇器,執(zhí)行循環(huán)體內(nèi)的運算操作
的運算器組成。 計數(shù)器,根據(jù)循環(huán)中對關鍵變量的操作類型,為循環(huán)關鍵變量進行加法計數(shù)或減 法計數(shù)。 比較器,比較循環(huán)關鍵變量值與循環(huán)的總次數(shù),滿足循環(huán)進行條件時,進入循環(huán)體 進行運算;不滿足循環(huán)進行條件時,跳出循環(huán),完成循環(huán)運算。 選擇器,當首次進入循環(huán)時,選擇循環(huán)體外數(shù)據(jù)對循環(huán)體內(nèi)數(shù)據(jù)輸入進行初始化; 否則,選擇循環(huán)體內(nèi)運算結果反饋值,對循環(huán)體內(nèi)輸入數(shù)據(jù)進行更新。
運算器,進入循環(huán)體后,根據(jù)循環(huán)體內(nèi)各種運算操作進行相應運算。 本發(fā)明提供了一種面向計數(shù)類循環(huán)的C-to-VHDL映射方法。讓軟件的核心結
構for循環(huán)移到硬件上執(zhí)行,從而加快其執(zhí)行效率,達到硬件加速實現(xiàn)循環(huán)的目的。本發(fā)
明通過對循環(huán)的控制信號與使能輸出信號進行明確的分離,實現(xiàn)高頻的循環(huán)基本模塊;同
時,通過對這兩組信號進行組合,可以實現(xiàn)任意形式的循環(huán)。本發(fā)明允許在循環(huán)路徑的任
意處靈活地加入各種運算模塊,并且對循環(huán)輸入沒有任何要求,支持循環(huán)體的break以及
continue控制。這些特點使得本發(fā)明有別于其他實現(xiàn)循環(huán)的設計方案。 本發(fā)明還提供了使用上述映射方法的映射裝置,用于解決實際應用中使用到本發(fā)
明上述方法的問題。 C語言與VHDL語言有相似的功能,但也有較大的不同。VHDL中雖然有循環(huán)結構,但 只能實現(xiàn)固定次數(shù)的循環(huán)即循環(huán)的初值、步長、終值都是靜態(tài)數(shù)據(jù)。固定次數(shù)的循環(huán)與C語 言的循環(huán)在功能上無法進行匹配,因此要實現(xiàn)循環(huán)就要將循環(huán)的結構打散,采用分支判斷 語句(IF)用時序設計完成循環(huán)的運算。每次時鐘到來時都對循環(huán)關鍵變量進行判斷,從而 決定是否進行循環(huán)體的操作。循環(huán)關鍵變量是指形如for(i = 0 ;i < b ;i++)中表示循環(huán) 初值、終值等的變量i。循環(huán)的操作流程類似于計數(shù)器,擴充的部分為根據(jù)計數(shù)器的值生 成相應的使能信號,其基本實現(xiàn)流程見錯誤!未找到引用源。。但是錯誤!未找到引用源。 所示流程中S202沒有將循環(huán)關鍵變量的"變量自加"與"循環(huán)有效"分開,每次判斷是否進 行循環(huán)體的操作將直接受循環(huán)體內(nèi)操作影響。這種實現(xiàn)方式層次結構不清晰,控制復雜,無 法靈活的實現(xiàn)多個循環(huán)的多種組合。 本發(fā)明通過提前循環(huán)關鍵變量的自加操作,將循環(huán)控制與循環(huán)體內(nèi)運算分開,從 而分離了循環(huán)的控制信號與使能輸出信號,使得循環(huán)控制簡潔,其實現(xiàn)流程如錯誤!未找 到引用源。所示。S301和S302中的重啟與自加分別是循環(huán)重啟(初始化)與步進的控制 信號,S303中的循環(huán)有效與循環(huán)完成是控制相應執(zhí)行模塊的控制信號。由于要進行模塊的 級聯(lián),因此所有的使能信號都為一個周期的高電平。使能信號在模塊之間按照邏輯進行傳 遞,從而完成循環(huán)對應的計算。使能信號的基本特征是只有一個周期的高電平。 一個周期 的高電平指的是模塊的使能信號為一個周期高電平,同時如果控制從該模塊轉移到下一級 模塊,則該模塊為相應的下一級生成一個周期高電平使能信號。 一個周期的高電平保證了 當循環(huán)體執(zhí)行需要多個時鐘節(jié)拍時,循環(huán)體相對應的模塊只被使能一個周期。該特性對其 它相應的模塊也有效。 本發(fā)明設計的循環(huán)基本模塊將各種信號進行了明確的定義,對循環(huán)基本模塊的自 由組合起到了決定性作用。若將循環(huán)有效與自身的自加相接,則實現(xiàn)了一個沒有循環(huán)體的 循環(huán);若將循環(huán)有效與一個運算模塊相接,運算模塊與自加相接,則實現(xiàn)了一個基本的循 環(huán)。若將基本循環(huán)的循環(huán)完成信號與另一個循環(huán)的重啟信號相接,則實現(xiàn)了 2個循環(huán)的并
列;若將循環(huán)的循環(huán)有效信號與另一個基本循環(huán)的重啟信號相接,基本循環(huán)的循環(huán)完成信 號與循環(huán)的自加信號相接,則實現(xiàn)了 2個循環(huán)的嵌套。按照實現(xiàn)循環(huán)并列和循環(huán)嵌套的原 理以此類推,便可實現(xiàn)任意形式的循環(huán)。 本發(fā)明的優(yōu)點在于將循環(huán)控制提前,同時分離了循環(huán)控制信號與數(shù)據(jù)運算使能信 號,從而使得循環(huán)控制變得簡潔,循環(huán)基本模塊最大時鐘頻率高。同時,更利于以后對循環(huán) 進行優(yōu)化,如循環(huán)流水化等。
圖1是循環(huán)基本模塊原理圖;圖2是循環(huán)的常規(guī)實現(xiàn)流程示意圖;圖3是模塊化 處理流程示意圖;圖4是運算單元處理流程示意圖;圖5是循環(huán)基本模塊結構圖;圖6是循 環(huán)的并列結構圖;圖7是循環(huán)的嵌套結構圖;圖8是PHI處理流程示意圖;圖9是單個循環(huán) (循環(huán)次數(shù)為3)波形圖;圖10是2個循環(huán)(循環(huán)次數(shù)都為3)順次波形圖;圖11是2個循 環(huán)(循環(huán)次數(shù)都為3)嵌套波形圖。
具體實施例方式
下面結合附圖舉例對本發(fā)明做更詳細地描述
1高頻的循環(huán)基本模塊
1. 1循環(huán)IR結構分析 本發(fā)明可以基于LLVM架構,利用LLVM作為前端將C語言中的for循環(huán)轉換成LLVM IR,然后對for循環(huán)的LLVM IR進行轉換處理。LLVM IR是一種獨立于機器架構的中間表達 式。 —個循環(huán)的BasicBlock(基本模塊)主要由LoopEntry (循環(huán)入口模塊),Loop_ exit(循環(huán)跳出模塊)及No—exit(循環(huán)執(zhí)行模塊)三部分組成,其中LoopEntry主要完成 數(shù)據(jù)的選擇、公共操作(循環(huán)可提前部分)及分支通路的選擇,No—exit完成循環(huán)體內(nèi)的操 作,Loop—exit完成循環(huán)完成后的操作。這些循環(huán)模塊間的關系如錯誤!未找到引用源。所 示。 錯誤!未找到引用源。中,通過PHI指令來進行數(shù)據(jù)選擇。PHI指令表示變量 在模塊使能信號有效時選擇相應的值。如% indvar = phi i32
, [% nextindvar, % Loop],這條PHI指令表示indvar變量在LoopHeader模塊使能信號有效時 取'0'值,而在Loop模塊使能信號有效時取next indvar這個變量的值。
錯誤!未找到引用源。中,BLoopentry通過br指令進行分支跳轉,根據(jù)跳轉結 果進入循環(huán)體或跳出循環(huán)。br指令表示根據(jù)比較指令結果,進行分支選擇,跳轉到相應 模塊。如br bool % tmp_19, label % BNo_exit, label % Loop_exit,這條br指令表示 BLoopentry根據(jù)tmp_19的值,進行分支選擇,若tmp_19為真,跳轉到BNo_exit ;否則跳轉 至lj Loop—exit。 1. 2循環(huán)關鍵變量處理 本發(fā)明通過分析模塊間的跳轉關系來識別循環(huán),找到BLoopentry ,然后處理
BLoopentry中循環(huán)關鍵變量。LLVM IR通過PHI指令對循環(huán)關鍵變量進行數(shù)據(jù)選擇,其數(shù)
據(jù)選擇流程如錯誤!未找到引用源。所示。
S801 :識別關鍵變量,初始化關鍵變量i ; S802 :對關鍵變量進行自加操作,更新關鍵變量i值, S803 :循環(huán)繼續(xù)時,執(zhí)行循環(huán)體運算操作; S804 :本次循環(huán)結束。 本發(fā)明的關鍵在于對循環(huán)關鍵變量的特殊處理方式
(1)識別循環(huán)關鍵變量
通過對模塊間的跳轉關系找到循環(huán)入口模塊判定是否進行循環(huán)的條件變量,通 過條件變量找到對應的比較指令,然后由比較指令的操作數(shù)得到關鍵變量,最后將關鍵變 量加入到KeyVariable數(shù)組中。
(2)將關鍵變量自加操作指令提前 讀取PHI指令,若該指令在KeyVariable中,則讀取其操作數(shù),然后將No_exit 模塊中對關鍵變量自加操作指令提前到LoopEntry模塊,并將自加操作指令加入到 KeyOperation數(shù)組中。
(3)忽略關鍵變量自加操作 在進行指令的翻譯時,如果該指令在KeyOpeartion數(shù)組中,則直接跳過。 經(jīng)過上述對PHI指令的特殊處理后,分離了循環(huán)的控制信號與使能輸出信號,從
而使得轉換后的循環(huán)基本模塊最大時鐘頻率高。同時,更有利于實現(xiàn)各種形式的for循環(huán),
增強了循環(huán)功能。 1. 3循環(huán)基本模塊的實現(xiàn) 本發(fā)明主要以循環(huán)關鍵變量為對象進行循環(huán)基本模塊的設計。將循環(huán)控制信號與 運算信號分開,其處理流程如錯誤!未找到引用源。所示。 S301 :當重啟信號有效時,首次進入循環(huán)判斷。利用圖l所示裝置中的比較器比較 循環(huán)關鍵變量值與n值。根據(jù)比較器結果對循環(huán)進行判斷,若循環(huán)有效,則進入循環(huán)體內(nèi)進 行相應運算,此時裝置內(nèi)的運算器開始工作,運算器處理流程如圖4所示;
S302:當重啟信號失效后,進入循環(huán)控制變量自加判斷,不自加則重新回到重啟判 斷部分;否則利用裝置中的計數(shù)器對循環(huán)關鍵變量進行計數(shù)操作。 S303 :自加或重啟后,裝置中的選擇器對關鍵變量以及運算器的運算結果進行選
擇。然后再次利用比較器比較選擇器對關鍵變量的選擇結果與n值的大小關系,根據(jù)比較
器產(chǎn)生結果判斷是否滿足循環(huán)有效的條件,滿足再次進入循環(huán);不滿足則完成整個循環(huán)。 S304 :完成本次循環(huán)操作。 實現(xiàn)循環(huán)基本模塊轉換處理步驟如下。 (1)分析模塊跳轉關系找到LoopEntry。 (2)處理PHI指令,完成對循環(huán)關鍵變量的特殊處理。通過LLVM中的dyn—cast指 令對PHI指令中的各個操作數(shù)進行指令類型轉換。如果操作數(shù)能轉換為指令,并且轉換成 的指令類型為加法或者減法則該操作數(shù)為關鍵變量。同時將該操作數(shù)所在的加法或減法運 算提前到PHI指令所在模塊內(nèi)進行運算。 (3)判斷關鍵變量,產(chǎn)生循環(huán)控制信號。根據(jù)循環(huán)控制信號,進入或跳出循環(huán)體操
作。若進入循環(huán)體,則循環(huán)地進行循環(huán)體內(nèi)的相關運算操作,直到循環(huán)關鍵變量不滿足循環(huán)
有效的條件,此時產(chǎn)生循環(huán)無效信號,從而跳出循環(huán),進行循環(huán)體外的相關運算操作。 (4)No_exit模塊轉換。將No_exit這個模塊號作為循環(huán)體操作模塊的使能信號,
為高電平時表示循環(huán)繼續(xù)進行。No—exit模塊內(nèi)的所有運算操作轉換為VHDL語言里對應的
基本操作。步驟(2)中被提前的加法或減法運行在No—exit模塊內(nèi)不再運算。 (5)Loop—exit模塊轉換。將Loop—exit這個模塊號作為循環(huán)結束使能信號,為高
電平時表示循環(huán)結束。Loop—exit模塊內(nèi)的所有運算操作轉換為VHDL語言里對應的基本操作。
錯誤!未找到引用源。為循環(huán)基本塊的硬件裝置圖,由計數(shù)器、比較器、選擇器、運 算器四部分組成。計數(shù)器用于處理循環(huán)關鍵變量i ;比較器為BLoopentry中,br指令進行 分支選擇依據(jù);選擇器用于PHI指令的數(shù)據(jù)選擇;運算器則用于進行循環(huán)體內(nèi)的運算,這四 部分的具體內(nèi)容由實際進行轉換的C代碼的結構來決定。
2循環(huán)組合的實現(xiàn) 本發(fā)明實現(xiàn)循環(huán)組合的原理是通過多個高頻的循環(huán)基本模塊進行相應的組合實
現(xiàn)任意形式的循環(huán)組合。 2. 1循環(huán)并列 錯誤!未找到引用源。為兩組循環(huán)所形成的并列結構。若兩次循環(huán)之間沒有中間 運算,則錯誤!未找到引用源。中的No—exitJ)模塊只是進行簡單的跳轉,直接進入新的循 環(huán);否則,在No—exitJ)模塊中做相應的中間運算,然后再跳轉到新的循環(huán)。利用實現(xiàn)循環(huán) 基本模塊的方法順序實現(xiàn)兩個循環(huán)基本模塊,從而實現(xiàn)循環(huán)并列。兩次循環(huán)之間使能信號 傳遞方式如下 當完成第一個循環(huán)基本模塊后,根據(jù)循環(huán)結束模塊里的br指令,將循環(huán)結束使能 信號Loop_eXit傳遞給跳轉到的模塊若兩次循環(huán)之間無中間運算,則分析模塊跳轉關系 找到下一個BLoopentryJ,將Loop—exit使能信號按照邏輯傳遞給BLoopentryJ ;否則,將 Loop_eXit使能信號按照邏輯傳遞給運算模塊使能信號,最后再分析模塊跳轉關系找到下 一個BLoopentryj,將運算模塊使能信號按照邏輯傳遞給BLoopentryJ 。
2.2循環(huán)嵌套 錯誤!未找到引用源。為嵌套結構,在No—exitJ)模塊(循環(huán)體)內(nèi)又有圖5所 示的循環(huán)基本結構。實現(xiàn)循環(huán)嵌套結構里的各個循環(huán)基本模塊的方法同實現(xiàn)單個循環(huán)基 本模塊的方法相同。實現(xiàn)循環(huán)嵌套結構的關鍵在于內(nèi)外層循環(huán)模塊之間模塊使能信號如 何傳遞。錯誤!未找到引用源。中,如果外層循環(huán)的循環(huán)體No—exitJ)中無其他運算,直 接進入內(nèi)層循環(huán),則外層循環(huán)的BLoopentryJ)使能信號按照邏輯直接傳遞給內(nèi)層循環(huán)的 BLoopentryJ ;否則,將外層循環(huán)的BLoopentryJ)使能信號按照邏輯傳遞給外層循環(huán)體模 塊使能信號NO_exit_0,最后再將NO_exit_0按照邏輯傳遞給內(nèi)層循環(huán)的BLoopentryj,從 而完成外層循環(huán)與內(nèi)層循環(huán)間模塊使能信號的傳遞。
3循環(huán)實現(xiàn)結果 利用面向計數(shù)類循環(huán)的C-to-VHDL映射方法與裝置,分別處理單個循環(huán)、并列循 環(huán)以及嵌套循環(huán)。將處理得到的VHDL程序利用Xilinx ISE工具仿真綜合,可得到圖9、圖 10以及圖ll所示的仿真結果。 錯誤!未找到引用源。為l個循環(huán)的波形圖,循環(huán)次數(shù)為3。從圖中看出,該示例 中循環(huán)體執(zhí)行時間為1個時鐘節(jié)拍,即EN與No_exit的相位差為1個周期。在實際的應用 中,循環(huán)體可能要執(zhí)行多個時鐘節(jié)拍,則EN在相應的節(jié)拍數(shù)完成之后才變?yōu)楦唠娖?。錯誤! 未找到引用源。為2個循環(huán)順次連接的波形圖,2個循環(huán)的循環(huán)次數(shù)都為3。錯誤!未找到 引用源。為2個循環(huán)嵌套連接的波形圖,內(nèi)外循環(huán)的循環(huán)次數(shù)都為3。在錯誤!未找到引用 源。中,外層循環(huán)的EN與No—exit相差9個周期。因為在內(nèi)層循環(huán)完成全部運算(循環(huán)) 之后,外層循環(huán)才步進一次。
權利要求
一種面向計數(shù)類循環(huán)的C-to-VHDL映射方法,其特征是提前循環(huán)關鍵變量的自加操作,將循環(huán)控制與循環(huán)體內(nèi)運算分開,從而分離了循環(huán)的控制信號與使能輸出信號;提前循環(huán)關鍵變量的自加操作的方法如下通過分析模塊跳轉關系后,找到循環(huán)入口模塊;進入循環(huán)入口模塊后,尋找循環(huán)關鍵變量;找到循環(huán)關鍵變量后,將循環(huán)關鍵的自加操作由循環(huán)體執(zhí)行模塊提前到循環(huán)入口模塊,使得循環(huán)的控制操作與循環(huán)體的運算操作分開;最終分離了循環(huán)的控制信號與使能輸出信號。
2. 根據(jù)權利要求1所述的一種面向計數(shù)類循環(huán)的C-to-VHDL映射方法,其特征是實現(xiàn) 循環(huán)的具體處理步驟如下(1) 分析模塊跳轉關系找到LoopEntry ;(2) 處理PHI指令,提前循環(huán)關鍵變量的自加操作;通過LLVM中的dyn—cast指令對rai 指令中的各個操作數(shù)進行指令類型轉換;如果操作數(shù)能轉換為指令,并且轉換成的指令類 型為加法或者減法則該操作數(shù)為關鍵變量;同時將該操作數(shù)所在的加法或減法運算由循環(huán) 體執(zhí)行模塊(No_exit)提前到PHI指令所在模塊內(nèi)進行運算;(3) 判斷關鍵變量,產(chǎn)生循環(huán)控制信號;根據(jù)循環(huán)控制信號,進入或跳出循環(huán)體操作; 若進入循環(huán)體,則進行循環(huán)體內(nèi)的相關運算操作,直到循環(huán)關鍵變量不滿足循環(huán)有效的條 件,此時產(chǎn)生循環(huán)無效信號,從而跳出循環(huán),進行循環(huán)體外的相關運算操作;(4) No_exit模塊轉換;將No_exit這個模塊號作為循環(huán)體操作模塊的使能信號,為高 電平時表示循環(huán)繼續(xù)進行;No_eXit模塊內(nèi)的所有運算操作轉換為VHDL語言里對應的基本 操作;步驟(2)中被提前的加法或減法運行在No—exit模塊內(nèi)不再運算;(5) Loop_eXit模塊轉換;將Loop_eXit這個模塊號作為循環(huán)結束使能信號,為高電平 時表示循環(huán)結束;L00p_eXit模塊內(nèi)的所有運算操作轉換為VHDL語言里對應的基本操作。
3. 根據(jù)權利要求2所述的一種面向計數(shù)類循環(huán)的C-to-VHDL映射方法,其特征是實現(xiàn) 循環(huán)基本模塊的處理步驟如下5301 :當重啟信號有效時,首次進入循環(huán)判斷;利用比較器比較循環(huán)關鍵變量值與n 值;根據(jù)比較器結果對循環(huán)進行判斷,若循環(huán)有效,則進入循環(huán)體內(nèi)進行相應運算,運算器 開始工作;5302 :當重啟信號失效后,進入循環(huán)控制變量自加判斷,不自加則重新回到重啟判斷部 分;否則利用計數(shù)器對循環(huán)關鍵變量進行計數(shù)操作;5303 :自加或重啟后,選擇器對關鍵變量以及運算器的運算結果進行選擇;然后再次 利用比較器比較選擇器對關鍵變量的選擇結果與n值的大小關系,根據(jù)比較器產(chǎn)生結果判 斷是否滿足循環(huán)有效的條件,滿足再次進入循環(huán);不滿足則完成整個循環(huán);S304:完成本次循環(huán)操作。
4. 根據(jù)權利要求2所述的一種面向計數(shù)類循環(huán)的C-to-VHDL映射方法,其特征是能 夠處理由兩組循環(huán)所形成的并列循環(huán)結構;處理并列循環(huán)結構的方法如下若兩次循環(huán)之 間沒有中間運算,則NO_exit_0模塊只是進行簡單的跳轉,直接進入新的循環(huán);否則,在No_ exit_0模塊中做相應的中間運算,然后再跳轉到新的循環(huán);兩次循環(huán)之間使能信號傳遞方 式如下當完成第一個循環(huán)基本模塊后,根據(jù)循環(huán)結束模塊里的br指令,將循環(huán)結束使能信號Loop—exit傳遞給跳轉到的模塊若兩次循環(huán)之間無中間運算,則分析模塊跳轉關系找 到下一個BLoopentry_l,將Loop_exit使能信號按照邏輯傳遞給BLoopentry_l ;否則,將 Loop_eXit使能信號按照邏輯傳遞給運算模塊使能信號,最后再分析模塊跳轉關系找到下 一個BLoopentryJ ,將運算模塊使能信號按照邏輯傳遞給BLoopentryJ 。
5. 根據(jù)權利要求2所述的一種面向計數(shù)類循環(huán)的C-to-VHDL映射方法,其特征是能 夠處理由兩組循環(huán)所形成的嵌套循環(huán)結構;處理嵌套循環(huán)結構的方法如下如果外層循環(huán)的循環(huán)體No—exitJ)中無其他運算,直接進入內(nèi)層循環(huán),則外層循環(huán)的 BLoopentryJ)使能信號按照邏輯直接傳遞給內(nèi)層循環(huán)的BLoopentryJ ;否則,將外層循環(huán) 的BLoopentryJ)使能信號按照邏輯傳遞給外層循環(huán)體模塊使能信號NO_exit_0,最后再將 No—exitJ)按照邏輯傳遞給內(nèi)層循環(huán)的BLoopentryJ,從而完成外層循環(huán)與內(nèi)層循環(huán)間模 塊使能信號的傳遞。
6. —種面向計數(shù)類循環(huán)的C-to-VHDL映射方法的映射裝置,其特征是由產(chǎn)生循環(huán)關 鍵變量的計數(shù)器,根據(jù)比較運算結果決定是否進行循環(huán)體內(nèi)運算的比較器,根據(jù)選擇開關 值獲取循環(huán)體外的數(shù)據(jù)值或循環(huán)體內(nèi)運算結果反饋值的選擇器,執(zhí)行循環(huán)體內(nèi)的運算操作 的運算器組成。
全文摘要
本發(fā)明提供的是一種面向計數(shù)類循環(huán)的C-to-VHDL映射方法及映射裝置。裝置由產(chǎn)生循環(huán)關鍵變量的計數(shù)器,根據(jù)比較運算結果決定是否進行循環(huán)體內(nèi)運算的比較器,根據(jù)選擇開關值獲取循環(huán)體外的數(shù)據(jù)值或循環(huán)體內(nèi)運算結果反饋值的選擇器,執(zhí)行循環(huán)體內(nèi)的運算操作的運算器組成。將C語言實現(xiàn)的計數(shù)類循環(huán)程序自動轉換成能在Xilinx系列FPGA上實現(xiàn)的VHDL程序。該方法以時序電路為基礎,通過分離循環(huán)的控制信號與使能輸出信號,提前循環(huán)控制,將C語言中的計數(shù)類循環(huán)分解為一種時鐘頻率較高的循環(huán)基本模塊。通過對多個高頻的循環(huán)基本模塊的組合,可實現(xiàn)多種形式的C語言循環(huán)。
文檔編號G06F9/44GK101719068SQ20101003242
公開日2010年6月2日 申請日期2010年1月6日 優(yōu)先權日2010年1月6日
發(fā)明者吳艷霞, 孫延騰, 楊敏, 楊杰, 牛曉霞, 顧國昌 申請人:哈爾濱工程大學