赞
踩
在这一篇之前,建议大家先看网口实现的上两篇:
这一篇讲解了网口的基础知识
这一篇讲解了网口的UDP,IP,以太网3种协议的单独实现方法
在之前的文章中,我们利用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校验的结果。完成一包数据的发送。
代码如下:
- module phy_reset(
- input clk,
- output reg pyh_rst_n,//phy芯片复位需要至少10ms时间
- output reg tic_toc
- );
-
- reg [7:0] cnt_us=8'd0;
- reg [9:0] cnt_ms=10'd0;
- reg [3:0] cnt_rst=4'd0;
- reg [5:0] cnt_tic=6'd0;//2^6=64ms
-
- //cnt for 1 us
- always @(posedge clk)
- begin
- if (cnt_us==8'd125) begin
- cnt_us<=8'd0;
- end
- else begin
- cnt_us<=cnt_us+1;
- end
- end
- // cnt for 1 ms
- always @(posedge clk)
- begin
- if (cnt_ms==10'd1000) begin
- cnt_ms<=10'd0;
- end
- else if (cnt_us==8'd125)begin
- cnt_ms<=cnt_ms+1;//cnt_us=125时cnt_ms+1
- end
- else begin
- cnt_ms<=cnt_ms;
- end
- end
- // cnt for 15 ms
- always @(posedge clk)
- begin
- if (cnt_rst==4'd15) begin
- cnt_rst<=4'd15;//cnt_rst=15不变
- end
- else if (cnt_ms==10'd1000) begin
- cnt_rst<=cnt_rst+1;//cnt_ms=1000计时1ms,cnt_rst+1
- end
- else begin
- cnt_rst<=cnt_rst;
- end
- end
- //rst output
- always @(posedge clk)
- begin
- if (cnt_rst==4'd14) begin//cnt_rst=1时phy_rst=0
- pyh_rst_n<=1'b0;
- end
- else if(cnt_rst==4'd15)begin//cnt_rst=15时phy_rst=1
- pyh_rst_n<=1'b1;
- end
- end
- // cnt for 64 ms
- always @(posedge clk)
- begin
- if (cnt_ms==10'd1000) begin
- cnt_tic<=cnt_tic+1;//每1ms cnt_tic+1
- end
- else begin
- cnt_tic<=cnt_tic;
- end
- end
- //rst output
- always @(posedge clk)
- begin
- if (cnt_tic==6'd2 && cnt_ms==10'd1000) begin//cnt_tic每次等于2的时候且cnt_ms=1000(选取一个周期)
- tic_toc<=1'b1;//每间隔64ms输出一次触发
- end
- else begin
- tic_toc<=1'b0;
- end
- end
- endmodule
不难看出,PHY芯片的复位,start_tx信号的产生都是通过计数器实现的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。