虚电路(Virtual Electronic Circuit)是跨平台的软件数字电路开发类库控件包,它支持跨越窗体、进程、计算机的电路互联,可以传导逻辑、数字、日期时间、文字、图像、声音、视频,支持虚实互联、虚实互换,提供电路事件支持,具备软件集成电路制造能力。
虚电路在Delphi6/C++Builder6下运行,它也支持在Linux 下的Kylix2下通过调用QT运行。
1 虚电路的组成
虚电路由狭义虚电路(Special VEC)和广义虚电路(General VEC)两部分组成。狭义虚电路关注电路、处理器、内存、外设的虚拟及互联,广义虚电路关注多媒体、网络、移动设备、云、物联网、Html5、内核、领域驱动、人工智能/机器学习的开发及互联。
1.1 狭义虚电路(SVEC)
狭义虚电路包括数字虚电路(Digital VEC)、虚拟机虚电路(VM VEC)、工控虚电路(Industrial Control VEC)三部分。
数字虚电路主要实现基本门电路、触发器、锁存器、处理器、中断控制器、硬盘、网卡、显示器等等设备的虚拟化。
虚拟机虚电路主要实现在虚拟机中的设备的虚拟化。
2 虚电路中的关键技术
2.1 无限连接
虚电路支持窗体内部、窗体之间、不同程序之间、不同计算机之间的电路互联,方式是相同的,效果是等价的。
2.1.1 进程内电路互联
进程内互联支持窗体内的电路互联,窗体之间的电路互联,窗体和数据模块(Data Module)的电路互联。通过点击连接即可。下面为几个软件运行例子:
1、同一窗体内
在窗体内放置一个绘制电路图控件(VECPCB),一个开关(VECSwitch),一个发光管(VECLED)。
然后选中开关后点击右键,在弹出菜单中选择 Connect To,鼠标就会变成红圈,移动鼠标到发光管,鼠标会变成一只手,单击发光管,这两个控件间就有一条线相连接,表示它们已经连接:

运行程序,点击开关后结果如下:

3、窗体与数据模块(Data Module)
连接方法同上,这里就不演示了。
2.1.2 本机不同程序的电路互联
使用MsgNode控件,放到不同的程序里。不管有几个,关键是它们的名称必须相同,名称相同的MsgNode会在应用程序之间进行电路传导。下面是两个程序使用相同名称进行连接的例子:
1、新建一个工程Projecet1,里面有个单元叫Unit1,名称叫Form1。在Form1里放入VECPCB, VECSwitch,和MsgNode,MsgNode连接到VECSwitch,MsgNode的LineName 设置为A1,Active设为True。
2、再添加一个工程叫Project2,里面有个单元Unit2,名称叫Form2。在Form2里放入VECPCB, VECLED,和MsgNode,MsgNode连接到VECLED,MsgNode的LineName 设置为A1,Active设为True:

运行两个程序,结果如下:

2、使用UDP协议进行连接
和上面的情况一样,只是要注意UDP可以实现广播到一群计算机。
2.2 虚实互联
虚拟电路虚电路支持虚实互联,例如有一个实际的非门可以和虚电路中的与门相连接。还可以通过IO端口与实际电路互联。
虚电路从设计之始,就在考虑与实际物理电路的互联问题。而虚实电路的互联是一个比较复杂的问题。截至目前,它可以支持的虚实互联设备为普通的总线IO设备,可以进行双向的读写操作。
虚实互联需要考虑以下几个方面的问题:
1、接口类型 – IO端口。计算机与硬件电路的互联需要通过接口板进行,而接口板又是种类繁多。因此,虚电路目前还不能支持任意型号的接口板,而标准的IO接口板成为支持对象。这种接口包括PC机的扬声器,CMOS的控制端口,游戏杆口等等。可以满足基本的需要,其它的接口方式需要进一步进行二次开发。
2、接口驱动 – 平台相关。因为现代的操作系统都不容许直接的端口读出/写入代码,所以,虚电路必须针对不同平台实现此接口,下面是各种平台的实现。
1)Linux,使用 setlevel(4) 提升进程权限到可以直接读写端口,然后就可以直接使用嵌入汇编写入了。
2)Windows 95/98/Me,通过嵌入汇编,直接可以写入IO端口。
3)Windows NT/2000/XP/2003,采用辅助的ZLPort.SYS驱动,在内核级读写端口。虚电路只是控制此驱动程序的读写。
3、实际的控制演示:

新建一个工程,在窗体中放入VECPCB控件,一个VECTrackBar,一个VECLED,连接两者。然后放入VECIO控件,连接到VECTrackBar,并设置端口为97,方向为双向,总线宽度为8。再放入一个普通的按钮,在它的点击事件中写入:
VECIO1.DirectPort.Active := not VECIO1.DirectPort.Active;
运行程序,点击按钮启动,然后拉动控制条,就会听到PC机扬声器发出的声音。
2.3 虚实等价和虚实互换
1
、电路可以是虚实混合的共同体。在虚电路的设计思想中,理解虚实互补、虚实互联是非常重要的。由于虚实互补,一个大的电路系统可以由虚虚实实的多个电路互联而成。逻辑是相同的,效果是一致的。而虚实的相互代替就给了电路设计的极大灵活性。示意图:

2、虚电路的误设计不会造成元器件的损坏。一般的电路逻辑,在调试维护时很容易损坏芯片。而虚电路最多只是电路无法工作,不会引起元器件的损坏。
3、虚实互联使得虚电路由单纯的虚拟电路设计转变为虚实电路联合设计。可以替代各种数字电路、可编程逻辑器件等等。
2.4 电路事件
事件是现代类库的一个重要功能,虚电路包括完整的电路事件支持,节点的连接
/断开、电路的传导、自定义数据读写,还有门电路的脉冲触发事件等等。下面是一个布尔节点的例子:

我们可以通过挂接这些事件来实现自己的业务处理。
2.5 传导类型
虚电路支持并不限于传导逻辑、数字、日期时间、文字、图像、声音、视频、通道、缓冲区、流、语音。
1、传导日期时间,放置VECPCB、VECClock、VECClockDisp,连接VECClock和VECClockDisp,就可以显示当前的日期时间:

2、传导文字,放置VECPCB、VECEdit、VECMemo、VECVoice,连接VECEdit和VECMemo、VECVoice,就可以传导文字、说出文字:

执行结果如下图:

3、执行程序,重定向标准输入、输出,传导文字,放置VECPCB、VECEdit、VECMemo、VECExecuteServer,连接VECEdit和VECExecuteServer,VECMemo和VECExecuteServer,就可以传导文字、执行程序:

运行程序,在文本框输入:
c:\windows\system32\ping.exe
结果如下:

继续在文本框输入:
c:\windows\system32\ping.exe 127.0.0.1
结果如下:

4、传导视频,放置VECPCB、VECDXPlayer、VECDXDrawImage,连接VECDXPlayer和VECDXDrawImage,就可以显示当前播放的视频:

2.6 虚电路家族
虚电路类库架构体现了从简单到复杂的生物进化过程。例如,狭义虚电路中的数字虚电路它包括以下几代:

下表列出了各代的类库层次:
| 名称 | 说明 | 备注 |
| 基本虚电路(Device) | 最简单的虚电路设备,例如开关、灯泡 | |
| 使能虚电路(_CS Device) | 增加_CS支持 | 在最简单的虚电路之上增加使能引脚,例如与非门、D触发器 |
| 读写虚电路(R/W Device) | 增加R/W支持增加Data Bus支持 | 在使能虚电路的基础之上增加数据总线和读写控制连线,例如寄存器 |
| 总线虚电路(Bus Device) | 增加M/IO支持增加Address Bus支持 | 在读写虚电路的基础之上增加地址总线和M/IO控制连线,例如内存条、处理器 |
2.7 软件集成电路制造
一般我们所说的集成电路制造是在硅片上进行光刻、腐蚀、切片、封装的过程。而一些薄膜、厚膜集成电路实际上是微型元器件的再次组装。虚电路的软件集成电路制造类似于厚膜工艺。首先设计一个具有若干电路器件和事件逻辑的IC模版,这个模版类似于窗体中的电路互联;然后就可以在软件开发中类似控件一样使用此模版;ICDevice的设计可以嵌套使用;还可以让软件集成电路隐藏设计细节。
2.7.1 软件集成电路制造的原理
软件集成电路制造遵循以下四条原则:
1)集成电路,即对象容器,可以在其中进行电路设计。
2)面向对象的集成电路包容,可以不断构造出复杂的复合电路逻辑。
3)蛋糕模子的制作工艺,设计一个,创建无数。
4)隐藏细节,可以将集成电路内部实现隐藏。
2.7.2 软件集成电路制造的演示
1)建立一个集成电路芯片:
1〉首先,新建一个工程,然后点击新建文件,选择VECIC。

这时,就会产生一个电路设计的窗体,如下图所示:

它不是
Windows的窗体,只是一个容器,可以在里面放置控件,编写代码,然后就可以重新使用了。同时,会产生相应的面向对象的代码:
TIC2 = class(TVECIC)
private
{ Private declarations }
public
{ Public declarations }
end;
所有的集成电路都必须继承自VECIC。
2〉下面我们在这里放置1个开关和1个灯泡,连接电路如下图所示:

这样,我们的一个基本的集成电路就制作好了。现在,我们将这个集成电路放入Windows窗体。和窗体中的1个灯泡连接,然后运行程序,下面为运行结果:


我们现在已经做好了集成电路,并且可以和窗体中的其它电路相连接,下面,我们要在这个集成电路的基础上设计一个更复杂的集成电路。
2)建立第二个集成电路芯片,包含第一个集成电路:
按照建立第一个集成电路的方法同样建立第二个集成电路,然后,我们将第一个集成电路放入第二个集成电路,并和1个灯泡相连:

我们可以看到的代码如下:
TIC3 = class(TVECIC)
IC21: TIC2;
VECLED1: TVECLED;
private
{ Private declarations }
public
{ Public declarations }
end;
然后,我们同样将
IC3也放入Windows窗体,运行程序,就可以看到下面的场景:

下面是整个窗体的代码,可以看到,此窗体包含了1个IC2,1个IC3和1个灯泡,1个绘制电路的控件。
TForm1 = class(TForm)
IC21: TIC2;
VECLED1: TVECLED;
VECPCB1: TVECPCB;
IC31: TIC3;
private
{ Private declarations }
public
{ Public declarations }
end;
上面的例子说明集成电路制造可以包含其它的集成电路,可以从简单到复杂不断扩展。
3)修改第一个集成电路芯片,连锁修改所有相关集成电路及电路板:
如果现在需要修改IC2的内部电路,可以直接打开设计进行修改,下面我们又连接了一个灯泡:

这时,我们打开IC3查看,可以看到,IC2中的灯泡已经在IC3中出现:

打开Windows窗体,看到的和我们所想的是一致的,窗体内部的所有设计都成为最新版本:

4)隐藏第一个集成电路的设计细节:
大多数时候,我们不希望最终用户看到电路内部的细节。这里以IC2为例,介绍隐藏电路内部实现而保留电路逻辑的方法:
在IC3的设计窗体中将IC2的ShowAsIcon属性设置为真。
我们在IC3中可以看到,IC2的设计细节已经被隐藏:

下面是最新的Windows窗体电路图,我们可以看到,所有的IC2集成电路都只显示为图标,无法看到内部细节:

虚电路的集成电路制造技术,巧妙的将面向对象设计和集成电路设计融合在一起,形成了较强的软件集成电路设计能力。
2.8 跨平台类库方案
虚电路是跨平台的数字门电路和多媒体软件开发控件包,目前它支持Delphi6/C++Builder6和Kylix2三个开发工具。
(01-07 历时一年半)