基于fpga的曼切斯特编码的设计.docx

上传人:b****6 文档编号:6681045 上传时间:2023-01-08 格式:DOCX 页数:36 大小:465.02KB
下载 相关 举报
基于fpga的曼切斯特编码的设计.docx_第1页
第1页 / 共36页
基于fpga的曼切斯特编码的设计.docx_第2页
第2页 / 共36页
基于fpga的曼切斯特编码的设计.docx_第3页
第3页 / 共36页
基于fpga的曼切斯特编码的设计.docx_第4页
第4页 / 共36页
基于fpga的曼切斯特编码的设计.docx_第5页
第5页 / 共36页
点击查看更多>>
下载资源
资源描述

基于fpga的曼切斯特编码的设计.docx

《基于fpga的曼切斯特编码的设计.docx》由会员分享,可在线阅读,更多相关《基于fpga的曼切斯特编码的设计.docx(36页珍藏版)》请在冰豆网上搜索。

基于fpga的曼切斯特编码的设计.docx

基于fpga的曼切斯特编码的设计

东北大学毕业设计(论文)东北大学继续教育学院教务处

毕业设计(论文)

GRADUATEDESIGN(THESIS)

设计(论文)题目基于FPGA的曼切斯特编码的设计

学生

学习中心

专业电气工程及其自动化

指导教师

 

摘要

在电信领域,曼彻斯特码是一种数据通讯线性码,它的每一个数据比特都是由至少一次电压转换的形式所表示的。

它是一种超越传统数字传输的信道编码技术,同时被认为是一种自定时码。

自定时就意味着完全可以实现数据流的精确同步。

每一个比特都准确的在一个预先定义时期的时间中被传送。

曼彻斯特编码已经被许多高效率且被广泛使用的电信标准所采用,例如以太网电讯标准。

曼彻斯特编码具有隐含时钟、去除了零频率信号的特性,使得它在石油勘探测井中得到广泛的应用[1]。

本文对曼彻斯特编码相关原理和FPGA进行概述,介绍了其编解码规则。

对其特点和应用范围进行了说明。

提出了曼彻斯特编解码方案,重点运用VerilogHDL语言对其编解码的描述。

最后讲述该系统在QuartusⅡ软件下的运行和仿真。

关键词:

FPGA;曼彻斯特编解码;VerilogHDL语言

 

目录

1.曼彻斯特码概述1

1.1曼彻斯特码简介1

1.2曼彻斯特码原理1

1.3曼彻斯特编解码2

1.3.1编码3

1.3.2解码5

2.曼彻斯特编解码实现方法比较6

2.1集成方法实现6

2.2软件编解码7

2.2.1单片机实现7

2.2.2FPGA/CPLD实现8

2.2.3方案选择8

3.FPGA原理及平台简介8

3.1FPGA原理与特点10

3.2QuartusII及HDL语言13

3.2.1基于QuartusII的FPGA设计13

3.2.2VerilogHDL简介16

4.系统总体设计19

4.1编码器19

4.2解码器23

 4.3时钟模块27

5.系统测试与仿真28

5.1曼彻斯特编码仿真28

5.1.1编码分析34

5.2曼彻斯特解码仿真35

5.2.1解码分析36

6.结论及展望37

参考文献38

附录40

1.曼彻斯特码概述

1.1曼彻斯特码简介

在电信领域,曼彻斯特码(也称作相位码或者PE)是一种数据通讯线性码,它的每一个数据比特都是由至少一次电压转换的形式所表示。

曼彻斯特编码因此被认为是一种自定时码。

自定时意味着是可以实现数据流的精确同步。

每一个比特都准确的在一预先定义时间时期的时间中被传送[2]。

曼彻斯特码又称双向码。

它是对每个二进制代码分别利用两个具有两个不同相位的二进制新码去取代的码。

双向码的特点是只用两个电平。

与用高、低电平表示0,1的非归零二进制码相比,在连0或连1的情况下,更易于提取同步时钟信息,又无直流漂移,编、译码过程比较简单,且有强的抗干扰能力。

1.2曼彻斯特码原理

曼彻斯特码是一种常用的用于数字基带传输的码型。

