Zynq 7000 PL和PS通信——使用BRAM

ZYNQ PS PL 数据交互 Bram 文章目录前言一、ZYNQ数据交互方式二、Create Block Design1.创建硬件工程2.封装的ip代码3.使用vitis写ps端程序输出效果 前言 关于zynq PS PL 数据交互的方式,本文搭建了一个基于Bram的数据交互方式 以下是本篇文章正文内容,下面案例可供参考 一、ZYNQ数据交互方式 AXI DMA AXI DMA 主要进行大批量的数据交换,有两种模式Direct Register Mode和Scatter/Gather Mode,前者为传统的DMA方式,目标地址,源地址,长度. 阅读详情
AI摘要

本文详细介绍了如何在Zynq 7000 SoC上使用BRAM进行PL与PS之间的通信。通过建立AXI接口,配置PS-PL Configuration,创建并连接AXI BRAM Controller IP核,实现Linux应用程序对BRAM的读写操作。同时,文中探讨了BRAM寻址问题以及PS端的地址映射注意事项。

介绍

Xilinx公司的Zynq 7000系列SoC除了有功能强大的FPGA,还集成了带有双核ARM Cortex A9的PS。在协同使用PS和PL时,就不免需要在PS和PL之间进行数据交互。本文主要讲述安装了linux操作系统的PS如何与PL进行数据交互。

1 准备工作

PC环境:win10
vivado版本:2015.4
开发板:ZC706(已安装从SD卡启动的Linux系统)

系统的总体框架如下图所示。利用AXI接口实现PS和PL的通信,PS作为主机,PL作为从机,通过AXI Interconnect分别和两个BRAM的控制器相连。BRAM部分有两个端口,这两个端口都可对这块BRAM进行读写操作。AXI的通信接口由AXI Interconnect和AXI BRAM Controller IP核完成,在PS端,可以将AXI BRAM Controller当做字符设备进行读写操作,在PL端,可以直接对BRAM进行读写操作。其中AXI接口的具体通信过程由IP核完成,在进行应用开发时可以不用太关心。下图这块BRAM的两个端口都连到了PS,没有端口供PL进行操作了,在实际应用中,可以一个端口连到PS,另一个端口由PL控制,然后商量好PS和PL的读写规则即可使用BRAM实现PL和PS的数据传输。
在这里插入图片描述

2 PL搭建BRAM

打开vivado,新建一个工程,在选择器件时,选择ZC706评估板(如果不是此评估板,应该根据实际芯片型号选择)。
在这里插入图片描述
建好工程后,新建一个bd文件。
在这里插入图片描述
在Block Design文件中,添加一个ZYNQ7 Processing System IP核。
在这里插入图片描述
双击这个IP核对其进行配置,由于本文所用是官方提供的开发板,可以直接点击Presets -> ZC706使用默认的配置。如果是其他型号,应该按照实际情况进行配置。
在这里插入图片描述
然后点击PS-PLConfiguration里,把GP0选择,然后点击ok保存配置。
在这里插入图片描述
继续添加IP核,选择AXI BRAM Controller。
在这里插入图片描述
添加AXI BRAM Controller后,双击并对齐进行配置,将接口选择为1个。配置完成后以同样的方法再添加一个AXI BRAM Controller。
在这里插入图片描述
添加BRAM,并对齐进行配置,将其配置成双端口。
在这里插入图片描述
在这里插入图片描述
然后把AXI接口的时钟线连上,并选择自动连线。
在这里插入图片描述
最终的Block Design如下图所示。
在这里插入图片描述
接下来右击bd文件,选择Create HDL Wrapper,并选择Let Vivado manage wrapper and auto-update。
在这里插入图片描述
在这里插入图片描述
然后点击Address Editor,可以看到两个外设的地址分别为0x40000000和0x42000000。这个地址是给PS使用的,可以按照自己的喜好进行修改(当然地址不可随心所欲的修改,有些地址是不能给它们使用的!)。BRAM的容量大小也可在此处修改,只不过修改之后需要再运行一下Create HDL Wrapper重新进行打包,本文就使用默认的8K大小。
在这里插入图片描述
然后直接点击Generate Bitstream,等待其一步到位。
在这里插入图片描述

3 下载PL程序

给开发板上电。前期已经制作了从SD卡启动的linux操作系统,上电后,系统启动,可以从串口进入系统进行命令行操作。连接PL后,点击Program Device下载bitstream文件。
在这里插入图片描述

4 编写Linux应用程序

下载完成后,在linux系统下编写一个测试读写的C语言程序,测试代码如下所示。

#include<stdio.h>
#include<unistd.h>
#include<sys/mman.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

#define BRAM_CTRL_0	0x40000000	//AXI_bram_ctrl_0的物理地址
#define BRAM_CTRL_1	0x42000000	//AXI_bram_ctrl_1的物理地址
#define DATA_LEN		10			//写入和读取的数据长度

int main(){
    unsigned int * map_base0;
	unsigned int * map_base1;
 
    int fd = open("/dev/mem", O_RDWR|O_SYNC);
    if (fd == -1){	
		printf("can't open /dev/mem !\n");
        return (-1);
    }
	printf("/dev/mem is opened !\n");
	
    map_base0 = mmap(NULL, DATA_LEN * 4, PROT_READ|PROT_WRITE, MAP_SHARED, fd, BRAM_CTRL_0);
	map_base1 = mmap(NULL, DATA_LEN * 4, PROT_READ|PROT_WRITE, MAP_SHARED, fd, BRAM_CTRL_1);
    if (map_base0 == 0 || map_base1 == 0){
        printf("NULL pointer!\n");
    }
    else{
        printf("mmap successfull!\n");
    }
	
    unsigned long addr;
    unsigned int content;
    int i = 0;
	
	//写数据到BRAM
	printf("\nWrite data to BRAM via AXI_bram_ctrl_0\n");
    for (i= 0; i < DATA_LEN; i++){
        addr = (unsigned long)(map_base0 + i);
        content = i + 2;
		map_base0[i] = content;
        printf("%2dth data, address: 0x%lx data_write: 0x%x\t\t\n", i, addr, content);
    }
	
	//从BRAM读数据
	printf("\nRead data from BRAM via AXI_bram_ctrl_1\n");
    for (i= 0; i < DATA_LEN; i++){
        addr = (unsigned long)(map_base1 + i);
		content = map_base1[i];
        printf("%2dth data, address: 0x%lx data_write: 0x%x\t\t\n", i, addr, content);
    }
    
    close(fd);
    munmap(map_base0, DATA_LEN);
	munmap(map_base1, DATA_LEN);
 
    return 0;
}

在linux下使用GCC进行编译,然后运行,运行结果如下图所示。
在这里插入图片描述
这里对测试的C语言程序进行简单的分析。首先打开/dev/mem字符设备节点,然后将BRAM的两个控制器AXI_bram_ctrl_0和AXI_bram_ctrl_1的物理地址进行地址映射,这两个控制器在linux看来就相当于两个外设。先向AXI_bram_ctrl_0写入10个数据,然后从AXI_bram_ctrl_1读出10个数据,由于这两个控制器所连接的是同一块BRAM存储空间,所以读出来的数据应该和写入的数据是一致的。如此便实现了PL和PS的数据交互。

5 问题

5.1 BRAM的寻址的问题

如果将BRAM的一端交给PL来操作,如果选择BRAM的容量为8K。如果查看BRAM,会发现其深度竟然只有2048,并非8192,如下图所示。
在这里插入图片描述
其实这是因为BRAM的地址是以8位为单位的,BRAM容量设置成8K是指8KB,即8K×8bits。换算成32位宽时为8K×8bits = 2K×32bits,也就是说只有2048个32位地址。PL在对BRAM进行寻址时,也是使用的8位位宽寻址,也就是说地址会从0~1FFF,会有13根地址线,而并非11根地址线32位位宽。这是PL对BRAM进行操作时需要注意的。

5.2 PS地址映射

在PL这边搭好工程之后,会分配两个地址0x40000000和0x42000000。这两个地址是真实的物理地址,在Linux系统下不能直接访问,需要进行地址映射,然后才能对其进行操作。关于地址映射可是个麻烦的事情,还需仔细学习和谨慎使用。

ZYNQ学习之路(二):PS与PL通过BRAM交互 在 ZYNQ SOC 开发过程中, PL 和 PS 之间经常需要做数据交互。对于传输速度要求较高、数据量大、地址连续的场合,可以通过AXI DMA 来完成。而对于数据量较少、地址不连续、长度不规则的情况,此时 AXI DMA 便不再适用了。针对这种情况,可以通过 BRAM 来进行数据的交互。 实验目的:将数据从PS端写入PL部分的BRAM,然后将数据从BRAM读出来与原数据进行比较,判断是否写入成功。 一、搭建硬件框图 首先添加ps处理器,只需添加UART串口并设置相应的DDR型号即可,虽然我们用不到 阅读详情

相关推荐

Xilinx的ZYNQ芯片软件设计说明

1、概述 ZYNQ是xilinx推出一个款SOC,其亮点在于FPGA里包含了完整的ARM处理子系统(PS),每一颗Zynq系列的处理器都包含了Cortex-A9处理器,整个处理器的搭建都以处理器为中心,而且处理器子系统中集成了内存控制器和大量的外设,使Cortex-A9的核在Zynq-7000中完全独立于可编程逻辑单元,也就是说如果暂时没有用到可编程逻辑单元部分(PL),ARM处理器的子系统也可...

qq_40063466的博客 1万+

ZYNQ中PS、PL的含义

ZYNQ的术语简介,带你快速了解PS、PL、MIO、EMIO、APU、TTC、WDT、SWDT、SCU。

Fan_zhaoyang的博客 2万+

ZYNQ PS-PL数据交互:基于BRAM的共享内存设计与实现

在嵌入式系统与FPGA协同设计中,处理器与可编程逻辑之间的高效数据交互是核心挑战。AXI总线作为标准互连协议,提供了多种通信机制,其中AXI BRAM控制器结合Block RAM(BRAM)实现了一种低延迟、高灵活性的共享内存方案。该技术通过内存映射将PL侧BRAM资源直接暴露给PS端处理器,使其能以指针方式直接访问,而PL逻辑则通过另一端口并行操作,实现了硬件级的零拷贝数据共享。其技术价值在于为小数据量、实时性要求高的控制寄存器、状态同步及传感器数据缓存等场景提供了极简的硬件架构,避免了DMA的配置复杂性

搜索 460

FPGA的PS还有什么PL是什么意思

在FPGA中 PS: 处理系统 (Processing System) :就是与FPGA无关的ARM的SOC的部分。 PL: 可编程逻辑 (Progarmmable Logic): 就是FPGA部分。之所以叫PL,而不是叫FPGA,用英文简写可能便于理解区分,或者显得比较专业吧(/滑稽脸) 对于ZYNQ,,就是两大功能块,PS 部分和 PL部分, ARM的SOC部分,和FPGA部分。我们可以通过调用IP核,系统会使用AXI(Advanced eXtensible Interface) 接口将IP与处理器

qq_45689790的博客 3万+

Zynq中PS与PL通过BRAM实现低延迟共享内存

Block RAM(BRAM)是FPGA片上高确定性、单周期访问的静态存储资源,其核心价值在于为异构系统提供超低延迟的数据交换通道。基于AXI总线协议,BRAM可通过AXI BRAM Controller实现PS端内存映射访问,原理上将AXI读写事务转换为原生BRAM地址/数据信号,具备零等待、时序可控、无需仲裁等硬件优势。相较于DDR等片外存储,BRAM特别适用于Zynq等SoC中PS与PL间的状态同步、命令传递与小批量缓冲场景,是嵌入式实时控制、电机闭环、高速I/O协同等应用的关键基础设施。本文聚焦BR

weixin_42593701的博客 166

Xilinx ZYNQ实战:PS端如何高效读写单口BRAM(附完整代码解析)

本文详细介绍了在Xilinx ZYNQ平台上实现PS端高效读写单口BRAM的工程实践,包括BRAM基础配置、Vivado工程设置、PS端代码优化及调试技巧。通过具体代码示例和性能优化策略,帮助开发者掌握ZYNQ芯片中PS与PL协同工作的关键技术,提升嵌入式系统设计效率。

weixin_29195217的博客 423

ZYNQ 7020与7045项目迁移实战:资源、DDR与Flash固化避坑指南

在嵌入式开发中,FPGA选型与项目迁移是常见需求。ZYNQ-7000系列凭借ARM+FPGA架构,广泛应用于图像处理、高速采集等领域。其PS端DDR控制器与PL端逻辑资源相互配合,实现软硬件协同。然而,不同型号间资源差异显著,直接影响算法并行度与系统性能。从概念上讲,逻辑单元、DSP切片和Block RAM决定PL端处理能力;DDR控制器和封装选项则制约PS端带宽与扩展性。技术价值在于,合理选型可避免资源浪费与性能瓶颈。应用场景涵盖机器视觉、雷达信号处理等。当项目从7045迁移至7020时,需重点关注DDR

weixin_33901926的博客 336

Zynq SoC中BRAM与PS端内存的协同工作机制

深入探讨Zynq SoC中BRAM与处理系统端内存的协同工作方式,揭示数据交互流程与优化策略。通过理解bram在系统中的角色,提升整体性能与资源利用效率。

weixin_35414260的博客 749

什么是 zynq 的 ps 和pl 端?

通过PS和PL的协作,Zynq芯片能够同时满足复杂计算和高性能硬件加速的需求,是嵌入式开发中的强大工具。在Xilinx Zynq系列芯片(如Zynq-7000和Zynq UltraScale+)中,是芯片的两个主要部分,用于分别处理不同的任务。PS和PL是Zynq芯片的两大部分,功能上紧密集成,协同工作。,基于FPGA架构,允许用户根据需求实现自定义硬件逻辑。,它是基于ARM架构的处理器子系统。

抟土成人祖,炼石补青天。眼中览银河,手可摘星辰。 8722

FPGA 53 ,基于 ZYNQ 7Z010 的 FPGA 高速路由转发加速系统架构设计(Xilinx ZYNQ-MINI 7Z010 CLG400 -1)

⭐摘要:本文基于Xilinx ZYNQ-7Z010芯片设计了一套FPGA高速路由转发加速系统,通过软硬件协同架构实现千兆线速转发。系统采用PS(ARM)+PL(FPGA)异构设计:FPGA负责数据面处理(包解析、流表查找、NAT转换等),ARM处理控制面逻辑。模块化设计形成全流水线处理路径,支持单向数据流处理,异常流量通过DMA交由CPU处理。关键设计包括跨时钟域处理、数据一致性保证和流表资源优化。系统可显著降低CPU负载,提升网络性能,适用于家庭/办公网络加速场景。文章还探讨了FPGA系统与前端工程化设计

AI Agent 全栈架构师(AI + GIS + Backend)& 数字芯片系统架构师(FPGA),NorthCity Smile的博客(NcSmile,博主域名:https://ncmile.blog.youkuaiyun.com) 1216

FPGA上基于FFT IP核的实时频谱分析:Zynq-7000工程实践

快速傅里叶变换(FFT)作为数字信号处理的核心算法,广泛应用于频谱分析、通信解调和频域滤波等场景。在工程实现中,FPGA凭借其并行流水线架构和丰富的DSP资源,成为处理高吞吐率信号的首选平台。传统单片机受限于串行执行,难以满足高速连续数据流的实时计算需求,而FPGA配合厂商提供的FFT IP核,能够高效完成蝶形运算和缩放控制,大幅降低开发门槛。本文以Zynq-7000系列可扩展处理平台为例,系统梳理了FFT IP核的配置要点、AXI4-Stream接口时序、数据格式与溢出规避策略,并结合频谱监测、OFDM解

weixin_30954817的博客 315

ZYNQ PS与PL共享DDR

平台: 开发板:ZYNQ-7000系列裸板开发 开发环境:vivado hls、vivado、sdk 参考 https://blog.youkuaiyun.com/weixin_36474809/article/details/85111550 https://www.youkuaiyun.com/link?target_url=http%3A%2F%2Fwww.eefocus.com%2Fanta...

qq_38128961的博客 1万+

ZYNQ通过PS访问PL端BRAM例程

在本例程中,在 PL 端设计了 1 个 4KB(位宽 32,深度 1024)的 BRAM。首先, PS 通过 M_AXI_GP 口向 BRAM 中 1024 个地址依次存入 1024 个 32 位的数据。 PS 每向 BRAM 完成写入 1 个 32 位数据后通过 AXI GPIO 输出 1 个 上升沿信号, PL 捕获上升沿后立即将 PS 写入的 32 位数据读出,然后加 2,再存入原地址中。存储完成后, PL 通 过 AXI GPIO 向 PS 输入 1 个翻转信号,每翻转 1 次, AXI GPIO 便向 PS 触发 1 次中断。 PS 触发中断后,再从 BRAM中读出该数据,判断是否被加了 2,若不一致,则报错。

ZYNQ 简介

传统的嵌入式集成电路应用级芯片常见的 DSP,ARM,PowerPC,MIPS,FPGA 等,FPGA 有灵活性好,资源丰富,可反复编程(Programmable)速度快(并行)的优势。在以往的应用中,常有场景需要使用 ARM 作为主控,通过 ARM 的外设并行 RAM 类总线外挂 FPGA ,使用 FPGA 来做高速的数据采集或者运算的架构,在通信,医疗电子等等行业,这都屡见不鲜; XILI...

StephenZhou 4万+

BEVFormer详解

BEVFormer 是将Transformer架构的自注意机制与BEV视图中3D检测结合起来的一种纯视觉目标检测方案。对于纯视觉的BEV检测方案,其中的重中之重就是如何将2D的图像特征映射到3D空间的BEV栅格,既然是映射关系,那就有前行投影和反向查询两种机制。前向投影是基于深度估计的方法,参考基于深度估计的BEV视图转换方法,典型代表为LSS。反向查询方法思路为先将BEV栅格在Z方向上进行lift提升,然后再映射到图像特征图上进行特征查询。BEVFormer 就是基于这种机制进行2D图像特征到3D空间的B

MAX的专栏 4745

医学图像可视化实战:ITK-SNAP与Python+SimpleITK双方案解析

本文深入解析了医学图像可视化的两大核心方案:ITK-SNAP与Python+SimpleITK。ITK-SNAP作为专业无损浏览器,是数据探索与分析的必备工具;而Python+SimpleITK方案则提供了自动化处理能力,但需注意将.nii.gz数据转换为JPG等格式时的信息损失。文章通过实战对比,为医学影像处理者提供了清晰的选择指南与避坑建议。

ol789012的博客 490

ZYNQ PS-PL BRAM数据交互权威指南:从基础架构到异构计算优化

摘要: ZYNQ异构架构通过BRAM实现PS与PL高效数据交互,具有低延迟、高带宽优势。BRAM支持随机访问和多端口并发,适用于工业控制、边缘AI等场景。硬件设计需配置AXI BRAM控制器与Block Memory Generator,关键参数包括数据宽度、容量扩展和时序约束。软件实现涉及地址映射、初始化及读写优化,通过批量突发传输提升性能。新一代ZYNQ器件中,BRAM与HBM协同可进一步提升异构计算效率。

从零开始,掌握网络安全。提供全面的网络安全教程、攻防演练技巧和行业动态。 1425

K8S证书过期解决办法之替换证书

k8s证书过期解决方案之替换证书

q_hsolucky的博客 1万+

ZYNQ的异构通信

总的来说,ZYNQ开发中,对于PS端和PL端的数据交互可以采用多种方式,主要有BRAM,AXI DMA,DDR, 文件。BRAM主要适用于数据量较少,地址不连续,长度不规则的数据传输场景,AXI DMA适用于数据量较大的块状连续数据传输场景。同时可以采用读写文件来实现数据的交互。

qq_42241500的博客 1859

区域法(zonal method)重构波前

目的:实现区域法的Matlab代码 1.理论介绍 区域法波前重构即从波前探测器测得的波前斜率中恢复出波前的相位值,其分为:休晋模型(Hudgin)[90]、绍契威尔模型(Southwell)[40]和弗雷德模型(Fried)[48]。 1.1 Fried模型,对于N×N微透镜阵列构成的网格: 以3*3的子透镜为例,解释上式,对其展开 改写为矩阵形式: 记作:S=AΦ,A根据N而确定。S是波前探测器测得的斜率,Φ是重构矩阵的相位值。 1.2 而Southwel...

EyRe1的博客 8196

树莓派使用 OLED 屏显示图片及文字

树莓派默认是不带显示屏的,如果想要查看系统的一些信息,需要使用电脑登录到树莓派,或者通过 HDMI 连接外接显示器查看。这样做总是有点麻烦,我们可以通过外接一个 OLED 屏来显示一些关键参数或者图片。本文将详细介绍操作方法。 OLED 模组介绍 OLED 屏主要有两种:128×32 和 128×64 ,主要颜色是白、黄、蓝。OLED 屏的特点是功耗低,价格便宜,使用 I2C 接口与主机连接。本文所使用的是 128×64 尺寸的屏幕,外形如下: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直

码到成功 3743

Zynq-7000 开发总结

近期经手了使用zynq开发的项目,中途遇到了很多问题,大多都是基础性问题,最后也都一一解决了,这里挑选一些印象深刻的坑进行记录,以鉴后者。软件版本:vivado 2017.4,及其配套的sdk。芯片型号:xc7z020clg400-2

weixin_45827703的博客 1539

Python爬虫抓取学术期刊数据(Springer、Elsevier)

本文详细介绍了如何使用Python爬虫抓取学术期刊网站(如Springer、Elsevier)上的文章信息,并进行数据清洗和存储。我们使用了requestsSeleniumpandas等技术,通过模拟浏览器行为来绕过反爬虫机制,并将数据保存为Excel文件,方便后续分析。未来,我们可以通过加入更多的期刊网站数据源,扩展爬虫的功能,抓取更多的学术数据。同时,结合自然语言处理(NLP)技术,可以对抓取的文章进行自动化的摘要提取和主题分类,为学术研究提供更多的支持。

2201_76125261的博客 1487

【ZYNQ必学】PS-PL架构完全解析:从零理解ARM+FPGA融合设计(附实战案例)

ZYNQ SoC芯片革命性融合ARM处理器与FPGA,实现PS(处理系统)和PL(可编程逻辑)协同设计。PS包含双核Cortex-A9处理器及丰富外设,适合控制任务;PL基于7系列FPGA架构,提供并行计算能力。相比传统FPGA,ZYNQ通过硬核处理器避免资源浪费,1GHz主频支持完整操作系统,同时保留FPGA的灵活性和高性能加速能力。典型应用场景包括嵌入式视觉、通信基带处理等需要软硬件协同的领域,显著降低系统复杂度并提高开发效率。

weixin_44413306的博客 2289

【2026年阿里巴巴集团暑期实习- 4月25日-算法岗-第二题- 矩阵计数】(题目+思路+Java&C++&Python解析+在线测试)

摘要: 给定两个非负整数序列a和b,构造n×m矩阵C,其中C[i][j]=a[i]×b[j]。统计矩阵中元素≥k的数量。解法是先对数组b排序,然后对于每个a[i],若k=0则直接累加m;若a[i]=0且k>0则跳过;否则计算需要的最小b[j]值,在排序后的b中使用二分查找确定满足条件的元素数量。时间复杂度为O((n+m)log m),空间复杂度O(1)。代码实现了排序和二分查找的高效组合。

m0_73659489的博客 65

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: ubuntu普通用户不能sudo的问题
下一篇: 信号的插值计算
STR618
博客等级 码龄9年 31粉丝 5原创
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值