按说明书的说法:AD9226的特点是上升沿周期采样,前8个周期采样数据无效,数据输入反向。见下图:
由于data_out的特殊性质,我们最好在上升沿开始采样,并交给fifo存储后发送给以太网。
使用提供的以太网代码或者其他方式可以实现以太网的接收。以太网端口将以太网信号整理成为32位数据、写脉冲信号、读取结束信号三个标志。
发送也是一样的结构,由fifo相关的读脉冲信号、32位读脉冲数据和开始读信号三个标志。
module ethernet_udp_rmii
(
input wire sys_rst_n , //系统复位,低电平有效
input wire eth_clk , //PHY芯片时钟信号
input wire eth_rxdv_r , //PHY芯片输入数据有效信号
input wire [1:0] eth_rx_data_r , //PHY芯片输入数据
input wire [31:0] send_data , //发送数据
input wire eth_en , //开始发送信号
input wire [15:0] send_length , //发送数据长度
output wire eth_end , //接收终止信号
output wire eth_fifo_read_clk , //读FIFO时钟
output wire eth_fifo_read_req , //读FIFO请求
output wire eth_fifo_write_clk , //写FIFO时钟
output wire eth_fifo_write_req , //写FIFO请求
output wire [31:0] rec_data , //接收数据
output wire eth_tx_en_r , //PHY芯片输出数据有效信号
output wire [1:0] eth_tx_data_r , //PHY芯片输出数据
output wire eth_rst_n //PHY芯片复位信号,低电平有效
);
我们可以使用一个内置的32位数据,在读取到来自以太网的第一次数据时判断是否需要输出这一数据线下的内容,并在eth_end信号到来时回复初始状态。
module ETH_CTRL
#(
parameter address = 32'd10
)
(
input wire eth_end,
input wire sys_rst_n,
input wire eth_ctrl_fifo_write_clk_in,
input wire eth_ctrl_fifo_write_req_in,
input wire [31:0] eth_ctrl_fifo_write_data_in,
output wire eth_ctrl_fifo_write_clk_out,
output wire eth_ctrl_fifo_write_req_out,
output wire [31:0] eth_ctrl_fifo_write_data_out
);
其中,参数address用来判断第一个数据是什么,如果第一个数据符合,则把剩下的数据输出出去。
就像这样,实现了对输入的判断与输出。并且保证了回复到完整的原来状态。