资讯动态

基于以太网的可见光通信系统:从MII到LED驱动的工程实践

发布时间:2026/10/22 2:32:39 来源:尧图企业网站定制
简介这份PPT资源面向通信工程、光通信与嵌入式方向的学习者系统讲解基于以太网的可见光通信系统实现方案。内容从可见光通信的基本概念切入逐步展开基于以太网的LED可见光通信系统架构涵盖信号接口处理电路、以太网介质转换模块、光发射机与光接收机等关键模块并深入分析光源LED的伏安特性、P-I特性与调制特性以及OFDM技术在可见光通信中提升带宽与可靠性的应用。资源包为1个pptx文件大小约1.13MB以图文并茂的幻灯片形式呈现系统通信链路、实验平台实物图与各模块原理框图便于课堂讲解与自学梳理。目前已有121人学习下载适合需要理解可见光通信系统组成、掌握LED调制驱动与以太网信号转换思路的读者参考也可作为相关课程设计或实验报告的资料底稿。1. 基于以太网的可见光通信系统为什么它比纯无线方案更值得动手如果你在实验室里搭过可见光通信VLC链路大概率经历过这种场景LED 驱动板调好了光电探测器PD接收端也调通了示波器上眼图勉强能看但一旦想跑个 TCP 流或者传个视频整个链路就开始丢包、卡顿最后只能退回到“点对点传文本”的演示水平。问题往往不在光路本身而在于数据源和光链路之间缺少一个标准化的、带流量控制的以太网接口。基于以太网的可见光通信系统核心思路就是把 VLC 链路当作一个二层网络设备来用而不是一个孤立的模拟前端。以太网帧从 MAC 层出来经过 FPGA 或 MCU 做线路编码和调制驱动 LED 发光接收端 PD 把光信号转回电信号恢复出以太网帧再送进标准 MAC 或交换机。这样一来VLC 链路对上层协议栈是透明的你可以直接跑 ping、iperf、甚至 HTTP 服务。适合谁做室内定位、电磁敏感场景通信、或者想把 VLC 从“演示”推到“可用”的嵌入式工程师和通信方向研究生。这一章先把概念立住后面几章拆实现、参数和坑。2. 以太网帧怎么变成光从 MII 到 LED 驱动的完整链路2.1 为什么选 MII 而不是直接接 PHY 芯片常见做法是拿一个带 MII 接口的以太网 MAC比如 FPGA 里的软核或者外挂的 MAC 芯片把 MII 的 TX 侧信号引出来。MII 是 4 位并行数据加 TX_CLK 和 TX_EN速率 25MHz 下对应 100Mbps。为什么不直接用 RJ45 口的差分信号去驱动 LED因为那对差分线是模拟的 MLT-3 编码你没法直接拿来做 OOK 或 VPPM 调制而且没有时钟恢复的余地。我一般会选 MII 的 TX 路径因为发送端时钟由 MAC 提供接收端可以用 CDR时钟数据恢复或者过采样来对齐。具体接线MAC 的 TXD[3:0]、TX_CLK、TX_EN 进 FPGAFPGA 内部做 4B/5B 或者 8B/10B 编码再串行化成单比特流最后驱动 LED 驱动器的使能端。接收端反过来PD 跨阻放大后进比较器恢复出比特流FPGA 做串并转换和解码再通过 MII RX 侧送回 MAC。注意MII 的 TX_CLK 在 100Mbps 下是 25MHz但 LED 的调制带宽通常只有几 MHz 到几十 MHz所以实际有效速率会受限于 LED 的响应时间不是 MII 跑多快就能传多快。2.2 用 FPGA 做 4B/5B 编码和串行化的最小实现下面是一个简化的发送端逻辑用 Python 模拟 4B/5B 查表和串行化过程方便你在写 Verilog 之前先验证映射关系。实际 FPGA 里会用查找表加移位寄存器实现。# 4B/5B 编码表部分用于把 MII 的 4 位数据映射成 5 位码字 # 选择原则保证足够的跳变沿便于接收端时钟恢复 encode_4b5b { 0x0: 0b11110, 0x1: 0b01001, 0x2: 0b10100, 0x3: 0b10101, 0x4: 0b01010, 0x5: 0b01011, 0x6: 0b01110, 0x7: 0b01111, 0x8: 0b10010, 0x9: 0b10011, 0xA: 0b10110, 0xB: 0b10111, 0xC: 0b11010, 0xD: 0b11011, 0xE: 0b11100, 0xF: 0b11101, } def mii_to_serial(nibbles, tx_en): 把 MII 的 4 位半字节流编码并串行化成比特流 bitstream [] for n in nibbles: if tx_en: code encode_4b5b[n 0xF] # 高位先出5 位码字 for i in range(4, -1, -1): bitstream.append((code i) 1) else: # TX_EN 无效时发送空闲码维持跳变 for i in range(4, -1, -1): bitstream.append((0b11111 i) 1) return bitstream # 示例发送 0x3, 0xA, 0x5 bits mii_to_serial([0x3, 0xA, 0x5], tx_en1) print(bits)逻辑说明encode_4b5b字典是 4B/5B 映射每个 4 位半字节变成 5 位码字保证足够的电平跳变。mii_to_serial按高位先出把码字展开成比特流tx_en无效时插入空闲码。参数上nibbles是 MII TXD 上的半字节序列tx_en对应 MII 的 TX_EN 信号。实际 FPGA 里这个循环会被展开成并行逻辑时钟用 TX_CLK 的 25MHz串行化后的比特率是 125Mbps25MHz × 5 位但 LED 只能响应到几 MHz所以后面还要加一级降速或调制。2.3 接收端比较器阈值和 CDR 的配合接收端 PD 出来的信号很弱跨阻放大器TIA之后一般只有几十 mV 到几百 mV。比较器阈值设得不对眼图直接闭合。我一般会把阈值设在信号摆幅的 50%但如果有直流偏置就用交流耦合加偏置电阻。CDR 可以用 FPGA 里的过采样用 125MHz 时钟采 125Mbps 的比特流每个比特采 4 个点取中间点作为判决。这样不需要额外的 CDR 芯片代价是 FPGA 逻辑资源多一点。参数上过采样倍数选 4 或 8取决于 FPGA 能跑多快。如果 LED 带宽只有 10MHz那实际比特率可能只有 20Mbps过采样 8 倍也才 160MHz一般 FPGA 都能跑。接收端解码就是发送端的逆过程串并转换、5B/4B 解码、恢复出 MII RX 信号。3. 物理层参数怎么调LED 偏置、调制深度和接收端跨阻3.1 LED 偏置电流与调制深度的取舍LED 的调制带宽和偏置电流强相关。偏置太低LED 结电容充放电慢带宽窄偏置太高发热严重寿命下降。常见做法是给 LED 加一个直流偏置让它在正向电流的线性区工作然后叠加交流调制信号。调制深度AC 幅度 / DC 偏置一般取 0.3 到 0.5太深了非线性失真太浅了接收端信噪比不够。具体调法先用可调直流电源给 LED 加偏置从 10mA 开始用网络分析仪看 LED 的 S21 曲线找到 -3dB 带宽。然后加一个正弦调制信号用示波器看 PD 输出调 AC 幅度直到波形无明显削顶。我一般会把偏置设在额定电流的 60% 左右调制深度 0.4。这个值不是绝对的不同 LED 差异很大血泪经验是别信 datasheet 上的带宽自己扫一遍。3.2 跨阻放大器反馈电阻和带宽的计算接收端 TIA 的反馈电阻 Rf 决定了增益和带宽。PD 的结电容 Cd 和运放的输入电容加起来和 Rf 构成一个极点带宽 f_-3dB 1 / (2π Rf Ct)。Ct 是总电容。比如 Ct 5pF想要 50MHz 带宽Rf 大概 640Ω。但 Rf 小了增益低后级比较器可能判不出来。常见做法是先用一个 Rf 较大的 TIA 做前置放大再用一级电压放大器补增益或者用两级 TIA 级联。参数上Rf 选 1kΩ 到 10kΩ带宽和增益折中。如果 PD 结电容大比如 10pF 以上Rf 就得降到几百欧这时候可能需要用共基极或者 cascode 结构来隔离电容。提示TIA 的电源去耦一定要做好否则接收端全是振荡眼图根本没法看。我一般会在运放电源脚旁边放 100nF 和 10uF 并联地平面尽量完整。3.3 用 iperf 验证端到端吞吐的实操步骤光路和电路调通后怎么验证以太网层能跑最直接的就是把 VLC 链路当成一个二层透明桥两边各接一台电脑跑 iperf。步骤发送端电脑设静态 IP比如 192.168.1.10/24接收端电脑设 192.168.1.20/24。接收端跑iperf -s -u先试 UDP因为 TCP 在丢包时降速太狠不容易看出物理层极限。发送端跑iperf -c 192.168.1.20 -u -b 20M -t 30带宽从 20Mbps 开始试。看接收端报告的丢包率和抖动。如果丢包超过 1%就降速率或者调物理层参数。# 接收端 iperf -s -u -i 1 # 发送端 iperf -c 192.168.1.20 -u -b 20M -t 30 -i 1参数说明-u是 UDP 模式-b 20M是目标带宽 20Mbps-t 30跑 30 秒-i 1每秒打印一次。如果 20Mbps 丢包严重降到 10Mbps 再试。这个测试能直接反映物理层和 MAC 层的综合性能比看眼图更接近实际使用。4. 避坑与排查调试 VLC 以太网链路时最容易翻车的 5 个点4.1 现象ping 通但 iperf 一跑就断原因MII 接口的 TX_CLK 和 RX_CLK 没有正确对齐或者 FPGA 里跨时钟域处理没做好。ping 包小偶尔能过iperf 大流量下 FIFO 溢出链路就断了。解决检查 MII 的时钟域TX 和 RX 各自用对应的时钟跨时钟域用异步 FIFO。FIFO 深度至少能缓冲一个最大以太网帧1500 字节实际我一般设 2KB 以上。另外确认 MAC 的流控没被误触发。4.2 现象接收端眼图张开但误码率居高不下原因比较器阈值漂移或者环境光干扰。环境光里的 100Hz 闪烁会叠加在信号上导致判决点偏移。解决在 PD 前面加光学滤光片只让 LED 波长通过。电路上比较器用迟滞比较器迟滞窗口设 10mV 到 20mV。如果环境光太强考虑用差分接收或者调制到更高频率避开低频干扰。4.3 现象LED 发热后链路误码率逐渐升高原因LED 结温升高正向压降下降同样的驱动电流下光输出功率变化接收端信噪比恶化。这是典型的玄学问题冷机跑得好热了就不行。解决加散热片或者风扇驱动电路用恒流源而不是恒压源。如果条件允许在接收端加自动增益控制AGC补偿光功率变化。我一般会在软件里加一个误码率监测超过阈值就报警。4.4 现象TCP 吞吐远低于 UDP但 UDP 丢包率很低原因TCP 对往返时延RTT敏感VLC 链路的处理延迟加上 FPGA 流水线RTT 可能到几毫秒TCP 窗口涨不上去。解决调大 TCP 窗口或者用 UDP 加应用层重传。如果必须用 TCP可以在两端开 TCP BBR 拥塞控制对高 RTT 链路更友好。另外检查 FPGA 里的缓冲深度别让数据在光链路里排队太久。4.5 现象MII 接口偶尔出现 CRC 错误原因PCB 走线阻抗不匹配或者 MII 的 25MHz 时钟串扰到数据线上。VLC 链路本身没问题但数字接口先翻车了。解决MII 走线尽量等长时钟线包地串联端接电阻 22Ω 到 33Ω。用示波器看 TX_CLK 和 TXD 的建立保持时间确保满足 MAC 的时序要求。如果走线太长考虑降低 MII 速率到 10Mbps2.5MHz 时钟先保证稳定。5. 进阶技巧用时间同步和自适应均衡把链路推到 50Mbps 以上如果你已经跑通了 10Mbps 到 20Mbps想再往上推瓶颈通常在 LED 带宽和接收端均衡。我一般会做两件事发送端加预加重接收端加自适应均衡。预加重是在比特跳变时加大驱动电流补偿 LED 的高频衰减。实现上在 FPGA 里检测比特跳变如果当前比特和前一比特不同就把驱动电流调大 20% 到 30%。这个比例需要根据 LED 的 S21 曲线来定我一般从 20% 开始试看眼图张开度。接收端自适应均衡可以用一个简单的 3 抽头判决反馈均衡DFE。下面是一个 Python 模拟的 DFE 核心逻辑实际 FPGA 里用移位寄存器和查找表实现。def dfe_equalizer(samples, taps[0.8, -0.3, 0.1]): 3 抽头 DFEtaps 是反馈系数samples 是过采样后的软判决值 decisions [] history [0, 0] # 前两个比特的判决结果 for s in samples: # 用历史判决做反馈补偿 feedback taps[1] * history[0] taps[2] * history[1] corrected s - feedback # 硬判决大于 0 判 1否则判 0 bit 1 if corrected 0 else 0 decisions.append(bit) history [bit, history[0]] return decisions # 模拟发送 1,0,1,1,0经过带宽受限信道后的软值 samples [0.9, -0.2, 0.7, 0.8, -0.1] print(dfe_equalizer(samples))逻辑说明taps是反馈系数第一个是主抽头后面两个是反馈抽头。history存前两个比特的判决结果。每次用历史判决乘以反馈系数从当前采样值里减掉再做硬判决。参数上taps需要根据信道响应来调我一般先用最小均方LMS算法离线训练一组系数再固化到 FPGA 里。samples是过采样后的软值实际系统中由 ADC 提供。另一个进阶方向是时间同步。VLC 链路如果要做多灯组网不同 LED 之间的时钟偏差会导致帧错位。常见做法是用以太网的 PTP精确时间协议或者 GPS 秒脉冲来同步各个发送端。我一般会在 FPGA 里加一个时间戳计数器接收端根据前导码对齐。这个做下来50Mbps 以上是可行的但需要示波器和误码仪反复调。最后说一个我自己的习惯每次改物理层参数之前先存一份能跑通的配置改完对比误码率和吞吐。别一次改多个参数否则翻车了都不知道是哪个引起的。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