
FPGA
文章平均质量分 77
巨大八爪鱼
喜欢Win32和STM32编程
展开
-
Quartus II 13.0sp1 NIOS添加include头文件包含路径的方法
如图所示, 源文件目录中haha文件夹下有一个hoho.h头文件。本来要包含这个头文件应该写成#include "haha/hoho.h"的,但是如果写成#include <hoho.h>的话,就需要把haha文件夹添加到include头文件包含路径中,否则编译不通过。在项目上点击右键,选择Properties命令。找到Nios II Application Properties --> Nios II Application Paths,在右边的Application i原创 2022-01-08 11:59:50 · 3400 阅读 · 0 评论 -
Xilinx Vitis 2020.1添加include头文件包含路径的方法
如图所示, 源文件目录中haha文件夹下有一个hoho.h头文件。本来要包含这个头文件应该写成#include "haha/hoho.h"的,但是如果写成#include <hoho.h>的话,就需要把haha文件夹添加到include头文件包含路径中,否则编译不通过。在左栏“项目名_system”的下一级“项目名”上点击右键,选择Properties命令。请注意是在下图红框处点击右键,而不是绿框处。找到C/C++ General --> Paths and Symbo原创 2022-01-08 11:28:57 · 10862 阅读 · 1 评论 -
基于小梅哥AC620开发板的NIOS II LWIP百兆以太网例程移植到自己做的板子上
原程序是运行在小梅哥AC620开发板上的:基于小梅哥AC620开发板的NIOS II LWIP百兆以太网例程_ZLK1214的专栏-优快云博客_小梅哥ac620【开发板】开发板型号:小梅哥AC620FPGA型号:EP4CE10F17C8N晶振频率:50MHzPHY芯片型号:RTL8201CP(MII接口,百兆以太网PHY芯片)【程序功能展示】1. ping通开发板的NetBIOS设备名,IPv4地址和IPv6地址2. 访问开发板上的http服务器(设备名方式、IPv6方式):3. 在路由器管理页面看到开发原创 2022-01-07 19:07:13 · 3142 阅读 · 3 评论 -
NIOS II串口非阻塞方式接收数据
Quartus II 10.0版本以上可以用fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK)将标准输入stdin设为非阻塞模式,然后用getchar,read,scanf等函数接收串口数据。笔者用的版本是Quartus II 13.0sp1 (64-bit)。下面的程序实现了每隔1秒钟打印一次hello world和系统毫秒计数器的值,收到串口字符时立即打印出来的功能。用read函数接收1字节字符,函数不阻塞,如果没有字符就会返回-1,有字符则返回1。/* *原创 2022-01-06 20:58:24 · 2176 阅读 · 0 评论 -
在外部DDR3内存中运行的MicroBlaze程序的固化方法
本文以基于米联客MA703FA开发板的MicroBlaze LWIP千兆以太网例程为例,详细介绍在外部DDR3内存中运行的MicroBlaze程序的固化方法。FPGA型号:XC7A35TFGG484-2首先打开Vivado工程,进入Block Design,添加AXI Quad SPI IP核:点击Run Connection Automation,连接AXI LITE总线,并导出SPI引脚:再次点击Run Connection Automation,连接Quad SPI的时钟:.原创 2021-04-19 22:22:25 · 6567 阅读 · 0 评论 -
RTL8211千兆网PHY芯片LED灯配置
配置目标:(1)绿灯表示连接状态,插上网线绿灯常亮,拔出网线绿灯熄灭。(2)黄灯表示数据包收发状态,收发数据包时黄灯闪烁,空闲时黄灯熄灭。假设绿灯接的是LED2,黄灯接的是LED1。那么绿灯应该配置为:10/100/1000Mbps Link Indication => 0x0b << (5 * 2)黄灯应该配置为:10/100/1000Mbps Link Indication + Active Indication => 0x1b << (5 * 1)原创 2021-04-18 23:12:43 · 18670 阅读 · 6 评论 -
基于米联客MA703FA开发板的MicroBlaze LWIP千兆以太网例程
Xilinx FPGA MicroBlaze使用AXI 1G/2.5G Ethernet Subsystem(= Tri Mode Ethernet MAC + AXI Ethernet Buffer)以太网IP核驱动RTL8211FD千兆网口,并使用lwip2.1.2协议栈建立http服务器,支持IPv6【开发板】开发板型号:米联客MA703FAFPGA型号:XC7A35TFGG484-2晶振频率:50MHzDDR3内存型号:MT41K128M16(容量为256MB)PHY芯片型号:RTL原创 2021-04-18 21:58:36 · 10311 阅读 · 12 评论 -
小梅哥AC620开发板NIOS II LWIP实现HTTP网页控制数码管的显示内容
Quartus II 13.0工程下载地址:https://pan.baidu.com/s/1vKYkxWP3lFEimshvkQH-xg(提取码:95kz)【程序运行效果】浏览器访问板子首页(http://板子IP地址/),里面有一个文本框,输入一个数字后点击确定按钮,输入的数字会显示到板子的数码管上。【程序说明】Web服务器采用的是lwip自带的httpd服务器,网页表单提交方式为GET。在lwipopts.h里面开启LWIP_HTTPD_CGI选项,可解析URL中“?”后面.原创 2021-04-12 21:44:53 · 2057 阅读 · 0 评论 -
在外部SDRAM中运行的NIOS II程序的固化方法
本文以基于小梅哥AC620开发板的NIOS II LWIP百兆以太网例程为例,详细介绍在外部SDRAM中运行的NIOS II程序的固化方法。【实用工具】小梅哥一键合并sof和NIOS的elf软件程序为jic文件http://www.corecourse.cn/forum.php?mod=viewthread&tid=27759(出处: 芯路恒电子技术论坛)【SDRAM NIOS程序固化的视频教程】第一部分:https://www.bilibili.com/video/BV1NE411原创 2021-04-08 22:39:54 · 1835 阅读 · 0 评论 -
基于小梅哥AC620开发板的NIOS II LWIP百兆以太网例程
【开发板】开发板型号:小梅哥AC620FPGA型号:EP4CE10F17C8N晶振频率:50MHzPHY芯片型号:RTL8201CP(MII接口,百兆以太网PHY芯片)【程序功能展示】1. ping通开发板的NetBIOS设备名,IPv4地址和IPv6地址2. 访问开发板上的http服务器(设备名方式、IPv6方式):3. 在路由器管理页面看到开发板的信息:【主要程序代码】main.v:module main( input clock,原创 2021-03-30 22:17:03 · 3822 阅读 · 6 评论 -
【程序】Altera FPGA Verilog使用三速以太网IP核(Triple-Speed Ethernet)读写MDIO寄存器,并接收以太网数据包
【开发板】开发板型号:小梅哥AC620FPGA型号:EP4CE10F17C8NPHY芯片型号:RTL8201CP(MII接口,百兆以太网PHY芯片)【时序分析】读写三速以太网IP核本身的0x02号寄存器的时序:PHY芯片MII接口输出收到的以太网数据包:三速以太网IP核Avalon Streaming接口输出收到的以太网数据包:【程序代码】`include "includes/StringManipulator.v"module main( in原创 2021-03-30 22:00:55 · 4739 阅读 · 1 评论 -
【程序】Altera FPGA NIOS实现Scatter-Gather DMA(SGDMA)收发回环测试,描述符和缓冲区全部放在同一块SDRAM里面
【Verilog程序】module main( input clock, input uart_rx, output uart_tx, output sdram_clk, output [11:0] sdram_addr, output [1:0] sdram_ba, output sdram_cas_n, output sdram_cke, output sdram_cs_n, inout [15:0] sdram_dq原创 2021-03-27 12:49:05 · 1740 阅读 · 2 评论 -
NIOS II Eclipse出现fatal error - cygheap base mismatch detected
1 [main] man (608) C:\cygwin\bin\man.exe: *** fatal error - cygheap base mismatch detected - 0x180301408/0x180304408.This problem is probably due to using incompatible versions of the cygwin DLL.Search for cygwin1.dll using the Windows Start->Find/...原创 2021-03-19 22:32:09 · 1969 阅读 · 3 评论 -
NIOS II在SDRAM里面运行程序,但是却无法下载程序,提示Pausing target processor: not responding的解决办法
【错误提示】Downloading ELF Process failedUsing cable "USB-Blaster [USB-0]", device 1, instance 0x00Pausing target processor: not responding.Resetting and trying again: FAILEDLeaving target processor paused【原因】NIOS II里面Reset Vector的地址设置到了SDRAM里面,而板子原创 2021-03-17 21:59:14 · 2295 阅读 · 0 评论 -
Verilog的always里面不能用assign语句,如何对一组inout端口批量赋值
在下面的代码中,我们定义了一组32位宽的inout双向引脚。要给这32个端口赋值,需要用32个assign语句,写起来比较麻烦。有没有更简单的方法呢?module test( input clock, inout [31:0] io ); reg [31:0] io_link; reg [31:0] io_output; assign io[0] = (io_link[0]) ? io_output[0] : 1'bz; assign原创 2021-02-04 23:44:14 · 4211 阅读 · 0 评论 -
Quartus II SignalTap抓取信号,采集到的数据不正确,数据某些位被反相的解决办法
如图所示,用SignalTap II Logic Analyzer抓取Altera EP1C3T144C8N FPGA的内部信号。USARTSlave模块是一个同步串口数据收发模块,寄存器bit_i表示的是当前收发的是哪一位。初始、空闲状态下,bit_i=10。当bit_i=0时收发的是起始位,当bit_i=9时收发的是停止位,当1<=bit_i<=8时收发的是数据位。USARTSlave模块的代码如下:module USARTSlave #( parameter SYSC原创 2021-02-03 22:33:52 · 7443 阅读 · 1 评论 -
【方法】Altera Cyclone系列的EP1C3T144C8N FPGA利用ALTASMI_PARALLEL IP核读写自身的EPCS Flash存储器
Altera FPGA的程序是存储在外部的EPCS Flash里面的。EP1C3T144C8N的程序大小只有78422字节(76.5KB),剩余Flash空间可以用来存储其他数据。利用Serial Flash Loader IP核,Verilog程序可以直接操作EPCS SPI Flash的片选、时钟和数据引脚,从而读写Flash数据。SPI通信协议和普通的SPI Flash(如W25Q128)差不多。不过还有更简单的方法,Quartus里面还有一个名叫ALTASMI_PARALLEL的IP核。利用这个原创 2021-01-27 22:08:01 · 4673 阅读 · 0 评论 -
【教程】Xilinx Vivado/Vitis 2020.1创建MicroBlaze工程运行Hello World C语言程序(使用外部DDR3内存)
阅读本文前,请先阅读:(1)【教程】Xilinx Vivado/Vitis 2020.1创建最简单的MicroBlaze工程运行Hello World C语言程序(不使用外部DDR3内存),并固化到SPI Flashhttps://blog.youkuaiyun.com/ZLK1214/article/details/111824576#comments_14749273(2)Xilinx 2020.1 MIG核读写DDR3内存,新建工程时配置MIG核的完整步骤https://blog.youkuaiyun.com原创 2021-01-26 23:15:05 · 4354 阅读 · 1 评论 -
【教程】Xilinx FPGA里面的AXI DMA IP核的简单用法(以读写Floating-point IP核数据为例)
在FPGA里面,AXI DMA这个IP核的主要作用,就是在Verilog语言和C语言之间传输大批量的数据,使用的通信协议为AXI4-Stream。Xilinx很多IP核都是基于AXI4-Stream协议的,例如浮点数Floating-point IP核,以及以太网Tri Mode Ethernet MAC IP核。要想将Verilog层面的数据搬运到C语言里面处理,就要使用DMA IP核。本文以浮点数Floating-point IP核将定点数转换为浮点数为例,详细讲解AXI DMA IP核的使用方法。原创 2021-01-25 22:19:58 · 15386 阅读 · 4 评论 -
Xilinx Vitis 2020.1里面运行C程序时提示找不到microblaze_0
Executables selected for download on to the following processors doesn't exist or incorrectly specified. Do you wish to ignore them and proceed?1. microblaze_0其实根本就不是MicroBlaze找不到,而是程序根本就没有编译出来!仔细看一下编译时的输出信息:10:12:15 **** Build of configuration D原创 2020-12-30 22:44:50 · 3694 阅读 · 2 评论 -
关于Xilinx Vitis 2020.1里面MicroBlaze软核的sleep函数卡死的问题
在Vitis里面创建了一个LwIP工程,调试的时候发现,在BRAM里面运行正常,但如果改到DDR3内存里面运行,启动时就会卡死在sleep函数上。于是建立了一个Hello World工程来检查,代码如下:#include <sleep.h>#include <stdio.h>#include "platform.h"int main(){ int i = 0; init_platform(); xil_printf("Hello Wo原创 2020-12-30 22:39:45 · 4124 阅读 · 3 评论 -
Xilinx Vivado 2020.1里面AXI Interrupt Controller无法选择中断的个数
虽然看起来AXI Interrupt Controller的intr[0:0]位宽无法修改,但实际上,添加一个Concat IP,这个IP可以设置In0的个数,设置为2。In0连接上中断线后,再把dout和intr相连。GenerateBlockDesign一下,回来再看,就会发现intr已经自动变成[1:0]了。注意:仅仅添加Concat IP,改一下连线,Vitis是无法识别的,xparameters.h也无法自动更新。要么对Block Design做较大的改动,要么重建Vitis的Plat..原创 2020-12-29 23:10:58 · 2829 阅读 · 0 评论 -
【教程】Xilinx Vivado/Vitis 2020.1创建最简单的MicroBlaze工程运行Hello World C语言程序(不使用外部DDR3内存),并固化到SPI Flash
本教程以米联客XC7A35T FGG484-2开发板为例,详细讲解一下用Xilinx Vivado 2020.1创建MicroBlaze软核工程,然后再用Xilinx Vitis 2020.1建立Hello World C程序工程的完整操作步骤。最后程序运行起来后,还要在Vitis里面将程序固化到SPI Flash中,断电再开机后也能启动运行。米联客开发板自带的那个PDF教程(名字叫Artix-7修炼秘籍)里面,讲MicroBlaze的时候用到了DDR3内存,最后C程序是跑在DDR3内存里面的。固化的时原创 2020-12-27 20:10:17 · 14921 阅读 · 7 评论 -
Xilinx Vitis 2020.1用SREC SPI Bootloader固化Microblaze程序,断电再通电后程序运行不了的解决办法
FPGA的型号为XC7A35TFGG484-2,开发板用的是米联客的。主程序hello_world运行于外部DDR3内存,SREC SPI Bootloader运行于FPGA片内BRAM。用此文所述的方法固化程序:https://blog.youkuaiyun.com/zhengshuo5444/article/details/107357806download.bit生成了,但是下载下去总是运行不了。就连bootloader本身都运行不了,串口也没有任何输出。首先怀疑的是Vivado Block Desi原创 2020-12-22 23:16:55 · 7058 阅读 · 8 评论 -
Xilinx Vitis 2020.1修改工程占用的BRAM内存大小的方法
修改了代码后编译工程,有时会因为BRAM空间不足而编译失败,出现下面的错误提示:'Invoking: MicroBlaze gcc linker'mb-gcc -Wl,-T -Wl,../src/lscript.ld -LE:/fpga_projects/test4/microblaze_test/export/microblaze_test/sw/microblaze_test/standalone_domain/bsplib/lib -mlittle-endian -mcpu=v11.0 -m原创 2020-12-21 22:52:43 · 6165 阅读 · 0 评论 -
【程序】Xilinx FPGA将DDR3内存转换为W25Q256的SPI接口,供STM32单片机调用,产生容量为256MB的USB U盘设备
本文以XC7A35TFGG484-2这款芯片为例,采用米联客FPGA开发板,用MIG核驱动DDR3内存。FPGA外接的晶振大小为50MHz,DDR3内存的驱动频率(ddr3_ck_p和ddr3_ck_n)为400MHz。选用的DDR3内存型号为MT41K128M16,内存容量为256MB。然后,通过SPI接口和STM32单片机连接,SPI的通信协议和W25Q256一模一样,单片机利用USB接口产生一个256MB的USB U盘设备。程序的运行效果如下:【Verilog代码】main.v:mod原创 2020-12-20 13:14:09 · 2294 阅读 · 1 评论 -
Xilinx Vitis 2020.1无法创建SREC SPI Bootloader工程,提示缺少xilisf库的解决办法
【错误提示】This application requires xilisf library in the Board Support Package. You can go back to the previous pages to select a different platform and domain or create a new one with suitable hardware and software.【解决办法】在BSP设置中,手动添加xilisf库的引用。首先,在原创 2020-12-20 12:49:37 · 2153 阅读 · 5 评论 -
Xilinx 2020.1 MIG核读写DDR3内存,新建工程时配置MIG核的完整步骤
本文以XC7A35TFGG484-2这款芯片为例,采用米联客FPGA开发板,用MIG核驱动DDR3内存。FPGA外接的晶振大小为50MHz,DDR3内存的驱动频率(ddr3_ck_p和ddr3_ck_n)为400MHz。选用的DDR3内存型号为MT41K128M16,内存容量为256MB。首先用Clocking Wizard配置时钟,由50MHz倍频到200MHz,作为MIG的系统时钟(sys_clk_i)和参考时钟(clk_ref_i)。用MMCM倍频,输入的时钟为50MHz:输出原创 2020-12-17 23:09:56 · 6365 阅读 · 3 评论 -
Xilinx MIG核读写DDR3内存,连续读写内存的正确方法(时序)及代码
MIG核里面有两个通道:命令通道和数据通道。这两个通道是相互独立的,互不影响。命令通道:要发送的命令由ddr3_app_cmd指定(0号命令是写内存,1号命令是读内存),ddr3_app_en拉高就开始发送命令。数据通道:要发送的数据由ddr3_app_wdf_data指定,ddr3_app_wdf_wren拉高就开始往FIFO里面送入数据。MIG里面是严格一个时钟(ddr3_ui_clk)发送一个命令(或写一个数据)。ddr3_app_en如果一直拉高,那么就一直重复发送命令。拉高了多少个时钟周期,原创 2020-12-12 22:51:35 · 15228 阅读 · 10 评论 -
FPGA实际运行时,寄存器(变量)的值乱跳的解决办法
下面是串口接收代码。实际运行时,发现i有时候会从10跳变为2或8,但程序中却没有这样的语句,让人百思不得其解。module UARTReceiver #( parameter SYSCLK = 50000000 )( input clock, // 系统时钟 input nrst, // 模块复位 input rx, // 串口接收引脚 input [23:0] baud_rate, // 波特率 output reg received, //.原创 2020-12-12 21:48:32 · 3366 阅读 · 0 评论 -
Vivado中ILA显示信号不全的解决办法
在代码中加入了很多信号,但是下载程序后进入ILA界面时信号却显示不全。其实这不是代码的问题,信号有是有,只是没有添加进来。点击加号把没有显示的信号添加进来就可以了。原创 2020-12-12 21:37:32 · 7863 阅读 · 6 评论 -
[Opt 31-66] Net ila0/inst/ila_core_inst/TRIGGER_I[82] is driverless and is driving the D pin of shif
【代码】wire clock_locked;wire clock50;clk_wiz_0 clk_wiz_0( .clk_in1(clock), // 输入10MHz时钟 .clk_out1(clock50), // 输出50MHz时钟 .reset(!nrst), .locked(clock_locked));ila_0 ila0( .clk(clock50), // ILA使用的是倍频后的50MHz时钟 .probe0(i), // [3:原创 2020-12-12 21:34:16 · 2105 阅读 · 3 评论 -
【方法】Verilog取变量位宽的时候含有变量怎么办
在Verilog里面,一般用reg来存储字符串。例如要存储4个字符的字符串,变量应该声明为reg [31:0] str。因为每个字符的宽度为8位,4个字符一共32位。最高位为第31位,最低位为第0位。字符串在声明时可以给定初始值:reg [31:0] str = "this"如果我们想要改变字符串中的某个字符,比如更改最后一个字符(称为第0个字符),可以写成str[7:0] = "d",字符串就变成了thid。更改第3个字符:str[31:24] = "a"更改第2个字符:str[23:16] =原创 2020-11-23 23:43:24 · 11183 阅读 · 3 评论 -
在Vivado 2020.1中用MIG核读写DDR3内存,编译代码时提示Sub-optimal placement错误的解决办法
板子使用的是米联客的XC7A35TFGG484-2的开发板,上面带有256MB的型号为Micron MT41K128M16的DDR3内存。板子上的V4引脚上接了50MHz的晶振。用MIG核来驱动这片DDR3内存。DDR3的运行时钟Clock Period为400MHz:PLL Input Clock Period(sys_clk_i)为200MHz:sys_clk_i和clk_ref_i都配置为No Buffer,然后在代码中都共用同一个200MHz的时钟:.sys_clk_i(原创 2020-11-19 22:55:49 · 7792 阅读 · 5 评论 -
在Verilog中用for循环实现字符串长度获取、字符串连接、字符串转数字以及数字转字符串(一)
Verilog中的for循环和disable语句是可综合的,利用for循环,可以像编写软件代码那样实现一些算法。测试环境:Vivado 2020.1 + XC7A35T-2FGG484,晶振50MHz。【StringManipulator.vh】`define STRMANIP_STRLEN 1`define STRMANIP_STRCAT 2`define STRMANIP_ATOI 3`define STRMANIP_ITOA 4【StringManipulator.v】原创 2020-11-17 23:55:55 · 4379 阅读 · 0 评论 -
通过几段代码理解Verilog里面阻塞赋值和非阻塞赋值的区别,以及Verilog的for循环的使用
弄清楚阻塞赋值和非阻塞赋值的区别非常重要,否则我们就没有办法理解verilog里面的for循环的执行结果。简单来说,阻塞赋值是给变量的现态赋值,非阻塞赋值是给变量的次态赋值。所谓的现态,就是执行代码时变量的状态,也就是当前状态。次态,就是当前整个always代码块执行完了之后,变量是什么值,也就是下一个状态。注意:在同一分支下,对同一变量不能同时使用非阻塞赋值和阻塞赋值,否则编译不通过。例如,下面的代码无法编译通过:reg [13:0] a = 0;reg [3:0] state = 0;原创 2020-11-13 00:29:57 · 2274 阅读 · 0 评论 -
在Quartus II 13.0中用ModelSim-Altera 10.1d进行波形仿真,若修改了Verilog代码,如何不关闭窗口重新用新的代码来仿真
修改了Verilog代码后,如果关闭ModelSim再重新打开,那么里面的信号列表就会丢失,非常不方便。其实只需要Compile一下修改了的那个v文件,然后点Restart重新开始仿真就可以了,不需要关闭窗口。具体过程如下:(1)点击工具栏上的Compile按钮(2)选择修改了的v文件,点击Compile按钮重新编译,最后点击Done按钮关闭窗口(3)重新开始仿真...原创 2020-11-08 21:30:22 · 1093 阅读 · 0 评论 -
【方法】用Quartus II开发Altera公司的FPGA,如何给引脚配置上电初始电平
用Vivado开发Xilinx FPGA的程序时,可以在引脚列表直接配置上电初始电平。例如:module main( input clock, output reg [5:0] leds = 6'b111100);然而这一招在Quartus II里面行不通,FPGA复位后这些引脚全部都是低电平。不过可以采用一种变通的方法。Quartus II支持给非引脚reg型变量赋初值,我们可以定义一个普通的reg变量,然后把引脚配置成wire型,用assign语句连线上去:`def原创 2020-11-07 00:45:00 · 3834 阅读 · 1 评论 -
二进制小数的意义
回忆小学学的十进制小数的意义:15.23这个小数,1是十位,5是个位,2是十分位,3是百分位。这个小数的意义为:,因为最低位为百分位,所以分母是100。小数末尾加上0或去掉0,小数的大小不变,但是小数的意义会改变。1.5的意义是,但1.50的意义是。同理,二进制小数也可以这样来分析:… 十六位 八位 四位 二位 个位 . 二分位 四分位 八分位 十六分位二进制小数011.01,最低位是四分位,所以分母为4,去掉小数点后01101是13,所以分子为13,这个小数的意义为,化成十进制小数就原创 2020-10-28 23:40:50 · 3343 阅读 · 2 评论 -
FPGA调用浮点数IP核实现浮点运算、以及CORDIC核计算三角函数,连续进行多次运算的时序
单片机的硬件串口,发送和接收完毕都有相应的标志位,例如TC(发送完成)和RXNE(接收完成)位。FPGA则不同,FPGA采用的是AXI4-Stream协议,数据送入IP核后,经过固定数量的时钟周期后,就得到运算结果,没有任何标志位表明运算完成。利用浮点数IP核(Floating-point),将32位有符号定点数(Int32)转换为单精度浮点数(float),只需要6个时钟周期,就能得到结果。如下图所示:将两个单精度浮点数相加,需要11个时钟周期后,才能得到结果,如下图所示:利用COR原创 2020-10-28 23:05:35 · 8845 阅读 · 2 评论