Quartus II综合电子设计软件全面指南

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

简介:Quartus II是Altera公司开发的EDA工具,用于FPGA和CPLD的设计、仿真、综合和编程。教程涵盖界面介绍、项目管理、硬件描述语言、逻辑综合、仿真、适配布局布线、编程下载及高级特性。中文和英文教程资源使学习者能够轻松掌握关键技能,迈向数字电路设计的实践。
Quartus II软件教程,中文,英文俱全

1. Quartus II软件界面介绍

在本章中,我们将开启对Quartus II软件的深入了解之门,首先对软件界面进行介绍。Quartus II,作为一款流行的FPGA和CPLD设计软件,以其强大的功能和用户友好的界面著称。软件界面不仅直观易用,而且集成了设计流程中的所有关键环节,从而提供了从设计输入到芯片编程的无缝体验。

1.1 主界面概览

Quartus II主界面的布局设计是为了确保用户可以快速访问常用功能。界面大致可以分为菜单栏、工具栏、项目导航器、设计视图区和信息显示窗口等几个主要部分。用户在创建新项目或者打开现有项目时,这些部分将协同工作,展示设计的进度和细节。

1.2 设计编辑器和工具

Quartus II提供了多种设计编辑器和工具,包括图形化的HDL编辑器、原理图编辑器、波形编辑器等。这些工具可以用来创建、编辑和调试FPGA和CPLD设计项目。例如,HDL编辑器支持VHDL和Verilog语言,并提供语法高亮、代码折叠等辅助编辑功能,以提高设计效率。

通过本章的学习,您将掌握Quartus II基本界面布局、工具使用和配置方法,为后续深入学习和设计工作打下坚实的基础。

2. FPGA和CPLD项目创建与管理

2.1 项目创建流程

2.1.1 新建项目向导的使用

新建项目向导是设计流程的第一步,它帮助我们初始化项目环境,并为后续的设计活动建立基础框架。以下是使用新建项目向导的基本步骤:

  1. 打开Quartus II软件后,点击“File”菜单,选择“New Project Wizard…”开始创建新项目。
  2. 在弹出的向导界面中,首先需要为项目命名,并选择项目的存储位置,输入一个合适的项目名称,然后指定项目保存的文件夹路径。
  3. 点击“Next”按钮进入下一个向导界面,在这里需要指定目标设备。Quartus II通常会自动检测到已经连接的设备,用户也可以手动选择一个特定的FPGA或CPLD设备。
  4. 下一个步骤是添加设计文件。Quartus II提供了多种设计文件类型,比如VHDL、Verilog、Block Diagram/Schematic等。初始时,可以只选择“Create a design file now”选项,以便之后添加或创建设计文件。
  5. 最后一步是总结向导所完成的设置。在确认无误后,点击“Finish”按钮完成项目的创建。

2.1.2 项目设置与管理

项目创建后,我们需要对项目进行细致的设置与管理,以确保设计流程的顺畅进行。项目设置与管理包含以下几个方面:

  • 设备选择 :基于项目需求选择合适的FPGA或CPLD芯片型号。设备选择不仅关系到引脚布局,还会对资源利用和性能产生影响。
  • 项目依赖项 :检查并管理项目所需的依赖文件,确保所有外部的库和头文件都正确包含在项目之中。
  • 编译器设置 :根据设计需要调整编译器的参数设置,比如逻辑综合和布局布线阶段的选项。
  • 版本控制 :项目管理还包括使用版本控制系统来跟踪设计文件的变更,常用工具有Git等。

2.2 项目文件结构与组织

2.2.1 文件类型和作用

FPGA和CPLD项目通常涉及多种类型的文件,每种文件都承担着不同的职责:

  • Quartus项目文件(.qpf) :包含了项目级别的配置信息,如目标FPGA/CPLD型号、编译器设置等。
  • Quartus设置文件(.qsf) :存储了项目中的各种用户设置,例如源文件列表、引脚分配、编译器选项等。
  • 源代码文件 :设计逻辑的实现文件,可以是VHDL、Verilog、或AHDL等硬件描述语言文件。
  • 仿真文件 :用于验证设计功能的仿真测试平台,通常为VHDL或Verilog测试台文件。
  • 约束文件(.sdc) :定义了项目的时序要求,包括时钟约束、输入输出延迟等关键的时序参数。