它是一种用跳变沿(而非电平)来表示要传输的二进制信息(0或1),一般规定在位元中间用向下跳变表示“1”,用向上跳变表示“0”。

曼彻斯特编码提供了一种简单的方法——在长时间段内没有电平跳变的情况下,仍然能够对任意的二进制序列进行编码,并且防止低通模拟电路中低频直流飘移所引起的比特错误以及防止在这种情况下同步时钟信号的丢失[3]。

如果保证传送的编码交流信号的直流分量为零并且能够防止中继信号的基线漂移,那么很容易实现信号的恢复和防止能量的浪费。

所以曼彻斯特码具有丰富的位定时信息。

同时,有许许多多的复杂的编码方法中,在达到同等目的情况下只需要减少带宽负荷并且只有减少的同步信号相位。

二进制码与曼彻斯特码波形的对比关系如图1-1。

图1-1二进制码与曼彻斯特码波形

1.3曼彻斯特编解码

本次论文曼彻斯特编解码由编码模块和解码模块二个部分组成。

编码模块提供时钟源,并且对输入的待传送原码进行编码,将其转换成曼彻斯特码并发送。

解码模块用则是将曼彻斯特码整形后利用同步时钟模块提供的同步信号把它转换成原码输出。

二个相对独立的模块相互协同工作共同完成曼彻斯特编解码工作。

1.3.1编码

曼彻斯特编码是一种自同步的编码方式,即时钟同步信号就隐藏在数据波形中。

曼彻斯特编码电平跳变的规则是:

低电平的中间时刻跳变表示为‘0’,用高电平中间时刻的跳变表示为‘1’,如下图1-2所示。

因而这样防止时钟同步的丢失,或来自低频率位移在贫乏补偿的模拟链接位错误,在这个技术下,实际上的二进制数据被传输通过这个电缆,不是作为一个序列的逻辑1或0来发送的。

它具有自同步能力和良好的抗干扰性能。

但每一个码元都被调成两个电平,所以数据传输速率只有调制速率的1/2。

图1-2曼彻斯特编码

下面是一段数据串行信号“110110001”,在上图中可以看出曼彻斯特编码信号的跳变都发生在中间时刻,它按照曼彻斯特的编码规则,可以表示“110110001”,如图3-3所示。

图3-3信号的曼彻斯特编码

曼彻斯特编码,常用于局域网传输。

在曼彻斯特编码中,编码简单的二进制序列时,长周期没有转换级别因而导致时钟同步的丢失,或来自低频率位移在贫乏补偿的模拟链接位错误,根据这样的情况,曼彻斯特编码提供了一个简单的方式。

而在这中技术下,二进制数据被传输通过这个电缆,不是作为一个序列的逻辑1或0来发送的。

相反地,这些位被转换为一个稍微不同的格式,这样使用直接的二进制编码有很多的优点。

在曼彻斯特编码中,用电压跳变的相位不同来区分1和0,即用正的电压跳变表示0,用负的电压跳变表示1。

因此,这种编码也称为相应编码。

由于跳变都发生在每一个码元的中间,接收端可以方便地利用它作为位同步时钟,因此,这种编码也称为自同步编码。

所以,每一位的中间有一跳变,位中间的跳变既作为时钟信号,又作为数据信号;从高到向低跳变表示“1”,从低到向高跳变表示“0”。

还有一种是差分曼彻斯特编码,每位中间的跳变仅提供时钟定时,而用每位开始时有无跳变表示“0”或“1”,有跳变为“0”,无跳变为“1”。

曼彻斯特码由于其特殊的性能,被广泛应用于小功率无线传输系统中[4]。

曼彻斯特编码最大的优点是:

数据和同步时钟统一编码,曼码中含有丰富的时钟信号,直流分量基本为零,接收器能够比较容易恢复同步时钟,并同步解调出信号,具有很好的抗干扰性能,这使他更适合信道传输。

1.3.2解码

解码器需要将收到的曼彻斯特码解码,得出16位并行数据,并给出各种校验结果。

解码过程为:

1、同步头检测,当检测到同步头后触发整个解码过程开始,并给出同步头类型。

2、检测到同步头后,计数器cnt开始计数,在cnt的控制下进行解码。

包括码型转换与移位操作,同步头类型输出、曼彻斯特码型校验、奇偶校验、字连续性校验等。

