实验报告 · 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
);
endmoduleRGMII_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
endmoduleRGMII_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【FPGA·实验证据】
【实验目标】
本节要验证什么?预期现象是什么?
【波形/截图】
用工具栏插入波形图、仿真界面或示波器照片
【仿真 log】
粘贴关键仿真输出或报错原文
【上板现象】
板卡现象、按键/数码管/接口实测结果
【结论与待改】
结论、坑点与下一步修改
评论 0