Menu Close

高速通信分层设计及PCS子层实现—接收端Verilog代码

在讲解清楚了通信分层的概念和PCS子层编码后,由于发送端的PCS子层采用8b/10b编码,因此接收端的对应层也要采用相同的解码方式。通信工程的各个分层如图1所示。

图1 高速通信分层的概念

本节内容除了添加了PCS子层外,还将整个工程接收部分的代码做了较大修改,使得工程中的层次更加分明,但要注意各个层之间的握手。各层的代码如下:

1. 接收端PMD层

这段代码和以前的代码一样,只是文件名做了修改,体现了该代码所在的层次。本层的任务是完成LVDS到单端信号的变换,并将接收 bit流通过本地时钟过采样,进行相位自适应调整,同步到本地时钟域。


 

2. 接收端PMA层代码

本层代码由于采用了8b/10b编码的方式,按照约定,发送端的PCS子层封装数据包时采用K28.5作为帧start,K28.1作为帧end (stop)。由于8b/10b的优良特性,K28.5和K28.1是8b/10b中的逗号,在编码码字中含有连续的5个0或5个1, 而且码字在整个串行流是惟一的。因此可以直接捕获K28.5和K28.1的10-bit数据代替Preamble + SFD作为同步字使用。其它的如寄存器移位,异步时钟的转换等,见上几个章节的介绍。最终输出3个信号rx_data_100Mr,  rx_data_rdy_100Mr,  rx_data_vld_pma用于与上层的握手。见仿真波形图2,3 ,4。


 

图2  PMA层同步字(K28.5)捕获

图3 PMA层的时钟域转换及握手信号

图4 PMA层的时钟域转换及握手信号

3. 接收端PCS代码


 

接收端的数据链路层没有添加 Preamble + SFD 以及FCS, 因此数据链路层的数据和PCS的代码一致,后续课程中会添加相关的应用,进而逐步完善通信工程。握手及10b/8b的转换见图5,6,7。

图5 PCS层的时钟域转换及握手信号

图6 PCS层的时钟域转换及握手信号

图7  PCS层的时钟域转换及握手信号

由于文章中无法详细展示代码设计及仿真中的细节,如果想了解细节请参照对应视频。

 

工程代码(quartus 20.1):

[content_control]

high_speed_txrx_pcs8b10b.zip

[/content_control]

Posted in FPGA, FPGA 教材教案, IP开发, Verilog, 教材与教案, 文章, 集成电路