2.2.2 文件的添加和删除

在项目开发过程中,可能会根据需要添加或删除一些文件。添加文件通常包括:

  • 导入已有的设计文件。
  • 创建新的设计文件。

删除文件的过程则相对简单:

  • 在Quartus II的项目导航器中选中不需要的文件。
  • 右键点击选择“Remove File from Project”进行删除。

2.2.3 文件的层次结构管理

FPGA和CPLD项目中的文件层次结构管理是保证项目清晰、有序的重要手段。管理文件层次结构可以遵循以下原则:

  • 逻辑分组 :根据设计模块的功能,将相关的源文件进行分组。
  • 目录结构 :使用合适的目录结构来存放不同的文件类型或设计模块,比如将所有的测试台文件放在一个名为”testbench”的目录下。
  • 版本控制 :使用版本控制工具来管理不同版本的设计文件,确保项目的历史状态可以被追溯和回退。

通过良好的文件结构管理,可以极大提高项目后期维护和团队协作的效率。

2.3 项目编译与调试

2.3.1 编译过程和注意事项

项目编译是一个自动化的过程,用于检查设计的语法正确性和将设计映射到目标硬件上。编译过程涉及多个阶段:

  1. 分析阶段 :分析设计文件,如VHDL或Verilog源文件,确保它们符合硬件描述语言的语法规则。
  2. 综合阶段 :将高级硬件描述语言转换成目标FPGA或CPLD的逻辑元件实现,如查找表(LUTs)、触发器等。
  3. 适配阶段 :将综合后的逻辑元件映射到特定的物理元件上,并进行布局布线。
  4. 生成编程文件 :最终阶段生成可以下载到FPGA或CPLD中的编程文件。

在编译过程中需要注意的是:

  • 错误和警告的处理 :在编译过程中,需要详细查看所有的错误和警告信息,对每个信息进行处理,确保设计能够无误地被编译。
  • 资源利用率和性能评估 :通过编译报告评估设计的资源利用率和性能指标,这些信息对于后续的设计优化至关重要。

2.3.2 调试过程和技巧

调试是确保设计符合预期的重要步骤。以下是一些调试过程和技巧:

  • 仿真 :在实际硬件上测试之前,使用仿真工具如ModelSim对设计进行仿真测试,检查逻辑功能和时序问题。
  • 波形分析 :在仿真过程中,波形分析可以帮助开发者理解信号的变化过程,快速定位问题。
  • 硬件调试 :通过使用Quartus II内置的SignalTap逻辑分析仪等工具,在硬件上动态捕获信号状态,对实际运行的设备进行调试。

调试过程中,可能遇到的问题及解决方法包括:

  • 仿真与实际硬件行为不一致 :这通常是因为仿真时未完全模拟硬件环境导致的,需要检查仿真设置是否与实际硬件环境一致。
  • 时序问题 :若发现时序问题,需要重新检查时序约束,并在适配阶段进行调整。

通过以上步骤,项目可以被编译和调试,确保最终的设计能够达到预期的目标。

3. 硬件描述语言VHDL和Verilog基础

硬件描述语言(HDL)是用于设计电子系统的计算机语言,它能够描述硬件的结构和行为,进而通过相应的EDA工具转化为实际的硬件。VHDL和Verilog是两种主流的硬件描述语言,广泛应用于FPGA和ASIC的设计中。本章节深入探讨这两种语言的基础知识、语法结构和应用场景。

3.1 VHDL基础

3.1.1 VHDL语言结构概述

VHDL(VHSIC Hardware Description Language)是用于复杂电子系统的建模、仿真和综合的硬件描述语言,其特点是抽象层次高,易于理解。VHDL语言的描述包括实体(entity)、架构(architecture)、配置(configuration)和包(package)等多个部分。

  • 实体(entity)部分定义了模块的接口,包括输入输出端口,以及与外部模块交互的信号。
  • 架构(architecture)部分描述了实体内部的逻辑功能,可以使用结构化(structural)或行为化(behavioral)的描述方式。
  • 配置(configuration)用于指定特定实体架构的实例化。
  • 包(package)则包含了可以在多个设计单元中复用的声明。

