Buck Blog · 博客正文

返回技术分享首页
基于RiscV@FPGA的WebServer逻辑设计方案(ED001R01)

基于RiscV@FPGA的WebServer 逻辑设计方案

文档编号:ED001R01
项目 内容
产品名称 基于RiscV@FPGA的WebServer
密级 内部
总页数 78

LinkReal LinkReal

版权所有 侵权必究


修订记录 Revision Record

日期 Date 修订版本 Revision Version 修改描述 Change Description 作者 Author
2026-06-29 ED001R01 初始版本 LinkReal

目录 Table of Contents


参考资料清单

  • 88E1111 Datasheet — Integrated 10/100/1000 Ultra Gigabit Ethernet Transceiver
  • W25Q128JV Datasheet — 128M-Bit Serial Flash Memory
  • CP2102 Datasheet — USB-to-UART Bridge Controller
  • XC7A35T Datasheet — Artix-7 FPGA Data Sheet
  • RISC-V Unprivileged ISA Specification v20191213
  • IEEE 802.3 — Ethernet Standard
  • LCPU Bus Protocol Specification(LinkReal 内部文档)
  • GMII/RGMII Specification v2.0

1 介绍

1.1 目的

本文档详细介绍基于RiscV@FPGA的WebServer的FPGA逻辑实现原理,包括模块划分、接口信号定义、内部实现说明、表项/寄存器定义以及RAM资源使用情况。

该设计在Xilinx Artix-7 FPGA上集成RISC-V软核处理器和千兆以太网MAC,实现一个完整的FPGA Web服务器系统。


1.2 选型分析

1.2.1 FPGA芯片

Xilinx XC7A35T-FGG484-2
  • Logic Cells: 33,280
  • Block RAM: 1,800 Kb
  • DSP Slices: 90
  • PLL/MMCM: 5
  • 用户IO: 250
  • 封装: FGG484 (484-ball BGA)
  • 速度等级: -2
选型理由:Artix-7系列提供充足的逻辑资源和Block RAM用于集成RISC-V软核与以太网MAC,FGG484封装满足RGMII高速IO需求,-2速度等级支持125MHz GMII时钟域。

1.2.2 外围芯片

1.2.2.1 PHY芯片 — Marvell 88E1111

  • 支持10/100/1000Mbps自适应
  • RGMII接口(125MHz DDR)
  • MDIO管理接口(Clause 22)
  • 支持Auto-Negotiation
  • 供电:2.5V/1.2V

1.2.2.2 USB-UART — CP2102

  • USB 2.0 Full Speed
  • UART波特率最高1Mbps
  • 用于RISC-V调试串口

1.2.2.3 SPI Flash — W25Q128JV

  • 容量:128M-bit (16MB)
  • SPI/Dual SPI/Quad SPI
  • 用于FPGA配置存储

2 设计的体系结构

2.1 模块分解分析

2.1.1 总体结构框图

图1 基于RiscV@FPGA的WebServer逻辑总体结构框图
flowchart TB subgraph FPGA["FPGA — XC7A35T"] subgraph Top["xilinx_xc7a35tfgg484_webserver_top"] PLL["pll_50m\nMMCM PLL"] RST["clk_rst_ctrl\n复位控制"] RGMII["rgmii2gmii\nRGMII→GMII"] MDIO_TOP["eth0_mdc/mdio"] end subgraph Wrapper["webserver_wrapper"] direction TB CPU["lcpu_riscv_wrapper\nRISC-V子系统"] REG["reg_webserver\n寄存器文件"] MAC["gmii2mac\nGMII MAC"] CH["cpu_channel\nCPU-MAC数据通道"] MDIO["lcpu_mdio\nMDIO控制器"] TOD["tod\n时间计数器"] TMR["interval_timer\n秒定时器"] end end PHY["88E1111 PHY"] <-->|"RGMII"| RGMII PHY <-->|"MDIO"| MDIO_TOP UART["CP2102\nUSB-UART"] <--> CPU Flash["W25Q128\nSPI Flash"] -.->|"配置"| FPGA RGMII <-->|"GMII (内部)"| Wrapper PLL -->|"50/125/200MHz"| Top RST -->|"reset_l_synced"| Top CPU <-->|"LCPU Bus"| REG REG -->|"MDIO SubBus"| MDIO MDIO <-->|"MDIO"| PHY MAC <-->|"125MHz GMII"| RGMII CH <-->|"125MHz MAC"| MAC CH <-->|"50MHz CPU"| REG style FPGA fill:#e8f5e9 style Top fill:#fff3e0 style Wrapper fill:#e3f2fd
图2 数据流处理路径
flowchart LR PHY["PHY\n88E1111"] -->|"RGMII RX"| RGMII2["rgmii2gmii\nRGMII→GMII"] RGMII2 -->|"GMII RX"| MAC_RX["gmii2mac\nRX: GMII→Packet"] MAC_RX -->|"Packet Stream"| CH_RX["cpu_channel\nRX FIFO"] CH_RX -->|"Packet Data"| CPU_RD["RISC-V CPU\n读取处理"] CPU_RD -->|"HTTP响应"| CPU_WR["RISC-V CPU\n写入发送"] CPU_WR -->|"Packet Data"| CH_TX["cpu_channel\nTX FIFO"] CH_TX -->|"Packet Stream"| MAC_TX["gmii2mac\nTX: Packet→GMII"] MAC_TX -->|"GMII TX"| RGMII2_TX["rgmii2gmii\nGMII→RGMII"] RGMII2_TX -->|"RGMII TX"| PHY REG["reg_webserver\n寄存器"] -.->|"配置"| CH_RX REG -.->|"配置"| CH_TX CPU_RD <-->|"LCPU Bus"| REG style PHY fill:#ffccbc style CPU_RD fill:#c8e6c9 style CPU_WR fill:#c8e6c9
图3 FPGA内部模块层级树
flowchart TD TOP["xilinx_xc7a35tfgg484_webserver_top"] TOP --> PLL["pll_50m \n(MMCM PLL)"] TOP --> RST["clk_rst_ctrl \n(复位同步)"] TOP --> RGMII["rgmii2gmii \n(RGMII↔GMII)"] TOP --> WRAP["webserver_wrapper"] WRAP --> TOD["tod \n(时间计数器)"] WRAP --> TMR["interval_timer \n(秒定时器)"] WRAP --> FBT["fpga_build_time \n(编译时间戳)"] WRAP --> CPU["lcpu_riscv_wrapper"] WRAP --> REG["reg_webserver"] WRAP --> MDIO["lcpu_mdio"] WRAP --> MAC["gmii2mac"] WRAP --> CDC["cdc_bus_sync/_vec"] WRAP --> CH["cpu_channel"] CPU --> LCPU["lcpu_top / lcpu_bfm"] CPU --> RISCV["riscv32_top"] CPU --> MERGE["lcpu_merge"] CH --> R2F["ram2pktfifo_int"] CH --> PFIFO["package_fifo_v2 x2"] CH --> F2R["pktfifo2ram_int_v2"] CH --> SOP["sop_eop_gen"]

2.1.2 时钟域分析

图4 时钟域分布
flowchart LR subgraph CLK50["50MHz 域"] CPU_SYS["RISC-V CPU子系统"] REG50["reg_webserver"] MDIO_C["lcpu_mdio"] TOD_C["tod / interval_timer"] UART_C["UART"] end subgraph CLK125["125MHz 域"] MAC_C["gmii2mac"] CH_C["cpu_channel"] end subgraph CLK200["200MHz 域"] RGMII_RX["rgmii2gmii RX"] end PLL_C["pll_50m\n50MHz in"] -->|"50MHz"| CLK50 PLL_C -->|"125MHz"| CLK125 PLL_C -->|"200MHz"| CLK200 CLK125 <-->|"CDC (Gray/ReqAck)"| CLK50

3 模块结构详细说明

3.1 零级模块说明

3.1.1 零级模块外围功能点描述(Feature)

88E1111(千兆以太网PHY收发器)

  • 支持10/100/1000Mbps三速自适应
  • RGMII接口(125MHz DDR,4bit数据总线)
  • MDIO管理接口(IEEE 802.3 Clause 22)
  • 支持Auto-Negotiation和Link检测
  • 集成1.25Gbps SerDes
  • 支持MDI交叉检测和自动校正

CP2102(USB转UART桥接芯片)

  • USB 2.0 Full Speed (12Mbps)
  • UART支持300bps~1Mbps波特率
  • 内置5V→3.3V LDO
  • 用于FPGA调试串口(115200bps)

W25Q128JV(SPI NOR Flash)

  • 128M-bit容量,3.3V供电
  • Standard/Dual/Quad SPI
  • 最高104MHz SPI时钟
  • 用于FPGA配置比特流存储

3.1.2 零级模块与外围接口说明(Interface)

1. 88E1111 RGMII 接口

表1 88E1111 RGMII接口信号列表
信号名 位宽(Bits) IO 说明
RGMII 接收接口
RXC 1 I RGMII接收时钟(125MHz)
RX_CTL 1 I RGMII接收控制(DV+ERR)
RXD 4 I RGMII接收数据(DDR)
RGMII 发送接口
TXC 1 O RGMII发送时钟(125MHz)
TX_CTL 1 O RGMII发送控制(EN+ERR)
TXD 4 O RGMII发送数据(DDR)
图5 88E1111 RGMII接口连接
flowchart LR subgraph FPGA["FPGA"] RGMII2GMII["rgmii2gmii"] end subgraph PHY["88E1111"] PHY_CORE["RGMII PHY Core"] end FPGA -->|"TXC, TX_CTL, TXD[3:0]"| PHY PHY -->|"RXC, RX_CTL, RXD[3:0]"| FPGA
图6 RGMII 接收时序(RX,DDR) > RGMII接收时序说明(来源:ip_common/doc/常见标准接口时序.md): > - RXC 为 125MHz 接收时钟,上升沿采样低半字节 byte[3:0],下降沿采样高半字节 byte[7:4]。 > - RX_CTL 上升沿等价于 RX_DV,下降沿等价于 RX_DV^RX_ER。 > - 每字节占 1 个 RXC 周期,低/高半字节成对拼接才形成完整字节。

2. UART 接口

表2 CP2102 UART接口信号列表
信号名 位宽(Bits) IO 说明
uart_rx 1 I UART接收(FPGA侧)
uart_tx 1 O UART发送(FPGA侧)

3. SPI Flash 接口

表3 W25Q128 SPI接口信号列表
信号名 位宽(Bits) IO 说明
SPI接口(FPGA配置模式)
CCLK 1 I 配置时钟
DIN/D0 1 I 配置数据输入
DOUT/D1 1 O 配置数据输出
CS 1 I 片选
WP/D2 1 I 写保护
HOLD/D3 1 I 保持

3.2 一级 xilinx_xc7a35tfgg484_webserver_top 顶层模块

3.2.1 顶层模块功能描述(Feature)

1. 模块标识

属性
模块名称 xilinx_xc7a35tfgg484_webserver_top
文件路径 fpga_webserver/rtl/xilinx_xc7a35tfgg484_webserver_top.v
目标器件 XC7A35T-FGG484-2

2. 功能描述

  • Xilinx Artix-7平台顶层模块,集成所有平台相关IP和原语
  • MMCM PLL产生50MHz / 125MHz / 200MHz三路时钟
  • RGMII到内部GMII的接口转换
  • 复位同步和PLL锁定门控
  • 封装webserver_wrapper核心逻辑
  • 仿真模式支持(旁路PLL和RGMII)

3. 内部模块结构图

图7 xilinx_xc7a35tfgg484_webserver_top 模块内部结构
flowchart TB subgraph TOP["xilinx_xc7a35tfgg484_webserver_top"] RST["clk_rst_ctrl\n复位同步"] PLL["pll_50m\nMMCM PLL"] RGMII["rgmii2gmii\nRGMII↔GMII"] WRAP["webserver_wrapper\nWebServer核心"] end CLK_IN["clk_50m_in"] --> PLL PLL -->|"50/125/200MHz"| TOP RESET["reset_l"] --> RST RST -->|"reset_l_synced"| TOP PHY["88E1111"] <-->|"RGMII"| RGMII RGMII <-->|"GMII"| WRAP UART["UART"] <--> WRAP MDIO["MDIO"] <--> WRAP WRAP --> LED["led_o[3:0]"] style TOP fill:#e3f2fd

3.2.2 顶层模块接口说明(Interface)

1. 接口信号

表4 xilinx_xc7a35tfgg484_webserver_top 模块接口信号表
信号名 位宽(Bits) IO 说明
系统接口
clk_50m_in 1 I 系统输入时钟(50MHz)
reset_l 1 I 系统复位(低有效)
UART接口
uart_rx 1 I UART接收数据
uart_tx 1 O UART发送数据
RGMII接口
rgmii_reset_l 1 O PHY复位信号(低有效)
rgmii_rxc 1 I RGMII接收时钟
rgmii_rx_ctl 1 I RGMII接收控制
rgmii_rxd 4 I RGMII接收数据
rgmii_txc 1 O RGMII发送时钟
rgmii_tx_ctl 1 O RGMII发送控制
rgmii_txd 4 O RGMII发送数据
MDIO接口
eth0_mdc 1 O MDIO管理时钟
eth0_mdio 1 IO MDIO管理数据
指示接口
led_o 4 O LED指示输出(低有效)
模块控制参数
sim_mod parameter integer 仿真模式:0=综合,1=仿真
xilinx_idelay_value parameter integer IDELAY延时值(16)
riscv_inst_en parameter integer RISC-V使能(1=使能)

3.3 一级 rgmii2gmii 模块

3.3.1 一级 rgmii2gmii 模块功能描述(Feature)

1. 模块标识

属性
模块名称 rgmii2gmii
文件路径 ip_common/rtl/rgmii2gmii.v

2. 功能描述

  • RGMII(DDR双沿)到内部GMII(SDR单沿)的双向转换
  • RX方向:RGMII DDR → GMII 8bit SDR(含IDELAY延时调整)
  • TX方向:GMII 8bit SDR → RGMII DDR(含ODDR输出)
  • 输入200MHz参考时钟用于RGMII RX的IDELAY校准
  • 支持Xilinx/Intel/Gowin/Pango多平台

3. 内部模块结构图

图8 rgmii2gmii 模块内部结构
flowchart LR subgraph RGMII2GMII["rgmii2gmii"] RX["rgmii_rx\nRGMII→GMII\n(DDR→SDR + IDELAY)"] TX["rgmii_tx\nGMII→RGMII\n(SDR→DDR + ODDR)"] end RGMII_IN["rgmii_rxc\nrgmii_rx_ctl\nrgmii_rxd"] --> RX RX -->|"gmii_rx_clk\ngmii_rx_dv\ngmii_rxd"| GMII_RX["GMII RX (内部)"] GMII_TX["GMII TX (内部)"] -->|"gmii_tx_clk\ngmii_tx_en\ngmii_txd"| TX TX -->|"rgmii_txc\nrgmii_tx_ctl\nrgmii_txd"| RGMII_OUT["RGMII TX"]

3.3.2 一级 rgmii2gmii 模块接口说明(Interface)

1. 接口信号

表5 rgmii2gmii 模块接口信号表
信号名 位宽(Bits) IO 说明
系统接口
reset_l 1 I 复位(低有效)
clk_200m 1 I 200MHz参考时钟
GMII RX 接口
gmii_rx_clk 1 O GMII接收时钟(125MHz)
gmii_rx_dv 1 O GMII接收数据有效
gmii_rxd 8 O GMII接收数据
GMII TX 接口
gmii_tx_clk 1 I GMII发送时钟(125MHz)
gmii_tx_en 1 I GMII发送使能
gmii_txd 8 I GMII发送数据
RGMII 接口
rgmii_rxc 1 I RGMII接收时钟
rgmii_rx_ctl 1 I RGMII接收控制
rgmii_rxd 4 I RGMII接收数据
rgmii_txc 1 O RGMII发送时钟
rgmii_tx_ctl 1 O RGMII发送控制
rgmii_txd 4 O RGMII发送数据
模块控制参数
Xilinx_IDELAY_VALUE parameter integer IDELAY延时值
vendor parameter string 器件厂商

2. 接口时序

图9 RGMII→GMII RX转换时序 图10 GMII→RGMII TX转换时序

3.3.3 一级 rgmii2gmii 模块实现说明(Implementation)

特征 内容
子模块实例 2个:rgmii_rx、rgmii_tx
跨时钟域 3个时钟域:RGMII_RXC、GMII_TX_CLK、CLK_200M
特殊原语 IDELAY、ODDR(Xilinx平台)
时钟关系 RGMII=125MHz DDR,GMII=125MHz SDR

3.4 一级 clk_rst_ctrl 模块

3.4.1 一级 clk_rst_ctrl 模块功能描述(Feature)

1. 模块标识

属性
模块名称 clk_rst_ctrl
文件路径 ip_common/rtl/clk_rst_ctrl.v

2. 功能描述

  • PLL锁定门控复位管理
  • 异步复位同步释放(async assert, sync deassert)
  • 支持多路PLL锁定信号输入,所有PLL锁定后释放复位

3. 内部模块结构图

图11 clk_rst_ctrl 模块内部结构
flowchart LR ASYNC["async_rst_l"] --> SYNC["同步器\n(2级FF)"] PLL["pll_locked"] --> GATE["锁定门控"] SYNC --> GATE GATE --> OUT["rst_l (synced)"] CLK["clk"] --> SYNC CLK --> GATE

3.4.2 一级 clk_rst_ctrl 模块接口说明(Interface)

1. 接口信号

表6 clk_rst_ctrl 模块接口信号表
信号名 位宽(Bits) IO 说明
clk 1 I 系统时钟
async_rst_l 1 I 异步复位输入(低有效)
pll_locked 1 I PLL锁定指示(高有效)
rst_l 1 O 同步释放复位输出(低有效)
模块控制参数
NUM_LOCK_INPUTS parameter integer PLL锁定信号数量

2. 接口时序

图12 clk_rst_ctrl 复位释放时序

3.5 一级 pll_50m 模块

3.5.1 一级 pll_50m 模块功能描述(Feature)

1. 模块标识

属性
模块名称 pll_50m
文件路径 ip_vendor/pll_50m.v(Xilinx MMCM IP封装)

2. 功能描述

  • Xilinx MMCM PLL时钟管理
  • 输入50MHz → 输出50MHz / 125MHz / 200MHz
  • 提供PLL锁定指示信号
  • 仿真模式下可旁路(直接使用输入时钟)

3. 内部模块结构图

图13 pll_50m 模块内部结构
flowchart LR IN["inclk0\n50MHz"] --> MMCM["MMCM\nPLL"] MMCM --> C0["c0: 50MHz"] MMCM --> C1["c1: 125MHz"] MMCM --> C2["c2: 200MHz"] MMCM --> LOCK["locked"]

3.5.2 一级 pll_50m 模块接口说明(Interface)

1. 接口信号

表7 pll_50m 模块接口信号表
信号名 位宽(Bits) IO 说明
inclk0 1 I 输入时钟(50MHz)
c0 1 O 输出时钟0(50MHz)
c1 1 O 输出时钟1(125MHz)
c2 1 O 输出时钟2(200MHz)
locked 1 O PLL锁定指示(高有效)

2. 接口时序

图14 pll_50m PLL锁定和时钟输出时序

3.6 一级 webserver_wrapper 模块

3.6.1 一级 webserver_wrapper 模块功能描述(Feature)

1. 模块标识

属性
模块名称 webserver_wrapper
文件路径 fpga_webserver/rtl/webserver_wrapper.v

2. 功能描述

  • 平台无关的FPGA WebServer核心模块
  • 集成RISC-V CPU子系统(LCPU + RISC-V + 总线合并)
  • 集成寄存器文件(reg_webserver,含MDIO子总线)
  • 集成GMII MAC(gmii2mac)
  • 集成MDIO控制器(lcpu_mdio)
  • 集成CPU-MAC数据通道(cpu_channel)
  • 集成时间计数器和秒定时器
  • 集成以太网统计计数器的跨时钟域同步
  • 集成FPGA编译时间戳

3. 内部模块结构图

图15 webserver_wrapper 模块内部结构
flowchart TB subgraph WRAP["webserver_wrapper"] subgraph CLK_GRP["基础时钟模块"] TOD_M["tod\n时间计数器"] TMR_M["interval_timer\n秒定时器"] FBT_M["fpga_build_time\n编译时间戳"] end subgraph CPU_GRP["CPU子系统"] CPU_M["lcpu_riscv_wrapper\nLCPU+RISC-V+合并"] end subgraph BUS_GRP["总线和寄存器"] REG_M["reg_webserver\n寄存器文件"] MDIO_M["lcpu_mdio\nMDIO控制器"] end subgraph ETH_GRP["以太网"] MAC_M["gmii2mac\nGMII MAC"] CH_M["cpu_channel\nCPU-MAC通道"] end subgraph CDC_GRP["跨时钟域"] CDC_V["cdc_bus_sync_vec\n多通道CDC"] CDC_S["cdc_bus_sync\nREQACK CDC"] end end GMII_IN["GMII RX"] --> MAC_M MAC_M -->|"Packet Stream"| CH_M CH_M -->|"CPU RD"| REG_M CH_M -->|"CPU WR"| REG_M REG_M <-->|"LCPU Bus"| CPU_M REG_M -->|"MDIO SubBus"| MDIO_M MDIO_M <-->|"MDIO"| PHY_M["PHY"] MAC_M -->|"Stats\n125MHz"| CDC_V CDC_V -->|"Stats\n50MHz"| REG_M style WRAP fill:#e8eaf6 style CLK_GRP fill:#fff9c4 style CPU_GRP fill:#c8e6c9 style BUS_GRP fill:#b3e5fc style ETH_GRP fill:#ffccbc style CDC_GRP fill:#e1bee7

3.6.2 一级 webserver_wrapper 模块接口说明(Interface)

1. 接口信号

表8 webserver_wrapper 模块接口信号表
信号名 位宽(Bits) IO 说明
系统接口
reset_l 1 I 复位(低有效)
clk_50mhz 1 I 50MHz时钟
clk_125mhz 1 I 125MHz时钟
UART接口
uart_rx 1 I UART接收
uart_tx 1 O UART发送
MDIO接口
eth0_mdc 1 O MDIO时钟
eth0_mdio 1 IO MDIO数据
GMII RX接口
gmii_rx_clk 1 I GMII接收时钟
gmii_rx_dv 1 I GMII接收数据有效
gmii_rx_err 1 I GMII接收错误
gmii_rxd 8 I GMII接收数据
GMII TX接口
gmii_txd 8 O GMII发送数据
gmii_tx_en 1 O GMII发送使能
gmii_tx_err 1 O GMII发送错误
指示接口
led 4 O LED输出
模块控制参数
sim_mod parameter integer 仿真模式
uart_baud_rate parameter integer UART波特率(115200)
cpu_vendor parameter string CPU厂商(xilinx/intel/uart)
riscv_inst_en parameter integer RISC-V使能
cpu_buf_addr_width parameter integer CPU缓冲区地址宽度(12)
cpu_buf_data_width parameter integer CPU缓冲区数据宽度(8)

3.6.3 一级 webserver_wrapper 模块实现说明(Implementation)

特征 内容
子模块实例 14个(含3个cdc_bus_sync实例)
时钟域 2个:clk_50mhz(CPU/寄存器)、clk_125mhz(以太网MAC)
跨时钟域 4路CDC:eth stats (GRAY×7)、filter_data (REQACK)、filter_offset (REQACK)、drop_cnt (GRAY)
LCPU总线地址空间 16bit地址,寄存器文件和MDIO子总线

3.6.1 二级 tod 模块

3.6.1.1 二级 tod 模块功能描述(Feature)

1. 模块标识
属性
模块名称 tod
文件路径 ip_common/rtl/tod.v
2. 功能描述
  • 64位本地时间计数器(Time of Day)
  • 支持快照模式(snapshot触发时锁存当前值到time_out)
  • 支持可配置步长(step参数,每时钟周期递增step)
  • 50MHz时钟,step=20 → 每20ns递增20,即1ns分辨率
3. 内部模块结构图
图16 tod 模块内部结构
flowchart LR CLK["clk (50MHz)"] --> CNT["counter_live\n64-bit计数器\n每周期 +step"] SNAP["snapshot"] --> REG["锁存寄存器"] CNT --> REG REG --> OUT["time_out"]

3.6.1.2 二级 tod 模块接口说明(Interface)

1. 接口信号
表9 tod 模块接口信号表
信号名 位宽(Bits) IO 说明
clk 1 I 时钟
reset_l 1 I 复位(低有效)
snapshot 1 I 快照触发
counter_live 64 O 实时计数器值
time_out 64 O 快照输出
模块控制参数
counter_mode parameter integer 计数模式(1=标准)
step parameter integer 每时钟递增步长(20)
2. 接口时序
图17 tod 快照时序 > snapshot信号由reg_webserver产生(get_local_time_ind),脉冲宽度1个clk周期。锁存后CPU通过0x07/0x08寄存器读取time_out。

3.6.2 二级 interval_timer 模块

3.6.2.1 二级 interval_timer 模块功能描述(Feature)

1. 模块标识
属性
模块名称 interval_timer
文件路径 ip_common/rtl/interval_timer.v
2. 功能描述
  • 可配置周期的定时器
  • 输出模式可选:0=toggle,1=pulse
  • 用于产生1秒间隔的second_event信号
  • 50MHz时钟,周期=50,000,000 → 1秒
3. 内部模块结构图
图18 interval_timer 模块内部结构
flowchart LR CLK["clk"] --> CNT["counter\n26-bit\n自增"] CNT --> CMP["比较器\n== period_count"] CMP --> OUT["event_out"] CMP -->|"清零"| CNT

3.6.2.2 二级 interval_timer 模块接口说明(Interface)

1. 接口信号
表10 interval_timer 模块接口信号表
信号名 位宽(Bits) IO 说明
clk 1 I 时钟
reset_l 1 I 复位(低有效)
event_out 1 O 定时事件输出
模块控制参数
counter_width parameter integer 计数器位宽(26)
period_count parameter integer 周期计数值(50000000)
output_mode parameter integer 输出模式(0=toggle)
2. 接口时序
图19 interval_timer 定时事件时序

3.6.3 二级 fpga_build_time 模块

3.6.3.1 二级 fpga_build_time 模块功能描述(Feature)

1. 模块标识
属性
模块名称 fpga_build_time
文件路径 ip_common/rtl/fpga_build_time.v
2. 功能描述
  • 通过Verilog $time系统函数或综合属性嵌入FPGA编译时间戳
  • 输出32bit build_date(YYYYMMDD格式)和32bit build_time(HHMMSS格式)
  • 纯组合逻辑,无时钟

3.6.4 二级 lcpu_riscv_wrapper 模块

3.6.4.1 二级 lcpu_riscv_wrapper 模块功能描述(Feature)

1. 模块标识
属性
模块名称 lcpu_riscv_wrapper
文件路径 fpga_cpu/rtl/lcpu_riscv_wrapper.v
2. 功能描述
  • RISC-V CPU子系统顶层模块
  • 集成LCPU(JTAG调试主机)和RISC-V32 CPU核心
  • 通过lcpu_merge实现JTAG和RISC-V双主机总线仲裁合并
  • 统一程序RAM接口(pram_*),支持指令初始化
  • 仿真模式支持:综合模式下例化lcpu_top(真实硬件),仿真模式下例化lcpu_bfm(行为模型)
  • 支持RISC-V可配置使能/禁用
  • 统一对外LCPU总线接口(req/rhwl/wdata/address/rdata/ack)
3. 内部模块结构图
图20 lcpu_riscv_wrapper 模块内部结构
flowchart TB subgraph CPU_SUB["lcpu_riscv_wrapper"] LCPU["lcpu_top\n(LCPU JTAG主机)\n综合模式"] BFM["lcpu_bfm\n(仿真BFM)\n仿真模式"] RISCV["riscv32_top\nRISC-V RV32IC"] MERGE["lcpu_merge\n双主机总线合并"] end UART["UART RX/TX"] <--> LCPU LCPU -->|"JTAG Bus"| MERGE RISCV -->|"RISC-V Bus"| MERGE MERGE -->|"统一LCPU Bus"| EXT["外部总线\n(req/rhwl/...)"] PRAM["Program RAM\n接口"] <--> RISCV PRAM <--> MERGE style LCPU fill:#c8e6c9 style BFM fill:#fff9c4 style RISCV fill:#b3e5fc style MERGE fill:#e1bee7
4. RISC-V C代码及编译环境介绍
RISC-V固件开发环境
  • 工具链:riscv32-unknown-elf-gcc(picolibc)
  • 指令集架构:RV32IC(基础整数 + 压缩指令)
  • C运行库:picolibc(轻量级嵌入式C库)
  • 链接脚本:定制link.ld,配置指令RAM和数据地址空间
  • 启动流程
  • FPGA加载比特流,Block RAM初始化时预装RISC-V固件(.hex文件)
  • RISC-V CPU复位释放后从复位向量(0x00000000)开始执行
  • _start → crt0 → main(),初始化外设、网络栈
  • 主循环处理以太网报文、HTTP协议、WebSocket通信
固件主要模块
  • main.c:主程序入口,初始化TCP/IP栈
  • http_server.c:HTTP请求解析和响应生成
  • eth.c:以太网帧收发驱动
  • uart.c:调试串口输出

3.6.4.2 二级 lcpu_riscv_wrapper 模块接口说明(Interface)

1. 接口信号
表11 lcpu_riscv_wrapper 模块接口信号表
信号名 位宽(Bits) IO 说明
系统接口
clk 1 I 系统时钟(50MHz)
reset_l 1 I 复位(低有效)
riscv_reset_l 1 I RISC-V专用复位
UART接口
uart_rx 1 I UART接收
uart_tx 1 O UART发送
程序RAM接口
pram_wr 1 I 程序RAM写使能
pram_addr instr_addr_width I 程序RAM地址
pram_wdata 32 I 程序RAM写数据
pram_rdata 32 O 程序RAM读数据
LCPU Bus接口
req 1 O 总线请求
rhwl 1 O 读高/写低
wdata 32 O 写数据
address 32 O 地址
ack 1 I 应答
rdata 32 I 读数据
模块控制参数
lcpu_type parameter string LCPU类型
riscv_inst_en parameter integer RISC-V使能
instr_addr_depth parameter integer 指令地址深度
enable_irq parameter integer IRQ使能

3.6.4.1 三级 lcpu_top 模块

1. 模块标识
属性
模块名称 lcpu_top
文件路径 fpga_cpu/rtl/lcpu_top.v
2. 功能描述
  • LCPU JTAG调试主机(综合模式)
  • 通过UART与上位机通信,将JTAG命令转换为LCPU总线操作
  • 支持RISC-V固件下载和调试
  • 支持xilinx/intel/uart三种接口模式
3. 接口信号
表12 lcpu_top 模块接口信号表
信号名 位宽(Bits) IO 说明
clk 1 I 时钟
reset_l 1 I 复位
uart_rx 1 I UART接收
uart_tx 1 O UART发送
jtag_req 1 O JTAG总线请求
jtag_rhwl 1 O JTAG读/写
jtag_address 32 O JTAG地址
jtag_wdata 32 O JTAG写数据
jtag_rdata 32 I JTAG读数据
jtag_ack 1 I JTAG应答

3.6.4.2 三级 lcpu_bfm 模块(仿真)

1. 模块标识
属性
模块名称 lcpu_bfm
文件路径 fpga_cpu/rtl/lcpu_bfm.v
2. 功能描述
  • LCPU总线行为功能模型(Bus Functional Model)
  • 仅用于仿真环境(sim_mod=1时启用,综合时禁用)
  • 从脚本文件(script_file)读取命令序列,模拟LCPU总线操作
  • 可配置操作延迟和超时时间
3. 接口信号
表13 lcpu_bfm 模块接口信号表
信号名 位宽(Bits) IO 说明
clk 1 I 时钟
reset_l 1 I 复位
EXEC 1 O 执行命令
RH_WL 1 O 读/写
ADDRESS 32 O 地址
WR_DATA 32 O 写数据
RD_DATA 32 I 读数据
OP_DONE 1 I 操作完成
模块控制参数
read_time_out parameter integer 读超时周期
delay_time parameter integer 操作间延时
script_file parameter string 脚本文件路径

3.6.4.3 三级 riscv32_top 模块

1. 模块标识
属性
模块名称 riscv32_top
文件路径 fpga_cpu/rtl/riscv32_top.v
2. 功能描述
  • RISC-V RV32IC处理器核心顶层模块
  • 支持RV32I基础整数指令集 + C压缩指令扩展
  • 集成指令RAM(Block RAM或寄存器实现)
  • 支持指令RAM初始化(上电预装固件)
  • LCPU总线主机接口,用于数据存储器访问
  • 可选IRQ中断支持
3. 内部模块结构图
图21 riscv32_top 模块内部结构
flowchart TB subgraph RISCV_TOP["riscv32_top"] CORE["riscv_core\nRV32IC Pipeline"] REG_FILE["reg_file\n寄存器堆 32x32"] IRAM["instr_ram\n指令RAM"] LSU["load_store_unit\n访存单元"] BIU["bus_interface\nLCPU总线接口"] end PRAM["Program RAM\n接口"] <--> IRAM CORE <--> REG_FILE CORE --> LSU LSU <--> BIU BIU <-->|"LCPU Bus"| EXT_BUS["外部总线"] CORE -->|"pc"| IRAM IRAM -->|"指令"| CORE style CORE fill:#ffccbc style IRAM fill:#c8e6c9
4. 接口信号
表14 riscv32_top 模块接口信号表
信号名 位宽(Bits) IO 说明
clk 1 I 时钟
reset_l 1 I 复位
req 1 O 总线请求
rhwl 1 O 读/写
wdata 32 O 写数据
address 32 O 地址
rdata 32 I 读数据
ack 1 I 应答
program_wr 1 I 程序RAM写使能
program_waddr init_addr_width I 程序RAM写地址
program_wdata 32 I 程序RAM写数据
program_rdata 32 O 程序RAM读数据
irq 32 I 中断请求
模块控制参数
instr_databits parameter integer 指令数据位宽(32)
instr_ram_type parameter string 指令RAM类型
init_addr_depth parameter integer 初始化地址深度
enable_irq parameter integer IRQ使能

3.6.4.4 三级 lcpu_merge 模块

1. 模块标识
属性
模块名称 lcpu_merge
文件路径 fpga_cpu/rtl/lcpu_merge.v
2. 功能描述
  • 双主机LCPU总线合并仲裁模块
  • Port 1:JTAG/LCPU主机(高优先级,用于调试和初始化)
  • Port 2:RISC-V CPU主机(低优先级)
  • 仲裁策略:JTAG优先,当JTAG无请求时RISC-V获得总线控制权
  • 输出统一的LCPU总线接口
3. 内部模块结构图
图22 lcpu_merge 模块内部结构
flowchart LR JTAG["Port 1: JTAG\n(req/rhwl/...)\n高优先级"] --> ARB["仲裁器\nJTAG优先"] RISCV_BUS["Port 2: RISC-V\n(req/rhwl/...)\n低优先级"] --> ARB ARB -->|"统一LCPU Bus"| EXT["外部总线"]
4. 接口信号
表15 lcpu_merge 模块接口信号表
信号名 位宽(Bits) IO 说明
clk 1 I 时钟
reset_l 1 I 复位
Port 1 (JTAG)
op_req_1 1 I Port1请求
wrl_rdh_1 1 I Port1读/写
wrdata_1 32 I Port1写数据
address_1 32 I Port1地址
op_ack_1 1 O Port1应答
rddata_1 32 O Port1读数据
Port 2 (RISC-V)
op_req_2 1 I Port2请求
wrl_rdh_2 1 I Port2读/写
wrdata_2 32 I Port2写数据
address_2 32 I Port2地址
op_ack_2 1 O Port2应答
rddata_2 32 O Port2读数据
合并输出
op_req 1 O 合并后请求
wrl_rdh 1 O 合并后读/写
wrdata 32 O 合并后写数据
address 32 O 合并后地址
op_ack 1 I 合并后应答
rddata 32 I 合并后读数据
4. 接口时序
图23 lcpu_merge 双主机仲裁时序

3.6.5 二级 cpu_channel 模块

3.6.5.1 二级 cpu_channel 模块功能描述(Feature)

1. 模块标识
属性
模块名称 cpu_channel
文件路径 fpga_webserver/rtl/cpu_channel.v
2. 功能描述
  • CPU与以太网MAC之间的数据通道,桥接125MHz MAC域和50MHz CPU域
  • RX路径:MAC → ram2pktfifo_int(字节流→包FIFO接口)→ package_fifo_v2(异步FIFO,125MHz→50MHz)→ CPU读端口
  • TX路径:CPU写端口 → package_fifo_v2(异步FIFO,50MHz→125MHz)→ pktfifo2ram_int_v2(包FIFO→字节流)→ sop_eop_gen(生成SOP/EOP边带)→ MAC
  • 集成数据包过滤器:根据filter_data/filter_offset匹配数据字节决定转发/丢弃
  • 丢包计数器
3. 内部模块结构图
图24 cpu_channel 模块内部结构
flowchart TB subgraph CH["cpu_channel"] subgraph RX_PATH["RX 路径 (125MHz→50MHz)"] R2F["ram2pktfifo_int\n字节流→包FIFO"] FILTER["包过滤器\ndata match @ offset"] PF_RX["package_fifo_v2\n(异步FIFO)"] end subgraph TX_PATH["TX 路径 (50MHz→125MHz)"] PF_TX["package_fifo_v2\n(异步FIFO)"] F2R["pktfifo2ram_int_v2\n包FIFO→字节流"] SOP["sop_eop_gen\n生成SOP/EOP"] end end MAC_RX["MAC RX\n(sop/en/data/eop)"] --> R2F R2F --> FILTER FILTER -->|"pass_enable"| PF_RX PF_RX -->|"CPU RD Port"| CPU_R["RISC-V CPU"] CPU_W["RISC-V CPU"] -->|"CPU WR Port"| PF_TX PF_TX --> F2R F2R --> SOP SOP -->|"MAC TX"| MAC_T["MAC TX"] FILTER_CFG["filter_data\nfilter_offset"] --> FILTER FILTER --> DROP["recv_pkt_drop_cnt"] style RX_PATH fill:#e8f5e9 style TX_PATH fill:#fff3e0

3.6.5.2 二级 cpu_channel 模块接口说明(Interface)

1. 接口信号
表16 cpu_channel 模块接口信号表
信号名 位宽(Bits) IO 说明
系统接口
clk 1 I MAC侧时钟(125MHz)
cpu_clk 1 I CPU侧时钟(50MHz)
reset_l 1 I 复位(低有效)
MAC RX接口(125MHz)
mac_rx_sop 1 I 接收包起始
mac_rx_en 1 I 接收数据使能
mac_rx_data cpu_buf_data_width I 接收数据
mac_rx_eop 1 I 接收包结束
mac_rx_err 1 I 接收错误
MAC TX接口(125MHz)
mac_tx_sop 1 O 发送包起始
mac_tx_en 1 O 发送数据使能
mac_tx_data cpu_buf_data_width O 发送数据
mac_tx_eop 1 O 发送包结束
mac_tx_err 1 O 发送错误
过滤器配置
filter_data 16 I 过滤匹配数据
filter_offset 16 I 过滤匹配偏移
recv_pkt_drop_cnt 8 O 丢包计数
CPU读端口(50MHz)
cpu_rd_empty 1 O 读FIFO空
cpu_rd_rpkt_pop 1 I 读包弹出
cpu_rd_rpkt_len cpu_buf_addr_width+1 O 读包长度
cpu_rd_ren 1 I 读使能
cpu_rd_raddr cpu_buf_addr_width I 读地址
cpu_rd_rdata cpu_buf_data_width O 读数据
CPU写端口(50MHz)
cpu_wr_full 1 O 写FIFO满
cpu_wr_wen 1 I 写使能
cpu_wr_waddr cpu_buf_addr_width I 写地址
cpu_wr_wdata cpu_buf_data_width I 写数据
cpu_wr_wpkt_push 1 I 写包推送
cpu_wr_wpkt_len cpu_buf_addr_width+1 I 写包长度
2. 接口时序
图25 cpu_channel RX 数据通道(MAC→CPU)

MAC侧(125MHz clk,信号名来自 ip_common/doc/常用LRIP接口时序.md gmii2mac MAC侧包流接口):

> RX数据在 mac_rx_en=1 期间有效,mac_rx_sop/eop 各持续1个clk周期。

CPU侧(50MHz cpu_clk,参考包FIFO读时序,信号名调整为 cpu_channel 端口名):

> cpu_rd_empty=0 时 CPU 通过 reg_webserver 发送 cpu_rd_rpkt_pop=1 弹出包;2周期后 cpu_rd_rpkt_len 有效;随后 cpu_rd_ren=1 逐字读取,cpu_rd_raddr 递增。

图26 cpu_channel TX 数据通道(CPU→MAC)

CPU侧(50MHz cpu_clk,参考包FIFO写时序,信号名调整为 cpu_channel 端口名):

> CPU 通过 reg_webserver 逐字写入包数据(cpu_wr_wen=1),写入完成后发送 cpu_wr_wpkt_push=1 推送完整包。

MAC侧(125MHz clk,TX方向与RX对称,来源同 MAC侧包流接口):

> MAC TX 方向时序与 RX 对称:sop/eop 各1周期脉冲,en=1 期间 data 有效。err=1 时强制产生错误 FCS。

> 数据流总述:RX — MAC(125MHz)→ram2pktfifo_int→包FIFO写→CDC(125→50MHz)→包FIFO读→CPU读端口。TX — CPU写端口→包FIFO写→CDC(50→125MHz)→包FIFO读→pktfifo2ram_int_v2→sop_eop_gen→MAC TX(125MHz)。


3.6.5.1 三级 ram2pktfifo_int 模块

1. 模块标识
属性
模块名称 ram2pktfifo_int
文件路径 ip_common/rtl/ram2pktfifo_int.v
2. 功能描述
  • 将连续字节流(ram_wen/ram_wdata/ram_waddr)转换为包FIFO接口
  • 通过ram_wen_permit实现背压控制
  • 自动检测包边界并生成wpkt_push/wpkt_len信号
3. 接口信号
表17 ram2pktfifo_int 模块接口信号表
信号名 位宽(Bits) IO 说明
clk 1 I 时钟
reset_l 1 I 复位
ram_wen 1 I 字节写使能
ram_wdata data_width I 字节写数据
ram_waddr addr_width I 字节写地址
wen 1 O FIFO写使能
wdata data_width O FIFO写数据
waddr addr_width O FIFO写地址
wpkt_push 1 O 包推送
wpkt_len addr_width+1 O 包长度
3. 接口时序
图27 ram2pktfifo_int 字节流转包FIFO时序

3.6.5.2 三级 package_fifo_v2 模块

1. 模块标识
属性
模块名称 package_fifo_v2
文件路径 ip_common/rtl/package_fifo_v2.v
2. 功能描述
  • 双时钟异步数据包FIFO(支持跨时钟域)
  • 存储数据包及其长度/参数信息
  • 支持Block RAM或分布式RAM实现
  • 支持block模式(多块组合)和max_pkt_length限制
  • 在cpu_channel中例化2个:RX方向(125→50MHz)和TX方向(50→125MHz)
3. 内部模块结构图
图28 package_fifo_v2 模块内部结构
flowchart LR subgraph PF["package_fifo_v2"] DP["dual_port_ram\n数据RAM"] PP["para_ram\n参数RAM"] CTRL["控制逻辑\n读写指针/空满"] end WPORT["写端口\n(wen/wdata/wpkt_push)"] --> DP WPORT --> PP WPORT --> CTRL CTRL --> DP CTRL --> PP DP --> RPORT["读端口\n(ren/rdata)"] PP --> RPORT CTRL --> RPORT WCLK["wclk"] --> CTRL RCLK["rclk"] --> CTRL
4. 接口信号
表18 package_fifo_v2 模块接口信号表
信号名 位宽(Bits) IO 说明
reset_l 1 I 复位
写端口
wclk 1 I 写时钟
full 1 O FIFO满
wen 1 I 写使能
waddr addr_width I 写地址
wdata data_width I 写数据
wpkt_push 1 I 包推送
wpkt_len addr_width+1 I 包长度
wpkt_para para_width I 包参数
读端口
rclk 1 I 读时钟
empty 1 O FIFO空
rpkt_pop 1 I 包弹出
rpkt_len addr_width+1 O 包长度
rpkt_para para_width O 包参数
ren 1 I 读使能
raddr addr_width I 读地址
rdata data_width O 读数据
4. 接口时序
图29 包FIFO写时序 > 包FIFO写时序说明(来源:ip_common/doc/常用LRIP接口时序.md): > - wclk 为写侧时钟,wen=1 时 waddr/wdata 有效,逐字写入包数据。 > - 包数据写入完成后,紧接着发送 wpkt_push=1(与 wen=0 同一周期),wpkt_len 给出包总长度(word数),wpkt_para 为附带参数。 > - full=1 时表示 FIFO 剩余空间不足以容纳最大包,此时不应再写入。 图30 包FIFO读时序 > 包FIFO读时序说明(来源:ip_common/doc/常用LRIP接口时序.md): > - rclk 为读侧时钟,empty=0 时发送 rpkt_pop=1 弹出一个包。 > - rpkt_pop 发出后 2 个时钟周期 rpkt_len 和 rpkt_para 有效。 > - 通过 ren=1 逐字读取,raddr 为偏移地址(0~rpkt_len-1),rdata 在下一个时钟周期返回。
RAM 类型 数量 配置 用途
M9K 2 4096×8bits RX/TX数据缓冲
分布式RAM 少量 包参数存储

3.6.5.3 三级 pktfifo2ram_int_v2 模块

1. 模块标识
属性
模块名称 pktfifo2ram_int_v2
文件路径 ip_common/rtl/pktfifo2ram_int_v2.v
2. 功能描述
  • 将包FIFO接口(rpkt_pop/rpkt_len/ren/rdata)转换为连续字节流输出
  • 自动插入IPG(Inter-Packet Gap)间隔
  • 支持block模式
3. 接口信号
表19 pktfifo2ram_int_v2 模块接口信号表
信号名 位宽(Bits) IO 说明
clk 1 I 时钟
reset_l 1 I 复位
empty 1 I FIFO空
rpkt_pop 1 O 包弹出
rpkt_len addr_width+1 I 包长度
ren 1 O 读使能
raddr addr_width O 读地址
rdata data_width I 读数据
ram_wen 1 O 字节流写使能
ram_wdata data_width O 字节流写数据
模块控制参数
ipg parameter integer IPG间隔(8周期)
4. 接口时序
图31 pktfifo2ram_int_v2 包FIFO→字节流+IPG时序

3.6.5.4 三级 sop_eop_gen 模块

1. 模块标识
属性
模块名称 sop_eop_gen
文件路径 ip_common/rtl/sop_eop_gen.v
2. 功能描述
  • 从连续字节流(i_en/i_data)生成带SOP/EOP边带信号的包流
  • 检测i_en的上升沿作为SOP
  • 检测i_en的下降沿作为EOP
  • 用于cpu_channel TX路径中pktfifo2ram_int_v2输出转换为MAC所需格式
3. 时序图
图32 sop_eop_gen 时序

3.6.6 二级 reg_webserver 模块

3.6.6.1 二级 reg_webserver 模块功能描述(Feature)

1. 模块标识
属性
模块名称 reg_webserver
文件路径 fpga_webserver/rtl/reg_webserver.v
2. 功能描述
  • WebServer寄存器文件,实现LCPU总线从设备接口
  • 寄存器地址空间:0x0000~0xFFFF(16bit地址)
  • 包含以下寄存器组:
  • 系统信息(0x00~0x0F):FPGA编译日期/时间、软件版本、以太网复位、秒事件、本地时间
  • 调试读写(0x10~0x13):debug_rw_0~3
  • 调试只读(0x20~0x23):debug_ro_0~3
  • 以太网统计(0x100~0x106):各类计数器和错误统计
  • 包过滤器配置(0x200~0x201):filter_data、filter_offset
  • CPU读通道控制(0x6000~0x600F):cpu_rd_*寄存器
  • CPU写通道控制(0x6100~0x610F):cpu_wr_*寄存器
  • MDIO子总线(0x1000~0x1FFF):自动转发到lcpu_mdio
  • 超时应答机制(is_req_cnt ≥ 0xF000时自动应答0xDEADDEAD)

3.6.6.2 二级 reg_webserver 模块接口说明(Interface)

1. 接口信号

表20 reg_webserver 模块接口信号表(主要信号)
信号名 位宽(Bits) IO 说明
LCPU Bus接口
clk 1 I 总线时钟(50MHz)
rst_n 1 I 复位(低有效)
req 1 I 总线请求
rhwl 1 I 读高/写低
wdata 32 I 写数据
address 16 I 寄存器地址
rdata 32 O 读数据
ack 1 O 应答
MDIO子总线
SUBBUS_eth_mdio_Req 1 O MDIO请求
SUBBUS_eth_mdio_RhWl 1 O MDIO读/写
SUBBUS_eth_mdio_ReqAddr 12 O MDIO地址
SUBBUS_eth_mdio_DataWr 32 O MDIO写数据
SUBBUS_eth_mdio_DataRd 32 I MDIO读数据
SUBBUS_eth_mdio_Ack 1 I MDIO应答
状态输入
fpga_build_date 32 I FPGA编译日期
fpga_build_time 32 I FPGA编译时间
second_event 1 I 秒事件
local_time_l/h 32/32 I 本地时间
eth_rx_correct_pkt_cnt 32 I 正确接收包计数
eth_rx_crc_err_pkt_cnt 32 I CRC错误包计数
eth_tx_correct_pkt_cnt 32 I 正确发送包计数
eth_tx_error_pkt_cnt 32 I 发送错误包计数

3.6.6.3 二级 reg_webserver 模块内部表项(Table)

表21 reg_webserver 寄存器地址映射表
地址 寄存器名称 位宽 访问 说明
0x00 fpga_build_date 32 RO FPGA编译日期(YYYYMMDD)
0x01 fpga_build_time 32 RO FPGA编译时间(HHMMSS)
0x02 sw_build_date 32 RW 软件编译日期
0x03 sw_build_time 32 RW 软件编译时间
0x04 eth_greset 4 RW 以太网全局复位
0x05 second_event 1 RO 秒事件状态
0x06 get_local_time 1 RW 本地时间快照触发
0x07 local_time_l 32 RO 本地时间低32位
0x08 local_time_h 32 RO 本地时间高32位
0x10 debug_rw_0 32 RW 调试读写0
0x11 debug_rw_1 32 RW 调试读写1
0x12 debug_rw_2 32 RW 调试读写2
0x13 debug_rw_3 32 RW 调试读写3
0x20 debug_ro_0 32 RO 调试只读0(含drop_cnt)
0x21 debug_ro_1 32 RO 调试只读1
0x22 debug_ro_2 32 RO 调试只读2
0x23 debug_ro_3 32 RO 调试只读3
0x30 led 4 RW LED控制
0x100 eth_rx_correct_pkt_cnt 32 RO ETH RX正确包计数
0x101 eth_rx_crc_err_pkt_cnt 32 RO ETH RX CRC错误计数
0x102 eth_tx_correct_pkt_cnt 32 RO ETH TX正确包计数
0x103 eth_tx_error_pkt_cnt 32 RO ETH TX错误包计数
0x104 eth_rx_afifo_full_cnt 32 RO ETH RX FIFO满计数
0x105 eth_rx_afifo_empty_cnt 32 RO ETH RX FIFO空计数
0x106 eth_rx_data_err_line 32 RO ETH RX数据错误行
0x200 filter_data 16 RW 包过滤匹配数据
0x201 filter_offset 16 RW 包过滤匹配偏移
0x6000 cpu_rd_empty 1 RO CPU读FIFO空
0x6001 cpu_rd_rpkt_pop 1 RW CPU读包弹出
0x6004 cpu_rd_ren 1 RW CPU读使能
0x6005 cpu_rd_raddr 32 RW CPU读地址
0x6006 cpu_rd_rdata 32 RO CPU读数据
0x6100 cpu_wr_full 1 RO CPU写FIFO满
0x6101 cpu_wr_wen 1 RW CPU写使能
0x6102 cpu_wr_waddr 32 RW CPU写地址
0x6103 cpu_wr_wdata 32 RW CPU写数据
0x6104 cpu_wr_wpkt_len 32 RW CPU写包长度
0x6106 cpu_wr_wpkt_push 1 RW CPU写包推送
0x1000-0x1FFF MDIO子总线 RW 转发到lcpu_mdio

3.6.6.3.1 LCPU Bus 接口时序

图33 LCPU 读寄存器时序(Master) > LCPU读寄存器时序说明(来源:ip_common/doc/常用LRIP接口时序.md): > - CLK 为系统CPU操作时钟,默认 50MHz。 > - 主设备发送一个时钟周期的 REQ=1 读请求,RH_WL=1(高电平)表示读操作。 > - 在 REQ 有效的时钟周期,ADDR 为有效的读操作地址。 > - 从设备操作完成后返回 ACK=1,同一周期 RDATA 有效。从 REQ 到 ACK 的延迟取决于从设备(几个到数百个周期不等)。 图34 LCPU 写寄存器时序(Master) > LCPU写寄存器时序说明(来源:ip_common/doc/常用LRIP接口时序.md): > - 主设备发送一个时钟周期的 REQ=1 写请求,RH_WL=0(低电平)表示写操作。 > - ADDR 和 WDATA 在 REQ 有效周期同时给出。 > - 从设备操作完成后返回 ACK=1。延迟取决于从设备。

3.6.6.4 二级 reg_webserver 模块实现说明(Implementation)

特征 内容
状态机 无(全组合+寄存器逻辑)
总线协议 LCPU Bus(req/rhwl风格,分离地址和数据阶段)
超时机制 is_req_cnt ≥ 0xF000 ≈ 61us @50MHz
子总线 MDIO地址空间 0x1000-0x1FFF 自动转发
特殊功能 led低有效输出,sw_build可由CPU写入

3.6.7 二级 lcpu_mdio 模块

3.6.7.1 二级 lcpu_mdio 模块功能描述(Feature)

1. 模块标识
属性
模块名称 lcpu_mdio
文件路径 ip_common/rtl/lcpu_mdio.v
2. 功能描述
  • IEEE 802.3 Clause 22 MDIO控制器
  • 通过LCPU总线子总线接口控制
  • 产生MDC时钟和MDIO双向数据
  • 支持PHY寄存器读写
3. 内部模块结构图
图35 lcpu_mdio 模块内部结构
flowchart LR subgraph MDIO["lcpu_mdio"] FSM["MDIO状态机\nClause 22帧格式"] SHIFT["移位寄存器\n32-bit"] MDIO_BUF["MDIO双向缓冲"] end BUS["SubBus\n(op_req/wrl_rdh/...)" ] --> FSM FSM <--> SHIFT SHIFT <--> MDIO_BUF FSM -->|"MDC"| PHY["PHY MDIO"] MDIO_BUF <-->|"MDIO"| PHY FSM -->|"op_ack/rddata"| BUS

3.6.7.2 二级 lcpu_mdio 模块接口说明(Interface)

1. 接口信号
表22 lcpu_mdio 模块接口信号表
信号名 位宽(Bits) IO 说明
clk 1 I 时钟
reset_l 1 I 复位
op_req 1 I 操作请求
wrl_rdh 1 I 写低/读高
wrdata 32 I 写数据
address 32 I 地址(含PHY地址+寄存器地址)
op_ack 1 O 操作完成
rddata 32 O 读数据
mdc 1 O MDIO时钟
mdio 1 IO MDIO数据
2. 接口时序
图36 MDIO 读时序(Clause 22) > MDIO读时序说明(来源:ip_common/doc/常见标准接口时序.md): > - Clause 22 读帧:PRE(32×1) + ST(01) + OP(10) + PHYAD(5) + REGAD(5) + TA(Z0) + RDATA(16)。 > - TA 阶段主设备释放 MDIO 为高阻(Z),从设备输出 TA0 作为应答,随后输出 16bit 读数据。 > - CPU 通过 reg_webserver 写入地址 0x1000-0x1FFF 触发 MDIO 操作。 图37 MDIO 写时序(Clause 22) > MDIO写时序说明(来源:ip_common/doc/常见标准接口时序.md): > - Clause 22 写帧:PRE(32×1) + ST(01) + OP(01) + PHYAD(5) + REGAD(5) + TA(10) + WDATA(16)。 > - TA 写事务为 10,由主设备继续驱动 MDIO。每 bit 在 MDC 下降沿后更新,上升沿被采样。

3.6.8 二级 gmii2mac 模块

3.6.8.1 二级 gmii2mac 模块功能描述(Feature)

1. 模块标识
属性
模块名称 gmii2mac
文件路径 ip_common/rtl/gmii2mac.v
2. 功能描述
  • GMII接口到内部MAC包接口的双向转换
  • RX方向:GMII 8bit SDR → 异步FIFO(跨GMII_RXC→clk域)→ eth_presemble → MAC包接口(sop/en/data/eop/err)
  • TX方向:MAC包接口 → eth_presemble → GMII 8bit SDR输出
  • 集成统计计数器:RX正确包、CRC错误包、TX正确包、TX错误包、RX FIFO满/空次数
  • 跨时钟域:GMII RX时钟(125MHz)→ 系统时钟(125MHz)
3. 内部模块结构图
图38 gmii2mac 模块内部结构
flowchart TB subgraph GMII2MAC["gmii2mac"] subgraph RX_PATH["RX路径"] AFIFO["dual_clock_fifo\n(3深度×10bit)"] PRE_RX["eth_presemble\nRX预组装"] end subgraph TX_PATH["TX路径"] PRE_TX["eth_presemble\nTX预组装"] end STATS["统计计数器"] end GMII_RX["GMII RX\n(RXC/RXDV/RXD/RXER)"] --> AFIFO AFIFO -->|"rclk=clk"| PRE_RX PRE_RX -->|"mac_rx_sop/en/data/eop/err"| MAC_RX["MAC内部接口"] MAC_TX["MAC内部接口\n(mac_tx_sop/en/data/eop/err)"] --> PRE_TX PRE_TX -->|"GMII TX\n(TXD/TXEN/TXER)"| GMII_TX["GMII TX"] AFIFO -->|"full/empty events"| STATS PRE_RX -->|"err events"| STATS PRE_TX -->|"pkt events"| STATS STATS -->|"7种统计计数器"| REG["reg_webserver"] style RX_PATH fill:#e8f5e9 style TX_PATH fill:#fff3e0

3.6.8.2 二级 gmii2mac 模块接口说明(Interface)

1. 接口信号
表23 gmii2mac 模块接口信号表
信号名 位宽(Bits) IO 说明
系统接口
clk 1 I 系统时钟(125MHz)
reset_l 1 I 复位
GMII接口
Eth_RXC 1 I GMII接收时钟
Eth_RXDV 1 I GMII接收数据有效
Eth_RXER 1 I GMII接收错误
Eth_RXD 8 I GMII接收数据
Eth_TXD 8 O GMII发送数据
Eth_TXEN 1 O GMII发送使能
Eth_TXER 1 O GMII发送错误
MAC包接口
mac_rx_sop/en/data/eop/err 1/1/8/1/1 O MAC接收包接口
mac_tx_sop/en/data/eop/err 1/1/8/1/1 I MAC发送包接口
统计输出
rx_correct_pkt_cnt 32 O RX正确包计数
rx_crc_err_pkt_cnt 32 O RX CRC错误计数
tx_correct_pkt_cnt 32 O TX正确包计数
tx_error_pkt_cnt 32 O TX错误包计数
rx_afifo_full_cnt 32 O RX FIFO满计数
rx_afifo_empty_cnt 32 O RX FIFO空计数
rx_data_err_line 32 O RX数据错误行计数
2. 接口时序
图39 GMII RX 接口时序 > GMII RX说明(来源:ip_common/doc/常用LRIP接口时序.md): > - Eth_RXC 为 GMII 接收参考时钟(125MHz/25MHz/2.5MHz,由 PHY 提供)。 > - Eth_RXDV=1 期间 Eth_RXD[7:0] 上的数据有效。Eth_RXER=1 时表示接收错误。 > - RX 通路内部经 dual_clock_fifo(深度8)实现 Eth_RXC→clk 跨时钟域切换。 图40 GMII 发送时序(TX) > GMII发送时序说明(来源:ip_common/doc/常见标准接口时序.md): > - GTX_CLK 为 125MHz 发送时钟,每周期发送 1 字节。TX_EN=1 期间 TXD[7:0] 有效。 > - TX_ER=1 表示对应周期存在发送错误。帧间插入 IFG(Inter-Frame Gap)空闲周期(≥12 字节时间)。 图41 MAC侧包流接口时序 > MAC包流接口说明(来源:ip_common/doc/常用LRIP接口时序.md): > - mac_rx_sop 为包起始脉冲(1 周期),mac_rx_eop 为包结束脉冲(1 周期)。 > - mac_rx_en=1 期间 mac_rx_data 有效。mac_rx_err 在 eop 时有效,表示包异常。 > - TX 方向(mac_tx_*)时序与 RX 完全对称,不单独画图。

3.6.8.3 二级 gmii2mac 模块实现说明(Implementation)

特征 内容
子模块实例 2个:dual_clock_fifo、eth_presemble
跨时钟域 GMII_RXC → clk(异步FIFO)
FIFO配置 3深度×10bit (RXER+RXDV+RXD[7:0])
统计 7个32bit计数器,持续累加不溢出处理

3.6.9 二级 cdc_bus_sync / cdc_bus_sync_vec 模块

3.6.9.1 二级 CDC 模块功能描述(Feature)

1. 模块标识
属性
模块名称 cdc_bus_sync / cdc_bus_sync_vec
文件路径 ip_common/rtl/cdc_bus_sync.sv / cdc_bus_sync_vec.sv
2. 功能描述
  • cdc_bus_sync:单通道总线跨时钟域同步
  • Mode 0:Gray码计数器同步(适用于单调递增的计数值)
  • Mode 1:REQACK全握手同步(适用于任意数据变化)
  • cdc_bus_sync_vec:多通道CDC封装,将CHANNELS路cdc_bus_sync打包,共享时钟和复位
  • 在webserver_wrapper中的应用:
  • cdc_bus_sync_vec(MODE=0, CHANNELS=7):以太网统计计数器 125MHz→50MHz
  • cdc_bus_sync(MODE=1):filter_data/offset REQACK 50MHz→125MHz
  • cdc_bus_sync(MODE=0):recv_pkt_drop_cnt GRAY 125MHz→50MHz
