版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 基于SystemC的語音備忘器設(shè)計</p><p><b> 摘要:</b></p><p> 隨著VLSI的集成度越來越高,設(shè)計也越趨復(fù)雜。傳統(tǒng)的設(shè)計方法如原理圖輸入、HDL語言描述在進(jìn)行復(fù)雜系統(tǒng)設(shè)計時,設(shè)計效率往往比較低。特別是在算法由軟件轉(zhuǎn)化為硬件的環(huán)節(jié)上,傳統(tǒng)的設(shè)計方法的效率不是很高,設(shè)計者往往要耗費(fèi)大量的時間和精力手工進(jìn)行算法的轉(zhuǎn)化
2、。為解決這些問題,一種新的系統(tǒng)級的設(shè)計方法SYSTEM C 被提出。SYSTEM C是一種方法,也是一個C++庫,用SYSTEM C可以很方便地實現(xiàn)一個軟件算法的硬件實現(xiàn),以及完成一個系統(tǒng)級的設(shè)計。</p><p> 關(guān)鍵詞:SystemC、語音備忘器、UML</p><p> SystemC的開發(fā)平臺</p><p><b> 概述</b&g
3、t;</p><p> 隨著VLSI的集成度越來越高,設(shè)計也越趨復(fù)雜。一個系統(tǒng)的設(shè)計往往不僅需要硬件設(shè)計人員的參與,也需要有軟件設(shè)計人員的參與。軟件設(shè)計人員與硬件設(shè)計人員之間的相互協(xié)調(diào)就變的格外重要,它直接關(guān)系到工作的效率以及整個系統(tǒng)設(shè)計的成敗。傳統(tǒng)的設(shè)計方法沒有使軟件設(shè)計工作與硬件設(shè)計工作協(xié)調(diào)一致,而是將兩者的工作割裂開來。軟件算法的設(shè)計人員在系統(tǒng)設(shè)計后期不能為硬件設(shè)計人員的設(shè)計提供任何的幫助。同時現(xiàn)在有些大
4、規(guī)模集成電路設(shè)計中往往帶有DSP Core或其它CPU Core。這些都使得單純地用原理圖或硬件描述語言來設(shè)計、仿真這么復(fù)雜的系統(tǒng)變得十分困難。System C就是在這些矛盾的背景下提出的。它的出現(xiàn)為復(fù)雜的系統(tǒng)設(shè)計提供了一條有效的解決途徑。 System C 是由 Synospy Inc. 提出的,目前最新的版本為V2.0。它提出的目的就是以一種系統(tǒng)設(shè)計的思想進(jìn)行系統(tǒng)設(shè)計。它將軟件算法與硬件實現(xiàn)很好的結(jié)合在一起,提高了整個系統(tǒng)設(shè)計的效
5、率和正確性。 </p><p> System C 是一個C++ 庫,也是一種使設(shè)計者可以有效地設(shè)計出一個軟件算法的準(zhǔn)確循環(huán)模型,硬件結(jié)構(gòu)以及系統(tǒng)級設(shè)計的方法。設(shè)計者可以用System C開發(fā)工具或在標(biāo)準(zhǔn)C++開發(fā)工具中加如System C庫制作系統(tǒng)級模型,快速地仿真和優(yōu)化設(shè)計,以及研究不同的算法,并且為硬件和軟件設(shè)計人員提供一個設(shè)計系統(tǒng)的可執(zhí)行規(guī)范。可執(zhí)行規(guī)范本質(zhì)上是一個C++程序,它顯示了和設(shè)計系統(tǒng)同樣的性
6、能,為軟件設(shè)計人員和硬件設(shè)計人員提供了一個設(shè)計的標(biāo)準(zhǔn)。 </p><p> System C 庫提供了創(chuàng)造系統(tǒng)結(jié)構(gòu)模型的必須結(jié)構(gòu),包括那些在C++沒有的功能如硬件時序,并行和觸發(fā)功能。C++這種面對象語言提供了通過增加類來擴(kuò)展語言的能力,而這種能力是C語言所不具備的。因此,System C使用大家熟悉的C++語言和開發(fā)工具。 </p><p> SYSTEM C的特點</p&g
7、t;<p> System C 支持對硬件和軟件的聯(lián)合設(shè)計,支持描述一個既包含硬件部分也包含軟件部分的復(fù)雜系統(tǒng)結(jié)構(gòu)。它也支持對接口的描述,有以下幾個顯著的特點: </p><p> 1.System C可以為軟件設(shè)計人員和硬件設(shè)計人員提供一個系統(tǒng)的可執(zhí)行規(guī)范。設(shè)計人員使用該可執(zhí)行規(guī)范可以避免設(shè)計中矛盾和錯誤的產(chǎn)生,并確保設(shè)計的完備性。這是應(yīng)為在設(shè)計可執(zhí)行規(guī)范時,系統(tǒng)設(shè)計者必須設(shè)計出也一個和系統(tǒng)具
8、有同樣工作狀態(tài)的程序,通過這個程序可以發(fā)掘出潛在的矛盾和錯誤,并將這些矛盾和錯誤消除在整個設(shè)計的開始階段,而不是在整個系統(tǒng)進(jìn)行調(diào)試階段才發(fā)現(xiàn)和解決這些矛盾和錯誤。這個程序還可以幫助設(shè)計者確保整個系統(tǒng)設(shè)計的完備性。 </p><p> 2.設(shè)計人員利用這個可執(zhí)行的系統(tǒng)規(guī)范,還可以發(fā)現(xiàn)設(shè)計中概念模糊的地方。無論什么時候,設(shè)計人員對設(shè)計產(chǎn)生疑惑,就可以運(yùn)行這個可執(zhí)行程序以明確在這個問題上系統(tǒng)設(shè)計人員是如何處理的,從而
9、確保系統(tǒng)設(shè)計的正確性。而現(xiàn)在的設(shè)計方法不能使設(shè)計人員方便迅速的解決這些疑惑。甚至這些疑惑是系統(tǒng)設(shè)計人員也不曾考慮過,這可能導(dǎo)致系統(tǒng)要重新進(jìn)行設(shè)計。 </p><p> 3.在系統(tǒng)設(shè)計被實現(xiàn)以前,設(shè)計人員還可以通過用System C設(shè)計的系統(tǒng)可執(zhí)行規(guī)范來驗證整個系統(tǒng)設(shè)計。這樣可以避免由于在系統(tǒng)設(shè)計上的失誤,而使系統(tǒng)實現(xiàn)不能達(dá)到要求。現(xiàn)在的設(shè)計方法不能提供這樣的手段在設(shè)計完成前進(jìn)行系統(tǒng)的驗證,對系統(tǒng)的驗證必須是在系
10、統(tǒng)設(shè)計完后。即使在完成前進(jìn)行驗證,由于不能完全模擬實際系統(tǒng)的工作,其結(jié)果也只能作為一種參考。 </p><p> 4.System C設(shè)計的可執(zhí)行規(guī)范所使用的TESTBENCH文件可以通過小范圍的修改或直接用在實現(xiàn)后的系統(tǒng)仿真。這就為設(shè)計實現(xiàn)人員帶來很大的好處,他們不必花很多的時間去編寫用來驗證實現(xiàn)后系統(tǒng)正確性的TESTBENCH文件。而現(xiàn)在采用的設(shè)計方法所使用的TESTBENCH文件卻沒有提供這樣的便利條件。
11、這是應(yīng)為軟件設(shè)計人員和硬件設(shè)計人員兩者的設(shè)計思想和設(shè)計手段都是不同的,一個軟件設(shè)計人員所使用的TESTBENCH文件并不能被硬件設(shè)計人員使用,甚至不能給硬件設(shè)計人員任何幫助。</p><p> SYSTEM C設(shè)計與傳統(tǒng)設(shè)計比較</p><p> 現(xiàn)在的系統(tǒng)設(shè)計一般是由系統(tǒng)工程師用C語言或C++語言設(shè)計出一個系統(tǒng)模型,并在系統(tǒng)級層次上檢驗概念和算法。當(dāng)這些概念和算法被檢驗為正確無誤時,
12、C/C++模塊被分解為功能相對獨(dú)立的子模塊。這些相對對立的子模塊由硬件設(shè)計人員手工地轉(zhuǎn)化為VHDL或Verilog語言用以硬件實現(xiàn)。這一個設(shè)計流程被顯示在圖1中。</p><p> 從圖1所示的設(shè)計流程中我們可以發(fā)現(xiàn)以下幾個問題: </p><p> 1、人工將C\C++程序轉(zhuǎn)換為HDL程序容易產(chǎn)生錯誤。在現(xiàn)在的這種設(shè)計方法中,系統(tǒng)工程師先按期望的設(shè)計要求設(shè)計出一個C模塊,并驗證這個模
13、塊使其達(dá)到期望的設(shè)計要求。然后系統(tǒng)工程師所設(shè)計的C模塊被硬件設(shè)計人員手工轉(zhuǎn)換為HDL模塊。這個轉(zhuǎn)換過程不僅容易產(chǎn)生錯誤,而且還很浪費(fèi)時間。這是因為C\C++語言和HDL語言有著顯著的區(qū)別。首先,HDL的處理方式比C\C++的復(fù)雜。C\C++程序采用順序執(zhí)行的處理方式,而HDL程序中既有順序執(zhí)行也有并行執(zhí)行的處理方式。要將C\C++程序轉(zhuǎn)化為HDL程序必然要引入一些控制信號,由這些信號控制HDL程序的運(yùn)行,但這樣也容易產(chǎn)生錯誤。其次,C\
14、C++語言不涉及到時序關(guān)系。由于C\C++語言不支持對時序的描述,系統(tǒng)工程師設(shè)計的系統(tǒng)模型只是驗證了概念和算法,而只能對時間耗費(fèi)上有一個大概的估計。這就使得硬件實現(xiàn)時,為滿足系統(tǒng)在時間上的要求,硬件設(shè)計人員必須對軟件算法進(jìn)行一定的改造或優(yōu)化。而這些改造或優(yōu)化也有可能引入各種錯誤。 </p><p> 2、系統(tǒng)模塊和HDL模塊間缺乏聯(lián)系。當(dāng)系統(tǒng)模塊被轉(zhuǎn)換為HDL模塊后,HDL模塊成為整個系統(tǒng)設(shè)計的焦點。為適應(yīng)硬件
15、實現(xiàn)的特點,硬件設(shè)計人員會更改系統(tǒng)設(shè)計人員的設(shè)計,但這種更改只是在HDL模塊中進(jìn)行,而系統(tǒng)設(shè)計人員設(shè)計的C模塊并沒有因此更改。這就使得系統(tǒng)工程師設(shè)計的C模塊和當(dāng)前硬件設(shè)計人員設(shè)計的HDL模塊缺乏必要的聯(lián)系。當(dāng)硬件設(shè)計人員遇到概念模糊或理解錯誤的地方時,往往不能馬上從C模塊中得到明確的解答。此時,C模塊的設(shè)計人員也不一定能為HDL設(shè)計人員提供有效的幫助。 </p><p> 3、多系統(tǒng)測試。不但C模塊要轉(zhuǎn)換為HD
16、L模塊,對C模塊的測試也要人工轉(zhuǎn)換為在HDL環(huán)境下的測試。這種轉(zhuǎn)換也很復(fù)雜,而且浪費(fèi)時間。HDL設(shè)計人員是根據(jù)他所設(shè)計的HDL模塊和系統(tǒng)要求來設(shè)計TESTBENCH,這使得硬件設(shè)計人員不可能利用軟件設(shè)計人員所使用的測試文件。同時,HDL人員要設(shè)計出一個好的TESTBENCH也需要比較長的時間。</p><p> 為解決在現(xiàn)在設(shè)計流程中所帶來的種種弊端,一種全新的設(shè)計流程被提出,這就是System C設(shè)計流程。它
17、能很好的解決上面所提到的各種設(shè)計弊端,大大提高設(shè)計效率。圖2是System C的硬件設(shè)計流程。</p><p> 這種設(shè)計方法與現(xiàn)在常用的設(shè)計方法相比有很多優(yōu)點: </p><p> 1、精煉的設(shè)計方法。使用System C設(shè)計系統(tǒng),系統(tǒng)設(shè)計人員不必花費(fèi)很大的精力將整個系統(tǒng)設(shè)計由C語言描述轉(zhuǎn)換為HDL描述。系統(tǒng)設(shè)計人員可以通過在C模塊中很小的區(qū)域范圍內(nèi)加入必要的硬件和時序結(jié)構(gòu)描述,從而
18、將C模塊方便準(zhǔn)確地轉(zhuǎn)化為一個有效的硬件設(shè)計,而避免將另行設(shè)計一個硬件模塊。利用System C設(shè)計方法,設(shè)計人員可以很輕松地實現(xiàn)一個設(shè)計的更改,或在優(yōu)化算法時檢測出一些設(shè)計錯誤并及時修改。 </p><p> 2、單一語言書寫。使用System C設(shè)計系統(tǒng),整個設(shè)計都用一種語言設(shè)計系統(tǒng),降低了對設(shè)計人員的要求,減少了語言轉(zhuǎn)換時所造成的錯誤。這一優(yōu)點也使得設(shè)計人員可以在一個比較高的層次上進(jìn)行系統(tǒng)模塊設(shè)計。在較高層
19、次的設(shè)計會導(dǎo)致產(chǎn)生小的設(shè)計代碼,使設(shè)計和仿真的速度比傳統(tǒng)的設(shè)計方法要快很多。這一點是很顯著的。</p><p> SystemC的開發(fā)流程</p><p> 用SystemC可以在抽象層次的不同級別描述系統(tǒng)。在系統(tǒng)最高層的系統(tǒng)級可以用C/C++描述系統(tǒng)的功能和算法。在系統(tǒng)的硬件實現(xiàn)部分可以在行為級到RTL級用SystemC的類來進(jìn)行描述。系統(tǒng)的軟件部分自然可以用C/C++語言描述。由此
20、可見針對系統(tǒng)的不同部分,SystemC都可以在不同的抽象層次對其進(jìn)行描述,而且這些描述在系統(tǒng)仿真時可以協(xié)同工作。</p><p> 用SystemC不僅可以描述要開發(fā)的系統(tǒng)本身,還可以描述系統(tǒng)的測試平臺以提供測試信號用于系統(tǒng)的仿真。一個熟悉C++語言的用戶只要了解類庫中各種類引入的語義就可以用SystemC編程。SystemC由一組描述類的頭文件和一個包含仿真核的連接庫所組成,在用戶的描述程序中必須包括相應(yīng)的頭
21、文件,然后可以用通常的ANSI C++編譯器編譯該程序。在連接時要調(diào)用SystemC的連接庫產(chǎn)生可執(zhí)行的系統(tǒng)仿真程序。整個開發(fā)流程如圖3所示。</p><p> SystemC的建模特點</p><p> SystemC語言的特點就是能夠支持對復(fù)雜系統(tǒng)的設(shè)計。一個復(fù)雜的系統(tǒng)設(shè)計一般都要涉及軟件和硬件兩個方面,SystemC在這兩個方面都有其獨(dú)到之處。它可以在任何C++集成環(huán)境中描述硬件
22、和軟件,以及它們之間的接口。SystemC語言平臺提供的建模元素和建模能力主要包括以下內(nèi)容:</p><p> 模塊語句:SystemC中定義了“模塊”類,它相當(dāng)于C++中的類定義。它是一個層次式設(shè)計的入口,一個模塊可以嵌套其他模塊;</p><p> 進(jìn)程語言:進(jìn)程被包含在模塊中,用來描述模塊的功能。在SystemC中有三種不同類型進(jìn)程以滿足不同軟、硬件設(shè)計人員的需求;</p&
23、gt;<p> 端口語句:用來描述模塊和外界通信的端口。SystemC中支持單向和雙向的端口;</p><p> 信號語句:信號主要用來實現(xiàn)模塊間以及模塊內(nèi)部各進(jìn)程間的通訊。SystemC支持單驅(qū)動和多驅(qū)動的信號。多驅(qū)動的信號可以有多個驅(qū)動,就是通常說的總線(BUS);</p><p> 豐富的數(shù)據(jù)類型:SystemC提供豐富的數(shù)據(jù)類型以滿足多種抽象模型,固定精度的數(shù)據(jù)
24、類型可用于快速仿真,任意精度的數(shù)據(jù)類型可用于大量數(shù)據(jù)的計算,定點數(shù)據(jù)類型可用來實現(xiàn)DSP;</p><p> 時鐘語句:時鐘在同步電路設(shè)計中是一個非常重要的角色,而C/C++在描述系統(tǒng)時卻很難表達(dá)時鐘。SystemC中對時鐘進(jìn)行了描述,并把它當(dāng)作一種特殊的信號。時鐘為仿真過程提供了時間基準(zhǔn),SystemC同時還支持在同一系統(tǒng)中的多個時鐘,以及任意相位的時鐘;</p><p> 通訊協(xié)議
25、:SystemC支持多層通訊協(xié)議,用來描述各種抽象級別的模型和系統(tǒng)I/O協(xié)議;</p><p> 波形跟蹤:SystemC支持VCD、WIF 和ISDB格式波形的跟蹤。</p><p><b> UML統(tǒng)一建模語言</b></p><p><b> 概論</b></p><p> UML與S
26、ystemC的絕妙搭配形成一股新式的芯片設(shè)計風(fēng)潮。他們都可以用來呈現(xiàn)軟硬件設(shè)計,最大的不同之處在于,UML是一種圖形語言,而SystemC則是程序語言。當(dāng)芯片設(shè)計的復(fù)雜度不斷增高時,SystemC代碼機(jī)會變得越來越難以掌握,所以會需要通過UML的圖形式設(shè)計來呈現(xiàn)真題的設(shè)計,再對應(yīng)生成SystemC代碼以得出更細(xì)致的設(shè)計。</p><p> UML的目標(biāo)是以面向?qū)ο髨D的方式來描述任何類型的系統(tǒng),具有很寬的應(yīng)用領(lǐng)域
27、。其中最常用的是建立軟件系統(tǒng)的模型,但它同樣可以用于描述非軟件領(lǐng)域的系統(tǒng),如機(jī)械系統(tǒng)、企業(yè)機(jī)構(gòu)或業(yè)務(wù)過程,以及處理復(fù)雜數(shù)據(jù)的信息系統(tǒng)、具有實時要求的工業(yè)系統(tǒng)或工業(yè)過程等??傊琔ML是一個通用的標(biāo)準(zhǔn)建模語言,可以對任何具有靜態(tài)結(jié)構(gòu)和動態(tài)行為的系統(tǒng)進(jìn)行建模。</p><p> 此外,UML適用于系統(tǒng)開發(fā)過程中從需求規(guī)格描述到系統(tǒng)完成后測試的不同階段。在需求分析階段,可以用用例來捕獲用戶需求。通過用例建模,描述對系
28、統(tǒng)感興趣的外部角色及其對系統(tǒng)(用例)的功能要求。分析階段主要關(guān)心問題域中的主要概念(如抽象、類和對象等)和機(jī)制,需要識別這些類以及它們相互間的關(guān)系,并用UML類圖來描述。為實現(xiàn)用例,類之間需要協(xié)作,這可以用UML動態(tài)模型來描述。在分析階段,只對問題域的對象(現(xiàn)實世界的概念)建模,而不考慮定義軟件系統(tǒng)中技術(shù)細(xì)節(jié)的類(如處理用戶接口、數(shù)據(jù)庫、通訊和并行性等問題的類)。這些技術(shù)細(xì)節(jié)將在設(shè)計階段引入,因此設(shè)計階段為構(gòu)造階段提供更詳細(xì)的規(guī)格說明。
29、</p><p> 編程(構(gòu)造)是一個獨(dú)立的階段,其任務(wù)是用面向?qū)ο缶幊陶Z言將來自設(shè)計階段的類轉(zhuǎn)換成實際的代碼。在用UML建立分析和設(shè)計模型時,應(yīng)盡量避免考慮把模型轉(zhuǎn)換成某種特定的編程語言。因為在早期階段,模型僅僅是理解和分析系統(tǒng)結(jié)構(gòu)的工具,過早考慮編碼問題十分不利于建立簡單正確的模型。</p><p> UML模型還可作為軟件測試階段的依據(jù)。系統(tǒng)通常需要經(jīng)過單元測試、集成測試、系統(tǒng)測
30、試和驗收測試。不同的測試小組使用不同的UML圖作為測試依據(jù):單元測試使用類圖和類規(guī)格說明;集成測試使用部件圖和合作圖;系統(tǒng)測試使用用例圖來驗證系統(tǒng)的行為;驗收測試由用戶進(jìn)行,以驗證系統(tǒng)測試的結(jié)果是否滿足在分析階段確定的需求。</p><p> 總之,標(biāo)準(zhǔn)建模語言UML適用于以面向?qū)ο蠹夹g(shù)來描述任何類型的系統(tǒng),而且適用于系統(tǒng)開發(fā)的不同階段,從需求規(guī)格描述直至系統(tǒng)完成后的測試和維護(hù)。</p><
31、p><b> UML的特點</b></p><p> 標(biāo)準(zhǔn)建模語言UML的主要特點可以歸結(jié)為三點:</p><p> ?。?) UML統(tǒng)一了Booch、OMT和OOSE等方法中的基本概念。</p><p> ?。?) UML還吸取了面向?qū)ο蠹夹g(shù)領(lǐng)域中其他流派的長處,其中也包括非OO方法的影響。UML符號表示考慮了各種方法的圖形表示,刪
32、掉了大量易引起混亂的、多余的和極少使用的符號,也添加了一些新符號。因此,在UML中匯入了面向?qū)ο箢I(lǐng)域中很多人的思想。這些思想并不是UML的開發(fā)者們發(fā)明的,而是開發(fā)者們依據(jù)最優(yōu)秀的OO方法和豐富的計算機(jī)科學(xué)實踐經(jīng)驗綜合提煉而成的。</p><p> (3)UML在演變過程中還提出了一些新的概念。在UML標(biāo)準(zhǔn)中新加了模板(Stereotypes)、職責(zé)(Responsibilities)、擴(kuò)展機(jī)制(Extensib
33、ility mechanisms)、線程(Threads)、過程(Processes)、分布式(Distribution)、并發(fā)(Concurrency)、模式(Patterns)、合作(Collaborations)、活動圖(Activity diagram)等新概念,并清晰地區(qū)分類型(Type)、類(Class)和實例(Instance)、細(xì)化(Refinement)、接口(Interfaces)和組件(Components)等概念
34、。</p><p> 因此可以認(rèn)為,UML是一種先進(jìn)實用的標(biāo)準(zhǔn)建模語言,但其中某些概念尚待實踐來驗證,UML也必然存在一個進(jìn)化過程。</p><p><b> 語音備忘器設(shè)計</b></p><p><b> 設(shè)計目的及意義</b></p><p> 人們經(jīng)常會有重短暫忘記的感覺,比如正在運(yùn)
35、動場上跑步,突然想到回去時順便買瓶酸奶帶回家,這樣的念頭一閃而過,沒有趕快記錄下來,跑完步回家時, 會這樣想“記得跑完步我要做什么的”,但總是想不起來。等回到家后要喝酸奶時才想起沒有買。如果有語音備忘器在口袋里,就可以在計劃要做什么的時候錄下音。</p><p> 用UML開始圖形化設(shè)計</p><p><b> 用例設(shè)計</b></p><p
36、> 語音備忘器的用例圖包括兩個模塊,錄制語音和播放語音。在starUML中新建工程更名為Recorder,Add->Model新建模塊更名為用例,選擇Add Diagram ->Use Case Diagram。然后建立如圖4所示的語音備忘器的用例.</p><p><b> 模塊設(shè)計</b></p><p> 在模塊設(shè)計中,畫兩種類圖,一種是
37、展現(xiàn)全部模塊的整體類圖,如圖5所示為整體類圖。另一種是個體類圖,特別用來展現(xiàn)單一模塊設(shè)置端口及接口的情況,如圖6-圖10所示為。在Recorder工程中新建模塊,更名為模塊設(shè)計,選擇Add Diagram ->Class Diagram。建立如圖5-圖10的類圖:</p><p><b> 結(jié)構(gòu)設(shè)計</b></p><p> 在進(jìn)行結(jié)構(gòu)設(shè)計時,通過組合結(jié)構(gòu)圖
38、來展現(xiàn)對象內(nèi)部,數(shù)個部件之間的整合組裝細(xì)節(jié)。在Recorder工程中新建模塊,更名為結(jié)構(gòu)設(shè)計,選擇Add Diagram ->Composite Structure Diagram。如圖11-15所示。</p><p><b> 線程設(shè)計</b></p><p> 在Recorder工程中新建模塊,更名為進(jìn)程設(shè)計,在選擇Add Diagram ->Ac
39、tivity Diagram新建活動圖。然后開始繪制如下活動圖。</p><p> 編寫System代碼</p><p> 下載systemC 后在Microsoft Visual Studio 10.0 中編譯出systemc.lib文件。</p><p> 新建工程Recorder。在工程的properties中設(shè)置如下選項:</p><
40、;p> 設(shè)置完后選擇菜單欄的Build-> Build Solution.</p><p> 開始在工程中編寫.h文件和.cpp文件,包括有main.cpp、Recorder.h、Recorder.cpp、Controller .h</p><p> 、Controller.cpp、Memory.h、Memory.cpp、ADC.h、ADC.cpp、DAC.h,DAC.c
41、pp。(具體SyatemC的代碼則分置于附件)</p><p><b> 仿真結(jié)果</b></p><p> 案例的一開始,外界會通過xpiOpCode端口,傳送操作嗎給Recoder模塊對象;操作碼1是仿真錄音功能,2是仿真播放功能。模擬錄音已經(jīng)啟動,外界會通過xpiAudioIn端口,將四組8位字符串“00000000”,“00000001”,“0000001
42、0”,“000000011”寫進(jìn)sc_fifo通道,路經(jīng)Recorder、Controller、ADC模塊對象,最后存到Memory模塊對象,內(nèi)部bvSample[4]數(shù)組(Array)里。</p><p> 在創(chuàng)建Memory模塊對象的同時,我們先預(yù)存了四組8位字符串“11111111”、“11111110”、“11111101”、“11111100”到bvSample[4]數(shù)組里。一旦執(zhí)行仿真錄音的功能后,
43、將會從外界寫進(jìn)“00000000”,“00000001”,“00000010”,“000000011”字符串取代預(yù)存字符串。這樣一來,如果錄音動作有誤的話,執(zhí)行畫面的錄音數(shù)字會跟播放數(shù)字不一致。</p><p> 圖20是模擬錄音的執(zhí)行畫面,圖21是模擬播放的執(zhí)行畫面。</p><p><b> 附件:</b></p><p> //--
44、-------------------- main.cpp : Defines the entry point for the console application.--------------------------</p><p> #include "stdafx.h"</p><p> #include "systemc.h"</
45、p><p> #include "Recorder.h"</p><p> int sc_main(int argc, char* argv[])</p><p><b> {</b></p><p> Recorder *myRecorder= new Recorder("myReco
46、rder");</p><p> cout<<"1(錄音),(播放)...";</p><p><b> int iOp;</b></p><p><b> cin>>iOp;</b></p><p> switch(iOp)</p
47、><p><b> { </b></p><p><b> case 1:</b></p><p> cout<<"錄音模擬開始..."<<endl;</p><p> myRecorder->xpiOpCode->write(1);&
48、lt;/p><p> myRecorder->xpiAudioIn->write("00000000");</p><p> myRecorder->xpiAudioIn->write("00000001");</p><p> myRecorder->xpiAudioIn->write(
49、"00000010");</p><p> myRecorder->xpiAudioIn->write("00000011");</p><p> sc_start();</p><p> cout<<"錄音模擬結(jié)束..."<<endl<<endl;&l
50、t;/p><p><b> break;</b></p><p><b> case 2:</b></p><p> cout<<"播放模擬開始..."<<endl;</p><p> myRecorder->xpiOpCode->writ
51、e(2);</p><p> sc_start();</p><p> for(int i=0;i<4;i++)</p><p><b> {</b></p><p> if(myRecorder->xpoAudioOut->num_available()==0)</p><
52、p> wait(myRecorder->xpoAudioOut->data_written_event());</p><p> cout<< myRecorder->xpoAudioOut->read()<<endl;</p><p> }//end for</p><p> cout<<&
53、quot;播放模擬結(jié)束..."<<endl<<endl;</p><p><b> break;</b></p><p><b> default:</b></p><p> return 0; </p><p> }//end switch</p&g
54、t;<p> system("PAUSE");</p><p> return 0; </p><p><b> }</b></p><p> //------------------------------------------ Recorder.h ------------------------
55、-----------------------------------</p><p> #pragma once</p><p> #include "Memory.h"</p><p> #include "Controller.h"</p><p> class Recorder :pub
56、lic sc_module</p><p><b> {</b></p><p><b> public:</b></p><p> sc_export<sc_signal_out_if<int> > xpiOpCode;</p><p> sc_export<
57、sc_fifo_out_if<sc_bv<8> > >xpiAudioIn;</p><p> sc_export<sc_fifo_in_if<sc_bv<8> > >xpoAudioOut;</p><p> SC_HAS_PROCESS(Recorder);</p><p> Recorde
58、r(sc_module_name mn);</p><p><b> private:</b></p><p> Memory* myMemory;</p><p> Controller* myController;</p><p> sc_signal<int> chOpCode;</p&g
59、t;<p><b> };</b></p><p> //------------------------------------- Recorder.cpp------------------------------------------------------------------</p><p> #include "stdaf
60、x.h"</p><p> #include "systemc.h"</p><p> #include "Recorder.h"</p><p> Recorder::Recorder(sc_module_name mn) : sc_module(mn)</p><p><b&g
61、t; {</b></p><p> myMemory =new Memory("myMemory");</p><p> myController = new Controller("myController");</p><p> xpiOpCode(chOpCode);</p><p
62、> xpiAudioIn(myController->xpiAudioIn);</p><p> xpoAudioOut(myController->xpoAudioOut);</p><p> myMemory->piOpCode(chOpCode);</p><p> myMemory->piSampleIn(myContr
63、oller->xpoDataOut);</p><p> myMemory->poSampleOut(myController->xpiDataIn);</p><p><b> };</b></p><p> //------------------------------------- Controller.h --
64、----------------------------------------------------------------</p><p> #pragma once</p><p> #include "ADC.h"</p><p> #include "DAC.h"</p><p>
65、class Controller :public sc_module</p><p><b> {</b></p><p><b> public:</b></p><p> sc_port<sc_signal_in_if<int> > piOpCode;</p><p&g
66、t; sc_export<sc_fifo_out_if<sc_bv<8> > >xpiAudioIn;</p><p> sc_export<sc_fifo_in_if<sc_bv<8> > >xpoDataOut;</p><p> sc_export<sc_fifo_out_if<sc_bv<
67、;8> > >xpiDataIn;</p><p> sc_export<sc_fifo_in_if<sc_bv<8> > >xpoAudioOut;</p><p> SC_HAS_PROCESS(Controller);</p><p> Controller(sc_module_name mn);&l
68、t;/p><p><b> private:</b></p><p> ADC* myADC;</p><p> DAC* myDAC;</p><p><b> };</b></p><p> //-----------------------------------
69、-- Recorder.cpp ------------------------------------------------------------------</p><p> #include "stdafx.h"</p><p> #include "systemc.h"</p><p> #include &
70、quot;Controller.h"</p><p> Controller::Controller(sc_module_name mn) : sc_module(mn)</p><p><b> {</b></p><p> myADC =new ADC("myADC");</p><p
71、> myDAC = new DAC("myDAC");</p><p> myADC->piOpCode(piOpCode);</p><p> xpiAudioIn(myADC->xpiAudioIn);</p><p> xpoDataOut(myADC->xpoDataOut);</p><
72、;p> myDAC->piOpCode(piOpCode);</p><p> xpiDataIn(myDAC->xpiDataIn);</p><p> xpoAudioOut(myDAC->xpoAudioOut);</p><p><b> };</b></p><p> //--
73、----------------------------------- Memory.h ------------------------------------------------------------------</p><p> #pragma once</p><p> class Memory : public sc_module</p><p>
74、;<b> {</b></p><p><b> public:</b></p><p> sc_port<sc_signal_in_if<int> > piOpCode;</p><p> sc_port<sc_fifo_in_if<sc_bv<8> > &
75、gt;piSampleIn;</p><p> sc_port<sc_fifo_out_if<sc_bv<8> > >poSampleOut;</p><p> SC_HAS_PROCESS(Memory);</p><p> Memory(sc_module_name mn);</p><p>
76、void ReadIn(void);</p><p> void WriteOut(void);</p><p><b> private:</b></p><p> sc_bv<8> bvSample[4];</p><p><b> };</b></p><
77、;p> //------------------------------------- Memory.cpp ------------------------------------------------------------------</p><p> #include "stdafx.h"</p><p> #include "syste
78、mc.h"</p><p> #include "Recorder.h"</p><p> Memory::Memory(sc_module_name mn) : sc_module(mn)</p><p><b> {</b></p><p> bvSample[0]="
79、11111111";</p><p> bvSample[0]="11111110";</p><p> bvSample[0]="11111101";</p><p> bvSample[0]="11111100";</p><p> SC_THREAD(Read
80、In);</p><p> SC_THREAD(WriteOut);</p><p><b> };</b></p><p> void Memory::ReadIn(void)</p><p><b> {</b></p><p><b> for( ;
81、 ;)</b></p><p><b> {</b></p><p> if(piOpCode->read()==1)</p><p><b> { </b></p><p> for(int i=0;i<4;i++)</p><p><
82、b> {</b></p><p> if(piSampleIn->num_available()==0)</p><p> wait(piSampleIn->data_written_event());</p><p> bvSample[i]=piSampleIn->read();</p><p>
83、; cout<< bvSample[i]<< endl;</p><p> }//end for</p><p><b> }//end if</b></p><p> wait(piOpCode->value_changed_event());</p><p> }//end f
84、or</p><p><b> };</b></p><p> void Memory::WriteOut(void)</p><p><b> {</b></p><p><b> for( ; ;)</b></p><p><b>
85、 {</b></p><p> if(piOpCode->read()==2)</p><p><b> { </b></p><p> for(int i=0;i<4;i++)</p><p><b> {</b></p><p> po
86、SampleOut->write(bvSample[i]);</p><p> }//end for</p><p><b> }//end if</b></p><p> wait(piOpCode->value_changed_event());</p><p> }//end for</p
87、><p><b> };</b></p><p> //------------------------------------- ADC.h ------------------------------------------------------------------</p><p> #pragma once</p>
88、<p> class ADC : public sc_module</p><p><b> {</b></p><p><b> public:</b></p><p> sc_port<sc_signal_in_if<int> > piOpCode;</p>&
89、lt;p> sc_export<sc_fifo_out_if<sc_bv<8> > >xpiAudioIn;</p><p> sc_export<sc_fifo_in_if<sc_bv<8> > >xpoDataOut;</p><p> SC_HAS_PROCESS(ADC);</p>&
90、lt;p> ADC(sc_module_name mn);</p><p> void Convert(void);</p><p><b> private:</b></p><p> sc_fifo<sc_bv<8> > chAudioIn;</p><p> sc_fifo&
91、lt;sc_bv<8> > chDataOut;</p><p><b> };</b></p><p> //------------------------------------- ADC.h ------------------------------------------------------------------</p&g
92、t;<p> #pragma once</p><p> class ADC : public sc_module</p><p><b> {</b></p><p><b> public:</b></p><p> sc_port<sc_signal_in_if&
93、lt;int> > piOpCode;</p><p> sc_export<sc_fifo_out_if<sc_bv<8> > >xpiAudioIn;</p><p> sc_export<sc_fifo_in_if<sc_bv<8> > >xpoDataOut;</p><p
94、> SC_HAS_PROCESS(ADC);</p><p> ADC(sc_module_name mn);</p><p> void Convert(void);</p><p><b> private:</b></p><p> sc_fifo<sc_bv<8> > ch
95、AudioIn;</p><p> sc_fifo<sc_bv<8> > chDataOut;</p><p><b> };</b></p><p> //------------------------------------- DAC.h -----------------------------------
96、-------------------------------</p><p> #pragma once</p><p> class DAC : public sc_module</p><p><b> {</b></p><p><b> public:</b></p>
97、<p> sc_port<sc_signal_in_if<int> > piOpCode;</p><p> sc_export<sc_fifo_out_if<sc_bv<8> > >xpiDataIn;</p><p> sc_export<sc_fifo_in_if<sc_bv<8>
98、 > >xpoAudioOut;</p><p> SC_HAS_PROCESS(DAC);</p><p> DAC(sc_module_name mn);</p><p> void Convert(void);</p><p><b> private:</b></p><p
99、> sc_fifo<sc_bv<8> > chDataIn;</p><p> sc_fifo<sc_bv<8> > chAudioOut;</p><p><b> };</b></p><p> ------------------------------------ DAC.c
100、pp ------------------------------------------------------------------</p><p> #include "stdafx.h"</p><p> #include "systemc.h"</p><p> #include "DAC.h&qu
101、ot;</p><p> DAC::DAC(sc_module_name mn) : sc_module(mn)</p><p><b> {</b></p><p> xpiDataIn(chDataIn);</p><p> xpoAudioOut(chAudioOut);</p><p&
102、gt; SC_THREAD(Convert);</p><p><b> };</b></p><p> void DAC::Convert(void)</p><p><b> {</b></p><p><b> for( ; ;)</b></p>
103、<p><b> {</b></p><p> if(piOpCode->read()==2)</p><p><b> { </b></p><p> for(int i=0;i<4;i++)</p><p><b> {</b></p&
104、gt;<p> if(chDataIn.num_available()==0)</p><p> wait(chDataIn.data_written_event());</p><p> chAudioOut.write(chDataIn.read());</p><p> }//end for</p><p><
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于UML和SystemC的軟硬件協(xié)同設(shè)計研究.pdf
- 基于SystemC的SoC設(shè)計方法的研究.pdf
- uml課程設(shè)計
- 課程設(shè)計--語音錄放器
- uml課程設(shè)計
- 語音濾波器的課程設(shè)計
- 語音濾波器課程設(shè)計
- 語音濾波器課程設(shè)計
- 語音錄放器電子課程設(shè)計
- 語音濾波器課程設(shè)計
- uml課程設(shè)計報告
- 語音濾波器課程設(shè)計--語音濾波器
- uml課程設(shè)計--基于uml的學(xué)生學(xué)籍管理系統(tǒng)建模
- 基于SystemC的SOC系統(tǒng)級建模設(shè)計的研究與應(yīng)用.pdf
- 語音濾波器課程設(shè)計報告
- 基于單片機(jī)的語音遙控器課程設(shè)計
- 基于SystemC的ARM內(nèi)核SoC平臺功能模型的設(shè)計開發(fā).pdf
- 面向?qū)ο笤O(shè)計課程設(shè)計--- 基于uml的超市進(jìn)貨管理系統(tǒng)設(shè)計
- uml課程設(shè)計-學(xué)籍管理系統(tǒng)
- uml課程設(shè)計-在線考試系統(tǒng)
評論
0/150
提交評論