以下是一个简单的VHDL实体和架构的例子:

entity and_gate is
    port(
        a : in bit;
        b : in bit;
        y : out bit
    );
end and_gate;

architecture dataflow of and_gate is
begin
    y <= a and b;
end dataflow;

在这个例子中, and_gate 是实体的名字,它定义了两个输入端口 a b ,以及一个输出端口 y 。在架构 dataflow 中,描述了门级电路的行为,即输出 y 是输入 a b 的逻辑与结果。

3.1.2 实体和架构的基本概念

实体(entity)可以看作是模块的接口定义,它定义了模块的对外接口,即端口。在VHDL中,端口可以是输入(input)、输出(output)或者双向(input/output)。端口声明的语法如下:

entity entity_name is
    port(
        port_name_1 : mode type;
        port_name_2 : mode type;
        ...
    );
end entity_name;

架构(architecture)是实体的具体实现,它通过一系列的语句和描述来实现实体中声明的逻辑功能。架构的开始和结束由 architecture body_name of entity_name is...end architecture; 定义,其中 body_name 是架构的名字, entity_name 是对应的实体名。

在架构中可以使用各种描述方式,包括数据流(dataflow)、行为(behavioral)和结构(structural)描述。例如,上述的 and_gate 例子采用了数据流方式描述,其中 <= 符号是赋值操作符,表示当赋值语句右边的逻辑表达式成立时,左边的信号会被赋值。

3.2 Verilog基础

3.2.1 Verilog语法要点

Verilog是一种被广泛使用的硬件描述语言,用于模拟电子系统,特别是数字电路。Verilog具有较强的模拟性和仿真性,语法简单直观,易于上手。

  • 模块(module)是Verilog设计的基本单位,它定义了接口和功能。
  • 输入输出声明(input/output)用于定义模块的端口类型。
  • 实例化(instantiation)是将模块应用到系统中的过程。

这里给出一个简单的Verilog与门例子:

module and_gate(input a, input b, output y);
    assign y = a & b;
endmodule

在这个例子中, and_gate 是模块的名字,它定义了一个与门的行为。 input output 关键字用于声明模块的端口,而 assign 语句用于描述门级行为, & 是逻辑与操作符。

3.2.2 模块和端口的使用

在Verilog中,模块是构建数字电路的基本单元。模块的端口可以是输入、输出或双向端口。端口列表在模块的开始处声明,并在模块体内使用。

module full_adder(
    input a,
    input b,
    input cin,
    output sum,
    output cout
);
    assign sum = a ^ b ^ cin;
    assign cout = (a & b) | (b & cin) | (a & cin);
endmodule

在上述 full_adder 模块的例子中,定义了一个全加器的逻辑功能,其中包含三个输入端口( a , b , cin )和两个输出端口( sum , cout )。模块内使用 assign 语句来定义输出与输入之间的逻辑关系。

模块的实例化类似于编程中的函数调用,可以将一个模块与其它模块连接起来。实例化时需要指定端口的连接顺序或使用命名连接方式,确保端口之间的正确对接。

这两种硬件描述语言提供了构建和描述数字逻辑电路的强大工具。根据设计的复杂性和团队的习惯,设计师可以选择适合的设计语言。接下来,我们将深入探讨如何综合这些硬件描述语言,并优化生成的逻辑设计。

4. 逻辑综合过程与优化策略

在数字电路设计中,逻辑综合是一个将高级设计描述(如VHDL或Verilog代码)转换为门级网表的过程。这一过程对于FPGA和ASIC设计至关重要,因为它直接影响到最终电路的性能、功耗和面积。本章将详细探讨逻辑综合的基本概念和优化策略。

4.1 逻辑综合的基本概念

4.1.1 综合流程详解

逻辑综合过程通常可以划分为几个主要阶段:解析、逻辑优化、映射、布局和布线。在解析阶段,综合工具读取硬件描述语言(HDL)源文件,并创建一个内部的逻辑表示。逻辑优化阶段对逻辑表达式进行优化,以减少所需的逻辑门数量并改善性能。映射阶段将优化后的逻辑表达式转换为特定FPGA或ASIC工艺库中的逻辑元素。布局阶段决定逻辑元素在物理芯片上的位置,而布线阶段则确定这些元素之间的连接路径。

