FPGA实时时钟实验

合集下载

fpga简单项目案例

fpga简单项目案例

fpga简单项目案例摘要:一、FPGA 简介1.FPGA 的定义与作用2.FPGA 的原理与结构二、FPGA 简单项目案例1.案例一:LED 灯控制2.案例二:按键控制LCD 显示3.案例三:数字时钟三、FPGA 项目开发流程1.FPGA 设计工具2.设计思路与方法3.实际操作步骤四、FPGA 在我国的发展与应用1.我国FPGA 产业现状2.FPGA 在各个领域的应用3.FPGA 未来的发展趋势与挑战正文:FPGA,即现场可编程门阵列(Field-Programmable Gate Array),是一种可以由用户编程定义逻辑功能的集成电路。

它具有高度灵活性,可重构性,广泛应用于航空航天、通信、计算机、工业控制等领域。

本文将介绍三个FPGA 简单项目案例,帮助大家更好地了解FPGA 的应用。

首先是LED 灯控制,通过FPGA 实现对多个LED 灯的亮灭控制,可以锻炼初学者的基本编程能力。

其次是按键控制LCD 显示,利用FPGA 实现对LCD 屏幕的显示控制,通过按键切换不同的显示内容。

最后是数字时钟,通过FPGA 实时显示当前时间,对时钟的显示精度要求较高。

在进行FPGA 项目开发时,首先需要选择合适的设计工具,例如Xilinx 的ISE、Altera 的Quartus 等。

然后根据项目需求,设计出合理的电路原理图,并进行实际操作。

操作过程中,需要将设计好的原理图下载到FPGA 芯片中,进行功能验证。

在项目开发过程中,要注重细节,保证设计的正确性。

近年来,FPGA 在我国得到了迅速发展,许多企业和科研机构在FPGA 领域取得了重要突破。

我国FPGA 产业正逐步向高端、自主方向发展。

然而,与国际先进水平相比,我国在FPGA 技术、产品及应用方面仍有一定差距。

fpga 分频时钟的使用方法

fpga 分频时钟的使用方法

fpga 分频时钟的使用方法
FPGA(现场可编程门阵列)的分频时钟使用方法可以根据具体
的应用和FPGA型号而有所不同,但一般的步骤如下:
1. 确定分频比,首先要确定需要的分频比,即输入时钟频率与
输出时钟频率的比值。

这决定了分频器的工作方式和参数设置。

2. 实例化分频器,在FPGA的设计工具中,需要实例化一个分
频器模块。

具体的名称和参数设置取决于所使用的FPGA型号和设计
工具。

3. 设置分频参数,根据所需的分频比,设置分频器模块的参数。

这通常包括输入时钟频率、输出时钟频率、分频比等。

4. 连接时钟信号,将输入时钟信号和分频器模块连接起来,确
保输入时钟信号正确地输入到分频器模块中。

5. 生成输出时钟,根据FPGA的时钟管理资源,将分频后的时
钟信号连接到需要的逻辑模块或输出引脚上,以供其他电路使用。

在实际应用中,还需要考虑时钟的相位对齐、时序约束等问题,以确保分频后的时钟信号能够满足设计的时序要求。

此外,不同的FPGA厂家和型号可能有特定的时钟分频器资源和设置方法,因此在
具体设计时需要参考相应的FPGA手册和设计工具文档。

总的来说,FPGA的分频时钟使用方法包括确定分频比、实例化
分频器、设置分频参数、连接时钟信号和生成输出时钟等步骤,需
要根据具体情况进行详细的设置和调整。

基于FPGA的24小时时钟

基于FPGA的24小时时钟

XXXXXX课程设计报告电子线路设计课程设计报告[24小时时钟电路设计]小组成员:XXXXXXXXXXXXXX 院(系):电气信息工程学院年级专业:20XX级电子信息工程指导老师:XX XX XX 联系电话:XXXXXXXXX二〇XX年XX月摘要本设计为24小时时钟设计,具有时、分、秒计数显示功能,以24小时循环计时的时钟电路;具有时、分校准以及清零的功能。

本设计采用EDA技术,以硬件描述语言VHDL为系统逻辑描述手段设计文件,在QUARTUSⅡ工具软件环境下,采用自顶向下的设计方法,由各个基本模块共同构建了一个基于FPGA的数字钟。