3、当码的串并转换以及各种校验都完成后,给出并行数据和校验结果信号,在cnt的控制下最终给出数据有效信号read。

协议模块可在该信号有效(高电平)时检测其他校验信号,并决定是否取走并行数据。

  解码器一直监视数据输入线,当接收到有效的同步头和两个有效的曼彻斯特码数据位后,便开始输出。

2.曼彻斯特编解码实现方法比较

2.1集成方法实现

集成方法实现曼彻斯特数据的编解码功能,一般采用专用的曼彻斯特编码译码器,如HD—15530或HD—6408,数据的串并转换与信号合成都通过数字电路完成。

但这种方法存在许多不足之处:

第一,在利用集成芯片方法实现曼彻斯特编解码传输时,对编解码器时序要求很高,使得上下位机同步比较困难;第二,这种方法会导致硬件电路过于庞大、复杂,而且也增加了系统调试的难度[5]。

2.2软件编解码

软件方法实现曼彻斯特编解码主要有高速单片机实现和FPGA/CPLD实现两种。

2.2.1单片机实现

单片机实现曼彻斯特编解码功能,是比较常见的。

一般AVR单片机实现曼彻斯特编解码中接受监视器的单片机程序需要完成数据接收、曼彻斯特编解码、数据处理、显示、异常情况报警等任务。

在接收数据时,因为小功率无线传输通道干扰比较严重,单片机又对所有的ICP1引脚跳变沿都响应,它的中断级别又比较高。

这些都很大程度上加大了单片机的负担,严重时会造成单片机的其它任务得不到执行。

而且在利用单片机或专用芯片进行编解码时,对传输的数据只能进行奇偶校验,在条件比较恶劣的场合,特别是在无线通信,数据极易出错,奇偶校验不能检测出这类突发性错误;再者单片机的串口通信和专用芯片在传输速率和每帧的有效数据位数等方面都作了严格的限制。

因此,还有在要求高速传输速率的场合,单片机和专用芯片都难以实现[6]。

2.2.2FPGA/CPLD实现

在现代电子设计领域,VHDL和现场可编程逻辑器件的广泛应用使数字系统设计更为灵活,大大缩短了开发周期。

现场可编程逻辑门阵列(FieldProgrammableGateArray:

FPGA)是新型的高密度可编程逻辑器件。

它是可编程阵列逻辑(PAL),门阵列逻辑(GAL)等逻辑器件的基础上发展起来的,同以往的PAL,GAL想比较,FPGA的规模较大,适合于时序、组合等逻辑电路应用场合,它可以替代几十甚至上百块通用ASIC芯片,这种芯片具有可编程性和实现方案可重构的特点。

FPGA器件的主要优点:

功能集成度高,系统设计快,设计灵活,可靠性高,费用低。

2.2.3方案选择

综上所述,本设计采用基于FPGA的设计方案,充分利用FPGA功能集成度高,系统设计快,设计灵活等优越性,大大提高设计的周期,减少PCB面积。

3.FPGA原理及平台简介

目前以硬件描述语言(VerilogHDL或VHDL)所完成的电路设计,可以经过简单的综合与布局,快速的烧录至FPGA上进行测试,是现代IC设计验证的技术主流。

这些可编辑器件可以被用来实现一些基本的逻辑门电路(比如AND、OR、XOR、NOT)或者更复杂一些的功能电路,比如解码器或数学方程式。

在大多数的FPGA里面,这些可编辑的元件里也包含记忆元件例如触发器(Flip-flop)或者其他更加完整的记忆块。

FPGA采用了逻辑单元阵列LCA(LogicCellArray)模型,内部包括可配置逻辑模块CLB(ConfigurableLogicBlock)、输出输入模块IOB(InputOutputBlock)和内部连线(Interconnect)三个部分[7],图3-1是FPGA的结构图。

图3-1FPGA结构图

3.1FPGA原理与特点

大部分FPGA器件采用了查找表结构,查找表的原理类似于ROM,其物理结构是静态储存器(SRAM),N个输入项的逻辑函数可以由一个2N位容量的SRAM来实现,函数值存放在SRAM中,SRMA的地址线起输入线作用,地址即输入变量值,SRMA的输出为逻辑函数值,由连线开过实现与其他功能的连接。