4.1.2 约束条件的设定

约束条件是指导逻辑综合过程的重要参数,它定义了设计的时序要求、引脚分配、功耗目标等。时序约束确保了电路满足指定的时钟频率和时钟域交叉要求。引脚约束指导了I/O元件在物理设备上的位置。而功耗约束则要求综合工具在满足其他所有条件的同时,尽可能降低功耗。正确设定和应用这些约束条件对于综合出一个成功的设计至关重要。

4.2 综合优化技巧

4.2.1 提高性能的优化方法

为了提高电路性能,综合工具通常会采用一系列的优化技术。比如,逻辑复制可以减少关键路径上的延迟,因为数据可以在多个路径上并行处理。另一种技术是逻辑重定时,它通过改变寄存器的位置来优化时序。使用查找表(LUT)合并可以减少资源的使用,但要小心平衡资源利用率和电路性能。

graph TD;
    A[开始综合] --> B[解析HDL代码]
    B --> C[逻辑优化]
    C --> D[映射到工艺库]
    D --> E[布局]
    E --> F[布线]
    F --> G[完成综合]

4.2.2 减小面积的优化策略

在FPGA中,资源的使用通常与成本直接相关,因此优化设计以减小面积可以带来显著的经济效益。通过优化冗余逻辑消除不必要的逻辑门,可以减少面积。技术如寄存器合并减少了所需的寄存器数量。逻辑打包技术可以将多个逻辑功能整合到单一的查找表中。在进行面积优化时,需要注意不要过分压缩逻辑以致影响电路的性能和时序。

graph LR;
    A[设计输入] --> B[综合优化]
    B --> C[面积优化]
    C --> D[面积评估]
    D --> |不满足| B
    D --> |满足| E[生成网表]

优化策略的选择取决于设计的目标和约束条件。一个设计可能同时需要高性能和低面积,但这两者往往是相互矛盾的。因此,在进行优化时,设计者必须在不同的需求之间做出权衡。在本章节中,我们将通过具体的案例分析这些优化技术的实际应用,并展示如何在保持性能的同时减小设计的面积。

5. ModelSim仿真器使用与波形分析

5.1 ModelSim仿真环境配置

5.1.1 ModelSim安装与设置

ModelSim 是一款广泛使用的硬件仿真器,它支持 VHDL 和 Verilog 语言,是 FPGA 开发中不可或缺的仿真工具之一。在开始使用 ModelSim 进行项目仿真之前,需要先进行安装和基本的环境配置。

安装过程通常包括下载安装包、运行安装向导以及配置安装路径和相关选项。在安装时,推荐选择完整安装(Full Installation)以确保所有功能都可用,特别是对于初学者来说,完整的安装包可以避免后续因为缺少某些组件而导致的问题。

环境设置主要是配置 ModelSim 的工作目录,以及设置项目的库路径(Library Path)。配置工作目录是为了确保所有的仿真文件都能被正确地组织和管理。在 ModelSim 中,库是一些用于存储仿真对象如设计单元、测试平台等的结构。设置库路径的目的是为了让 ModelSim 在编译仿真文件时能够找到正确的文件位置。

安装和配置完成后,应通过一个简单的测试项目来验证安装是否成功。例如,可以创建一个简单的 VHDL 或 Verilog 测试模块,编写相应的测试平台(Testbench),然后进行编译和仿真。观察仿真结果,如果能够正常显示预期波形,则说明 ModelSim 已经成功安装并配置完毕。

5.1.2 仿真项目的创建和管理

在 ModelSim 中创建仿真项目,可以遵循以下步骤:

  1. 打开 ModelSim,选择 “File” -> “New” -> “Project…”。
  2. 在弹出的 “New Project Wizard” 对话框中输入项目名称,并选择项目存储位置。
  3. 在 “Project Type” 选项中选择 “Empty Project”。
  4. 点击 “Next”,然后点击 “Finish” 创建项目。

创建项目后,就可以添加源文件和库了。添加源文件的步骤如下:

  1. 右键点击项目名,选择 “Add to Project…”。
  2. 在弹出的对话框中,选择相应的 VHDL 或 Verilog 源文件,并加入项目。

