频 道 直 达 - 新闻 - 培训 - 软件 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 读书 - 博客 - BBS
51CTO.COM_中国最大的网络技术网站
找资料:

6.3 端口与通道

作者: 邱郁惠 出处:机械工业出版社  2008-05-06 18:53    砖    好    评论   进入论坛
阅读提示:《SOC设计UML实务手册》通过一个录音芯片的仿真实例,从最简单的芯片设计,到更复杂的芯片组装设计,从UML图到SystemC代码,一应俱全,解说详尽。本文介绍了端口与通道。

6.3 端口与通道

如果子模块之间无法沟通,就无法整合在一起,也就无法提供更强大且有价值的功能了。在SystemC的程序中,子模块之间的沟通必须通过端口及通道;除此之外,进程与子模块间的沟通,以及进程之间的沟通,也都需要通道作为沟通的桥梁。

在本小节中,我们会说明子模块之间如何通过端口和通道进行沟通;下一小节中,将进一步谈到进程与子模块之间的沟通;进程之间的沟通,我们在之前的章节中已经说明过了。

外界无法直接接触模块内部的进程或其他部件,同样地,模块内部的进程或其他部件也不能直接接触外界,组模内外的沟通仅能通过模块对外提供的端口。所以,只有模块的设计者可以决定是否设置端口,以便能够与外界进行沟通。无论是顶层的模块还是内部的子模块,亦或是子模块内部更小的模块,都是一样的,都需要设置端口,才能与外界沟通。

在组合结构图中,端口的图示是一个小方型,放置于模块或部件的框线上,如图6-7所示。从图中所见可知,DAC模块设置了一个名为piDataIn的输入端口,而Memory模块则设置了一个名为poDataOut的输出端口。

图6-7 端口

在设置端口时,通常会指定端口将作为输入(In)或输出(Out)之用。例如,在PC的主机上头,也会区分该端口是接喇叭端子(音频输出),还是接麦克风端子(音频输入)。因为,端口的图示上并未特别标示出输出或输入,所以我们特别以pi(port in,输入)或po(port out,输出)作为端口的名称开头,便于指定端口方向。

一旦模块内部通过端口与外界取得联系之后,便可以通过输出端口写出数据到外部信道,或者也可以通过输入端口从信道读入数据。而且,端口并不直接连接信道,而是通过信道所提供的接口,与信道联系。接口就像是约定好的服务窗口,客人可以在不知服务者为谁的情况下,获得事先约定好的服务。例如邮局有提供储汇服务的窗口,也有提供邮政服务的窗口,我们根本不需要知道柜台后面是哪位银行员工,只要走对服务窗口,就能够获得约定好的服务项目。

由于端口与通道之间并无直接连接,所以当日后必需替换不同种类的信道时,只要新信道有支持原先的旧接口,那就不会影响到端口的设计了。这么一来,不仅原有的端口和模块不需要支出额外的费用,就可以立即享有新通道所带来的益处,而且通道的设计者也可以在不需要担心影响其他部件的情况下,安然地开发新种类的通道。

请先回头看图6-7,在组合结构图中,接口采用小圆图标,实线连接实际提供服务的对象。以sc_fifo信道为例,我们最常使用信道来做输出输入数据的动作,所以SystemC已经预先设计了sc_fifo_out_if接口约定,经由sc_fifo通道的实现之后,模块可以调用write()函数来将数据推进信道。而且,模块也可以通过sc_fifo_in_if接口,调用sc_fifo信道实现的read()函数,以便从信道拉出数据。

再接着看图6-8,端口连接上接口之后,图形就会变成像是一只伸出去的小手在抓取服务小球一般。所以,从这张组合结构图来看,我们可以得知Memory子模块通过poDataOut端口输出数据,并且通过chData信道所提供的sc_fifo_out_if接口,将数据推进sc_fifo信道。随后,DAC子模块通过piDataIn输入端口,经由sc_fifo_in_if接口从信道拉出数据。

图6-8 接口

最后,我们来看一个SystemC程序案例,说明子模块之间如何通过自身的端口,连接信道所提供的接口,以便传递彼此的数据。延续上一小节的Recorder模块,我们修改SystemC代码,让DAC与Memory子模块之间可以通过chData信道传递数据;仿真Memory芯片将数据推进信道,而DAC芯片从信道拉出数据,并转换成模拟音频的运作情况。