系统由主控模块、分频模块、译码模块以及显示组成。

经编译和仿真所设计的程序,在可编程逻辑器件上下载验证,本系统能够完成时、分、秒的分别显示,由按键输入进行数字钟的清零功能。

关键词时钟,QUARTUSⅡ,VHDL,FPGAAbstractThe design for the 24-hour clock design, with hours, minutes, seconds count display, a 24-hour cycle of the clock timing circuit; with hours, minutes, and cleared the calibration function.This design uses EDA technology to hardware description language VHDL description of the means for the system logic design documents, software tools in QUARTUSⅡenvironment, using top-down design approach, from the various modules together to build a basic FPGA-based digital clock.System by the control module, frequency module, decoding module and display components. The compilation and simulation of the design process, in the download validation of programmable logic devices, the system can complete the hours, minutes, seconds, respectively, indicated by the key input for clear digital clock function.Keywords clock,QUARTUSⅡ,VHDL,FPGA目录摘要 (Ⅰ)ABSTRACT (Ⅱ)1 绪论 (1)1.1 题目意义 (1)1.2 设计要求 (1)2 设计的基本原理 (2)2.1 设计原理 (2)2.2 设计流程 (3)3 设计方案 (4)3.1 设计思路 (4)3.2 模块图和功能 (4)3.2.1 分频模块 (4)3.2.2 主控模块 (5)3.2.3 译码模块 (8)3.2.4 顶层模块 (10)4 测试 (11)4.1 模块仿真 (11)4.1.1 分频模块 (12)4.1.2 主控模块 (13)4.1.3 译码模块 (14)4.2 顶层模块仿真 (15)5 结论 (16)6 参考文献 (17)1 绪论1.1 题目意义现在是一个知识爆炸的新时代。

fpga秒表设计实验报告

fpga秒表设计实验报告

fpga秒表设计实验报告本次实验是基于FPGA设计的秒表。

秒表主要是用来计时的一种仪器,具有精准度高、显示清晰等优点。

在实验中,我们使用FPGA来实现秒表的设计。

1. 实验目的通过本次实验,我们的目的是掌握FPGA的使用方法,并设计出一个能够精准计时的秒表。

同时,也能够加深理解数字电路的基本原理和数字信号的处理方式。

2. 实验原理秒表的原理很简单,在起点按下计时键后,秒表开始计时,时间会显示在数码管或LCD屏幕上。

在终点按下停止键后,秒表停止计时。

我们需要用数字电路来实现这个过程,分为三个部分。

2.1. 时钟模块时钟模块是秒表实现的基础。

我们可以使用FPGA内置的时钟控制器IP,也可以自己实现时钟模块。

在这个实验中,我们使用了FPGA内置的时钟控制器IP。

2.2. 计时模块计时模块是实现秒表的关键。

我们可以使用FPGA内置的计数器IP,也可以自己实现计数器模块。

在这个实验中,我们使用了FPGA内置的计数器模块。

2.3. 显示模块显示模块用来显示计时结果。

我们可以使用数码管或LCD屏幕来显示计时结果。

在这个实验中,我们使用了数码管来显示计时结果。

3. 实验步骤3.1. 创建工程首先,我们需要在Vivado IDE中创建一个FPGA工程。

在创建工程时,需要选择适当的设备型号、板卡等参数。

3.2. 添加时钟控制器IP在Vivado IDE中,选择IP Catalog,搜索并添加时钟控制器IP。

3.3. 添加计数器IP在Vivado IDE中,选择IP Catalog,搜索并添加计数器IP。

3.4. 添加数码管IP在Vivado IDE中,选择IP Catalog,搜索并添加数码管IP。

3.5. 连接IP在Vivado IDE中,将时钟控制器IP、计数器IP和数码管IP进行连接。

3.6. 程序设计使用Vivado IDE中的HDL语言对秒表进行程序设计。

3.7. 烧录程序将程序烧录到FPGA中,实现秒表功能。

fpga竞赛题目

fpga竞赛题目

题目:设计一个FPGA竞赛题目并解释它的要求和解决方法一、题目:数字时钟的设计与实现要求:1. 使用FPGA设计一个数字时钟,包括小时、分钟和秒的显示。

