课程笔记
  • 工程师可点评

实验报告 · 03 | 接口设计:RGMII接口时序(二) 课程:中级 | FPGA工程师实战精进课程(送板卡+证书) · 第一部分 进阶接口设计篇 发布自课程云笔记 · FPGA 实验证据骨架 【本节要点】 RGMII代码 【疑问/坑点】 源语需要等待启动时间 输出(output)使用了always块赋值必须改为reg类型,使用源语赋值时依旧使用wire 【可复用的代码/思路】 RGMII顶层 …

旭晨
110 3 2
3 位工程师评优秀

实验报告 · 03 | 接口设计:RGMII接口时序(二)

课程:中级 | FPGA工程师实战精进课程(送板卡+证书) · 第一部分 进阶接口设计篇

发布自课程云笔记 · FPGA 实验证据骨架

RGMII代码

源语需要等待启动时间

输出(output)使用了always块赋值必须改为reg类型,使用源语赋值时依旧使用wire

RGMII顶层

`timescale 1ns / 1ps
module RGMII(
input   wire            ETH_RXC ,
input   wire            ETH_RXV ,
input   wire    [3:0]   ETH_RXD ,
output  wire            ETH_TXC ,
output  wire            ETH_TXV ,
output  wire     [3:0]   ETH_TXD ,
output  wire            MAC_TXC ,
input   wire            MAC_TXV ,
input   wire    [7:0]   MAC_TXD ,
output  wire            MAC_RXC ,
output  wire            MAC_RXV ,
output  wire     [7:0]   MAC_RXD
);
/*连线过程
时钟:
芯片---ETH_RXC---(rgmii_rxc---bufg---mac_rxc)---MAC_RXC---协议代码
MAC_RXC---MAC_TXC---(mac_txc---rgmii_txc)---ETH_TXC---芯片
数据:
ETH_RXD---(rgmii_rxd[4]---IDDR---mac_rxd[8])---MAC_RXD---协议代码
协议代码---MAC_TXD---(mac_txd[8]---ODDR---rgmii_txd[4])---ETH_TXD---芯片
*/
assign  MAC_TXC = MAC_RXC   ;
rgmii_rx rgmii_rx_u(
rgmii_rxc   (ETH_RXC    ),//i
rgmii_rxv   (ETH_RXV    ),//i
rgmii_rxd   (ETH_RXD    ),//i
mac_rxc     (MAC_RXC    ),//o
mac_rxv     (MAC_RXV    ),//o
mac_rxd     (MAC_RXD    ) //o
);
rgmii_tx rgmii_tx_u(
mac_txc     (MAC_TXC    ),//i
mac_txv     (MAC_TXV    ),//i
mac_txd     (MAC_TXD    ),//i
rgmii_txc   (ETH_TXC    ),//o
rgmii_txv   (ETH_TXV    ),//o
rgmii_txd   (ETH_TXD    ) //o
);
endmodule

RGMII_TX

`timescale 1ns / 1ps
module rgmii_tx(
input   wire            mac_txc ,//MAC提供的时钟
input   wire            mac_txv ,//有效信号
input   wire    [7:0]   mac_txd ,//数据
output  wire            rgmii_txc   ,
output  wire            rgmii_txv   ,
output  wire     [3:0]   rgmii_txd
);
assign rgmii_txc = mac_txc ;
ODDR #(
.DDR_CLK_EDGE("SAME_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"
.INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1
.SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC" 同步复位 or 异步复位
) rgmii_txv_ODDR_inst (
.Q(rgmii_txv),   // 1-bit DDR output
.C(mac_txc),   // 1-bit clock input
.CE(1'b1), // 1-bit clock enable input
.D1(mac_txv), // 1-bit data input (positive edge)
.D2(mac_txv), // 1-bit data input (negative edge)
.R(0),   // 1-bit reset
.S(0)    // 1-bit set
);
//0:3 4:7 先发低四位再发高四位
genvar i ;
generate for(i=0;i<4;i=i+1)begin
ODDR #(
.DDR_CLK_EDGE("SAME_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"
.INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1
.SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC" 同步复位 or 异步复位
) rgmii_txd_ODDR_inst (
.Q(rgmii_txd[i]),   // 1-bit DDR output
.C(mac_txc),   // 1-bit clock input
.CE(1'b1), // 1-bit clock enable input
.D1(mac_txd[i]), // 1-bit data input (positive edge)
.D2(mac_txd[i+4]), // 1-bit data input (negative edge)
.R(0),   // 1-bit reset
.S(0)    // 1-bit set
);
end
endgenerate
endmodule

RGMII_RX

`timescale 1ns / 1ps
module rgmii_rx(
input   wire            rgmii_rxc   ,//phy芯片提供的外部时钟,引入外部时钟后通常加入buf进行缓存,缓存后根据时钟作用区分
input   wire            rgmii_rxv   ,
input   wire    [3:0]   rgmii_rxd   ,
output  wire            mac_rxc     ,
output  wire            mac_rxv     ,
output  wire     [7:0]   mac_rxd
);
wire            rgmii_rxc_bufg                              ;//global全局时钟
wire            rgmii_rxc_bufio                             ;//io接口时钟
assign          mac_rxc = rgmii_rxc_bufg                    ;
wire    [1:0]   rgmii_rxv_reg                               ;//2位位宽的缓存器
assign          mac_rxv = rgmii_rxv_reg[0]&rgmii_rxv_reg[1] ;
BUFG BUFG_inst (
.O(rgmii_rxc_bufg), // 1-bit output: Clock output
.I(rgmii_rxc)  // 1-bit input: Clock input
);
BUFIO BUFIO_inst (
.O(rgmii_rxc_bufio), // 1-bit output: Clock output (connect to I/O clock loads).
.I(rgmii_rxc)  // 1-bit input: Clock input (connect to an IBUF or BUFMR).
);
IDDR #(
.DDR_CLK_EDGE("SAME_EDGE"), // "OPPOSITE_EDGE", "SAME_EDGE"
//    or "SAME_EDGE_PIPELINED"
.INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1
.INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1
.SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
) rgmii_rxv_IDDR_inst (
.Q1(rgmii_rxv_reg[0]), // 1-bit output for positive edge of clock
.Q2(rgmii_rxv_reg[1]), // 1-bit output for negative edge of clock
.C(rgmii_rxc_bufio),   // 1-bit clock input
.CE(1'b1), // 1-bit clock enable input
.D(rgmii_rxv),   // 1-bit DDR data input
.R(0),   // 1-bit reset
.S(0)    // 1-bit set
);
genvar i ;
generate for (i = 0;i<4 ;i=i+1 )
begin
IDDR #(
.DDR_CLK_EDGE("SAME_EDGE_PIPELINED"), // "OPPOSITE_EDGE", "SAME_EDGE"
//    or "SAME_EDGE_PIPELINED"
.INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1
.INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1
.SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
) rgmii_rxd_IDDR_inst (
.Q1(mac_rxd[i]), // 1-bit output for positive edge of clock
.Q2(mac_rxd[i+4]), // 1-bit output for negative edge of clock
.C(rgmii_rxc_bufio),   // 1-bit clock input
.CE(1'b1), // 1-bit clock enable input
.D(rgmii_rxd[i]),   // 1-bit DDR data input
.R(0),   // 1-bit reset
.S(0)    // 1-bit set
);
end
endgenerate
endmodule

本节要验证什么?预期现象是什么?

用工具栏插入波形图、仿真界面或示波器照片

粘贴关键仿真输出或报错原文

板卡现象、按键/数码管/接口实测结果

结论、坑点与下一步修改

产出状态

评优秀3 位工程师
工程师已阅110 位工程师