而实际上FPGA器件的查找表的输入项一般不超过5个,多于5个输入变量的逻辑函数由多个查找表组合或级联实现。

FPGA利用小型查找表(16×1RAM)来实现组合逻辑,每个查找表连接到一个D触发器的输入端,触发器再来驱动其他逻辑电路或驱动I/O,由此构成了既可实现组合逻辑功能又可实现时序逻辑功能的基本逻辑单元模块,这些模块间利用金属连线互相连接或连接到I/O模块。

FPGA的逻辑是通过向内部静态存储单元加载编程数据来实现的,存储在存储器单元中的值决定了逻辑单元的逻辑功能以及各模块之间或模块与I/O间的连接方式,并最终决定了FPGA所能实现的功能,FPGA可以进行数十万次的编程。

用户可对FPGA内部的逻辑模块和I/O模块重新配置,以实现用户的逻辑,因而也被用于对CPU的模拟。

用户对FPGA的编程数据放在Flash芯片中,通过上电加载到FPGA中,对其进行初始化。

也可在线对其编程,实现系统在线重构,这一特性可以构建一个根据计算任务不同而实时定制的CPU,这是当今研究的热门领域。

和其他可编程逻辑器件一样,FPGA也由未完成的逻辑阵列所组成,通过将这些逻辑阵列连接到一起来完成一定的功能。

像PAL一样,各个阵列单元之间的互连是可以编程的。

FPGA采用了逻辑单元阵列结构,内部包括可配置逻辑模块CLB、输出输入模块IOB和内部连线三个部分。

FPGA的基本特点主要有:

1、采用FPGA设计ASIC电路,用户不需要投片生产,就能得到合用的芯片。

2、FPGA可做其它全定制或半定制ASIC电路的中试样片。

3、FPGA内部有丰富的触发器和I/O引脚。

4、FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。

5、FPGA采用高速CHMOS工艺,功耗低,可以与CMOS、TTL电平兼容。

FPGA是由存放在片内RAM中的程序来设置其工作状态的,因此,工作时需要对片内的RAM进行编程。

用户可以根据不同的配置模式,采用不同的编程方式。

加电时,FPGA芯片将EEPROM中数据读入片内编程RAM中,配置完成后,FPGA进入工作状态。

掉电后,FPGA恢复成白片,内部逻辑关系消失,因此,FPGA能够反复使用。

这样,同一片FPGA不同的编程数据可以产生不同的电路功能,因此FPGA的使用非常灵活。

FPGA提供了一种"自顶向下"的全新的设计方法。

这种设计方法首先从系统设计入手,在顶层进行功能方框图的划分和结构设计,再对图表进行仿真、纠错,并用硬件描述语言对高层次的系统行为进行描述,在系统级进行验证。

然后用综合优化工具生成具体门电路的网表,其对应的物理实现级可以是印刷电路板或专用集成电路。

由于设计的主要仿真和调试过程是在高层次上完成的,这不仅有利于早期发现结构设计上的错误,避免设计工作的浪费,而且也减少了逻辑功能仿真的工作量,有效降低设计风险。

3.2QuartusII及HDL语言

QuartusII是Altera公司的CPLD/FPGA集成开发软件,具有完善的可视化设计环境,并具有标准的EDA工具接口。

它支持原理图、VHDL、VerilogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程[9]。

3.2.1基于QuartusII的FPGA设计

QuartusII为硬件电路的设计提供了很大的方便。

FPGA之所以能够广泛应用于电路设计中,就是因为它们有使用相当方便的开发软件工具包,通过编程工具和软件的配合使用,对器件芯片可以进行流畅的开发、校验。

FPGA特别适用于正向设计,即从电路原理图或各种硬件描述语言到芯片成品的设计,在这些设计流程中,设计人员对特别底层的硬件知识并不需要特别的了解和掌握,完全可以从功能应用出发,根据任务需求,自顶向下地进行电路设计,图3-2为QuartusII设计开发流程图,具体如下:

1、设计输入(DesignEntry)

运用电路原理图输入、HDL文本输入等方式,表达设计思想,指定所用HIGA器件的型号,分配其外部管脚。

