当前位置:   article > 正文

FPGA网口实现与详解(3)_fpga实现串口转网口

fpga实现串口转网口

在这一篇之前,建议大家先看网口实现的上两篇:

这一篇讲解了网口的基础知识

FPGA网口实现与详解(1)_居安士的博客-CSDN博客

这一篇讲解了网口的UDP,IP,以太网3种协议的单独实现方法

FPGA网口实现与详解(2)_居安士的博客-CSDN博客


在之前的文章中,我们利用start_tx作为网口数据传输的开始,今天就介绍一下这个start_tx信号如何产生

首先我们要了解,网口数据的发送依赖一个芯片:PHY芯片(RTL8211)

1、PHY芯片的基本作用

(1)收到MAC过来的数据(PHY没有帧的概念,都是数据而不管什么地址数据还是CRC),进行处理*,然后把并行数据转化为串行流数据,再按照物理层的编码规则把数据编码,再变为模拟信号把数据送出去。

(2)实现CSMA/

CD(多点接入载波监听/冲突检测)的部分功能,可以检测到网络上是否有数据在传送,如果有数据在传送中就等待,一旦检测到网络空闲,再等待一个随机时间后将送数据出去。冲突检测机构可以检测到冲突,然后各等待一个随机的时间重新发送数据。

2、PHY芯片的连接

CPU,MAC,PHY并不是集成在同一个芯片内,由于PHY包含大量模拟器件,而MAC是典型的数字电路,考虑到芯片面积及模拟/数字混合架构的原因,将MAC集成进CPU而将PHY留在片外,这种结构是最常见的。 下图是网络接口内部结构图,虚框表示CPU,MAC集成在CPU中,PHY芯片通过MII接口与CPU上的MAC连接:

下面这个图更直观,RGMII接口连接FPGA和PHY芯片,RJ-45接口连接PYH芯片和上位机

 3、PHY芯片复位时间

 查阅RTL8211芯片手册,我们可以看到PYH芯片是有至少10ms的复位时间的


综上,我们需要设计一个PHY芯片模块,PHY芯片模块实现以下功能:

(1)PHY芯片复位前需要至少10ms的时间(这里设置15ms)用cnt_rst表示

(2)每一包数据的发送有时间的间隔,这个时间间隔用tic_toc表示(这里是64ms)

(3)tic_toc作为数据包触发的开始,将tic_toc与start_tx相连,用start_tx触发MAC头的发送,MAC头发送结束输出start_ip_tx,作为IP头发送的开始,IP包发送结束输出start_udp_tx,作为UDP包的开始,UDP包发送结束输出udp_tx_end,作为数据输出的开始,数据发送完毕后输出数据有效信号,在数据输出有效信号下降沿发送CRC校验的结果。完成一包数据的发送。

代码如下:

  1. module phy_reset(
  2. input clk,
  3. output reg pyh_rst_n,//phy芯片复位需要至少10ms时间
  4. output reg tic_toc
  5. );
  6. reg [7:0] cnt_us=8'd0;
  7. reg [9:0] cnt_ms=10'd0;
  8. reg [3:0] cnt_rst=4'd0;
  9. reg [5:0] cnt_tic=6'd0;//2^6=64ms
  10. //cnt for 1 us
  11. always @(posedge clk)
  12. begin
  13. if (cnt_us==8'd125) begin
  14. cnt_us<=8'd0;
  15. end
  16. else begin
  17. cnt_us<=cnt_us+1;
  18. end
  19. end
  20. // cnt for 1 ms
  21. always @(posedge clk)
  22. begin
  23. if (cnt_ms==10'd1000) begin
  24. cnt_ms<=10'd0;
  25. end
  26. else if (cnt_us==8'd125)begin
  27. cnt_ms<=cnt_ms+1;//cnt_us=125时cnt_ms+1
  28. end
  29. else begin
  30. cnt_ms<=cnt_ms;
  31. end
  32. end
  33. // cnt for 15 ms
  34. always @(posedge clk)
  35. begin
  36. if (cnt_rst==4'd15) begin
  37. cnt_rst<=4'd15;//cnt_rst=15不变
  38. end
  39. else if (cnt_ms==10'd1000) begin
  40. cnt_rst<=cnt_rst+1;//cnt_ms=1000计时1ms,cnt_rst+1
  41. end
  42. else begin
  43. cnt_rst<=cnt_rst;
  44. end
  45. end
  46. //rst output
  47. always @(posedge clk)
  48. begin
  49. if (cnt_rst==4'd14) begin//cnt_rst=1时phy_rst=0
  50. pyh_rst_n<=1'b0;
  51. end
  52. else if(cnt_rst==4'd15)begin//cnt_rst=15时phy_rst=1
  53. pyh_rst_n<=1'b1;
  54. end
  55. end
  56. // cnt for 64 ms
  57. always @(posedge clk)
  58. begin
  59. if (cnt_ms==10'd1000) begin
  60. cnt_tic<=cnt_tic+1;//每1ms cnt_tic+1
  61. end
  62. else begin
  63. cnt_tic<=cnt_tic;
  64. end
  65. end
  66. //rst output
  67. always @(posedge clk)
  68. begin
  69. if (cnt_tic==6'd2 && cnt_ms==10'd1000) begin//cnt_tic每次等于2的时候且cnt_ms=1000(选取一个周期)
  70. tic_toc<=1'b1;//每间隔64ms输出一次触发
  71. end
  72. else begin
  73. tic_toc<=1'b0;
  74. end
  75. end
  76. endmodule

不难看出,PHY芯片的复位,start_tx信号的产生都是通过计数器实现的

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/441780
推荐阅读
相关标签
  

闽ICP备14008679号