库的管理也很重要,特别是在复杂的项目中,合理的库管理可以极大提高工作效率:

  1. 在项目树(Project Navigator)中,右键点击 “Libraries”,选择 “New Library…”。
  2. 输入库名并选择库路径,然后点击 “OK” 完成创建。
  3. 将源文件添加到对应的库中,这样 ModelSim 在仿真时能够正确地定位和编译这些文件。

项目创建和管理完成后,就可以进行仿真操作了。在仿真之前,需要进行编译。ModelSim 提供了编译命令,可以手动执行,也可以通过 GUI 界面的按钮来完成编译过程。

代码块展示与分析

以下是一个简单的 VHDL 测试平台(Testbench)示例代码块,用于演示如何在 ModelSim 中进行仿真。

library ieee;
use ieee.std_logic_1164.all;

entity testbench is
-- Testbench entity has no ports
end testbench;

architecture behavior of testbench is
    -- Component Declaration for the Unit Under Test (UUT)
    component my_dut
        port(
            input_signal : in  std_logic;
            output_signal: out std_logic
        );
    end component;
    -- Signals for connecting the DUT
    signal input_signal:  std_logic := '0';
    signal output_signal: std_logic;

    -- Instantiate the Unit Under Test (UUT)
    uut: my_dut port map (
        input_signal  => input_signal,
        output_signal => output_signal
    );
    -- Start simulation process
    begin
        -- Stimulus process
        stim_proc: process
        begin
            -- hold reset state for 100 ns.
            wait for 100 ns;
            input_signal <= '1';
            wait for 100 ns;
            input_signal <= '0';
            wait for 100 ns;
            -- Wait for simulation to end
            wait;
        end process;
    end;

在上述代码中,我们定义了一个无端口的测试平台,它包含了一个待测试的单元(DUT)的实例。我们创建了一个信号列表来连接 DUT 的端口,并定义了一个仿真过程来提供测试信号。这样的测试平台可以用来验证 VHDL 设计的正确性。

5.2 波形分析与调试

5.2.1 波形查看窗口使用

ModelSim 提供了一个直观的波形查看窗口,它允许用户以图形化的方式观察和分析仿真过程中信号的变化。要打开波形查看窗口,首先需要进行编译并运行仿真,得到仿真结果后,按照以下步骤操作:

  1. 在仿真运行结束后,右键点击想要观察的信号名称。
  2. 选择 “Add to Wave”。
  3. 波形查看窗口将自动打开,显示你添加的信号。

波形查看窗口中,水平轴表示时间,信号的变化会以不同的颜色线段显示在窗口中。用户可以缩放时间轴、滚动查看不同的时间区间,以及调整波形的显示高度。

用户还可以对波形进行分组,将相关的信号放置在同一个组中,以便于管理和观察。此外,ModelSim 提供了波形的过滤和搜索功能,用户可以通过输入信号名的部分或全部字符快速定位信号。

5.2.2 信号追踪与仿真调试技巧

在波形查看窗口中,ModelSim 提供了强大的信号追踪功能,可以用于快速定位和分析问题。在仿真过程中,如果发现信号值不符合预期,可以使用以下技巧进行调试:

  1. 暂停仿真 :在仿真运行时,可以暂停仿真,这样就可以手动检查波形的变化,而不必等到仿真结束。
  2. 单步执行 :ModelSim 允许用户单步执行仿真,观察信号变化的每一个细节。这对于复杂的同步问题特别有帮助。

  3. 信号标注 :通过右键点击波形信号,并选择 “Add to ‘Wave’->’Marks’“,可以在特定的信号变化位置添加标注,这样在分析波形时可以快速定位到关键点。

  4. 查看信号值 :在波形窗口中,选中某个特定时间点,ModelSim 会显示该时间点所有信号的值。这对于问题定位非常有用。

  5. 使用断点 :在仿真过程中,可以在波形窗口中设置断点,当仿真达到这些断点时自动暂停。这样可以观察在特定操作之后的信号变化。

  6. 比较波形 :ModelSim 支持比较不同波形窗口的数据,这对于验证不同仿真运行结果的一致性特别有帮助。