2. 时钟的显示应该具有实时更新功能,即每秒钟更新一次时间。

3. 时钟应该具有手动调整时间的功能,可以通过按键输入小时、分钟和秒。

4. 时钟应该具有闹钟功能,当到达设定的时间时,闹钟会发出声音。

解决方法:1. 首先,我们需要使用FPGA设计一个时钟模块,该模块需要能够处理小时、分钟和秒的计数。

可以使用计数器来实现这一功能。

计数器的计数频率应该足够快,以实现每秒钟更新一次时间的要求。

2. 显示模块可以使用FPGA上的LED或LCD显示屏来实现。

我们需要设计一个驱动程序来控制显示屏的显示内容。

3. 手动调整时间的功能可以通过按键输入来实现。

我们需要设计一个按键检测模块来检测按键的状态,并将按键输入传递给时钟模块。

4. 闹钟功能可以通过在时钟模块中设置一个闹钟时间来实现。

当到达设定的时间时,闹钟模块会触发一个中断,通知驱动程序发出声音。

二、题目:智能家居系统的设计与实现要求:1. 设计一个基于FPGA的智能家居系统,包括灯光、窗帘、空调等设备的控制。

2. 系统应该具有远程控制功能,可以通过手机APP或网页界面进行控制。

3. 系统应该具有自动控制功能,可以根据环境条件(如温度、光照等)自动控制设备。

解决方法:1. 智能家居系统需要使用FPGA作为主控制器,协调各个设备的控制。

我们可以使用FPGA 上的GPIO接口来控制各种设备。

2. 远程控制可以通过手机APP或网页界面的方式实现。

我们可以使用Wi-Fi模块(如ESP32)来实现通信,将用户的控制指令发送给FPGA。

3. 自动控制可以根据环境条件实现。

我们可以使用传感器(如温度、光照传感器)来检测环境条件,并将检测结果传递给FPGA。

FPGA可以根据这些信息来控制各种设备。

总之,这些题目需要使用FPGA的知识和技能来解决,需要熟练掌握FPGA设计、电路设计、软件开发、通信等方面的基础知识。

fpga数字钟实验流程

fpga数字钟实验流程

fpga数字钟实验流程FPGA(可编程逻辑门阵列)数字钟是一种基于可编程逻辑器件的数字时钟实验,通过编程和硬件设计的方式,实现数字时钟的功能。

本文将详细介绍FPGA数字钟实验的流程。

第一部分:实验准备1.硬件准备:需要准备一块FPGA开发板、显示器、键盘等硬件设备,以及一些连接线。

2.软件准备:需要安装好FPGA开发软件,例如Xilinx ISE,以及相应的驱动程序。

第二部分:FPGA数字钟的原理和设计1.了解数字时钟的结构和工作原理,数字时钟一般由时钟控制模块、时钟显示模块和按键控制模块组成。

2.设计时钟控制模块,该模块用来控制时钟的频率和计时功能。

3.设计时钟显示模块,该模块用来将时钟的计时结果以数字的形式显示在显示器上。

4.设计按键控制模块,该模块用来实现时钟的设置功能,包括设置时间和闹钟等。

第三部分:FPGA数字钟的硬件连接1.将FPGA开发板和显示器通过连接线连接起来,确保能够正常显示。

2.将FPGA开发板和键盘通过连接线连接起来,确保能够正常接收按键信号。

第四部分:FPGA数字钟的编程实现1.打开FPGA开发软件,创建一个新工程,并选择合适的FPGA芯片型号。

2.导入所需的模块和外设驱动程序,并将其进行连接。

3.配置FPGA芯片的引脚分配,将各个模块和硬件设备连接起来。

4.编写FPGA数字钟的软件代码,包括时钟控制模块、时钟显示模块和按键控制模块的代码。

5.进行编译和综合,生成对应的比特流文件。

6.将比特流文件下载到FPGA芯片中,实现数字时钟的功能。

第五部分:实验调试和功能测试1.将FPGA开发板连接到电源上,确保供电正常。

2.通过按键进行时间设置,并观察显示器上的时钟显示是否正确。

3.调整时钟频率,观察显示器上的时钟走动是否正常。

