采用双端口RAM技术实现智能型高速并行通讯卡的接口设计

网友投稿 256 2022-11-07

采用双端口RAM技术实现智能型高速并行通讯卡的接口设计

1 系统描述

通讯卡包含了数字滤波、数据收集、传输等功能,对系统内的并、串行通讯实现分时操作。卡上由一片MCU负责管理各个分机,通过串行通讯方式将分机采集的各种数据,收集到通讯卡内,经过判断、筛选,将有效数据存贮到双端口RAM的规定区域内;计算机从双端口RAM内将数据读入,进行运算处理,与标准数据进行比较判断,将结果或控制命令写入双端口RAM内,实现整个系统统一协调运行。本文主要针对通讯卡的软、硬件设计和在VB环境下的软件实现,作重点的分析。

2 硬件设计

通讯卡的基本硬件设计简图如图1所示。利用计算机总线做扩展卡的技术已经广为应用,但很多都是利用计算机提供固定的I/O端口地址进行读写操作,“瓶颈效应”十分明显。在对实时性要求很高、数据传输量很大的场合,数据阻塞明显,无法满足系统的大量数据高速传输的需要。本系统利用计算机内存直接映象技术,对内存物理地址直接操作,实时性和速度明显改善,完全满足本系统的速度要求。

2.1 MCU和双端口RAM的选择

2.2 双端口RAM的地址范围的选择

计算机内部高端地址中有一段保留给I/O适配卡的128KB地址空间,段地址空间为0C0000H~0DFFFFH。利用这128KB中的一段2KB空间即可满足IDT7132的使用,按PC总线的协议经过地址译码和其它控制总线选能,实现内存直接映象方式。地址范围为0D0000H~0D07FFH之间。另一侧,MCU与IDT7132的接法只将IDT7132其中一侧总线接入MCU的总线上,其接法同普通RAM没有区别,设置地址范围在 8000H~87FFH之间。

2.3 对双端口RAM访问的特殊情况处理

IDT7132 两侧的BUSY线分别接到MCU的INT0中断上和PC总线的A10脚(IO-CH-RDY)上,作为MCU和计算机同时读写IDT7132的同一个地址单元时的“忙闲”状态线。当两侧访问不同的地址单元时,BUSY线无效,两侧操作互不影响。当两侧“几乎同时”访问同一个单元时,按IDT7132的总线仲裁逻辑,对两侧的片选信号和地址信号之一到达时间间隔只要大于5ns,就能对先到达的一侧提供读写通道,保证数据读写的真实性。同时将另一侧的BUSY 线置低,为MCU或计算机提供中断或等待信号。众所周知,89C51不具备插入等待周期延时操作的能力。当MCU一侧先行操作时,计算机一侧的BUSY线有效,PC总线上的IO-CH-RDY状态线被拉低,命令计算机CPU插入等待周期,延时等待MCU一侧完成读写操作后,再进行读写操作。当计算机一侧占据IDT7132的一个地址单元时,MCU一侧再操作该单元,MCU读写的数据无效。我们采用了判断标志位的方式解决此问题。当对应的BUSY线变低 INT0中断有效时,MCU完成该条读写指令后立即进入中断,置标志位,中断返回后,即执行查询标志位的指令同,判断此次操作是否有效。未成功,重复操作,直至读写成功。

3 软件设计

Visual Basic 6.0不具备对计算机底层地址操作的功能,不如Visual C++ 6.0、Delphi等。特别在本系统中采用的高速并行通信方式,对内存物理地址读写操作的频率很高,按常规应改用其它语言。但系统其它方面的工作,不是其它语言所能替代的,所以必须将VB语言环境下不能对底层地址读写操作的问题加以解决。经过实验,通过如下方法实现。

笔者采用的方法是调用动态链接库DLL。用VisualC++ 6.0编写对内存物理地址进行读写操作的DLL动态链接库函数,进行数据采集和发送;用Visual Basic 6.0调用DLL实现数据通信,从而弥补VB对底层数据操作的缺陷,使VB环境下开发数据通信系统软件更为方便。

(1)首先使用Visual C++ 6.0创建一个MFC Appwizard dll项目,这样就可以在DLL中编写程序。因为我们要对直接映象在高端内在范围内的地址进行操作,所以在编写程序时,要使用如下方法:

-asm{ mov A B

mov ……

…………

mov i A}

return i;

-asm{}是嵌入式汇编函数,在Visual C++6.0中只有使用此方法才可以访问高端内存地睛。还要在DLL中编写两个函数。一个从内存地址读数函数,一个对内存地址写数函数。这样才能完成对高端内存地址读写的操作,实现底层的数据传输。

(2)使用Visual Basic 6.0调用DLL动态链接库函数。

(ByVal localport%,ByVal value%)

(ByVal localport%)

其中:write( )函数是向高端内存地址写数据;

read( )函数是从高端内存地址读数据。

第二步:在窗体中放入三个文本框(Text 1,Text2,Text3),一个命令按扭(Command 1),就可以在代码窗口中编写代码:

Option Explicit

Dim Port 1 ‘内存地址 如:0D0000H

Dim Port 2 ‘16进制数 如:12H

Private Sub Command 1-click()

Port 1=Val(Text 1.Text) ‘把Text 1赋给port 1

Port 2=Val(Text 2.Text) ‘把Text 2赋给port 2

Gg=“write”(port 1,port2) ‘往Port 1地址中写Port 2

Salp=“read”(port 1) ‘从Port 1地址中读数

Text3.Text=Salp ‘在Text3中显示

Salp

End Sub

两个函数的调用过程如上所述,可根据编程的意图放在任何位置。特别注意,函数地址不能与其它硬件的地址或系统内存地址冲突,否则会造成计算机死机。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:关于maven依赖 ${xxx.version}报错问题
下一篇:观点 | 苹果在中国建立研发中心背后的7个逻辑
相关文章

 发表评论

暂时没有评论,来抢沙发吧~