包括原理图输入、HDL文本输入、EDIF网表输入及波形输入等几种方式。

2、编译(Compilation)

先根据设计要求设定编译方式和编译策略,如器件选择、逻辑综合方式的选择等。

然后根据设定的参数和策略对设计项目进行网表提取、逻辑综合、器件适配,并产生报告文件、延时信息文件以及编程文件,供分析、仿真和编程使用。

3、仿真(Simulation)

仿真包括功能仿真、时序仿真和定时分析,用以验证设计项目的逻辑功能和时序关系的正确性。

功能仿真验证电路功能是否符合设计要求;时序仿真包含了延时信息,能较好反映芯片的实际工作情况。

仿真一般按如下步骤进行:

(1)新建波形编辑文件;

(2)设置仿真时间区域;保存文件;

(3)导入欲观察的信号节点;编辑激励信号;

(4)设置数据格式;设置仿真器参数;

(5)启动仿真和观察仿真结果。

4、编程与验证(ProgramandVerification)

成功编译后,将生成的编程文件下载到目标FPGA系统中调试;调试成功后,烧写到FPGA的配置芯片中。

用得到的编程文件通过编程电缆配置PLD,加入实际激励,进行在线测试。

设计过程中,如果出现错误,这需要重新回到设计输入阶段,改正错误或调整电路后重复上述过程。

图3-2QuartusII设计开发流程

3.2.2VerilogHDL简介

VerilogHDL是在用途极为广泛的C语言的基础上发展起来的一种硬件描述语言,它是由GDA(GatewayDesignAutomation)公司的PhilMoorby在1983年末首创的,最初只设计了一个仿真与验证工具,之后又陆续开发了相关的故障模拟与时序分析工具。

1985年Moorby推出它的第三个商用仿真器Verilog-XL,获得了巨大的成功,从而使得VerilogHDL迅速得到推广应用。

1989年Cadence公司收购了GDA公司,使得VerilogHDL成为了该公司的独家专利。

1990年CADENCE公司公开发表了VerilogHDL,并成立LVI组织以促进VerilogHDL成为IEEE标准,即IEEEStandard1364-1995.

VerilogHDL的最大特点就是易学易用,如果有C语言的编程经验,可以在一个较短的时间内很快的学习和掌握。

VerilogHDL主要特性:

●基本逻辑门,例如and、or和nand等都内置在语言中。

开关级基本结构模型,例如PMOS和NMOS等也被内置在语言中。

●用户定义原语(UDP)创建的灵活性。

用户定义的原语既可以是组合逻辑原语,也可以是时序逻辑原语。

●时延描述:

提供显式语言结构指定设计中的端口到端口的时延及路径时延和设计的时序检查。

●描述方式:

可采用三种不同方式或混合方式对设计建模。

这些方式包括:

行为描述方式—使用过程化结构建模;数据流方式—使用连续赋值语句方式建模;结构化方式—使用门和模块实例语句描述建模。

在行为级描述中,VerilogHDL不仅能够在RTL级上进行设计描述,而且能够在体系结构级描述及其算法级行为上进行设计描述。

同时,VerilogHDL支持混合方式建模,即在一个设计中每个模块均可以在不同设计层次上建模。

●数据类型:

VerilogHDL中有两类数据类型:

线网数据类型和寄存器数据类型。

线网类型表示构件间的物理连线,而寄存器类型表示抽象的数据存储元件。

●层次设计:

能够描述层次设计,可使用模块实例结构描述任何层次,设计能够在多个层次上加以描述,从开关级、门级、寄存器传送级(RTL)到算法级,包括进程和队列级,能够使用内置开关级原语在开关级对设计完整建模。

能够使用门和模块实例化语句在结构级进行结构描述。

VerilogHDL不再是某些公司的专有语言而是IEEE标准。

设计的规模可以是任意的;语言不对设计的规模(大小)施加任何限制。

●功能扩展:

VerilogHDL语言的描述能力能够通过使用编程语言接口(PLI)机制进一步扩展。

PLI是允许外部函数访问Verilog模块内信息、允许设计者与模拟器交互的例程集合。

●测试仿真:

可用于生成模拟激励和指定测试的验证约束条件,例如输入值的指定。