4.测试其他功能,例如闹钟功能、定时功能等。

第六部分:实验总结与展望1.对实验结果进行总结,分析实验中遇到的问题和解决方法。

2.展望数字时钟的进一步应用,例如可以加入温湿度传感器,实现天气预报功能等。

基于fpga的倒计时时钟实验报告总结

基于fpga的倒计时时钟实验报告总结

基于FPGA的倒计时时钟实验报告总结一、实验目的本实验旨在通过FPGA技术,设计一个能够进行倒计时的时钟电路,并进行相应的功能验证。

二、实验内容1. 确定实验目标:设计一个基于FPGA的倒计时时钟电路,实现倒计时功能。

2. 学习FPGA设计工具:熟悉并掌握FPGA设计工具的使用方法,包括逻辑综合、时序分析等。

3. 编写时钟电路代码:利用Verilog硬件描述语言编写时钟电路的代码。

4. 进行仿真验证:对时钟电路进行仿真验证,确保设计的正确性和稳定性。

5. 下板实验验证:将设计好的时钟电路下载到FPGA开发板上,进行实际验证。

三、实验步骤与结果分析1. 设计倒计时时钟电路通过学习资料和实验指导,我们利用Verilog HDL进行倒计时时钟电路的设计,并对其功能进行初步测试。

初步测试结果表明,设计的倒计时时钟电路能够正常工作。

2. 时钟电路仿真验证我们利用FPGA设计工具对时钟电路进行了仿真验证,通过时序分析和波形仿真,确认了时钟电路的正确性和稳定性。

仿真结果显示,时钟电路能够准确地进行倒计时操作。

3. 下板实验验证将设计好的时钟电路下载到FPGA开发板上进行实际验证。

经过实际测试,我们发现倒计时时钟电路能够稳定可靠地进行倒计时操作,符合设计要求。

四、实验总结通过本次实验,我们深入学习了FPGA技朰,并成功设计并验证了基于FPGA的倒计时时钟电路。

实验中我们克服了一些困难,如时钟电路设计的复杂性和仿真验证的精确性等。

我们顺利完成了实验目标,掌握了FPGA设计工具的使用方法,提高了自己的实践能力和动手能力。

这次实验为我们今后在FPGA领域的研究打下了坚实的基础,也对我们的专业素养、工程实践能力提出了更高的要求。

五、改进建议在今后的实验中,我们可以进一步深入研究FPGA技术,探索更多的应用场景,提高我们的设计水平。

注重团队合作、创新思维,不断提升自己的综合素质和实践能力,为将来的科研工作和工程实践打下更加坚实的基础。

《FPGA设计与应用》数字时钟实验

《FPGA设计与应用》数字时钟实验

《FPGA设计与应用》数字时钟实验一、实验目的和要求
1.学习动态数码管的工作原理;
2.实现 FPGA 对四位动态数码管的控制;
3.熟悉模块化编程的操作流程。

二、实验内容
1.实现 FPGA 对四位动态数码管的控制,使其能够正常工作;2.基于eGo-1的数字钟设计与实现
三、实验要求
1、能够在实验板上实现数字时钟
四、操作方法与实验步骤
本实验的设计思路如下:
各模块实现方式:
分频
计数器
Hex2BCD
数码管动态显示
五、实验数据记录和处理实验代码如下:
设计文件:(部分)
仿真文件(部分):
约束文件(部分):
六、实验结果与分析
综合后生成的网表结构如下图所示:
仿真图像:
实物操作:
经过如上图代码的运行,实验要求的功能已基本实现,得出的实验结果与预期基本一致。

七、讨论和心得
这次实验用到了之前学习的动态数码管工作原理,将动态数码管与时钟相结合,对于每一位数码管来说,每隔一段时间点亮一次。

显示器的亮度通过导通电流,点亮时间和间隔时间的控制。

通过调整电流和时间参数,可以既保证亮度,又保证显示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

简介这一节,我将给大家讲解实时时钟部分的内容,我在黑金板上用的实时时钟芯片是DS1302,这块芯片很常见,性价比也很高。

我们主要来讲如何在NIOS中实现其功能,所以DS1302功能介绍我简单概括一下,有问题的百度一下就都知道了。

