9.1案例设计一个随身录音笔,功能具有录音和播放,存储功能。该芯片可以由Memory存储芯片、ADC转换芯片和DAC芯片组装而成。9.2案例的用例图该案例具有两个大的功能录音和播放,则该案例的用例图如图所示。系统名称录音笔芯片用例名称录音UC编号UC001用例简述把声音存储到芯片里执行画面主要流程1)从AD接收信号2)把信号存储3)从芯片里读取信号4)由DA接口处理5)播放参考文件1)系统用例图2)设计文件3)程序文件9.3案例代码#ifndef_RECORDER_H#define_RECORDER_H#includesystemc.hclassRecorder:publicsc_module{public:SC_HAS_PROCESS(Recorder);Recorder(sc_module_namemn);voidInput(void);voidRecord(void);voidPlay(void);private:sc_eventeRecordStart,eRecordStop;sc_eventePlayStart,ePlayStop;};#endif9.3案例代码#includerecorder.hRecorder::Recorder(sc_module_namemn):sc_module(mn){SC_THREAD(Input);SC_THREAD(Record);SC_THREAD(Play);}voidRecorder::Input(void){intiOp;wait(SC_ZERO_TIME);for(;;){cout1(录音),2(播放)...;ciniOp;switch(iOp){case1:eRecordStart.notify();wait(eRecordStop);break;case2:ePlayStart.notify();wait(ePlayStop);break;default:return;}}}9.3案例代码voidRecorder::Record(){for(;;){wait(eRecordStart);coutsc_time_stamp()...开始录音endl;wait(10,SC_SEC);coutsc_time_stamp()...结束录音endl;coutendl;eRecordStop.notify();}}9.3案例代码voidRecorder::Play(){wait(ePlayStart);coutsc_time_stamp()...开始播放endl;wait(10,SC_SEC);coutsc_time_stamp()...结束播放endl;coutendl;ePlayStop.notify();}9.3案例代码voidRecorder::Record(){for(;;){wait(eRecordStart);coutsc_time_stamp()...开始录音endl;wait(10,SC_SEC);coutsc_time_stamp()...结束录音endl;coutendl;eRecordStop.notify();}}9.3案例代码#includerecorder.hintsc_main(intargc,char*arg[]){Recorder*myRecorder=newRecorder(myRecorder);sc_start();system(PAUSE);return0;}9.3活动图使用活动图能够演示出系统中那些地方存在功能,以及这些功能和系统中其他组件或者模块之间如何协调工作。能为我们建模一个工作流。活动图可以锁定表达多条进程(Process)并发执行状况,同时也可以详尽表达单个进程内部的执行细节。活动图很适合来表达系统进程设计。活动图的作用在我们编码之前可以帮助编程和设计人员很好地协助思考复杂的进程细节。9.3活动图这个活动图对应程序代码为右边所示,呈现出Recorder有三条并行的进程。Recorder::Recorder(sc_module_namemn):sc_module(mn){SC_THREAD(Input);SC_THREAD(Record);SC_THREAD(Play);}9.3活动图这个活动图对应程序代码为Input处理函数,呈现出Input进程的内部执行流程。input进程主要结构为一个选择结构。9.3活动图voidRecorder::Input(void){intiOp;wait(SC_ZERO_TIME);for(;;){cout1(录音),2(播放)...;ciniOp;switch(iOp){case1:eRecordStart.notify();wait(eRecordStop);break;case2:ePlayStart.notify();wait(ePlayStop);break;default:return;}}}9.3活动图这个活动图对应程序代码为Record处理函数,呈现出Record进程内部设计。Record进程一开始便进入接收事件,等待接收到RecordStart事件,才会进入Recording(录音动作)。9.3活动图voidRecorder::Record(){for(;;){wait(eRecordStart);coutsc_time_stamp()...开始录音endl;wait(10,SC_SEC);coutsc_time_stamp()...结束录音endl;coutendl;eRecordStop.notify();}}9.3活动图这个活动图对应程序代码为Play处理函数,呈现出Play进程内部设计。Play进程一开始便进入接收事件,等待接收到PlayStart事件,才会进入Playing(播放动作)。9.3活动图voidRecorder::Play(){wait(ePlayStart);coutsc_time_stamp()...开始播放endl;wait(10,SC_SEC);coutsc_time_stamp()...结束播放endl;coutendl;ePlayStop.notify();}9.4进程在操作系统中,进程(process)是程序在并发环境中的执行过程,它具有动态性,并发性,独立性,异步性和结构性五大特征。进程与程序的区别是,进程是一个动态概念,而程序是一个静态概念。程序是指令的有序集合,永远存在,进程强调的是执行,是程序在数据上的一次执行,有创建有撤销,存在是暂时的;进程具有并发性,而程序没有;进程是竞争资源的基本单位,程序不是。进程与程序的联系是,进程是程序在数据集上的一次执行;一个程序可对应多个进程,一个进程可包括多个程序。9.4进程在systemc里,一个最基本的执行单位称为”进程”(process)。进程行为是多样。进程不是层次化的。在systemc里进程声明格式,它是在systemc里的模块(Module)里的建构式(Constructor)里声明进程,以便通知systemc引擎产生所需要的并发(concurrency)进程。Systemc支持两种SC_CTOR声明方式。9.4进程在systemc声明格式C++声明格式classRecorder:publicsc_module{public:SC_HAS_PROCESS(Recorder);Recorder(sc_module_namemn);voidInput(void);voidRecord(void);voidPlay(void);};Recorder::Recorder(sc_module_namemn):sc_module(mn){SC_THREAD(Input);SC_THREAD(Record);SC_THREAD(Play);}9.4进程在systemc声明格式传统声明格式classRecorder:publicsc_module{public:SC_CTOR(Recorder){SC_THREAD(Input);SC_THREAD(Record);SC_THREAD(Play);}voidInput(void);voidRecord(void);voidPlay(void);};9.4进程相关的活动图在UML的活动图中,圆角矩形称作动作(Action),可表示一项进程。一个动作可以表示一个完整的进程,也可以表示进程内部的一小段动作。9.4进程相关的活动图在子活动图中内部包含一段层次级的活动流程。9.4进程相关的活动图在systemc中为我们提供三种进程类别,这三种进程类别为Method、Thread和ClockedThread。在活动图中我们可以表示出该进程的类别。9.5事件进程之间是不能进行相互通信的,必须通过事件(Event)来通知协调进程。Systemc为我们提供了sc_event类。在系统内部模块里声明事件对象,就可以实现发送事件通知,使不同进程之间进行直接沟通。9.5事件声明classRecorder:publicsc_module{public:SC_HAS_PROCESS(Recorder);Recorder(sc_module_namemn);voidInput(void);voidRecord(void);voidPlay(void);private:sc_eventeRecordStart,eRecordStop;sc_eventePlayStart,ePlayStop;};9.5事件使用voidRecorder::Record(){for(;;){wait(eRecordStart);coutsc_time_stamp()...开始录音endl;wait(10,SC_SEC);coutsc_time_stamp()...结束录音endl;coutendl;eRecordStop.notify();}}9.5事件相关的活动图Record进程一开始执行就进入到RecordStart接收事件。只有接收到了录音事件通知之后,才会往下执行Recording录音。录音时间一到(Timeout),会发生转换事件,使流程转换到下个活动。进入发送录音结束事件通知,发送之后,流程再次回到RecordStart接收事件处。9.5事件相关的活动图for(;;){wait(eRecordStart);coutsc_time_stamp()...开始录音endl;wait(10,SC_SEC);coutsc_time_stamp()...结束录音endl;coutendl;eRecordStop.notify();}9.6通道进程之间可以通过事件来进行沟通,但不能进行事件数据的传递。Systemc为了我们解决了数据传递问题,就是通道。模块是系统行为的主要载体,通道是通信的主要载体。在systemc中,通道是接口方法的具体实现者。Systemc为我们提供了多种通道(sc_signal,sc_mutex,sc_fifoT,sc_semaphore,sc_bufferT)9.6添加通道之后的程序代码#includesystemc.hclassRecorder:publicsc_module{public:SC_HAS_PROCESS(Recorder);Recorder(sc_module_namemn);voidInput(void);voidRecord(void);voidPlay(void);private:sc_eventeRecordStart,eRecordStop;sc_eventePlayStart,ePlayStop;sc_fifosc_bv8chAudio;}