VerilogHDL能够监控模拟验证的执行,即模拟验证执行过程中设计的值能够被监控和显示。

这些值也能够用于与期望值比较,在不匹配的情况下,打印报告消息。

4.系统总体设计

基于现场可编程门阵列(FPGA),研究曼彻斯特编解码器的实现,采用VerilogHDL硬件描述语言进行电路建模并测试。

本设计包含编码和解码两个模块。

曼彻斯特的编码一次发送11位数据,其中编码头3位,为111,8位有效数据,奇校验1位;曼彻斯特解码一次接收11位数据,其中编码头3位,为111,有效码8位,奇校验位1位。

4.1编码器

编码过程可分为三部分:

1)检测编码周期是否开始,产生同步字头;2)进行输入数据的曼彻斯特编码;3)产生奇偶校验位并对其进行编码,编码周期结束。

下面是曼彻斯特编码结构图。

由于曼彻斯特编码是将NRZ普通二进制数据与其位率时钟信号相异或而得,因此,首先要产生位率时钟信号,同时,要解决位率时钟与NRZ码的同步问题,保证NRZ每个码元宽度占用一个周期的位率时钟信号,并且保证NRZ码元输入时,立即产生位率时钟,这样就可以保证位率时钟与NRZ码的同步。

保证了位率时钟与NRZ码同步,然后将NRZ码与位率时钟异或,便可以得到最终的曼彻斯特编码。

本设计是在第一个位率时钟下降沿开始产生曼彻斯特编码,在位率时钟出现下降沿时,将NRZ码与位率时钟异或,相当于与“0”异或,在位率时钟出项上升沿时,将NRZ码与位率时钟异或,相当于与“1”,输入8位NRZ码,产生16位曼彻斯特编码,最终输出转换完成标志位[10]。

图4-1曼彻斯特编码

编码过程包含了发送信号电平沿检测模块、曼彻斯特编码模块、时钟分频模块和数据位发送技术模块。

编码电路模块提供时钟源,并且对输入的待传送原码进行编码,将其转换成曼彻斯特码并发送。

      发送信号电平沿检测模块主要功能就是检测mfs信号上升沿,当检测到mfs上升沿后使能时钟信号clk1x_en。

程序如下:

always@(posedgeclk16xornegedgerst)

begin

if(!

rst)

begin

mfs1<=1'b0;

mfs2<=1'b0;

end

else

begin

mfs2<=mfs1;

mfs1<=mfs;

end

end

时钟分频模块,当检测到mfs上升沿后使能时钟信号clk1x_en;当数据发送完成时,失能clk1x_en。

其中含有16位时钟分频,将clk16x经16分频得单倍时钟clk1x。

在复杂时序电路设计中通过引入时钟使能信号可减少设计中的时钟信号,提高电路的可靠性。

程序如下:

always@(posedgeclk16xornegedgerst)

begin

if(!

rst)

clk1x_en<=1'b0;

elseif(mfs1==1'b1&&mfs2==1'b0)//检测到mfs上升沿时,使能clk1x_en

clk1x_en<=1'b1;

elseif(bit_cont==4'b1011)//当数据发送完成时,失能clk1x_en

clk1x_en<=1'b0;

end

//16时钟分频

always@(posedgeclk16xornegedgerst)

begin

if(!

rst)

clkdiv<=4'b0000;

elseif(clk1x_en==1'b1)

clkdiv<=clkdiv+1'b1;//16分频计数

else

clkdiv<=4'b0000;

end

assignclk1x=clkdiv[3];//clk16x经16分频得单倍时钟clk1x

数据位发送计数模块根据时钟信号发送数据给编码器,达到同步,并同时进行计数。

图4-2编码器RTL模块图

曼彻斯特编码模块,当检测到mfs上升沿时将mdata数据送mbuf缓存。

一次发送11位数据,其中编码头3位,为111,8位有效数据,奇校验位1位,再进行曼彻斯特的数据编码。

程序见附录。

4.2解码器

曼彻斯特解码是分曼彻斯特信号电平沿检测模块、时钟分频模块和曼彻斯特解码模块三个模块组成的。

时钟分频模块的作用是将时钟信号分频后,产生一个与曼彻斯特码新号同频的时钟信号和一个16倍曼彻斯特码信号

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1