DS1302是DALLAS公司推出的涓流充电实时时钟芯片,内含一个实时时钟/日历和31字节静态RAM,仅需要三根线:RES(复位),I/O(数据线),SCLK(串行时钟)。

时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信DS1302 工作时功耗很低,保持数据和时钟信息时功率小于1mW。

下面看一下电路图吧,下图所示,很简单,三根线就可以搞定了。

硬件开发首先,我们需要在软核中构建三个PIO模块,方法跟以前讲的一样。

需要注意的是RTC_DATA这个PIO,在构建的过程中,我们将其选择为双向的IO口,因为它是数据线,既要输入也需要输出,如下图所示,红圈处就是我们需要注意的地方,其他两个IO口设置为仅输出。

看看构建好以后的样子吧,如下图是所示接下来就是自动分配地址,中断,然后开始编译,等待……回到Quartus后,分配引脚,还是需要注意数据线,也是双向的,分配引脚的时候,要构建双向引脚(bidir),如下图所示。

都设置好以后,我们运行TCL脚本文件,然后开始编译,又是等待……软件开发编译好后,我们打开NIOS II IDE,首先,还是需要编译一下,CTRL+b,编译之后,我们看看system.h有什么变化。

观察后可以看出,里面对了,RTC部分的代码,如下表所示,#define RTC_DATA_NAME "/dev/RTC_DATA"#define RTC_DATA_TYPE "altera_avalon_pio"#define RTC_DATA_BASE 0x00201030……/** RTC_SCLK configuration**/#define RTC_SCLK_NAME "/dev/RTC_SCLK"#define RTC_SCLK_TYPE "altera_avalon_pio"#define RTC_SCLK_BASE 0x00201040……/** RTC_nRST configuration**/#define RTC_NRST_NAME "/dev/RTC_nRST"#define RTC_NRST_TYPE "altera_avalon_pio"#define RTC_NRST_BASE 0x00201050……/*在这些代码中,我们需要用到的是以下部分#define RTC_DATA_BASE 0x00201030#define RTC_SCLK_BASE 0x00201040#define RTC_NRST_BASE 0x00201050好的,接下来,我们就开始写程序吧第一步,修改sopc.h文件,加入以下代码到sopc.h中#define _RTC#ifdef _RTC#define RTC_SCLK ((PIO_STR *) RTC_SCLK_BASE)#define RTC_DATA ((PIO_STR *) RTC_DATA_BASE)#define RTC_RST ((PIO_STR *) RTC_NRST_BASE)#endif /* _RTC */没什么可说的,接下来我们在inc文件夹下建立ds1302.h,在其中加入以下内容,跟串口程序一样,里面也有个结构体,用这种方式整合所有的函数和变量。

/** =============================================================== ** Filename: ds1302.h* Description:* Version: 1.0* Created:* Revision: none* Compiler: Nios II 9.0 IDE* Author: AVIC* Company: 金沙滩工作室* ==============================================================*/#ifndef DS1302_H_#define DS1302_H_#include "../inc/sopc.h"//对于双向的IO,操作的过程中要注意改变IO口的方向,置1为输出,置0为输入#define RTC_DATA_OUT RTC_DATA->DIRECTION = 1#define RTC_DATA_IN RTC_DATA->DIRECTION = 0typedef struct{void (* set_time)(unsigned char *ti);void (* get_time)(char * ti);}DS1302;extern DS1302 ds1302;#endif /*DS1302_H_*/准备工作都做好以后,接下来我们要做的就是写ds1302的驱动了,根据DS1302的时序图来进行编写,首先我来给看看时序图吧,如下图所示,这个是读数据的时序图,这个是写数据时序图还有一个有关寄存器的表格,大家也要注意看一下,如下所示,前面两列是读和写的地址,每次操作时,都先写地址,再传数据。

