版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 基于SystemC的語音備忘器設(shè)計(jì)</p><p><b> 摘要:</b></p><p> 隨著VLSI的集成度越來越高,設(shè)計(jì)也越趨復(fù)雜。傳統(tǒng)的設(shè)計(jì)方法如原理圖輸入、HDL語言描述在進(jìn)行復(fù)雜系統(tǒng)設(shè)計(jì)時(shí),設(shè)計(jì)效率往往比較低。特別是在算法由軟件轉(zhuǎn)化為硬件的環(huán)節(jié)上,傳統(tǒng)的設(shè)計(jì)方法的效率不是很高,設(shè)計(jì)者往往要耗費(fèi)大量的時(shí)間和精力手工進(jìn)行算法的轉(zhuǎn)化
2、。為解決這些問題,一種新的系統(tǒng)級(jí)的設(shè)計(jì)方法SYSTEM C 被提出。SYSTEM C是一種方法,也是一個(gè)C++庫,用SYSTEM C可以很方便地實(shí)現(xiàn)一個(gè)軟件算法的硬件實(shí)現(xiàn),以及完成一個(gè)系統(tǒng)級(jí)的設(shè)計(jì)。</p><p> 關(guān)鍵詞:SystemC、語音備忘器、UML</p><p> SystemC的開發(fā)平臺(tái)</p><p><b> 概述</b&g
3、t;</p><p> 隨著VLSI的集成度越來越高,設(shè)計(jì)也越趨復(fù)雜。一個(gè)系統(tǒng)的設(shè)計(jì)往往不僅需要硬件設(shè)計(jì)人員的參與,也需要有軟件設(shè)計(jì)人員的參與。軟件設(shè)計(jì)人員與硬件設(shè)計(jì)人員之間的相互協(xié)調(diào)就變的格外重要,它直接關(guān)系到工作的效率以及整個(gè)系統(tǒng)設(shè)計(jì)的成敗。傳統(tǒng)的設(shè)計(jì)方法沒有使軟件設(shè)計(jì)工作與硬件設(shè)計(jì)工作協(xié)調(diào)一致,而是將兩者的工作割裂開來。軟件算法的設(shè)計(jì)人員在系統(tǒng)設(shè)計(jì)后期不能為硬件設(shè)計(jì)人員的設(shè)計(jì)提供任何的幫助。同時(shí)現(xiàn)在有些大
4、規(guī)模集成電路設(shè)計(jì)中往往帶有DSP Core或其它CPU Core。這些都使得單純地用原理圖或硬件描述語言來設(shè)計(jì)、仿真這么復(fù)雜的系統(tǒng)變得十分困難。System C就是在這些矛盾的背景下提出的。它的出現(xiàn)為復(fù)雜的系統(tǒng)設(shè)計(jì)提供了一條有效的解決途徑。 System C 是由 Synospy Inc. 提出的,目前最新的版本為V2.0。它提出的目的就是以一種系統(tǒng)設(shè)計(jì)的思想進(jìn)行系統(tǒng)設(shè)計(jì)。它將軟件算法與硬件實(shí)現(xiàn)很好的結(jié)合在一起,提高了整個(gè)系統(tǒng)設(shè)計(jì)的效
5、率和正確性。 </p><p> System C 是一個(gè)C++ 庫,也是一種使設(shè)計(jì)者可以有效地設(shè)計(jì)出一個(gè)軟件算法的準(zhǔn)確循環(huán)模型,硬件結(jié)構(gòu)以及系統(tǒng)級(jí)設(shè)計(jì)的方法。設(shè)計(jì)者可以用System C開發(fā)工具或在標(biāo)準(zhǔn)C++開發(fā)工具中加如System C庫制作系統(tǒng)級(jí)模型,快速地仿真和優(yōu)化設(shè)計(jì),以及研究不同的算法,并且為硬件和軟件設(shè)計(jì)人員提供一個(gè)設(shè)計(jì)系統(tǒng)的可執(zhí)行規(guī)范??蓤?zhí)行規(guī)范本質(zhì)上是一個(gè)C++程序,它顯示了和設(shè)計(jì)系統(tǒng)同樣的性
6、能,為軟件設(shè)計(jì)人員和硬件設(shè)計(jì)人員提供了一個(gè)設(shè)計(jì)的標(biāo)準(zhǔn)。 </p><p> System C 庫提供了創(chuàng)造系統(tǒng)結(jié)構(gòu)模型的必須結(jié)構(gòu),包括那些在C++沒有的功能如硬件時(shí)序,并行和觸發(fā)功能。C++這種面對(duì)象語言提供了通過增加類來擴(kuò)展語言的能力,而這種能力是C語言所不具備的。因此,System C使用大家熟悉的C++語言和開發(fā)工具。 </p><p> SYSTEM C的特點(diǎn)</p&g
7、t;<p> System C 支持對(duì)硬件和軟件的聯(lián)合設(shè)計(jì),支持描述一個(gè)既包含硬件部分也包含軟件部分的復(fù)雜系統(tǒng)結(jié)構(gòu)。它也支持對(duì)接口的描述,有以下幾個(gè)顯著的特點(diǎn): </p><p> 1.System C可以為軟件設(shè)計(jì)人員和硬件設(shè)計(jì)人員提供一個(gè)系統(tǒng)的可執(zhí)行規(guī)范。設(shè)計(jì)人員使用該可執(zhí)行規(guī)范可以避免設(shè)計(jì)中矛盾和錯(cuò)誤的產(chǎn)生,并確保設(shè)計(jì)的完備性。這是應(yīng)為在設(shè)計(jì)可執(zhí)行規(guī)范時(shí),系統(tǒng)設(shè)計(jì)者必須設(shè)計(jì)出也一個(gè)和系統(tǒng)具
8、有同樣工作狀態(tài)的程序,通過這個(gè)程序可以發(fā)掘出潛在的矛盾和錯(cuò)誤,并將這些矛盾和錯(cuò)誤消除在整個(gè)設(shè)計(jì)的開始階段,而不是在整個(gè)系統(tǒng)進(jìn)行調(diào)試階段才發(fā)現(xiàn)和解決這些矛盾和錯(cuò)誤。這個(gè)程序還可以幫助設(shè)計(jì)者確保整個(gè)系統(tǒng)設(shè)計(jì)的完備性。 </p><p> 2.設(shè)計(jì)人員利用這個(gè)可執(zhí)行的系統(tǒng)規(guī)范,還可以發(fā)現(xiàn)設(shè)計(jì)中概念模糊的地方。無論什么時(shí)候,設(shè)計(jì)人員對(duì)設(shè)計(jì)產(chǎn)生疑惑,就可以運(yùn)行這個(gè)可執(zhí)行程序以明確在這個(gè)問題上系統(tǒng)設(shè)計(jì)人員是如何處理的,從而
9、確保系統(tǒng)設(shè)計(jì)的正確性。而現(xiàn)在的設(shè)計(jì)方法不能使設(shè)計(jì)人員方便迅速的解決這些疑惑。甚至這些疑惑是系統(tǒng)設(shè)計(jì)人員也不曾考慮過,這可能導(dǎo)致系統(tǒng)要重新進(jìn)行設(shè)計(jì)。 </p><p> 3.在系統(tǒng)設(shè)計(jì)被實(shí)現(xiàn)以前,設(shè)計(jì)人員還可以通過用System C設(shè)計(jì)的系統(tǒng)可執(zhí)行規(guī)范來驗(yàn)證整個(gè)系統(tǒng)設(shè)計(jì)。這樣可以避免由于在系統(tǒng)設(shè)計(jì)上的失誤,而使系統(tǒng)實(shí)現(xiàn)不能達(dá)到要求。現(xiàn)在的設(shè)計(jì)方法不能提供這樣的手段在設(shè)計(jì)完成前進(jìn)行系統(tǒng)的驗(yàn)證,對(duì)系統(tǒng)的驗(yàn)證必須是在系
10、統(tǒng)設(shè)計(jì)完后。即使在完成前進(jìn)行驗(yàn)證,由于不能完全模擬實(shí)際系統(tǒng)的工作,其結(jié)果也只能作為一種參考。 </p><p> 4.System C設(shè)計(jì)的可執(zhí)行規(guī)范所使用的TESTBENCH文件可以通過小范圍的修改或直接用在實(shí)現(xiàn)后的系統(tǒng)仿真。這就為設(shè)計(jì)實(shí)現(xiàn)人員帶來很大的好處,他們不必花很多的時(shí)間去編寫用來驗(yàn)證實(shí)現(xiàn)后系統(tǒng)正確性的TESTBENCH文件。而現(xiàn)在采用的設(shè)計(jì)方法所使用的TESTBENCH文件卻沒有提供這樣的便利條件。
11、這是應(yīng)為軟件設(shè)計(jì)人員和硬件設(shè)計(jì)人員兩者的設(shè)計(jì)思想和設(shè)計(jì)手段都是不同的,一個(gè)軟件設(shè)計(jì)人員所使用的TESTBENCH文件并不能被硬件設(shè)計(jì)人員使用,甚至不能給硬件設(shè)計(jì)人員任何幫助。</p><p> SYSTEM C設(shè)計(jì)與傳統(tǒng)設(shè)計(jì)比較</p><p> 現(xiàn)在的系統(tǒng)設(shè)計(jì)一般是由系統(tǒng)工程師用C語言或C++語言設(shè)計(jì)出一個(gè)系統(tǒng)模型,并在系統(tǒng)級(jí)層次上檢驗(yàn)概念和算法。當(dāng)這些概念和算法被檢驗(yàn)為正確無誤時(shí),
12、C/C++模塊被分解為功能相對(duì)獨(dú)立的子模塊。這些相對(duì)對(duì)立的子模塊由硬件設(shè)計(jì)人員手工地轉(zhuǎn)化為VHDL或Verilog語言用以硬件實(shí)現(xiàn)。這一個(gè)設(shè)計(jì)流程被顯示在圖1中。</p><p> 從圖1所示的設(shè)計(jì)流程中我們可以發(fā)現(xiàn)以下幾個(gè)問題: </p><p> 1、人工將C\C++程序轉(zhuǎn)換為HDL程序容易產(chǎn)生錯(cuò)誤。在現(xiàn)在的這種設(shè)計(jì)方法中,系統(tǒng)工程師先按期望的設(shè)計(jì)要求設(shè)計(jì)出一個(gè)C模塊,并驗(yàn)證這個(gè)模
13、塊使其達(dá)到期望的設(shè)計(jì)要求。然后系統(tǒng)工程師所設(shè)計(jì)的C模塊被硬件設(shè)計(jì)人員手工轉(zhuǎn)換為HDL模塊。這個(gè)轉(zhuǎn)換過程不僅容易產(chǎn)生錯(cuò)誤,而且還很浪費(fèi)時(shí)間。這是因?yàn)镃\C++語言和HDL語言有著顯著的區(qū)別。首先,HDL的處理方式比C\C++的復(fù)雜。C\C++程序采用順序執(zhí)行的處理方式,而HDL程序中既有順序執(zhí)行也有并行執(zhí)行的處理方式。要將C\C++程序轉(zhuǎn)化為HDL程序必然要引入一些控制信號(hào),由這些信號(hào)控制HDL程序的運(yùn)行,但這樣也容易產(chǎn)生錯(cuò)誤。其次,C\
14、C++語言不涉及到時(shí)序關(guān)系。由于C\C++語言不支持對(duì)時(shí)序的描述,系統(tǒng)工程師設(shè)計(jì)的系統(tǒng)模型只是驗(yàn)證了概念和算法,而只能對(duì)時(shí)間耗費(fèi)上有一個(gè)大概的估計(jì)。這就使得硬件實(shí)現(xiàn)時(shí),為滿足系統(tǒng)在時(shí)間上的要求,硬件設(shè)計(jì)人員必須對(duì)軟件算法進(jìn)行一定的改造或優(yōu)化。而這些改造或優(yōu)化也有可能引入各種錯(cuò)誤。 </p><p> 2、系統(tǒng)模塊和HDL模塊間缺乏聯(lián)系。當(dāng)系統(tǒng)模塊被轉(zhuǎn)換為HDL模塊后,HDL模塊成為整個(gè)系統(tǒng)設(shè)計(jì)的焦點(diǎn)。為適應(yīng)硬件
15、實(shí)現(xiàn)的特點(diǎn),硬件設(shè)計(jì)人員會(huì)更改系統(tǒng)設(shè)計(jì)人員的設(shè)計(jì),但這種更改只是在HDL模塊中進(jìn)行,而系統(tǒng)設(shè)計(jì)人員設(shè)計(jì)的C模塊并沒有因此更改。這就使得系統(tǒng)工程師設(shè)計(jì)的C模塊和當(dāng)前硬件設(shè)計(jì)人員設(shè)計(jì)的HDL模塊缺乏必要的聯(lián)系。當(dāng)硬件設(shè)計(jì)人員遇到概念模糊或理解錯(cuò)誤的地方時(shí),往往不能馬上從C模塊中得到明確的解答。此時(shí),C模塊的設(shè)計(jì)人員也不一定能為HDL設(shè)計(jì)人員提供有效的幫助。 </p><p> 3、多系統(tǒng)測(cè)試。不但C模塊要轉(zhuǎn)換為HD
16、L模塊,對(duì)C模塊的測(cè)試也要人工轉(zhuǎn)換為在HDL環(huán)境下的測(cè)試。這種轉(zhuǎn)換也很復(fù)雜,而且浪費(fèi)時(shí)間。HDL設(shè)計(jì)人員是根據(jù)他所設(shè)計(jì)的HDL模塊和系統(tǒng)要求來設(shè)計(jì)TESTBENCH,這使得硬件設(shè)計(jì)人員不可能利用軟件設(shè)計(jì)人員所使用的測(cè)試文件。同時(shí),HDL人員要設(shè)計(jì)出一個(gè)好的TESTBENCH也需要比較長(zhǎng)的時(shí)間。</p><p> 為解決在現(xiàn)在設(shè)計(jì)流程中所帶來的種種弊端,一種全新的設(shè)計(jì)流程被提出,這就是System C設(shè)計(jì)流程。它
17、能很好的解決上面所提到的各種設(shè)計(jì)弊端,大大提高設(shè)計(jì)效率。圖2是System C的硬件設(shè)計(jì)流程。</p><p> 這種設(shè)計(jì)方法與現(xiàn)在常用的設(shè)計(jì)方法相比有很多優(yōu)點(diǎn): </p><p> 1、精煉的設(shè)計(jì)方法。使用System C設(shè)計(jì)系統(tǒng),系統(tǒng)設(shè)計(jì)人員不必花費(fèi)很大的精力將整個(gè)系統(tǒng)設(shè)計(jì)由C語言描述轉(zhuǎn)換為HDL描述。系統(tǒng)設(shè)計(jì)人員可以通過在C模塊中很小的區(qū)域范圍內(nèi)加入必要的硬件和時(shí)序結(jié)構(gòu)描述,從而
18、將C模塊方便準(zhǔn)確地轉(zhuǎn)化為一個(gè)有效的硬件設(shè)計(jì),而避免將另行設(shè)計(jì)一個(gè)硬件模塊。利用System C設(shè)計(jì)方法,設(shè)計(jì)人員可以很輕松地實(shí)現(xiàn)一個(gè)設(shè)計(jì)的更改,或在優(yōu)化算法時(shí)檢測(cè)出一些設(shè)計(jì)錯(cuò)誤并及時(shí)修改。 </p><p> 2、單一語言書寫。使用System C設(shè)計(jì)系統(tǒng),整個(gè)設(shè)計(jì)都用一種語言設(shè)計(jì)系統(tǒng),降低了對(duì)設(shè)計(jì)人員的要求,減少了語言轉(zhuǎn)換時(shí)所造成的錯(cuò)誤。這一優(yōu)點(diǎn)也使得設(shè)計(jì)人員可以在一個(gè)比較高的層次上進(jìn)行系統(tǒng)模塊設(shè)計(jì)。在較高層
19、次的設(shè)計(jì)會(huì)導(dǎo)致產(chǎn)生小的設(shè)計(jì)代碼,使設(shè)計(jì)和仿真的速度比傳統(tǒng)的設(shè)計(jì)方法要快很多。這一點(diǎn)是很顯著的。</p><p> SystemC的開發(fā)流程</p><p> 用SystemC可以在抽象層次的不同級(jí)別描述系統(tǒng)。在系統(tǒng)最高層的系統(tǒng)級(jí)可以用C/C++描述系統(tǒng)的功能和算法。在系統(tǒng)的硬件實(shí)現(xiàn)部分可以在行為級(jí)到RTL級(jí)用SystemC的類來進(jìn)行描述。系統(tǒng)的軟件部分自然可以用C/C++語言描述。由此
20、可見針對(duì)系統(tǒng)的不同部分,SystemC都可以在不同的抽象層次對(duì)其進(jìn)行描述,而且這些描述在系統(tǒng)仿真時(shí)可以協(xié)同工作。</p><p> 用SystemC不僅可以描述要開發(fā)的系統(tǒng)本身,還可以描述系統(tǒng)的測(cè)試平臺(tái)以提供測(cè)試信號(hào)用于系統(tǒng)的仿真。一個(gè)熟悉C++語言的用戶只要了解類庫中各種類引入的語義就可以用SystemC編程。SystemC由一組描述類的頭文件和一個(gè)包含仿真核的連接庫所組成,在用戶的描述程序中必須包括相應(yīng)的頭
21、文件,然后可以用通常的ANSI C++編譯器編譯該程序。在連接時(shí)要調(diào)用SystemC的連接庫產(chǎn)生可執(zhí)行的系統(tǒng)仿真程序。整個(gè)開發(fā)流程如圖3所示。</p><p> SystemC的建模特點(diǎn)</p><p> SystemC語言的特點(diǎn)就是能夠支持對(duì)復(fù)雜系統(tǒng)的設(shè)計(jì)。一個(gè)復(fù)雜的系統(tǒng)設(shè)計(jì)一般都要涉及軟件和硬件兩個(gè)方面,SystemC在這兩個(gè)方面都有其獨(dú)到之處。它可以在任何C++集成環(huán)境中描述硬件
22、和軟件,以及它們之間的接口。SystemC語言平臺(tái)提供的建模元素和建模能力主要包括以下內(nèi)容:</p><p> 模塊語句:SystemC中定義了“模塊”類,它相當(dāng)于C++中的類定義。它是一個(gè)層次式設(shè)計(jì)的入口,一個(gè)模塊可以嵌套其他模塊;</p><p> 進(jìn)程語言:進(jìn)程被包含在模塊中,用來描述模塊的功能。在SystemC中有三種不同類型進(jìn)程以滿足不同軟、硬件設(shè)計(jì)人員的需求;</p&
23、gt;<p> 端口語句:用來描述模塊和外界通信的端口。SystemC中支持單向和雙向的端口;</p><p> 信號(hào)語句:信號(hào)主要用來實(shí)現(xiàn)模塊間以及模塊內(nèi)部各進(jìn)程間的通訊。SystemC支持單驅(qū)動(dòng)和多驅(qū)動(dòng)的信號(hào)。多驅(qū)動(dòng)的信號(hào)可以有多個(gè)驅(qū)動(dòng),就是通常說的總線(BUS);</p><p> 豐富的數(shù)據(jù)類型:SystemC提供豐富的數(shù)據(jù)類型以滿足多種抽象模型,固定精度的數(shù)據(jù)
24、類型可用于快速仿真,任意精度的數(shù)據(jù)類型可用于大量數(shù)據(jù)的計(jì)算,定點(diǎn)數(shù)據(jù)類型可用來實(shí)現(xiàn)DSP;</p><p> 時(shí)鐘語句:時(shí)鐘在同步電路設(shè)計(jì)中是一個(gè)非常重要的角色,而C/C++在描述系統(tǒng)時(shí)卻很難表達(dá)時(shí)鐘。SystemC中對(duì)時(shí)鐘進(jìn)行了描述,并把它當(dāng)作一種特殊的信號(hào)。時(shí)鐘為仿真過程提供了時(shí)間基準(zhǔn),SystemC同時(shí)還支持在同一系統(tǒng)中的多個(gè)時(shí)鐘,以及任意相位的時(shí)鐘;</p><p> 通訊協(xié)議
25、:SystemC支持多層通訊協(xié)議,用來描述各種抽象級(jí)別的模型和系統(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è)計(jì)風(fēng)潮。他們都可以用來呈現(xiàn)軟硬件設(shè)計(jì),最大的不同之處在于,UML是一種圖形語言,而SystemC則是程序語言。當(dāng)芯片設(shè)計(jì)的復(fù)雜度不斷增高時(shí),SystemC代碼機(jī)會(huì)變得越來越難以掌握,所以會(huì)需要通過UML的圖形式設(shè)計(jì)來呈現(xiàn)真題的設(shè)計(jì),再對(duì)應(yīng)生成SystemC代碼以得出更細(xì)致的設(shè)計(jì)。</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)、具有實(shí)時(shí)要求的工業(yè)系統(tǒng)或工業(yè)過程等??傊琔ML是一個(gè)通用的標(biāo)準(zhǔn)建模語言,可以對(duì)任何具有靜態(tài)結(jié)構(gòu)和動(dòng)態(tài)行為的系統(tǒng)進(jìn)行建模。</p><p> 此外,UML適用于系統(tǒng)開發(fā)過程中從需求規(guī)格描述到系統(tǒng)完成后測(cè)試的不同階段。在需求分析階段,可以用用例來捕獲用戶需求。通過用例建模,描述對(duì)系
28、統(tǒng)感興趣的外部角色及其對(duì)系統(tǒng)(用例)的功能要求。分析階段主要關(guān)心問題域中的主要概念(如抽象、類和對(duì)象等)和機(jī)制,需要識(shí)別這些類以及它們相互間的關(guān)系,并用UML類圖來描述。為實(shí)現(xiàn)用例,類之間需要協(xié)作,這可以用UML動(dòng)態(tài)模型來描述。在分析階段,只對(duì)問題域的對(duì)象(現(xiàn)實(shí)世界的概念)建模,而不考慮定義軟件系統(tǒng)中技術(shù)細(xì)節(jié)的類(如處理用戶接口、數(shù)據(jù)庫、通訊和并行性等問題的類)。這些技術(shù)細(xì)節(jié)將在設(shè)計(jì)階段引入,因此設(shè)計(jì)階段為構(gòu)造階段提供更詳細(xì)的規(guī)格說明。
29、</p><p> 編程(構(gòu)造)是一個(gè)獨(dú)立的階段,其任務(wù)是用面向?qū)ο缶幊陶Z言將來自設(shè)計(jì)階段的類轉(zhuǎn)換成實(shí)際的代碼。在用UML建立分析和設(shè)計(jì)模型時(shí),應(yīng)盡量避免考慮把模型轉(zhuǎn)換成某種特定的編程語言。因?yàn)樵谠缙陔A段,模型僅僅是理解和分析系統(tǒng)結(jié)構(gòu)的工具,過早考慮編碼問題十分不利于建立簡(jiǎn)單正確的模型。</p><p> UML模型還可作為軟件測(cè)試階段的依據(jù)。系統(tǒng)通常需要經(jīng)過單元測(cè)試、集成測(cè)試、系統(tǒng)測(cè)
30、試和驗(yàn)收測(cè)試。不同的測(cè)試小組使用不同的UML圖作為測(cè)試依據(jù):?jiǎn)卧獪y(cè)試使用類圖和類規(guī)格說明;集成測(cè)試使用部件圖和合作圖;系統(tǒng)測(cè)試使用用例圖來驗(yàn)證系統(tǒng)的行為;驗(yàn)收測(cè)試由用戶進(jìn)行,以驗(yàn)證系統(tǒng)測(cè)試的結(jié)果是否滿足在分析階段確定的需求。</p><p> 總之,標(biāo)準(zhǔn)建模語言UML適用于以面向?qū)ο蠹夹g(shù)來描述任何類型的系統(tǒng),而且適用于系統(tǒng)開發(fā)的不同階段,從需求規(guī)格描述直至系統(tǒng)完成后的測(cè)試和維護(hù)。</p><
31、p><b> UML的特點(diǎn)</b></p><p> 標(biāo)準(zhǔn)建模語言UML的主要特點(diǎn)可以歸結(jié)為三點(diǎn):</p><p> ?。?) UML統(tǒng)一了Booch、OMT和OOSE等方法中的基本概念。</p><p> ?。?) UML還吸取了面向?qū)ο蠹夹g(shù)領(lǐng)域中其他流派的長(zhǎng)處,其中也包括非OO方法的影響。UML符號(hào)表示考慮了各種方法的圖形表示,刪
32、掉了大量易引起混亂的、多余的和極少使用的符號(hào),也添加了一些新符號(hào)。因此,在UML中匯入了面向?qū)ο箢I(lǐng)域中很多人的思想。這些思想并不是UML的開發(fā)者們發(fā)明的,而是開發(fā)者們依據(jù)最優(yōu)秀的OO方法和豐富的計(jì)算機(jī)科學(xué)實(shí)踐經(jīng)驗(yàn)綜合提煉而成的。</p><p> ?。?)UML在演變過程中還提出了一些新的概念。在UML標(biāo)準(zhǔn)中新加了模板(Stereotypes)、職責(zé)(Responsibilities)、擴(kuò)展機(jī)制(Extensib
33、ility mechanisms)、線程(Threads)、過程(Processes)、分布式(Distribution)、并發(fā)(Concurrency)、模式(Patterns)、合作(Collaborations)、活動(dòng)圖(Activity diagram)等新概念,并清晰地區(qū)分類型(Type)、類(Class)和實(shí)例(Instance)、細(xì)化(Refinement)、接口(Interfaces)和組件(Components)等概念
34、。</p><p> 因此可以認(rèn)為,UML是一種先進(jìn)實(shí)用的標(biāo)準(zhǔn)建模語言,但其中某些概念尚待實(shí)踐來驗(yàn)證,UML也必然存在一個(gè)進(jìn)化過程。</p><p><b> 語音備忘器設(shè)計(jì)</b></p><p><b> 設(shè)計(jì)目的及意義</b></p><p> 人們經(jīng)常會(huì)有重短暫忘記的感覺,比如正在運(yùn)
35、動(dòng)場(chǎng)上跑步,突然想到回去時(shí)順便買瓶酸奶帶回家,這樣的念頭一閃而過,沒有趕快記錄下來,跑完步回家時(shí), 會(huì)這樣想“記得跑完步我要做什么的”,但總是想不起來。等回到家后要喝酸奶時(shí)才想起沒有買。如果有語音備忘器在口袋里,就可以在計(jì)劃要做什么的時(shí)候錄下音。</p><p> 用UML開始圖形化設(shè)計(jì)</p><p><b> 用例設(shè)計(jì)</b></p><p
36、> 語音備忘器的用例圖包括兩個(gè)模塊,錄制語音和播放語音。在starUML中新建工程更名為Recorder,Add->Model新建模塊更名為用例,選擇Add Diagram ->Use Case Diagram。然后建立如圖4所示的語音備忘器的用例.</p><p><b> 模塊設(shè)計(jì)</b></p><p> 在模塊設(shè)計(jì)中,畫兩種類圖,一種是
37、展現(xiàn)全部模塊的整體類圖,如圖5所示為整體類圖。另一種是個(gè)體類圖,特別用來展現(xiàn)單一模塊設(shè)置端口及接口的情況,如圖6-圖10所示為。在Recorder工程中新建模塊,更名為模塊設(shè)計(jì),選擇Add Diagram ->Class Diagram。建立如圖5-圖10的類圖:</p><p><b> 結(jié)構(gòu)設(shè)計(jì)</b></p><p> 在進(jìn)行結(jié)構(gòu)設(shè)計(jì)時(shí),通過組合結(jié)構(gòu)圖
38、來展現(xiàn)對(duì)象內(nèi)部,數(shù)個(gè)部件之間的整合組裝細(xì)節(jié)。在Recorder工程中新建模塊,更名為結(jié)構(gòu)設(shè)計(jì),選擇Add Diagram ->Composite Structure Diagram。如圖11-15所示。</p><p><b> 線程設(shè)計(jì)</b></p><p> 在Recorder工程中新建模塊,更名為進(jìn)程設(shè)計(jì),在選擇Add Diagram ->Ac
39、tivity Diagram新建活動(dòng)圖。然后開始繪制如下活動(dòng)圖。</p><p> 編寫System代碼</p><p> 下載systemC 后在Microsoft Visual Studio 10.0 中編譯出systemc.lib文件。</p><p> 新建工程Recorder。在工程的properties中設(shè)置如下選項(xiàng):</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> 案例的一開始,外界會(huì)通過xpiOpCode端口,傳送操作嗎給Recoder模塊對(duì)象;操作碼1是仿真錄音功能,2是仿真播放功能。模擬錄音已經(jīng)啟動(dòng),外界會(huì)通過xpiAudioIn端口,將四組8位字符串“00000000”,“00000001”,“0000001
42、0”,“000000011”寫進(jìn)sc_fifo通道,路經(jīng)Recorder、Controller、ADC模塊對(duì)象,最后存到Memory模塊對(duì)象,內(nèi)部bvSample[4]數(shù)組(Array)里。</p><p> 在創(chuàng)建Memory模塊對(duì)象的同時(shí),我們先預(yù)存了四組8位字符串“11111111”、“11111110”、“11111101”、“11111100”到bvSample[4]數(shù)組里。一旦執(zhí)行仿真錄音的功能后,
43、將會(huì)從外界寫進(jìn)“00000000”,“00000001”,“00000010”,“000000011”字符串取代預(yù)存字符串。這樣一來,如果錄音動(dòng)作有誤的話,執(zhí)行畫面的錄音數(shù)字會(huì)跟播放數(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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于UML和SystemC的軟硬件協(xié)同設(shè)計(jì)研究.pdf
- 基于SystemC的SoC設(shè)計(jì)方法的研究.pdf
- uml課程設(shè)計(jì)
- 課程設(shè)計(jì)--語音錄放器
- uml課程設(shè)計(jì)
- 語音濾波器的課程設(shè)計(jì)
- 語音濾波器課程設(shè)計(jì)
- 語音濾波器課程設(shè)計(jì)
- 語音錄放器電子課程設(shè)計(jì)
- 語音濾波器課程設(shè)計(jì)
- uml課程設(shè)計(jì)報(bào)告
- 語音濾波器課程設(shè)計(jì)--語音濾波器
- uml課程設(shè)計(jì)--基于uml的學(xué)生學(xué)籍管理系統(tǒng)建模
- 基于SystemC的SOC系統(tǒng)級(jí)建模設(shè)計(jì)的研究與應(yīng)用.pdf
- 語音濾波器課程設(shè)計(jì)報(bào)告
- 基于單片機(jī)的語音遙控器課程設(shè)計(jì)
- 基于SystemC的ARM內(nèi)核SoC平臺(tái)功能模型的設(shè)計(jì)開發(fā).pdf
- 面向?qū)ο笤O(shè)計(jì)課程設(shè)計(jì)--- 基于uml的超市進(jìn)貨管理系統(tǒng)設(shè)計(jì)
- uml課程設(shè)計(jì)-學(xué)籍管理系統(tǒng)
- uml課程設(shè)計(jì)-在線考試系統(tǒng)
評(píng)論
0/150
提交評(píng)論