简化程序的做法是,我们直接在Memory模块的WriteOut进程里,写出四组8位的数据,仿真保存在内存内的数字音频。这四组8位数据依序为00000000、00000001、00000010、108 SOC设计UML实务手册00000011。当Memory模块将数据写进信道之后,SystemC会通知DAC模块的Convert进程,去信道读出数据。不过,我们当然没有真的转换成模拟音频,取而代之的是,让DAC模块的Convert进程直接将取回的四组8位数据显示到屏幕上,执行画面如图6-9所示。

图6-9 执行画面

图6-10~图6-12则分别是Recorder、Memory和DAC模块的组合结构图。

图6-10 Recorder模块的组合结构图

图6-11 Memory模块的组合结构图

程序清单6-8~6-14为SystemC的源代码,特别需要注意之处,如下所述:

• Recorder.h—特别注意到程序清单6-9的行号15,此处声明了一个名为chData的sc_fifo信道,该信道可存取的数据结构为sc_bv<8>,也就是8位(bit)数据。还有要注意,两个右角键号之间要留一个空格,否则会产出编译错误。

图6-12 DAC模块的组合结构图

• Recorder.cpp—在程序清单6-10的行号10~11中,指定Memory子模块的poDataOut端口连接chData通道,同样地,DAC子模块的piDataIn端口也连到了相同的信道,所以两子模块之间就可以通过共同的信道传递数据了。

• Memory.h—在程序清单6-11的行号7,声明了一个sc_port,而且指定为sc_fifo_out_if接口,同时也指定了传递的数据类型为sc_bv<8>,通过这个sc_fifo_out_if接口可以将数据推进sc_fifo信道中。

• Memory.cpp—在程序清单6-12的行号12~15中,通过poDataOut端口连到sc_fifo_out_if接口,并且调用write()函数,将数据推进chData信道。

• DAC.h—在程序清单6-13的行号7,声明了一个sc_port,而且指定为sc_fifo_in_if接口,同时也指定了传递的数据类型为sc_bv<8>,通过这个sc_fifo_in_if接口可以从sc_fifo信道拉出数据。

• DAC.cpp—如果sc_fifo信道中没有数据(可用数目为0)的话,Convert进程会先暂停执行,等待接收到数据已写入的事件,如程序清单6-14的行号14~15所示。否则Convert进程会调用read()函数,从信道拉出数据,并且显示到屏幕上,如行号16所示。

程序清单6-8 main.cpp

//// EX06_02
7. // main.cpp : Defines the entry point for the console application.
8. //
9. #include "stdafx.h"
10. #include "systemc.h"
11. #include "Recorder.h"
12. int sc_main(int argc, char* argv[])
13. {
14. Recorder *myRecorder = new Recorder("myRecorder");
15. sc_start();
16. system("PAUSE");
17. return 0;
18. }
//// EX06_02

程序清单6-9 Recorder.h

//// EX06_02
18. // Recorder.h
19. //
20. #pragma once
21. #include "Memory.h"
22. #include "DAC.h"
23. class Recorder : public sc_module
24. {
25. public:
26. SC_HAS_PROCESS(Recorder);
27. Recorder(sc_module_name mn);
28. void Playback(void);
29. private:
30. Memory* myMemory;
31. DAC* myDAC;
32. sc_fifo<sc_bv<8> > chData;
33. };
//// EX06_02

程序清单6-10 Recorder.cpp

//// EX06_02
1. // Recorder.cpp
2. //
3. #include "stdafx.h"
4. #include "systemc.h"
5. #include "Recorder.h"
6. Recorder::Recorder(sc_module_name mn) : sc_module(mn)
7. {
8. myMemory = new Memory("myMemory");
9. myDAC = new DAC("myDAC");
10. myMemory->poDataOut(chData);
11. myDAC->piDataIn(chData);
12. SC_THREAD(Playback);
13. };
14. void Recorder::Playback(void)
15. {
16. cout << "I'm Recorder::Playback" << endl;
17. };
//// EX06_02

程序清单6-11 Memory.h

//// EX06_02
17. // Memory.h
18. //
19. #pragma once
20. class Memory : public sc_module
21. {
22. public:
23. sc_port<sc_fifo_out_if<sc_bv<8> > > poDataOut;
24. SC_HAS_PROCESS(Memory);
25. Memory(sc_module_name mn);
26. void WriteOut(void);
27. };
//// EX06_02

程序清单6-12 Memory.cpp

//// EX06_02
1. // Memory.cpp
2. //
3. #include "stdafx.h"
4. #include "systemc.h"
5. #include "Memory.h"
6. Memory::Memory(sc_module_name mn) : sc_module(mn)
7. {
8. SC_THREAD(WriteOut);
9. };
10. void Memory::WriteOut(void)
11. {
12. poDataOut->write("00000000");
13. poDataOut->write("00000001");
14. poDataOut->write("00000010");
15. poDataOut->write("00000011");
16. };
//// EX06_02

