基于FPGA的图像采集系统设计毕业论文(52页).doc

上传人:1595****071 文档编号:37157042 上传时间:2022-08-30 格式:DOC 页数:52 大小:785.50KB
返回 下载 相关 举报
基于FPGA的图像采集系统设计毕业论文(52页).doc_第1页
第1页 / 共52页
基于FPGA的图像采集系统设计毕业论文(52页).doc_第2页
第2页 / 共52页
点击查看更多>>
资源描述

《基于FPGA的图像采集系统设计毕业论文(52页).doc》由会员分享,可在线阅读,更多相关《基于FPGA的图像采集系统设计毕业论文(52页).doc(52页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、-基于FPGA的图像采集系统设计毕业论文-第 4 页 基于FPGA的图像采集系统设计前言 随着科技社会的发展,图像采集系统在日常生活、工业生产、国家安全等众多领域得到广泛的应用,具有广阔的应用前景和研究价值。采用FPGA进行设计的图像采集系统有良好的扩展性能和相对稳定的硬件结构。主要工作如下: 1)分析图像采集和图像处理的原理和特点,设计硬件电路的原理图,完成系统PCB板图的设计。 2)针对FPGA进行内部功能模块的划分,使用Verilog HDL硬件描述语言进行设计。 3)利用SOPC Builder完成NIOS处理器软核及其外设的创建和配置。 4)根据FPGA内部硬件电路的特点,选择适合F

2、PGA的算法,并对算法进行优化。 5)在NIOS II IDE环境下用Verilog HDL语言编写图像传感器控制、图像采集、SRAM读写控制、图像显示等程序,实现完整的图像采集系统功能。 1课题分析1.1 选题背景(含国内外相关研究综述及评价)与意义EDA技术的发展和应用普及性越来越高,已经涉及到现代电子产品设计的各个系统、各个领域中。之所以有这样的广泛应用,主要得益于可编程逻辑器件的长足发展和日益成熟,可编程逻辑器件(Programmable Logic Device, PLD)是一种半定制集成电路,在其内部集成了大量的门和触发器等基本逻辑单元电路,通过用户编程来改变PLD内部电路的逻辑关

3、系或连线,从而得到所需要的电路设计功能。这种新型逻辑器件,不仅速度快、集成度高,能够完成用户定义的逻辑功能,还可以加密和重新定义编程,其允许编程次数可以达到上万次。可编程逻辑器件的出现,大大改变了传统数字系统设计方法,简化了硬件系统、降低成本、提高系统的可靠性、灵活性。因此,自20世纪70年代问世以后,PLD受到广大工程师的青睐,被广泛应用于工业控制、通信设备、仪器仪表和医疗电子仪器等众多领域,为EDA技术开创了广阔的发展空间。VGA作为一种标准的显示接口,在视频和计算机领域得到了广泛的应用。VGA图像信号发生器是电视台、电视机生产企业、电视维修人员常用的仪器,其主要功能就是产生标准的图像测试

4、信号。对VGA而言,其主要应用在工业控制领域,通过VGA接口实现将信息、图像、文字等内容显示各种VGA显示器上,为客户提供一种完美的显示界面,也是目前重要的显示终端。本次实验设计主要是基于FPGA芯片为处理器,利用硬件描述语言完成VGA的时序控制,并利用相应的实验平台,进行设计验证,基本实现了VGA的彩条信号和图像显示效果,达到了整个设计目标和要求。1.2 选题研究的方法与主要内容1.2.1研究方法 通过查阅资料,学习VGA工作原理和控制方法,掌握EDA技术应用基本技巧,运用FPGA为设计实现的处理器,完成VHDL对各个模块的功能描述,在实验平台上完成整个系统设计实现。1.2.2主要内容u 根

5、据设计任务,制定实现方案u 应用VHDL完成对系统中各个功能模块的描述u 完成顶层设计文件,并调试仿真系统u 下载程序代码到FPGA,在实验平台上验证VGA是否正常显示撰写设计报告书1.3 研究条件和可能存在的问题1.3.1研究条件会使用EDA开发工具软件Quartus II ,能熟练使用VHDL语言编写时序电路,需要有相应的实验开发平台。1.3.2可能存在的问题:u VGA时序控制不正确,无法正常显示相应的图形u VGA硬件接口电路PCB设计不能实现其功能u FPGA内部ROM存储空间太小,不能存储大容量的图片数据1.4 拟解决的主要问题和预期的结果1.4.1拟解决的主要问题u VGA时序控

6、制问题 u PROTEL绘制VGA电阻分压网络电路设计问题u 调试VHDL程序代码常见错误1.4.2预期的结果通过完成整个系统的电路设计,实现各个功能模块和顶层设计电路,能在显示器上正确看到横竖彩条、棋盘格图形和图片显示等效果。2 图像采集系统介绍2.1 图像采集系统功能分析这部分阐述了图像采集系统的各种动作功能和控制要求,给出了完整的图像采集系统操作规程,并介绍了图像采集运行系统中所包括的人工操作步骤。2.1.1 图像采集系统的基本功能在进行上、下位机程序编写之前,首先要做的工作是确定图像采集系统本身所具备的功能及在进行某种操作后所具有的状态。在实际生活中,我们见到的图像采集系统可以采集一些

7、简单的图像,如书本、人物和植物等。图像采例集系统的基本功能就是对图像进行采集,并进行简单的处理。举一个简单的例子来说明:采集一本书的图像,系统会根据书的颜色大小自动调整,使采集的图像清晰,尽量减小失真。当图像达到最佳状态时,系统等待外部命令,如继续采集,则同上,如果此时不再采集而按下退出按钮,系统则要进行退出操作,并提示你是否保存所采集的图像,完成此次操作。由此看来,系统一次采集要涉及摄像头、VGA以及FPGA等,这是它的内部功能。基于FPGA实现的图像采集系统的整体结构框图如图1.1.1-1所示: 系统主要分为:图像采集模块、PLL锁相环时钟管理模块、I2C总线模块、FIFO图像数据处理模块

8、、Nios II 显示控制模块。系统中PLL负责为Nios II嵌入式内核、外部SDRAM和OV7670摄像头提供时钟,系统通电后,FPGA首先从EPCS中读取配置数据,完成自身程序加载,随后对系统时钟分频为摄像头提供系统时钟,然后通过I2C总线完成对OV7670摄像头的配置。配置完成后,OV7670将采集到的图像数据输出格式转换为标准的图像数据及图像时钟送入FPGA进行处理,并将处理后的图像数据通过FIFO模块暂时存储在SDRAM中进行缓冲,同时Nios II模块读取存放在SDRAM中的图像数据,按照TFT液晶显示的时序、数据要求将图像数据送到TFT彩色液晶显示屏上显示。彩色LCD显示SDR

9、AM控制模块液晶显示控制模块FIFO数据缓存模块PLL视频采集模块I2C模块 OV7670摄像头EPCS16配置芯片SDRAM图1.1.1-1 图像采集系统结构3 系统硬件设计3.1 FPGA选型 FPGA是该系统的核心,由于系统目前只是完成简单的图像处理,故FPGA选用Altera公司的低成本FPGA Cyclone II系列器件简介如表所示。 Cyclone II器件采用90nm工艺制造,它延续Cyclone的低成本定位,在逻辑容量、PLL、乘法器和I/O数量上都比Cyclone有了较大提高,应用Cyclone II进行图像处理开发有如下优点:(1)低成本高性能,适应图像处理要求较高的需要

10、。(2)丰富的内嵌存储器资源,适应大量图像数据存取的需要。(3)丰富的硬件乘法器,适应图像处理算法的需要。系统的FPGA选用开发板自带的EP2CS5Q208C8芯片。Cyclone II系列FPGA参数对比器件EP2C5EP2C8EP2C15EP2C20EP2C35EP2C50EP2C70逻辑单元460882561444818752332165052868416M4K RAM块26365252105129250总比特数1198081658882396162396164838405944321152000嵌入式乘法器131826263586150PLL个数2244444最多用户I/O管脚1581

11、823153154754506223.2 图像采集模块选择 图像采集采用OV7670图像传感器,OV7670图像传感器体积小、工作电压低。OV7670摄影头的VGA图像最高达到30帧/秒。通过SCCB总线控制内部寄存器,可以是OV7670输出整帧、子采样、取窗口等方式的各种分辨率的图像数据。用户还可以完全控制图像质量、数据格式和传输方式。OV7670与FPGA硬件连接如图所示。3.3 图像显示模块 图像显示通过在FPGA中构建的Nios II嵌入式内核实现,Nios II系统可以在设计阶段根据实际的需求来增减外设的数量和种类。可以使用Altera提供的开发工具SOPC Builder,在FPG

12、A器件上创建软硬件开发的基础平台,即用SOPC Builder创建嵌入式内核CPU和参数化的接口总线Avalon。在此基础上,可以快速地将硬件系统与常规软件集成在单一可编程芯片中。而且SOPC Builder还提供标准的接口方式,以便用户将外围电路做成Nios II嵌入式内核可以添加的外设模块。这种设计方式,方便了各类系统的调试。3.4 PLC的选型与工作原理当某一个控制任务决定由PLC来完成后,选择PLC就成为最重要的事情。一方面要选择多大容量的PLC ,另一方面是选择什么公司的PLC及外设。对第一个问题,首先要对控制任务进行详细的分析,把所有的I/O点找出来,包括开关量I/O和模拟量I/O

13、以及输出是用继电器还是晶体管或是可控硅型。3.4.1 PLC的硬件结构图:图2.4.1-1 PLC硬件结构图3.4.2 PLC各部分的作用与工作原理 3.4.2.1 中央处理器 CPU是由控制器和运算器组成的。运算器也称为算术逻辑单元,它的功能就是进行算术运算和逻辑运算。控制器的作用是控制整个计算机的各个部件有条不紊地工作,其基本功能是从内存中取指令和执行指令。他的重要功能如下: 诊断PLC电源、内部电路的工作状态及编制程序中的语法错误。 采集由现场输入装置送来的状态或数据,并送入PLC的寄存器中。 按用户程序存储器中存放的先后顺序逐条读取指令,进行编译解释后,按指令规定的任务完成各种运算和操

14、作。 将存于寄存器中的处理结果送至输出端。 应各种外部设备的工作请求。3.4.2.2 存储器PLC的存储器分为两大部分:一大部分是系统存储器,用来存放系统管理程序、监控程序及其系统内部数据;二大部分是用户存储器,包括用户程序存储区及工作数据存储区。3.4.2.3 PLC的基本工作原理PLC采用的是循环扫描工作方式。对每个程序,CPU从第一条指令开始执行,按指令步序号做周期性的程序循环扫描,如果无跳转指令,则从则从第一条指令开始逐条顺序执行用户程序,直至遇到结束符后又返回第一条指令,如此周而复始不断循环,每一个循环称为一个扫描周期。PLC的扫描全过程如图2.4.2.3-1所示。图3.4.2.3-

15、1 PLC的扫描全过程3.4.2.3.1 输入刷新阶段在输入刷新阶段,CPU扫描全部输入端口,读取其状态并写入输入状态寄存器。完成后关闭输入端口,转入程序执行阶段。3.4.2.3.2 程序执行阶段在程序执行阶段,根据用户输入的控制程序,从第一条开始逐条执行,并将相应的逻辑运算结果存入对应的内部辅助寄存器和输出状态寄存器。3.4.2.3.3 输出刷新阶段当所有指令执行完毕后,将输出状态寄存器中的内容,依次送到输出锁存电路,并通过一定输出方式输出,驱动外部相应执行元件工作,这才形成PLC的实际输出。显然扫描周期的长短主要取决与程序的长短。扫描周期越长,响应速度越慢。由于每一个扫描周期只进行一次I/

16、O刷新,即每一个扫描周期PLC只对输入、输出状态寄存器更新一次,故使系统存在输入、输出滞后现象,这在一定程度上降低了系统的响应速度。I/O端口设置见表3.4.2.3.3-1:表3.4.2.3.3-1 I/O端口设置DirAttribData功能唤醒功能功能描述000下拉是带下拉电阻的输入管脚001上拉是带上拉电阻的输入管脚010悬浮是悬浮式输入管脚011悬浮否悬浮式输入管脚10反相输出否Data数据位反相输出11同相输出否Data数据位同相输出由此可见,若输入变量在I/O刷新期间状态发生变化,则本次扫描期间输出会相应地发生变化。反之,若在本次刷新之后输入变量才发生变化,则本次扫描输出不变,而要

17、到下一次扫描的I/O刷新期间输出才会发生变化。这对于一般的开关量控制系统来说是完全允许的,不但不会造成不利影响,反而可以增强系统的抗干扰能力。这是因为输入采样仅在输入刷新阶段进行,PLC在一个工作周期的大部分时间里实际上是外设隔离的。而工业现场的干扰常常是脉冲式的、短时的,由于系统响应较慢,往往要几个扫描周期才响应一次,而多次扫描后,因瞬间干扰而引起的误操作将会大大减少,从而提高了系统的抗干扰能力。但是对于控制时间要求较严格、响应速度要求较快的系统,就需要精心编制程序,必要时采用一些特殊功能,以减少因扫描周期造成的响应滞后等不良影响。3.5 VGA的概述VGA(VideoGraphicsArr

18、ay)是IBM公司在1987年推出的一种视频传输标准,具有分辨率高、显示速率快、颜色丰富等优点,在彩色显示器领域得到了广泛的应用,VGA最早是指分辨率为640*480的一种显示模式。下面就VGA相关的工作原理及时序要求进行简单介绍。3.5.1 CRT的工作原理VGA接口技术应用最多的就是CRT显示器,这种显示器的信号接口采用的就是标准的VGA接口。常见的彩色显示器,一般由 CRT (阴极射线管)构成,彩色是由 R、G、B三原色按不同比例组成。显示过程中,HS和VS的极性可正可负,显示器内可自动转换为正极性逻辑。3.5.2 VGA工作时序对于普通的VGA显示器,主要包含5个信号:l R、G、B:

19、三基色信号l HS: 行同步信号l VS:场同步信号图3.5-1 VGA行扫描时序 图3.5-2 VGA场扫描时序表3.5-1 行扫描时序时间(单位:像素,即输出一个像素Pixel的时间间隔)行同步头行图像行周期对应位置TfTaTbTcTdTeTg时间 Pixels8964086408800表3.5-2 场扫描时序时间(单位:行,即输出一行Line的时间间隔)场同步头场图像场周期对应位置TfTaTbTcTdTeTg时间 Lines222584808525系统原理图系统PCB图4 系统软件设计4.1软件模块介绍 系统软件总设计模块如图所示,在 pll 中建立PLL锁相环对时钟倍频、分频产生系统各

20、模块所需时钟与系统复位信号,ov7670-data_receive 模块负责OV7670摄像头的初始化与图像数据的采集, 模块配合Nios II负责对ov7670-data_receive 采集的图像数据的缓存,以防止数据时钟不匹配而出现数据紊乱,而 模块主要负责产生读取 中的数据域实现数据的VGA显示产生相应的RGB数据与行、场同步信号,再将采集数据送到Nios II中,在Nios II中用Verilog语言驱动TFT液晶,实现图像数据的显示。系统总设计框图4.2 Nios II嵌入式内核程序设计Nios II嵌入式内核主要任务是将采集到的数据送入SDRAM暂存,然后再根据显示需要将暂存的数

21、据读取出来送到LCD显示,为了确保显示图像与采集图像的一致,在送LCD显示数据时要注意以下几点:(1) 根据实际情况去除行、场消隐数据,再根据显示内容的多少对数据进行裁剪,裁剪到适合LCD显示的大小,从而避免显示时图像的错位以及乱码等情况。(2) 由于嵌入式内核时钟频率相对于摄像头的大量数据来说速度还是难以做到摄像头采集的每副图像都能完全显示,所以在设计中采用隔场采集处理的方式,这样避免SDRAM中数据过多以至于被填满的情况,也解决了嵌入式内核采集的出现的卡屏的情况。5 测试结果电路板成品:测试结果如图所示:由上图可以看出,显示的图像清晰,色彩与实际相符,失真较少。测试结果基本达到预期。6 结

22、束语 采用FPGA设计并实现了一种图像采集系统,大幅减少了电路板的尺寸,节约了成本,同时增加了设计的灵活性和系统的可靠性,充分应用FPGA快速并行处理数据的特性,在产生同步信号的同时送出像素数据。嵌入式内核Nios II的使用,解决了其他系统实时图像显示的体积与速度问题,扩展了应用范围。 (全文完)参考文献:1 潘 松、黄继业: EDA技术实用教程,科学出版社,2003.5,P23-P282 杨 静: 电子设计自动化,高等教育出版社,2004.7,P32-P363 张文爱:EDA技术与FPGA应用设计,电子工业出版社,2012.1,P25-P484 杨立英:电子电路EDA技术与应用,清华大学出

23、版社,2011.1,P43-P865 徐志军、徐光辉:VGA在CPLD/FPGA的开发与应用,电子工业出版社,2002.4,P12-P166 黄智伟: FPGA系统设计与实践,电子工业出版社,2005.1,P66-P697 潘 松、王国栋:VHDL实用教材(修订版),电子科技大学出版社,2001.7,P48-P528 孟宪元:FPGA嵌入式系统设计,电子工业出版社,2007.10,P56-P649 褚振勇、齐 亮、田红心:FPGA设计及应用,高等教育出版社,2006.12,P36-P41附录:源程序timescale 1ns/1nsmodule I2C_Controller input iCL

24、K, input iRST_N, input I2C_CLK, input I2C_EN, input 23:0 I2C_WDATA, output I2C_SCLK, inout I2C_SDAT, input WR, input GO, output ACK, output reg END, output reg 7:0 I2C_RDATA reg I2C_BIT;reg SCLK; reg 5:0 SD_COUNTER;wire I2C_SCLK1 = (GO = 1 & (SD_COUNTER = 5 & SD_COUNTER = 16 & SD_COUNTER = 27 & SD_C

25、OUNTER = 5 & SD_COUNTER = 16 & SD_COUNTER = 33 & SD_COUNTER = 44 & SD_COUNTER = 43 & SD_COUNTER = 51) ? 1b0 : 1b1; wire SDO = WR ? SDO1 : SDO2;assign I2C_SDAT = SDO ? I2C_BIT : 1bz;reg ACKW1, ACKW2, ACKW3; reg ACKR1, ACKR2, ACKR3; assign ACK = WR ? (ACKW1 | ACKW2 | ACKW3) : (ACKR1 | ACKR2 | ACKR3);a

26、lways (posedge iCLK or negedge iRST_N)begin if (!iRST_N) SD_COUNTER = 6b0; else if(I2C_EN) begin if (GO = 0 | END = 1) SD_COUNTER = 6b0; else if (SD_COUNTER 6d63) SD_COUNTER = SD_COUNTER + 6d1; end else SD_COUNTER = SD_COUNTER;endalways (posedge iCLK or negedge iRST_N) begin if(!iRST_N) begin SCLK =

27、 1; I2C_BIT = 1; ACKW1 = 1; ACKW2 = 1; ACKW3 = 1; ACKR1 = 1; ACKR2 = 1; ACKR3 = 1; END = 0; I2C_RDATA = 8h0; end else if(I2C_EN) begin if(GO) begin if(WR) begin case(SD_COUNTER) 6d0 : begin SCLK = 1; I2C_BIT = 1; ACKW1 = 1; ACKW2 = 1; ACKW3 = 1;ACKR1 = 1; ACKR2 = 1; ACKR3 = 1; END = 0; end 6d1 : beg

28、in SCLK = 1; I2C_BIT = 1; ACKW1 = 1; ACKW2 = 1; ACKW3 = 1; END = 0; end 6d2 : I2C_BIT = 0; 6d3 : SCLK = 0; 6d4 : I2C_BIT = I2C_WDATA23; 6d5 : I2C_BIT = I2C_WDATA22; 6d6 : I2C_BIT = I2C_WDATA21; 6d7 : I2C_BIT = I2C_WDATA20; 6d8 : I2C_BIT = I2C_WDATA19; 6d9 : I2C_BIT = I2C_WDATA18; 6d10 : I2C_BIT = I2

29、C_WDATA17; 6d11 : I2C_BIT = I2C_WDATA16; 6d12 : I2C_BIT = 0; 6d13 : ACKW1 = I2C_SDAT; 6d14 : I2C_BIT = 0; 6d15 : I2C_BIT = I2C_WDATA15; 6d16 : I2C_BIT = I2C_WDATA14; 6d17 : I2C_BIT = I2C_WDATA13; 6d18 : I2C_BIT = I2C_WDATA12; 6d19 : I2C_BIT = I2C_WDATA11; 6d20 : I2C_BIT = I2C_WDATA10; 6d21 : I2C_BIT

30、 = I2C_WDATA9; 6d22 : I2C_BIT = I2C_WDATA8; 6d23 : I2C_BIT = 0; 6d24 : ACKW2 = I2C_SDAT; 6d25 : I2C_BIT = 0; 6d26 : I2C_BIT = I2C_WDATA7; 6d27 : I2C_BIT = I2C_WDATA6; 6d28 : I2C_BIT = I2C_WDATA5; 6d29 : I2C_BIT = I2C_WDATA4; 6d30 : I2C_BIT = I2C_WDATA3; 6d31 : I2C_BIT = I2C_WDATA2; 6d32 : I2C_BIT =

31、I2C_WDATA1; 6d33 : I2C_BIT = I2C_WDATA0; 6d34 : I2C_BIT = 0; 6d35 : ACKW3 = I2C_SDAT; 6d36 : I2C_BIT = 0; 6d37 : begin SCLK = 0; I2C_BIT = 0; end 6d38 : SCLK = 1; 6d39 : begin I2C_BIT = 1; END = 1; end default : begin I2C_BIT = 1; SCLK = 1; end endcase end else begin case(SD_COUNTER) 6d0 : begin SCL

32、K = 1; I2C_BIT = 1; ACKW1 = 1; ACKW2 = 1; ACKW3 = 1; ACKR1 = 1; ACKR2 = 1; ACKR3 = 1; END = 0; end 6d1 : begin SCLK = 1; I2C_BIT = 1; ACKR1 = 1; ACKR2 = 1; ACKR3 = 1; END = 0; end 6d2 : I2C_BIT = 0; 6d3 : SCLK = 0; 6d4 : I2C_BIT = I2C_WDATA23; 6d5 : I2C_BIT = I2C_WDATA22; 6d6 : I2C_BIT = I2C_WDATA21

33、; 6d7 : I2C_BIT = I2C_WDATA20; 6d8 : I2C_BIT = I2C_WDATA19; 6d9 : I2C_BIT = I2C_WDATA18; 6d10 : I2C_BIT = I2C_WDATA17; 6d11 : I2C_BIT = I2C_WDATA16; 6d12 : I2C_BIT = 0; 6d13 : ACKR1 = I2C_SDAT; 6d14 : I2C_BIT = 0; 6d15 : I2C_BIT = I2C_WDATA15; 6d16 : I2C_BIT = I2C_WDATA14; 6d17 : I2C_BIT = I2C_WDATA

34、13; 6d18 : I2C_BIT = I2C_WDATA12; 6d19 : I2C_BIT = I2C_WDATA11; 6d20 : I2C_BIT = I2C_WDATA10; 6d21 : I2C_BIT = I2C_WDATA9; 6d22 : I2C_BIT = I2C_WDATA8; 6d23 : I2C_BIT = 0; 6d24 : ACKR2 = I2C_SDAT; 6d25 : I2C_BIT = 0; 6d26 : begin SCLK = 0; I2C_BIT = 0; end 6d27 : SCLK = 1; 6d28 : begin I2C_BIT = 1; end 6d29 : begin SCLK = 1; I2C_BIT = 1; end 6d30 : I2C_BIT = 0; 6d31 : SCLK = 0; 6d32 : I2C_BIT = I2C_WDATA23; 6d33 : I2C_BIT = I2C_WDATA22; 6d34 : I2C_BIT = I2C_WDATA21; 6d35 : I2C_BIT = I2C_WDATA20; 6d36 : I2C_BIT = I2C_WDATA19; 6d37 : I2C_BIT = I2C_WDATA18; 6d38 :

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