通过上述技巧,结合波形查看窗口的直观显示,开发者可以更有效地识别和解决硬件设计中的问题。正确地使用 ModelSim 进行波形分析与调试,不仅可以节省时间,还可以提高设计的可靠性。

表格展示

为了更好地组织和展示波形分析的技巧,可以使用以下表格:

技巧 说明
暂停仿真 在仿真运行过程中暂停,便于检查和分析信号值的变化。
单步执行 逐个仿真周期执行仿真,观察信号的逐个变化细节。
信号标注 为关键信号变化点添加标注,便于快速定位。
查看信号值 在波形窗口中查看选中时间点的所有信号值,有助于问题定位。
使用断点 设置断点暂停仿真,检查特定仿真周期结束后的信号值。
比较波形 比较不同波形窗口的数据,验证仿真结果的一致性。

通过结合波形查看窗口和仿真调试技巧,开发者可以更有效地分析和优化硬件设计,确保其在未来的实际应用中的性能和稳定性。

6. FPGA适配与布局布线过程

6.1 适配过程概述

6.1.1 适配流程和关键步骤

FPGA适配过程是将综合后的设计映射到特定的FPGA硬件资源上的步骤。适配过程包含了一系列转换,这些转换将设计中的逻辑元素转换为FPGA内的查找表(LUTs)、触发器、专用逻辑块和其他资源。适配过程是确保设计在目标设备中正确运行的关键。

适配流程通常包括以下关键步骤:

  1. 映射(Mapping) :将设计中的逻辑门和触发器映射到FPGA的实际硬件资源,如查找表(LUTs)和寄存器。
  2. 布局(Placement) :将映射后的逻辑块分配到FPGA内部的物理位置。
  3. 布线(Routing) :连接布局后的逻辑块,确保它们之间的信号正确传递。

6.1.2 适配策略的制定

制定有效的适配策略对于优化性能和资源利用至关重要。适配策略可以根据设计的特定需求进行调整,包括时序约束、资源利用率和功耗等因素。

在Quartus II中,可以通过以下方式制定适配策略:

  • 设置目标时钟频率 :为设计指定一个目标时钟频率,适配工具会尝试满足这一要求。
  • 资源分配 :为特定逻辑块指定FPGA内的物理位置,以满足时序或路径要求。
  • 时序驱动布局(Timing-driven placement) :布局过程会考虑到时序要求,尽量减少关键路径的延迟。
  • 布局优化 :在满足时序要求的同时,优化资源的使用。

6.2 布局布线优化

6.2.1 布局布线参数设置

布局布线工具提供了丰富的参数设置选项,这些参数可以帮助设计者优化FPGA的实现过程。在Quartus II中,可以通过如下方式进行布局布线参数设置:

  • 时序约束 :使用SDC格式的文件设置时序约束,指定设计的时序要求。
  • 布局选项 :通过指定布局工具的参数来控制布局的质量和时间,例如,设置布局的最大迭代次数。
  • 布线选项 :调整布线阶段的参数,以控制布线的密度和时序表现。

6.2.2 时序分析与优化方法

时序分析是布局布线过程中的一个重要环节,它决定了设计是否能在指定频率下运行。FPGA适配工具通常会提供时序分析器来帮助设计者识别和解决时序问题。

优化方法包括:

  • 增加时钟频率 :通过选择更快的时钟源或减少逻辑级数来增加目标时钟频率。
  • 添加延迟缓冲 :在路径上增加延迟缓冲来平衡延迟差异。
  • 重布线和重新布局 :基于时序报告,进行重布线和重新布局,以改善时序。
  • 时钟域交叉分析 :对于跨时钟域的信号,进行特殊处理以保证时序的正确性。

布局布线参数的合理设置和时序问题的优化是提升FPGA性能的重要途径,设计者应结合实际设计需求和设备特性进行细致的调整和优化。在实际操作中,需要通过不断的迭代和测试来找到最佳的适配参数。

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

简介:Quartus II是Altera公司开发的EDA工具,用于FPGA和CPLD的设计、仿真、综合和编程。教程涵盖界面介绍、项目管理、硬件描述语言、逻辑综合、仿真、适配布局布线、编程下载及高级特性。中文和英文教程资源使学习者能够轻松掌握关键技能,迈向数字电路设计的实践。


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值