📄 mac.txt
字号:
#######################################################
********有关MAC的寄存器地址****************************
parameter MAC_REG_BASE = 32'h1f00_2000;
/*
* MAC Controller
*/
/* Data structure for Tx BD */
parameter BIT_MAC_TX_BD_READY = 32'h0000_8000; // Tx BD Ready
parameter BIT_MAC_TX_BD_IRQ = 32'h0000_4000; // Tx BD IRQ Enable
parameter BIT_MAC_TX_BD_WRAP = 32'h0000_2000; // Tx BD Wrap (last BD)
parameter BIT_MAC_TX_BD_PAD = 32'h0000_1000; // Tx BD Pad Enable
parameter BIT_MAC_TX_BD_CRC = 32'h0000_0800; // Tx BD CRC Enable
parameter BIT_MAC_TX_BD_UNDERRUN = 32'h0000_0100; // Tx BD Underrun Status
parameter BIT_MAC_TX_BD_RETRY = 32'h0000_00F0; // Tx BD Retry Status
parameter BIT_MAC_TX_BD_RETLIM = 32'h0000_0008; // Tx BD Retransmission Limit Status
parameter BIT_MAC_TX_BD_LATECOL = 32'h0000_0004; // Tx BD Late Collision Status
parameter BIT_MAC_TX_BD_DEFER = 32'h0000_0002; // Tx BD Defer Status
parameter BIT_MAC_TX_BD_CARRIER = 32'h0000_0001; // Tx BD Carrier Sense Lost Status
/* Rx BD */
parameter BIT_MAC_RX_BD_EMPTY = 32'h0000_8000; // Rx BD Empty
parameter BIT_MAC_RX_BD_IRQ = 32'h0000_4000; // Rx BD IRQ Enable
parameter BIT_MAC_RX_BD_WRAP = 32'h0000_2000; // Rx BD Wrap (last BD)
parameter BIT_MAC_RX_BD_MISS = 32'h0000_0080; // Rx BD Miss Status
parameter BIT_MAC_RX_BD_OVERRUN = 32'h0000_0040; // Rx BD Overrun Status
parameter BIT_MAC_RX_BD_INVSIMB = 32'h0000_0020; // Rx BD Invalid Symbol Status
parameter BIT_MAC_RX_BD_DRIBBLE = 32'h0000_0010; // Rx BD Dribble Nibble Status
parameter BIT_MAC_RX_BD_TOOLONG = 32'h0000_0008; // Rx BD Too Long Status
parameter BIT_MAC_RX_BD_SHORT = 32'h0000_0004; // Rx BD Too Short Frame Status
parameter BIT_MAC_RX_BD_CRCERR = 32'h0000_0002; // Rx BD CRC Error Status
parameter BIT_MAC_RX_BD_LATECOL = 32'h0000_0001; // Rx BD Late Collision Status
// MAC Controller
parameter REG_MAC_MODER = 32'h0000_0000; // 0x00
parameter BIT_MAC_MODER_RXEN = 32'h0000_0001; // Receive Enable
parameter BIT_MAC_MODER_TXEN = 32'h0000_0002; // Transmit Enable
parameter BIT_MAC_MODER_NOPRE = 32'h0000_0004; // No Preamble
parameter BIT_MAC_MODER_BRO = 32'h0000_0008; // Reject Broadcast
parameter BIT_MAC_MODER_IAM = 32'h0000_0010; // Use Individual Hash
parameter BIT_MAC_MODER_PRO = 32'h0000_0020; // Promiscuous (receive all)
parameter BIT_MAC_MODER_IFG = 32'h0000_0040; // Min. IFG not required
parameter BIT_MAC_MODER_LOOPBCK = 32'h0000_0080; // Loop Back
parameter BIT_MAC_MODER_NOBCKOF = 32'h0000_0100; // No Backoff
parameter BIT_MAC_MODER_EXDFREN = 32'h0000_0200; // Excess Defer
parameter BIT_MAC_MODER_FULLD = 32'h0000_0400; // Full Duplex
parameter BIT_MAC_MODER_RST = 32'h0000_0800; // Reset MAC
parameter BIT_MAC_MODER_DLYCRCEN = 32'h0000_1000; // Delayed CRC Enable
parameter BIT_MAC_MODER_CRCEN = 32'h0000_2000; // CRC Enable
parameter BIT_MAC_MODER_HUGEN = 32'h0000_4000; // Huge Enable
parameter BIT_MAC_MODER_PAD = 32'h0000_8000; // Pad Enable
parameter BIT_MAC_MODER_RECSMALL = 32'h0001_0000; // Receive Small
parameter BIT_MAC_SOFT_RST = 32'h0080_0000; // Soft reset for MAC
parameter REG_MAC_INT_SOURCE = 32'h0000_0004; // 0x04
parameter BIT_MAC_INT_TXB = 32'h0000_0001; // Transmit Buffer IRQ
parameter BIT_MAC_INT_TXE = 32'h0000_0002; // Transmit Error IRQ
parameter BIT_MAC_INT_RXB = 32'h0000_0004; // Receive Buffer IRQ
parameter BIT_MAC_INT_RXE = 32'h0000_0008; // Receive Error IRQ
parameter BIT_MAC_INT_BUSY = 32'h0000_0010; // Busy IRQ
parameter BIT_MAC_INT_TXC = 32'h0000_0020; // Transmit Control Frame IRQ
parameter BIT_MAC_INT_RXC = 32'h0000_0040; // Received Control Frame IRQ
parameter REG_MAC_INT_MASK = 32'h0000_0008; // 0x08
parameter BIT_MAC_INT_MASK_TXB = 32'h0000_0001; // Transmit Buffer IRQ Mask
parameter BIT_MAC_INT_MASK_TXE = 32'h0000_0002; // Transmit Error IRQ Mask
parameter BIT_MAC_INT_MASK_RXF = 32'h0000_0004; // Receive Frame IRQ Mask
parameter BIT_MAC_INT_MASK_RXE = 32'h0000_0008; // Receive Error IRQ Mask
parameter BIT_MAC_INT_MASK_BUSY = 32'h0000_0010; // Busy IRQ Mask
parameter BIT_MAC_INT_MASK_TXC = 32'h0000_0020; // Transmit Control Frame IRQ Mask
parameter BIT_MAC_INT_MASK_RXC = 32'h0000_0040; // Received Control Frame IRQ Mask
parameter REG_MAC_IPGT = 32'h0000_000C; // 0x0C
parameter REG_MAC_IPGR1 = 32'h0000_0010; // 0x10
parameter REG_MAC_IPGR2 = 32'h0000_0014; // 0x14
parameter REG_MAC_PACKETLEN = 32'h0000_0018; // 0x18
parameter REG_MAC_COLLCONF = 32'h0000_001C; // 0x1C
parameter REG_MAC_TX_BD_NUM = 32'h0000_0020; // 0x20
parameter REG_MAC_CTRLMODER = 32'h0000_0024; // 0x24
parameter BIT_MAC_CTRLMODER_PASSALL= 32'h0000_0001;// Pass Control Frames
parameter BIT_MAC_CTRLMODER_RXFLOW= 32'h0000_0002; // Receive Control Flow Enable
parameter BIT_MAC_CTRLMODER_TXFLOW= 32'h0000_0004; // Transmit Control Flow Enable
parameter REG_MAC_MIIMODER = 32'h0000_0028; // 0x28
parameter BIT_MAC_MIIMODER_CLKDIV = 32'h0000_00FF; // Clock Divider
parameter BIT_MAC_MIIMODER_NOPRE = 32'h0000_0100; // No Preamble
parameter BIT_MAC_MIIMODER_RST = 32'h0000_0200; // MIIM Reset
parameter REG_MAC_MIICOMMAND = 32'h0000_002C; // 0x2C
parameter BIT_MAC_MIICMD_SCANSTAT = 32'h0000_0001; // Scan Status
parameter BIT_MAC_MIICMD_RSTAT = 32'h0000_0002; // Read Status
parameter BIT_MAC_MIICMD_WCTRLDATA= 32'h0000_0004; // Write Control Data
parameter REG_MAC_MIIADDRESS = 32'h0000_0030; // 0x30
parameter BIT_MAC_MIIADDRESS_FIAD = 32'h0000_001F; // PHY Address
parameter BIT_MAC_MIIADDRESS_RGAD = 32'h0000_1F00; // RGAD Address
parameter REG_MAC_MIITX_DATA = 32'h0000_0034; // 0x34
parameter REG_MAC_MIIRX_DATA = 32'h0000_0038; // 0x38
parameter REG_MAC_MIISTATUS = 32'h0000_003C; // 0x3C
parameter BIT_MAC_MIISTAT_LINKFAIL=32'h0000_0001; // Link Fail bit
parameter BIT_MAC_MIISTAT_BUSY =32'h0000_0002; // MII Busy bit
parameter BIT_MAC_MIISTAT_NVALID =32'h0000_0004; // Data in MII Status Register is invalid bit
parameter REG_MAC_ADDR0 = 32'h0000_0040; // 0x40
parameter REG_MAC_ADDR1 = 32'h0000_0044; // 0x44
parameter REG_MAC_HASH0 = 32'h0000_0048; // 0x48
parameter REG_MAC_HASH1 = 32'h0000_004C; // 0x4C
parameter REG_MAC_TX_CTRL = 32'h0000_0050; // 0x50
parameter BIT_MAC_TX_CTRL_PAUSERQ = 32'h0001_0000; // Send PAUSE request
parameter REG_MAC_BD_BASE = 32'h0000_0400; // 0x400
########################################################
********有关MAC的存储区地址*****************************
(原仿真环境的相关值)
parameter SD_MAC_TX_BASE = 20'h5_0000; 发送缓冲区起始地址
parameter SD_MAC_TX_SIZE = 20'h0_8000; 发送缓冲区总长度
parameter SD_MAC_RX_BASE = 20'h5_8000; 接收缓冲区起始地址
parameter SD_MAC_RX_SIZE = 20'h0_8000; 接收缓冲区总长度
########################################################
测试常量
parameter TOTAL_BD_NUM = 128; //
parameter MAC_ADDRESS_HI = 32'h0000_AA02;
parameter MAC_ADDRESS_LO = 32'h0304_0506;
parameter MIN_FL = 64;
parameter MAX_FL = 1518;
########################################################
操作流程:
1.寄存器初始化
寄存器 复位值 初始化值 初始化说明
REG_MAC_MODER 0000A000 0000A400 全双工,低两位发送接受时控制
REG_MAC_INT_MASK 00000000 0000007F 所有的中断屏蔽位打开
REG_MAC_IPGT 00000012 00000015 半双工建议为12H,全双工建议为15H
REG_MAC_PACKETLEN 00400600 不需初始化
REG_MAC_COLLCONF 000F003F 不需初始化
REG_MAC_TX_BD_NUM 00000040 不需初始化
REG_MAC_CTRLMODER 00000000 00000007 允许发送控制帧、接受帧,且存入内存
REG_MAC_ADDR0 00000000 03040506
REG_MAC_ADDR1 00000000 0000AA02 设置MAC地址0605040302AA
最后,再将发送、接收使能:REG_MAC_MODER低2bit置11;
2.LoobBack测试
初始化REG_MAC_MODER寄存器为0000A480;
在发送缓冲区构造一发送帧:设置设置MAC地址0605040302AA,数据字节递增,记录长度;
构造发送TxBD、RxBD,并填入MAC的RAM中(TxBD Ready置1便发送、RxBD Ready 置1便准备接收);
等待发送完成;
发送完成后(中断服务程序执行),读取TxBD,显示发送结果状态,并比较发送缓冲区和接收缓冲区中的数据;
3.发送数据帧
在发送缓冲区中构造发送数据帧:设置好接收方的MAC地址,构造数据;
构造发送TxBD,启动发送
等待中断服务程序;
读取TxBD,获取发送状态。
4.发送控制帧
启动发送:将REG_MAC_TX_CTRL寄存器Bit16 置1,Bit[15:0]置0040(可随意);
等待中断服务程序;
5.接收数据帧
接收前(可以在初始化中)设置好RxBD并填入MAC内部RAM中;
等待接收中断服务程序;
读取RxBD获取接收状态,比较接收数据。
6.中断服务程序
若MAC发出中断,读取REG_MAC_INT_SOURCE寄存器,获取中断类型;
若是TXB中断(Bit[0]): 正确发送数据帧,唤醒等待发送完成的进程
若是TXE中断(Bit[1]):发送数据帧出错,唤醒等待发送完成的进程
若是RXB中断(Bit[2]):正确接收数据帧,唤醒等待接收完成的进程
若是RXE中断(Bit[3]):接收数据帧出错,唤醒等待接收完成的进程
若是TXC中断(Bit[4]):发送完控制帧, 唤醒等待发送控制帧完成的进程
若是RXC中断(Bit[5]):接收完数据帧, 唤醒等待接收完成的进程
清中断,向REG_MAC_INT_SOURCE寄存器写入读取的状态值。
7.总程序流程
main()
{
InitializeRegister();
填入RxBD;//准备接收
LoopBackTest(){
SendOneNormalFrame();
WaitForTxInt();
ReadRxFrame();
CompareData();
}
SendOneNormalFrame();
WaitForTxInt();
SendOneHugeFrame();
WaitForTxInt();
SendOneSmallFrame();
Delay1s;
//接收测试
WaitForRxInt();
ReadRxNormalFrame();
}
#######################################################################################
如有任何问题表述不清楚,尽管找我.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -