基于FPGA的ARM JTAG控制实现教程

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:JTAG接口作为嵌入式系统开发中的重要工具,用于芯片级在线编程、故障检测和系统级调试。本教程详细探讨了如何利用Xilinx FPGA实现ARM处理器的JTAG控制。通过构建JTAG控制器并涵盖TMS信号处理、TDI/TDO数据流处理、TCK时钟同步、ARM JTAG接口兼容性以及软件控制层等关键方面,教程提供了在FPGA上实现JTAG控制的全面指南。本项技术不仅有助于硬件调试和系统验证,还强调了FPGA在复杂系统中的灵活性和实用性。 使用FPGA实现ARM JTAG控制

1. JTAG接口基础及其在ARM中的应用

1.1 JTAG接口的历史与发展

JTAG(Joint Test Action Group)接口最初被设计为一种测试硬件的方法,现在已经成为电路板调试和程序下载的标准接口。JTAG接口的基本标准由IEEE 1149.1(也被称为JTAG标准)定义,它允许信号与芯片内部逻辑之间的边界扫描测试,这在早期主要用于集成电路的测试和故障诊断。随着时间的发展,JTAG接口逐渐扩展了其应用范围,不仅仅局限于测试领域,还被广泛应用于ARM核心的调试。

1.2 JTAG接口的工作原理

JTAG接口通过5个引脚与设备通信,分别是TDI(数据输入),TDO(数据输出),TCK(时钟信号),TMS(测试模式选择),以及一个可选的TRST(测试复位)。这些引脚共同工作,允许数据以串行的方式流入或流出设备。JTAG的核心是边界扫描寄存器,它通过一系列的TCK时钟脉冲,根据TMS信号的状态,切换不同的操作模式,如捕获、移位和更新等。这些操作使得JTAG能够对内部寄存器和信号进行控制和观测,为开发者提供了一种强大的调试和编程手段。

1.3 JTAG在ARM中的应用

ARM处理器由于其高性能和低功耗的特点,在嵌入式系统中得到了广泛的应用。JTAG接口在ARM调试中扮演着不可或缺的角色。在ARM处理器的开发过程中,开发者可以利用JTAG接口进行代码调试、系统测试、内核调试等工作。利用JTAG接口,开发者能够逐步执行代码、查看和修改寄存器的值,甚至是下载和上传内存内容。由于JTAG接口的高速和简单易用,它已经成为ARM开发调试中不可或缺的标准工具。

2. Xilinx FPGA硬件平台介绍

2.1 Xilinx FPGA产品系列概览

Xilinx作为FPGA领域的市场领导者,其产品线丰富多样,覆盖从入门级到高性能应用的广泛需求。其中,Spartan和Virtex是Xilinx最著名的两个产品系列。

2.1.1 从Spartan到Virtex:Xilinx产品线的发展

Spartan系列FPGA是Xilinx针对成本敏感型应用的解决方案,具有较低的功耗和适中的性能。自推出以来,Spartan系列不断进化,融合了最新的工艺技术和创新的架构,如Spartan-6及后续的 Spartan-7系列。

相对而言,Virtex系列是Xilinx的高端产品线,面向高性能计算、网络通信和航空宇宙市场。Virtex系列FPGA具有更高的逻辑密度、更多内存资源和更高速的I/O特性。Virtex-5是里程碑式产品,而Virtex-7及更新的Virtex UltraScale系列在3D IC和硅片级集成方面展现了Xilinx在技术上的领先地位。

在市场定位上,Spartan系列与Virtex系列各自针对不同市场领域,但二者均提供灵活的可编程平台,使得设计师可以依据项目需求选择合适的产品。

2.1.2 Xilinx FPGA的市场定位和应用场景

Xilinx FPGA广泛应用于以下几个市场:

  • 通信领域 :用于基站、光传输、网络处理器等。
  • 计算与存储 :包括数据中心加速器和固态硬盘控制器。
  • 工业控制 :机器视觉、自动化控制、汽车电子等。
  • 消费电子产品 :电视机顶盒、网络设备等。

这些应用场景均需要FPGA的高性能处理能力、可重配置性和快速原型设计特性。Xilinx FPGA在这些领域的成功应用,体现了其产品的市场适应性和技术优势。

2.2 Xilinx FPGA的开发工具链

Xilinx提供完整的开发工具链,支持从设计、仿真、实现到调试的全工程流程。

2.2.1 Vivado的设计套件介绍

Vivado是Xilinx推出的全新一代设计套件,其主要特点如下:

  • 集成化设计环境 :将设计、仿真、分析和实施整合在一个单一的界面。
  • 高速设计 :Vivado支持28nm及以下工艺节点,通过高级综合和优化技术实现快速时序收敛。
  • 资源利用率 :先进的资源分配算法,可以有效利用FPGA内的逻辑资源。
  • IP集成和生成 :提供大量预设计的IP核,支持快速生成定制IP核。

Vivado的推出标志着Xilinx在工具链上迈出了重要的一步,对提升设计师的工作效率和优化FPGA设计流程有显著效果。

2.2.2 ISE与Vivado的对比分析

与Vivado相比,ISE作为Xilinx早期的产品,也具有良好的市场基础和用户群体。ISE与Vivado的主要区别在于:

  • 设计理念 :ISE更侧重于传统设计流程,Vivado则推动了从RTL到比特流的全流程自动化。
  • 硬件支持 :ISE主要针对Spartan-3、Virtex-4等较早的FPGA产品,而Vivado则面向28nm及以下工艺。
  • 用户界面 :Vivado提供更为现代化和直观的用户界面,而ISE的界面则较为传统。
  • 性能优化 :Vivado在设计性能优化方面提供了更多自动化工具和算法。

尽管Vivado以其先进特性逐渐取代ISE成为主流,ISE仍然在一些老旧项目及特定应用中发挥作用。选择使用ISE还是Vivado,取决于项目的具体需求和设计团队的偏好。

2.3 Xilinx FPGA的性能评估

性能评估是设计流程中不可或缺的一环,它决定了FPGA最终的效率和实用性。

2.3.1 性能指标详解

在评估Xilinx FPGA的性能时,主要关注以下指标:

  • 逻辑单元利用率 :反映设计在FPGA上的实现效率。
  • 时钟频率 :决定了系统的工作速度和性能。
  • I/O带宽 :FPGA与外部交互数据的速度。
  • 功耗 :包括静态功耗和动态功耗,对热设计和能效管理至关重要。
2.3.2 性能评估实战演练

实际评估通常包括:

  1. 静态功耗分析 :使用Xilinx Power Analyzer进行功耗预算。
  2. 时序分析 :通过Xilinx Timing Analyzer对设计进行时序约束和验证。
  3. 资源利用率分析 :综合使用Xilinx Vivado报告查看逻辑单元、查找表(LUTs)、寄存器等资源的利用情况。

性能评估并非一蹴而就,需要设计者反复迭代优化设计,直至满足所有性能指标要求。

以上为《Xilinx FPGA硬件平台介绍》第二章节的详细内容。各章节在逻辑上环环相扣,内容上逐步深入,旨在为IT专业人士提供从基础知识到深度技术分析的全面信息。

3. FPGA中JTAG控制器的设计实现

3.1 JTAG控制器的硬件架构

3.1.1 JTAG控制器的组成模块

在FPGA中实现JTAG控制器,需要构建一个符合IEEE 1149.1标准的硬件架构,它由以下几个核心模块组成:

  • TAP控制器(Tap Controller) : 作为JTAG接口的核心,负责整个测试访问端口(TAP)的操作和协议处理。
  • 指令寄存器(Instruction Register) : 存储和传输JTAG指令。
  • 数据寄存器(Data Register) : 存储边界扫描单元和测试数据。
  • 测试数据输入/输出缓冲区(TDI/TDO Buffers) : 提供与外部设备数据交互的接口。

3.1.2 硬件架构的优化策略

为了提高JTAG控制器的效率和灵活性,设计时应考虑以下优化策略:

  • 模块化设计 : 通过模块化设计,每个模块负责特定功能,便于维护和扩展。
  • 流水线技术 : 应用流水线技术来提高数据处理速度。
  • 可配置性 : 设计允许用户根据不同需求进行配置,以实现资源优化。

在设计时,需要考虑硬件资源的消耗以及性能需求,找到最佳平衡点。

3.2 JTAG控制器的编程模型

3.2.1 寄存器映射和访问机制

JTAG控制器中的寄存器映射是连接软件控制层和硬件层的关键。下面是一个简化的寄存器映射示例:

module jtag_controller(
    input wire TCK,        // Test Clock
    input wire TDI,        // Test Data Input
    output wire TDO,       // Test Data Output
    // 其他控制信号略
);

reg [31:0] instruction_reg; // 指令寄存器
reg [31:0] data_reg;        // 数据寄存器

// 寄存器访问逻辑
always @(posedge TCK) begin
    // 根据TAP状态机进行寄存器更新
end

assign TDO = /* 数据输出逻辑 */;
endmodule

3.2.2 编程模型的灵活性与可扩展性

为了保证JTAG控制器的灵活性与可扩展性,编程模型应支持以下特性:

  • 动态指令加载 : 允许在运行时加载新指令。
  • 动态数据寄存器链调整 : 根据不同的测试需求动态改变数据寄存器链的长度和配置。

3.3 JTAG控制器的仿真与测试

3.3.1 使用ModelSim进行仿真测试

ModelSim是业界广泛使用的FPGA仿真工具。JTAG控制器的仿真测试分为两个阶段:

  • 单元测试 : 验证单个模块的功能是否正常,例如仅测试指令寄存器模块。
  • 集成测试 : 将所有模块集成在一起,验证整体功能是否符合预期。

3.3.2 实际硬件测试环境搭建

硬件测试环境的搭建包括:

  • FPGA开发板 : 选择合适的FPGA开发板作为测试载体。
  • 外部接口 : 设计与外部设备通信的接口,如USB转JTAG适配器。
  • 测试脚本 : 编写测试脚本进行自动化的测试流程。

这个阶段的测试结果将为后续的优化提供重要依据。

4. TMS信号处理状态机设计

4.1 状态机的基本理论

4.1.1 状态机的定义和分类

状态机是一种用于设计和建模决策行为的计算模型,其行为可以描述为在不同状态之间的转换。它基于一组有限的状态和在这些状态之间触发转换的输入事件。状态机广泛应用于各种电子系统和软件中,用于控制逻辑和数据处理流程。

状态机可以分为两大类:有限状态机(FSM)和无穷状态机。有限状态机又可以细分为确定性有限状态机(DFSM)和非确定性有限状态机(NDFSM)。确定性有限状态机在给定的当前状态和输入下,只有一个可能的下一个状态。而非确定性有限状态机可能存在多种可能的下一个状态。

4.1.2 状态机设计的原则和方法

设计状态机时,应遵循以下原则:

  • 最小化状态数量 :状态机应尽可能简单,以减少复杂性。
  • 明确的状态转换条件 :确保每个状态转换都有清晰定义的触发条件。
  • 完备性 :确保对于任何输入序列,状态机都能给出相应的输出或行为。
  • 无死锁 :设计时应避免产生无法离开的状态。

状态机的设计方法通常涉及以下步骤:

  • 需求分析 :明确状态机需要实现的功能和行为。
  • 状态定义 :确定状态机的各个状态,并定义每个状态的意义。
  • 事件和转换 :列出触发状态转换的事件,并确定每个事件在不同状态下的行为。
  • 伪代码或逻辑表达式 :编写控制逻辑的伪代码或逻辑表达式。
  • 验证和测试 :验证状态机的逻辑,并进行测试以确保符合设计要求。

4.2 TMS信号处理状态机的设计细节

4.2.1 状态转换图的构建

在设计TMS信号处理的状态机时,需要构建一个状态转换图来表示状态机的全部行为。该图是通过一系列节点(状态)和有向边(转换)构成的。每个节点代表一个状态,而边则代表状态之间的转换。

考虑到JTAG接口的工作模式和操作序列,状态转换图应包括以下主要状态:

  • TEST-LOGIC-RESET :这是设备上电或测试逻辑重置后的初始状态。
  • RUN-TEST-IDLE :从TEST-LOGIC-RESET状态进入后,设备将进入此状态,并在此状态下等待执行特定的测试操作。
  • SELECT-DR-SCAN :此状态用于选择数据寄存器(DR)扫描。
  • CAPTURE-DR :在SELECT-DR-SCAN之后,CAPTURE-DR状态将捕获当前DR链的数据。
  • SHIFT-DR :在CAPTURE-DR之后,SHIFT-DR状态用于通过DR链移位数据。
  • EXIT1-DR :从SHIFT-DR状态退出,准备进入UPDATE-DR或IDLE状态。
  • PAUSE-DR :在SHIFT-DR中,如果需要暂停数据移位,将进入此状态。
  • UPDATE-DR :最后,数据从DR链移位到寄存器,然后更新状态,完成一个数据寄存器扫描周期。

4.2.2 状态转换逻辑的实现

状态转换逻辑通常用硬件描述语言(HDL)编写,例如VHDL或Verilog。以下是Verilog代码示例,用于实现TMS信号处理状态机的一部分:

// 定义状态机的状态枚举
typedef enum reg [3:0] {
    TEST_LOGIC_RESET,
    RUN_IDLE,
    SELECT_DR_SCAN,
    CAPTURE_DR,
    SHIFT_DR,
    EXIT1_DR,
    PAUSE_DR,
    UPDATE_DR
} state_t;

// 状态机当前状态和下一状态寄存器
reg [3:0] current_state, next_state;

// 状态转换逻辑
always @(posedge TCK or negedge TRST) begin
    if (!TRST) begin
        current_state <= TEST_LOGIC_RESET; // 复位到初始状态
    end else begin
        current_state <= next_state;
    end
end

// 下一状态逻辑和状态转换条件
always @(*) begin
    case (current_state)
        TEST_LOGIC_RESET: begin
            next_state = TRST ? RUN_IDLE : TEST_LOGIC_RESET;
        end
        RUN_IDLE: begin
            next_state = TMS ? SELECT_DR_SCAN : RUN_IDLE;
        end
        SELECT_DR_SCAN: begin
            next_state = TMS ? SELECT_IR_SCAN : CAPTURE_DR;
        end
        // 其他状态转换逻辑...
    endcase
end

// TMS信号处理和输出逻辑
assign TDO = (current_state == SHIFT_DR) ? shifting_data : 1'bz;

代码分析:

  • current_state next_state 寄存器用于存储当前和下一个状态。
  • 状态转换逻辑在每个 TCK 上升沿或 TRST 下降沿触发。
  • TMS 信号决定了从当前状态转换到下一个状态的逻辑。
  • SHIFT_DR 状态, TDO 信号用于输出数据到测试逻辑或外部设备。

4.3 状态机的验证与优化

4.3.1 功能仿真验证流程

功能验证是确保状态机按照预定逻辑正确工作的关键步骤。验证流程通常包括以下步骤:

  • 单元测试 :对状态机的各个状态和转换条件进行独立测试。
  • 集成测试 :验证状态机与外部接口或其它系统组件的交互。
  • 系统测试 :将状态机集成到整个系统中,确保它能与其他系统组件协同工作。
  • 随机测试 :通过随机生成TMS序列,检查状态机对不规则输入的响应。
  • 边界值测试 :测试状态机在边界条件下的行为。

4.3.2 性能优化的策略

性能优化可能涉及减少状态转换的延迟、提高资源利用率或降低功耗等。以下是状态机性能优化的一些策略:

  • 状态合并 :合并可以合并的状态,减少状态总数。
  • 逻辑简化 :简化状态转换条件和输出逻辑,例如通过公共项提取或逻辑重组。
  • 流水线设计 :在状态机中引入流水线结构,减少关键路径的延迟。
  • 资源共享 :对于重用的逻辑或组件,采用资源共享策略以减少资源消耗。
  • 并行处理 :在可能的情况下,采用并行处理逻辑以提高吞吐量。

通过仿真和综合工具,可以分析和评估状态机在不同条件下的性能表现,并据此进行必要的优化。

5. TDI和TDO数据流处理逻辑

5.1 数据流处理的基础知识

5.1.1 数据流的概念和特点

数据流是信息在系统中传输的方式,其特点和效率直接影响到整个系统的性能。在FPGA中,数据流处理的效率通常决定了系统的响应速度和数据吞吐量。数据流在FPGA中的处理通常依靠多个并行处理单元,以及高速的输入/输出接口,以达到预期的性能目标。

TDI(Test Data Input)和TDO(Test Data Output)是JTAG接口中用于传输测试数据的信号线。TDI向FPGA内部的JTAG控制器提供数据,而TDO则用于输出测试结果或设备状态。数据流处理逻辑在这里起到了至关重要的作用,保证数据能够在FPGA内部或与外部设备之间正确、快速地传递。

5.1.2 数据流在FPGA中的处理机制

在FPGA中,数据流处理涉及到多个组件,包括但不限于:数据缓冲区、通道选择逻辑、数据路径选择、以及可能的缓存和延迟调整。这些组件的协同工作需要精心设计以确保数据流动的平滑和高效。

数据流处理的机制一般依赖于时钟信号,通过时钟同步来管理数据的捕获、传输和处理。在TDI和TDO的情况下,数据流通常在JTAG控制器的控制下,按照预定的时序和协议传输。此外,为了处理可能出现的错误或异常,还需要设计数据校验和错误处理机制。

5.2 TDI和TDO的逻辑设计

5.2.1 数据捕获和传输的策略

TDI和TDO的逻辑设计必须确保数据能够在FPGA内部和外部设备间正确传输。这涉及到一系列复杂的策略和优化,例如数据缓冲、流水线处理、以及并行数据路径的设计等。

数据捕获通常使用状态机来实现,其中状态机根据JTAG协议控制TDI输入的数据何时开始和结束。这些状态机的转换能够根据TMS信号的状态而触发,保证数据流的同步和数据边界的明确。

5.2.2 数据校验和错误处理

为了保证数据流的完整性和正确性,需要实现数据校验机制,比如使用CRC(循环冗余校验)或校验和算法。通过这些算法,可以在数据传输过程中实时地检测错误,并采取相应的错误处理措施,如重新传输数据或触发异常处理逻辑。

错误处理的逻辑需要设计成高度可靠和可预测,以防止潜在的数据损坏导致的系统故障。在实现时,要确保所有的错误处理代码都能够被充分测试,并且与系统的其他部分良好集成。

5.3 数据流处理的性能优化

5.3.1 优化方案的评估与选择

优化数据流处理逻辑是一个持续的过程,需要针对具体的应用场景评估多种优化方案。优化方案的评估可以从多个角度进行,例如优化成本、复杂度、以及预期的性能提升。

在选择优化方案时,需要仔细考量硬件资源的使用、时钟频率、以及数据处理的并行度。这些因素直接影响到数据流处理的效率,需要在性能与资源消耗之间做出平衡。

5.3.2 实际性能提升案例分析

性能提升案例分析是验证优化策略有效性的关键步骤。在实际应用中,通过前后对比,能够直观地展示出优化措施带来的效果。

例如,通过引入流水线处理,可以显著提高数据的吞吐量。流水线的每一级可以独立于其他级进行操作,从而实现并行处理。然而,流水线的引入可能会增加硬件资源的消耗,并引入额外的时延。因此,每个优化措施都需要根据具体的应用需求来进行权衡和选择。

代码块示例与解释

-- VHDL example for TDI/TDO data flow control
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity TDI_TDO_Controller is
    Port (
        TDI : in STD_LOGIC;
        TCK : in STD_LOGIC;
        TMS : in STD_LOGIC;
        TDO : out STD_LOGIC;
        -- Additional control signals
        clk : in STD_LOGIC;
        reset : in STD_LOGIC
    );
end TDI_TDO_Controller;

architecture Behavioral of TDI_TDO_Controller is
    -- Internal signals and registers for TDI/TDO handling
    -- (e.g., a shift register for serial data handling, state machine registers, etc.)
begin
    -- Data flow process handling TDI/TDO operations
    process(clk, reset)
    begin
        if reset = '1' then
            -- Reset logic for internal registers and control signals
        elsif rising_edge(clk) then
            -- Capture data from TDI
            -- Shift data and apply any processing required
            -- Output data to TDO
        end if;
    end process;
end Behavioral;

在上面的VHDL代码中,我们定义了 TDI_TDO_Controller 实体,它处理TDI和TDO信号的数据流动。状态机和数据处理逻辑通常被包含在该实体的行为架构中。这个例子展示了如何控制TDI数据流入和TDO数据流出,以及如何使用时钟信号来同步数据流动。注意,每个FPGA设计可能会根据其特定需求有所不同。因此,代码块中的内部信号和处理逻辑部分需要根据实际应用场景来具体实现。

6. TCK时钟信号同步机制

TCK(Test Clock)信号是JTAG接口中的一个重要信号,它为测试逻辑的时序提供参考。在设计和实现基于FPGA的JTAG控制器时,确保TCK信号的正确同步是至关重要的。本章节将深入探讨TCK时钟信号同步机制的设计、测试和优化。

6.1 同步机制的基本原理

6.1.1 时钟域的概念

在数字电路设计中,时钟域是指由同一个时钟信号控制的一组触发器集合。由于各种信号可能有不同的来源,它们可能属于不同的时钟域。当需要在这些不同域之间进行通信时,就必须考虑同步问题,以避免可能的时序问题,如时钟偏差、亚稳态等问题。

6.1.2 同步机制的重要性

同步机制是处理跨时钟域信号的关键。如果信号在没有适当同步机制的情况下在时钟域之间传输,那么可能会导致数据的不稳定和不可预测性。特别是在高速数据传输或者在FPGA这样的可编程硬件中,正确的同步机制能够保证系统的稳定性和可靠性。

6.2 TCK时钟信号的设计实现

6.2.1 设计中的常见问题

在设计包含TCK信号的FPGA系统时,工程师可能会遇到一些常见的问题。这些问题包括但不限于:

  • 时钟偏差:由于物理路径长度不一,TCK信号可能在到达不同的寄存器时产生不同的延迟,导致时序问题。
  • 亚稳态:当信号从一个时钟域同步到另一个时钟域时,可能会进入一个不稳定的状态,需要一定的时间来稳定,这就是亚稳态问题。

6.2.2 设计解决方案的提出与实施

为了解决上述问题,设计人员需要采取一系列措施:

  • 使用时钟缓冲器和时钟分配网络来平衡不同路径的延迟,从而最小化时钟偏差。
  • 在两个时钟域之间使用双触发器或更高级的同步器来减少亚稳态的风险。
  • 对于高频信号,可能需要设计专用的同步电路来处理时钟域之间的信号传输。

6.3 同步机制的测试与验证

6.3.1 测试用例的设计

测试用例的设计对于验证同步机制的有效性至关重要。测试用例应该包括:

  • 不同频率的TCK信号测试。
  • 长时间连续运行,以检测时钟偏差累积效应。
  • 多个不同信号同时通过同步机制,来模拟真实工作环境。

6.3.2 验证结果的分析与总结

通过执行测试用例后,应收集并分析结果。查看信号是否正确同步,时钟偏差是否在可接受的范围内,以及是否出现亚稳态。如果测试发现有同步问题,则需要回到设计阶段进行调整。通过迭代的方式,可以逐步优化同步机制,直到达到设计要求。

在设计与实现JTAG控制器时,TCK时钟信号的同步机制是确保控制器稳定性和可靠性的重要组成部分。正确的设计原则和测试验证手段可以帮助设计人员构建出满足高性能要求的JTAG控制器。而对时钟同步问题的深入理解,对于优化整体设计以及提高系统性能是不可或缺的。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:JTAG接口作为嵌入式系统开发中的重要工具,用于芯片级在线编程、故障检测和系统级调试。本教程详细探讨了如何利用Xilinx FPGA实现ARM处理器的JTAG控制。通过构建JTAG控制器并涵盖TMS信号处理、TDI/TDO数据流处理、TCK时钟同步、ARM JTAG接口兼容性以及软件控制层等关键方面,教程提供了在FPGA上实现JTAG控制的全面指南。本项技术不仅有助于硬件调试和系统验证,还强调了FPGA在复杂系统中的灵活性和实用性。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值