程序清单6-13 DAC.h

//// EX06_02
22. // DAC.h
23. //
24. #pragma once
25. class DAC : public sc_module
26. {
27. public:
28. sc_port<sc_fifo_in_if<sc_bv<8> > > piDataIn;
29. SC_HAS_PROCESS(DAC);
30. DAC(sc_module_name mn);
31. void Convert(void);
32. };
//// EX06_02

程序清单6-14 DAC.cpp

//// EX06_02
1. // DAC.cpp
2. //
3. #include "stdafx.h"
4. #include "systemc.h"
5. #include "DAC.h"
6. DAC::DAC(sc_module_name mn) : sc_module(mn)
7. {
8. SC_THREAD(Convert);
9. };
10. void DAC::Convert(void)
11. {
12. for(;;)
13. {
14. if (piDataIn->num_available()==0)
15. wait(piDataIn->data_written_event());
16. cout << piDataIn->read() << endl;
17. } //end for
18. };
//// EX06_02


回书目   上一节   下一节
关于 SOC  UML
专题
UML统一建模语言
征服Ajax——Web 2.0快速入门与项目实践(.net)
征服Ajax+Lucene构建搜索引擎
征服Ajax——Web 2.0快速入门与项目实践(Java)
Visual C++程序设计自学手册
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 最 大 的 网 络 技 术 网 站 ·
技 术 成 就 梦 想
订阅技术快讯
电子杂志下载
名称:SQL Server数据库管理精品黄皮书
简介:书中文章经过精挑细选,便于用户能根据自己的实际工作和学习,快速在本书寻找到相关资料。内容涵盖了SQL Server的安装与升级、语句查询、数据备份和恢复、自动化任务、数据同步、数据字典、安全和预防、性能和优化、集群等各方面应用信息,以及DBA管理人员在数据库管理工作中
名称:2007路由技术大全
简介:《2007路由技术大全》由51CTO.com网站特别策划制作,该书包括路由器技术、路由器产品、路由器配置、安全设置、路由器故障处理、路由器密码恢复,以及广大网友在实践使用中的心得经验和技巧文章,内容注重实用性,适用于初学者入门,也适合多年从业者提高,是一本实践和理论完
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
华为路由器配置
华为路由器配置
LAMP技术精解
LAMP技术精解
微软出价446亿美元收购雅虎
微软出价446亿美元收购雅虎
· 微软出价446亿美元收购..
· 网络故障排除宝典
· Vista SP1对决XP SP3
· 2008年上半年全国软考..
· AIX操作系统管理应用(..
· 华为员工自杀频频拷问..
· 三层交换技术专题
· ARP攻击防范与解决方案
· 隐私保护技术探讨
· 反垃圾邮件技术应用
· 龙芯要做中国的“奔腾”
· Windows Server 2008专..
· AMD Phenom三核处理器..
· 路由器设置与口令恢复
· 微软Forefront企业安全..
· 企业数据恢复指南
ARP攻击防范与解决方案
ARP攻击防范与解决方案
iSCSI应用与发展
iSCSI应用与发展
SQL Server 2008/2005全解
SQL Server 2008/2005全解
· SQL Server 2008/2005..
· SOA 面向服务架构
· SQL Server 2008/2005..
· iSCSI应用与发展
· RAID——磁盘阵列基础
· Apache技术专题
· 中间件应用技术专题
· 三层交换技术专题
· SQL Server入门到精通
· Apache技术专题
· 国际文档格式标准开战
· 路由器设置与口令恢复
· 打造安全服务器
· PHP开发应用手册
· SOA 面向服务架构
· 企业数据恢复指南
ARP攻击防范与解决方案
ARP攻击防范与解决方案
SQL Server 2008/2005全解
SQL Server 2008/2005全解
iSCSI应用与发展
iSCSI应用与发展
· iSCSI应用与发展
· 中间件应用技术专题
· SQL Server入门到精通
· SQL Server 2008/2005..
· SOA 面向服务架构
· Apache技术专题
· iSCSI应用与发展
· 三层交换技术专题
· Apache技术专题
· 企业数据恢复指南
· RAID——磁盘阵列基础
· 路由器设置与口令恢复
· SOA 面向服务架构
· ADSL应用面面俱到
· ADSL应用面面俱到
· 反垃圾邮件技术应用