1. 前言
上一篇文章对802.11a协议进行了概述,接下来对该协议的OFDM发射机基带分模块进行MATLAB仿真和FPGA的实现。
2. 整体设计思路
2.1 借鉴书籍
之前学习的时候参考了书籍《基于XILINX FPGA的OFDM通信系统基带设计》。书中的思路是,按照IEEE802.11a标准的规定,一个OFDM符号的长度为4us,其中共有80个采样点,这样对于64点的IFFT处理模块而言,要求其工作频率在4us/8064=3.2us时间内输出64个样值,即工作时钟频率为1/(3.2s/64)=20MHz。因此,本系统使用20MHz时钟作为整个基带处理器的系统时钟(SYS_CLK)。由于本书是采用16QAM调制方式,因此4个输人比特对应一组调制后的I/Q两路数据,若使得调制后输出为20MHz,则输人数据需要20MHz4=80MHz(CB_CLK)的时钟;另外本书中的编码效率为3/4,因此,在编码和截断之前的数据速率应为80MHz*3/4=60MHz(DIN_CLK);MAC层送往物理层的数据为字节格式,物理层处理时要首先进行8位的并/串变换,因此,MAC_CLK作为MAC层时钟的大小为60MHz/8=7.5MHz。
书中只是实现了一种调制方式和一种编码效率就使用了4种时钟,另外802.11a中规定了的调制方案和编码效率有8种,如下图所示:
2.2 作者对书中设计思路的看法
按照该书的思路,实现整个协议岂不是要用到32种时钟,这在我看来是不科学的。频繁的进行跨时钟域的数据处理,不仅给后期调试带来困难和隐患,而且实际实现的时候及其容易翻车。且网上大部分人也是这样操作的,对此我决定换一种设计思路。当然,作者也是一位小白,看法不一定正确,只是在阅读资料时有了自己的想法,决定去实现一下看能否行得通,顺便记录一下学习过程。
考虑到IFFT的输出需要满足20MHz的数据速率,使用最快的传输方案,64-QAM调制+3/4编码效率。编码前的数据速率应该为2063/4=90MHz;编码后的数据速率为20*6=120MHz。整个系统个人认为使用120MHz的时钟是比较合理的,如果后期有问题再进行调整。作者设计时,不打算采用书中增加时钟的方法来进行处理,而是采用valid-ready双向握手机制,来解决数据速率不同步的问题。握手协议的原则是:当Valid和Ready信号同时高有效时,数据在时钟上升沿传输。
2.3 valid-ready双向握手机制
使用valid-ready双向握手机制,各级模块连接方式如下图所示:
除此之外,也可以灵活的进行其他更为复杂的连接:
Valid-Ready信号产生有三种情况:
-
(1) Ready-Before-Valid,即Ready信号在Valid信号之前有效。如下时序图:
这样设计使得在数据来临之前,通道已准备好接收数据,可以保持通道的最大吞吐量,因为Ready先产生,这个通道保持刷新等待数据。通道作为接受数据端采用这样的设计。
-
(2)Valid-before-Ready,即Valid信号在Ready信号之前有效。时序图如下所示:
通道作为数据输出端采用这样的设计。收到下游接收端的准备接收信号,才开始传输数据。
-
(3)Valid-Ready协议’Stalemate’情况。Stalemate可以理解为“锁住”。假设我们不遵守上面两种接收端和输出端的设计规则。输出端用Ready-Before-Valid而接受端使用Valid-before-Ready,就会出现输出端等待接受端给出的Ready来输出数据,但是接收端也在等待输出端给出Valid信号来接受数据。两者都在等待却没有一方先给,所以这个时候这个通道就是无效的,被“锁住”了。管道会出现停止传输或者传输数据为空的情况,分别如下两图所示:
3.总结
这节先讲valid_ready双向握手的机制,为后面设计流水级的模块奠定基础,先不放代码,下节写串并/并串转换的时候一起把这部分代码展现。
原文链接(含完整工程):
OFDM802.11a的FPGA实现(二)基于valid-ready双向握手机制的串并和并串转换
OFDM802.11a概述
OFDM802.11a的FPGA实现(一)valid_ready双向握手机制