3. 内部模块结构图
图42 cdc_bus_sync 模块内部结构
flowchart LR subgraph CDC["cdc_bus_sync"] subgraph MODE0["MODE=0: Gray同步"] GRAY_ENC["Gray编码器"] SYNC_FF["2级同步器"] GRAY_DEC["Gray解码器"] end subgraph MODE1["MODE=1: REQACK握手"] REQ_FF["请求触发器"] ACK_SYNC["应答同步器"] DATA_HOLD["数据保持寄存器"] end end SRC["src_data\nsrc_valid"] --> MODE0 SRC --> MODE1 MODE0 -->|"dst_data"| DST["dst域"] MODE1 -->|"dst_data/dst_valid"| DST DST -->|"src_ready"| MODE1
图43 cdc_bus_sync_vec 模块内部结构(CHANNELS=7)
flowchart TB subgraph VEC["cdc_bus_sync_vec (CHANNELS=7)"] CH0["cdc_bus_sync[0]\neth_rx_correct_pkt"] CH1["cdc_bus_sync[1]\neth_rx_crc_err_pkt"] CH2["cdc_bus_sync[2]\neth_tx_correct_pkt"] CH3["cdc_bus_sync[3]\neth_tx_error_pkt"] CH4["cdc_bus_sync[4]\neth_rx_afifo_full"] CH5["cdc_bus_sync[5]\neth_rx_afifo_empty"] CH6["cdc_bus_sync[6]\neth_rx_data_err"] end SRC_CLK["src_clk\n(125MHz)"] --> VEC DST_CLK["dst_clk\n(50MHz)"] --> VEC SRC_DATA["src_data\n32×7=224bit"] --> VEC VEC -->|"dst_data\n224bit"| DST_DATA["dst_data"] style VEC fill:#e1bee7

3.6.9.2 二级 CDC 模块接口说明(Interface)

1. 接口信号
表24 cdc_bus_sync 模块接口信号表
信号名 位宽(Bits) IO 说明
src_clk 1 I 源时钟
src_rst_l 1 I 源复位
src_data DATA_WIDTH I 源数据
src_valid 1 I 源数据有效
dst_clk 1 I 目的时钟
dst_rst_l 1 I 目的复位
dst_data DATA_WIDTH O 目的数据
dst_valid 1 O 目的数据有效
src_ready 1 O 源端就绪
模块控制参数
DATA_WIDTH parameter integer 数据位宽
MODE parameter integer 0=Gray, 1=REQACK
SYNC_STAGES parameter integer 同步级数(2)
表25 cdc_bus_sync_vec 模块接口信号表
信号名 位宽(Bits) IO 说明
src_clk/dst_clk 1 I 时钟
src_rst_l/dst_rst_l 1 I 复位
src_data DATA_WIDTH×CHANNELS I 源数据(按通道拼接)
src_valid CHANNELS I 源有效(按通道)
dst_data DATA_WIDTH×CHANNELS O 目的数据
dst_valid CHANNELS O 目的有效
src_ready CHANNELS O 源就绪
模块控制参数
DATA_WIDTH parameter integer 每通道数据位宽(32)
CHANNELS parameter integer 通道数
MODE parameter integer 0=Gray, 1=REQACK
2. 接口时序
图44 CDC Gray模式时序 (MODE=0) > MODE=0适用于单调递增计数器(如以太网统计),数据先在源域转Gray码,经过2级同步器后在目的域解Gray码。 图45 CDC REQACK模式时序 (MODE=1) > MODE=1适用于任意数据变化(如filter_data/offset),通过REQ/ACK握手保证数据在目的域被正确采样。

3.6.9.3 二级 CDC 模块实现说明(Implementation)

特征 内容
Gray模式延迟 2~3个dst_clk周期
REQACK模式延迟 4~5个src_clk + 2~3个dst_clk周期
生成块 generate for循环实例化CHANNELS路cdc_bus_sync
CDC策略 Gray适合单调递增计数器,REQACK适合任意数据

表目录

表编号 表名
表1 88E1111 RGMII接口信号列表
表2 CP2102 UART接口信号列表
表3 W25Q128 SPI接口信号列表
表4 xilinx_xc7a35tfgg484_webserver_top 模块接口信号表
表5 rgmii2gmii 模块接口信号表
表6 clk_rst_ctrl 模块接口信号表
表7 pll_50m 模块接口信号表
表8 webserver_wrapper 模块接口信号表
表9 tod 模块接口信号表
表10 interval_timer 模块接口信号表
表11 lcpu_riscv_wrapper 模块接口信号表
表12 lcpu_top 模块接口信号表
表13 lcpu_bfm 模块接口信号表
表14 riscv32_top 模块接口信号表
表15 lcpu_merge 模块接口信号表
表16 cpu_channel 模块接口信号表
表17 ram2pktfifo_int 模块接口信号表
表18 package_fifo_v2 模块接口信号表
表19 pktfifo2ram_int_v2 模块接口信号表
表20 reg_webserver 模块接口信号表(主要信号)
表21 reg_webserver 寄存器地址映射表
表22 lcpu_mdio 模块接口信号表
表23 gmii2mac 模块接口信号表
表24 cdc_bus_sync 模块接口信号表
表25 cdc_bus_sync_vec 模块接口信号表

图目录

图1 基于RiscV@FPGA的WebServer逻辑总体结构框图
图2 数据流处理路径
图3 FPGA内部模块层级树
图4 时钟域分布
图5 88E1111 RGMII接口连接
图6 RGMII 接收时序(RX,DDR)
图7 xilinx_xc7a35tfgg484_webserver_top 模块内部结构
图8 rgmii2gmii 模块内部结构
图9 RGMII→GMII RX转换时序
图10 GMII→RGMII TX转换时序
图11 clk_rst_ctrl 模块内部结构
图12 clk_rst_ctrl 复位释放时序
图13 pll_50m 模块内部结构
图14 pll_50m PLL锁定和时钟输出时序
图15 webserver_wrapper 模块内部结构
图16 tod 模块内部结构
图17 tod 快照时序
图18 interval_timer 模块内部结构
图19 interval_timer 定时事件时序
图20 lcpu_riscv_wrapper 模块内部结构
图21 riscv32_top 模块内部结构
图22 lcpu_merge 模块内部结构
图23 lcpu_merge 双主机仲裁时序
图24 cpu_channel 模块内部结构
图25 cpu_channel RX 数据通道(MAC→CPU)
图26 cpu_channel TX 数据通道(CPU→MAC)
图27 ram2pktfifo_int 字节流转包FIFO时序
图28 package_fifo_v2 模块内部结构
图29 包FIFO写时序
图30 包FIFO读时序
图31 pktfifo2ram_int_v2 包FIFO→字节流+IPG时序
图32 sop_eop_gen 时序
图33 LCPU 读寄存器时序(Master)
图34 LCPU 写寄存器时序(Master)
图35 lcpu_mdio 模块内部结构
图36 MDIO 读时序(Clause 22)
图37 MDIO 写时序(Clause 22)
图38 gmii2mac 模块内部结构
图39 GMII RX 接口时序
图40 GMII 发送时序(TX)
图41 MAC侧包流接口时序
图42 cdc_bus_sync 模块内部结构
图43 cdc_bus_sync_vec 模块内部结构(CHANNELS=7)
图44 CDC Gray模式时序 (MODE=0)
图45 CDC REQACK模式时序 (MODE=1)

缩略语清单

缩略语 英文全名 中文解释
AXI Advanced eXtensible Interface 高级可扩展接口
BFM Bus Functional Model 总线功能模型
BRAM Block RAM 块随机存取存储器
CDC Clock Domain Crossing 跨时钟域
CPU Central Processing Unit 中央处理器
CRC Cyclic Redundancy Check 循环冗余校验
DDR Double Data Rate 双倍数据速率
DMA Direct Memory Access 直接存储器访问
DSP Digital Signal Processor 数字信号处理器
FIFO First In First Out 先进先出缓冲器
FPGA Field-Programmable Gate Array 现场可编程门阵列
GMII Gigabit Media Independent Interface 吉比特介质无关接口
GPIO General Purpose Input/Output 通用输入输出
HTTP Hypertext Transfer Protocol 超文本传输协议
IEEE Institute of Electrical and Electronics Engineers 电气与电子工程师协会
IP Intellectual Property 知识产权(核)
IPG Inter-Packet Gap 包间隔
IRQ Interrupt Request 中断请求
ISA Instruction Set Architecture 指令集架构
JTAG Joint Test Action Group 联合测试工作组
LCPU LinkReal CPU Bus Protocol LinkReal CPU总线协议
LLD Low-Level Design 详细设计
MAC Media Access Control 媒体访问控制
MDC Management Data Clock 管理数据时钟
MDI Medium Dependent Interface 介质相关接口
MDIO Management Data Input/Output 管理数据输入输出
MII Media Independent Interface 介质无关接口
MMCM Mixed-Mode Clock Manager 混合模式时钟管理器
PHY Physical Layer 物理层
PLL Phase-Locked Loop 锁相环
RAM Random Access Memory 随机存取存储器
REQACK Request-Acknowledge 请求-应答握手
RGMII Reduced Gigabit Media Independent Interface 精简吉比特介质无关接口
RISC-V Reduced Instruction Set Computer V 第五代精简指令集计算机
RTL Register Transfer Level 寄存器传输级
RV32IC RISC-V 32-bit Integer + Compressed RISC-V 32位整数+压缩指令
SDR Single Data Rate 单倍数据速率
SOP/EOP Start of Packet / End of Packet 包起始 / 包结束
SPI Serial Peripheral Interface 串行外设接口
TCP Transmission Control Protocol 传输控制协议
TOD Time of Day 本地时间
UART Universal Asynchronous Receiver/Transmitter 通用异步收发器
WebSocket WebSocket Protocol WebSocket 协议