现在,我们就根据时序图来编写ds1302的驱动,在driver文件夹下建ds1302.c文件,然后添加以下内容,/** =============================================================* Filename: ds1302.c* Description:* Version: 1.0* Created: 2009-11-23* Revision: none* Compiler: Nios II 9.0 IDE* Author: AVIC* Company: 金沙滩工作室** =============================================================*/#include "../inc/ds1302.h"//函数声明static void delay(unsigned int dly);static void write_1byte_to_ds1302(unsigned char da);static unsigned char read_1byte_from_ds1302(void);static void write_data_to_ds1302(unsigned char addr, unsigned char da); static unsigned char read_data_from_ds1302(unsigned char addr);void set_time(unsigned char *ti);void get_time(char *ti);//对DS1302结构体进行初始化,注意结构体中函数指针的初始化方式DS1302 ds1302={.set_time = set_time,.get_time = get_time};/** === FUNCTION====================================================* Name: delay* Description: 延时函数* ================================================================== */void delay(unsigned int dly){for(;dly>0;dly--);}/** === FUNCTION ================================================= * Name: write_1byte_to_ds1302* Description: 向ds1302写入1 byte数据* ===============================================================*/void write_1byte_to_ds1302(unsigned char da){unsigned int i;//写数据的时候,RTC_DATA为输出,先设置其为输出RTC_DATA_OUT;//以下步骤是处理串行数据的的典型方法,一个位一个位的来判断for(i=8; i>0; i--){if((da&0x01)!= 0)RTC_DATA->DATA = 1;elseRTC_DATA->DATA = 0;//根据芯片手册,适当加些延时,不是精确延时delay(10);RTC_SCLK->DATA = 1;delay(20);RTC_SCLK->DATA = 0;delay(10);da >>= 1;}}/** === FUNCTION ================================================== * Name: read_1byte_from_ds1302* Description: 从ds1302读取1 byte数据* ================================================================ */unsigned char read_1byte_from_ds1302(void){unsigned char i;unsigned char da = 0;//当读数据的时候,我们要将数据IO设置为输入RTC_DATA_IN;//以下是典型的读串行数据的方法for(i=8; i>0; i--){delay(10);da >>= 1;if(RTC_DATA->DATA !=0 )da += 0x80;RTC_SCLK->DATA = 1;delay(20);RTC_SCLK->DATA = 0;delay(10);}RTC_DATA_OUT;return(da);}/** === FUNCTION ================================================= * Name: write_data_to_ds1302* Description: 向ds1302写入数据* ===============================================================*/void write_data_to_ds1302(unsigned char addr, unsigned char da){RTC_DATA_OUT;RTC_RST->DATA = 0;//复位,低电平有效RTC_SCLK->DATA = 0;delay(40);RTC_RST->DATA = 1;//先写地址,再写数据,每次写1字节write_1byte_to_ds1302(addr); // 地址,命令write_1byte_to_ds1302(da); // 写1Byte数据RTC_SCLK->DATA = 1;RTC_RST->DATA = 0;delay(40);}/** === FUNCTION =================================================== * Name: read_data_from_ds1302* Description: 从ds1302读取数据* ================================================================= */unsigned char read_data_from_ds1302(unsigned char addr){unsigned char da;RTC_RST->DATA = 0;RTC_SCLK->DATA = 0;delay(40);RTC_RST->DATA = 1;//先写地址,再读数据write_1byte_to_ds1302(addr);da = read_1byte_from_ds1302();RTC_SCLK->DATA = 1;RTC_RST->DATA = 0;delay(40);return(da);}/** === FUNCTION ================================================== * Name: set_time* Description: 设置时间* ================================================================ */void set_time(unsigned char *ti){unsigned char i;unsigned char addr = 0x80;write_data_to_ds1302(0x8e,0x00); // 控制命令,WP=0,写操作for(i =7;i>0;i--){write_data_to_ds1302(addr,*ti); // 秒分时日月星期年ti++;addr +=2;}write_data_to_ds1302(0x8e,0x80); // 控制命令,WP=1,写保护}/** === FUNCTION ================================================== * Name: get_time* Description: 获取时间 ,读取的时间为BCD码,需要转换成十进制* ================================================================ */void get_time(char *ti){unsigned char i;unsigned char addr = 0x81;char time;for (i=0;i<7;i++){time=read_data_from_ds1302(addr);//读取的时间为BCD码 ti[i] = time/16*10+time%16;//格式为: 秒分时日月星期年addr += 2;}}OK,我们的驱动写好了,现在我们来写一个main函数来验证一下我们的驱动是否好用吧。

相关文档
最新文档