以太网接口通信速度快,传输可靠,使用和配置方便,对于20 mb/s以下的码速率,100 mb/s的网卡可以进行不丢包转发,采用tcp包格式还可使设备小型化,便于数据的转发,因此有必要扩展设备的以太网功能。
1 整体模块设计
1.1 系统设计
系统设计框图如图1所示。其中,采编器或接收机解调输出的pcm信号及时钟输入到fpga中进行帧同步,irig—b码信息也送到fpga中进行解调,得到时间信息。数据与时间一起存入sram乒乓缓冲区中,达到一定大小后,fpga向arm处理器发器中断,arm中运行的linux系统,将数据取走,进行tcp/ip打包,发送给接收计算机。
在设备开始工作前,需要在计算机端进行参数设置,计算机tcp/ip包将参数发送给arm处理器,由arm处理器转发给fpga。帧同步器的设计中,码速率为100b/s~10mb/s,帧长为4~4 096word,帧同步码组为4~32,arm网卡为100mb/s。
1.2 硬件实现
pcb采用6层结构,相邻布线层,水平垂直交叉,电路层与电源层单独分开,提供良好的电磁兼容特性。
1.2.1 fpga
fpga选择ep1c12,为实现乒乓缓冲结构,采用sram为is61lv25616。输入信号使用sma线缆连接,在传输过程中会引入衰减,信号输入输出易出现阻抗不匹配的情况,选用ad8556构成射随器,对输入信号进行匹配,同时也增大模拟源的输出能力。
1.2.2 arm
在此采用s3c2440,内核为arm920t,最高频率为400 mhz,带mmu支持操作系统。内存采用2×32 mb的sdram,存储采用128 mb nand flash,网卡采用dm9000a。
1.2.3 arm与fpga的接口连接
这里采用总线接口,将fpga作为一个存储设备挂在arm的存储器总线上,如图2所示。
fpga在arm中起始地址为0x18000000,以4 b对齐,占用0x80个地址,地址范围为0x18000000~ox1800007c,中断为eint0。
在fpga内部采用读/写指针来模拟fifo,用一个地址来读取fpga数据,其余地址用于配置帧同步器与模拟源的参数。
2 帧同步与b码解调
fpga完成pcm数据的帧同步和解调b码,写入到乒乓sram缓冲区中,实现如图3所示。
2.1 帧同步模块
帧同步器根据帧同步码组的相关性和周期性,经过相关运算将同步码从pcm串行流中识别出来,原理框图如图4所示。
pcm数据按时钟进行串/并转换,与本地帧同步码进行同或运算后再与上屏蔽位,由全加网络将相关运算结果按位相加统计结果中1的个数,大于门限值则表示可能接收到了帧同步码。
为避免虚警和漏检,使帧同步器稳定可靠工作,采用搜索、校核、锁定三态逻辑。
系统开始时处于搜索态,符合相关器输出,由搜索态转入校核态。在预期检测窗口内没有帧码,从校核返回到搜索态。连续通过校核数α,进入锁定态。为避免帧同步码的漏检,连续漏检超过保护帧数β,帧同步才返回搜索态,否则保持在锁定态,帧脉冲由本地产生。
2.2 irig—b码解调
irig时间序列码是一种串行码,共有3种码元,如图5所示。
p码元是位置码元,连续2个p码为一帧的开始,第1个p码元定义为p0,第2个p码元为秒脉冲pps,上升沿为该秒的准时刻,时间信息以bcd码依次分布在其后的码元中。解调时先进行pps的提取,再进行秒、分、时、天的信息提取,其流程如图6所示。
时钟频率为1 mhz,用计数器对输入信号的脉宽进行计数。8 ms,5 ms,2 ms脉宽计数为8 000,5 000,2 000。输入b码的脉宽会混有干扰,晶振时钟也存在一定的误差,计数器的计时判别应浮动一个范围,设置门限为脉宽的85%~115%,当满足一定范围的数值时,分别输出p码,0码,1码信号。
fpga中的时码产生“天:时:分:秒:毫秒:微秒”信息。解调出b码时,fpga更新内部时间,b码中不含毫秒与微秒信息,由fpga根据秒脉冲信息的准时刻来生成。
3 fpga驱动程序开发
在linux中,所有的硬件设备都像常规文件一样进行打开、关闭和读/写。把fpga当作字符设备进行设计,驱动由设备加载与卸载,以及文件操作file_operation结构体中成员函数组成。
3.1 加载与卸栽设备驱动
fpga设备驱动程序初始化流程为动态获得主设备号、字符设备注册和申请中断;卸载流程为注销设备,释放设备编号。
定义一个设备结构体来表示fpga,如下:
当用户程序读fpga设备时,数据还未准备好,此时驱动程序应该阻塞该进程,将其置入睡眠状态直到条件满足。此时需要初始化一个等待队列头,对读进程的休眠和唤醒时使用:
在卸载函数中,删除一个cdev,完成字符设备的注销,然后释放设备编号:
3.2 文件接口操作
linux为所有的设备文件都提供了统一的操作函数,fpga设备驱动。file_operations包含打开函fpga_open、读函数fpga_read、设置参数函数fpga_ioctl和关闭设备函数fpga_release。
3.2.1 打开与关闭fpga设备
在打开设备与关闭设备时会调用open函数与release函数,在open函数中,要对设备进行i/o内存资源映射及中断申请。
设备驱动程序中,需通过内存管理单元mmu将设备的虚拟地址映射到物理地址。根据fpga在s3c2440中的物理地址,定义如下宏:
使用ioremap()对fpga的i/o内存资源进行映射,把物理内存地址映射为一个内核指针:
数据交换采用中断,需先设置硬件中断方式,然后向系统注册中断函数,实现如下:
fpga连接在arm的eint0上,isr_fpga为中断处理函数指针。当关闭fpga设备时,需释放i/o内存,释放中断:
3.2.2 驱动程序控制接口ioctl
ioctl用来设置fpga中帧同步器和模拟源的参数,部分设置命令如表1所示。
在此,采用统一的命令码方式,包含幻数、序数、传输方向、数据长度,使用宏_io(),_ior(),_iow()和iowr()辅助生成,如命令0设置如下:
在ioctl中,采用switeh(cmd)来实现对fpga参数的设置及fpga状态的读取。
3.2.3 中断函数及读函数
当fpga产生中断时,根据缓冲区的大小,中断函数循环对fpga映射后的地址读取数据。arm与fpga接口为16位,使用inw读取,数据存放在驱动程序的缓冲区中:
应用程序读取数据时,调用read函数,参数buffer为用户空间缓冲区的指针,利用copy_to_user函数将数据从内核空间拷贝到用户空间,当设备中暂时没有数据时,读进程应当被休眠:
flag为一个标志位,当flag被中断函数设置为1时表示设备中有数据,此时读进程可被换醒。
3.2.4 用户程序及测试
设备驱动实现后,需编写相应的用户程序来进行测试驱动程序和实现数据的网络转发。在用户程序中,读/写fpga设备使用与普通文件一样的操作函数。移植linux时配置好网卡的地址,然后使用socket编程实现数据的tcp/ip转发,用遥测软件接收到的数据测试如图7所示。
通过测试可以看到,同步码fdb18450被正确识别,irig-b解码为当前时间。
4 结语
在此,基于fpga与arm进行遥测数据的帧同步遥测数据的网络转发,充分地利用了fpga与arm各自的特点,它可使fpga+arm在数据接收处理中得到广泛应用。
恒讯科技带大家深入理解:WebSocket服务器的工作原理
微电子技术应用实例及应用领域分析
“预见”6G新未来:通感一体化—传递信息无数,感知万事万物
pcb油墨特性
fireflyAIO-3288J主板LED介绍
基于FPGA与ARM进行遥测数据网络转发的流程剖析
中国敦促英国不要在5G建设方面歧视华为 抵制他国的压力
未来教育发展趋势是怎样的
红外线光电开关的原理_红外线光电开关分类
元戎启行发布L4级自动驾驶传感解决方案
低功耗无线模块超远距离无线传输实现中继的方法
Flyme 8很快就会与我们见面,它又有哪些亮点呢?
德国5G频谱拍卖结束 总收益65亿欧元
一文盘点孙正义背后的“自动驾驶帝国”
微软开始测试音量窗口新功能 将提供精细化多媒体控制
为适应数字隔离器传播延迟 CAN节点位时序大升级
2020年款PS5 Pro曝光在浮点运算方面可以和Xbox Series X抗衡
努比亚X双屏怎么样 打造了许许多多与众不同的新玩法
索尼松下三洋垄断锂电池价格遭巨额罚款,三星告密SDI免罚
华为欧拉os系统是家用的吗