VHDL乒乓球游戏设计.doc

上传人:知****量 文档编号:18877092 上传时间:2022-06-02 格式:DOC 页数:33 大小:508.87KB
返回 下载 相关 举报
VHDL乒乓球游戏设计.doc_第1页
第1页 / 共33页
VHDL乒乓球游戏设计.doc_第2页
第2页 / 共33页
点击查看更多>>
资源描述

《VHDL乒乓球游戏设计.doc》由会员分享,可在线阅读,更多相关《VHDL乒乓球游戏设计.doc(33页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、目录1引言12 VHDL简介22.1 VHDL的特点及优点22.2设计流图33模块设计63.1七段数码管显示译码器73.2按键去抖电路93.3状态机设计113.3.1状态机的6种状态及状态转移113.3.2状态机/球台控制程序123.4记分器设计174系统硬件测试204.1 GW48系统的主要性能和特点204.2 FPGA目标芯片管脚图204.3系统的编译、综合、适配224.4系统的有关仿真244.5系统的编程配置265结论28参考文献29致谢30摘 要VHDL是甚高速集成电路硬件描述语言。目前,VHDL已成为许多设计自动化工具普遍采用的标准化硬件描述语言。VHDL语言功能性强,覆盖面广,灵活

2、性高,具有很好的实用性。本文设计一个基于VHDL的乒乓游戏机,乒乓游戏机由状态机、记分器、译码显示器与按键去抖等部分所组成。通过对各部分编写VHDL程序,然后进行编译、仿真、逻辑综合、逻辑适配,最后进行编程下载,并且通过GW48型EDA实验箱的验证,实现乒乓游戏机的基本功能。关键词:VHDL;GW48;乒乓游戏机AbstractVHDL is high speed IC hardware describe language. VHDL already becomes the language of normalizing hardware describe that a lot of desi

3、gn automation implement adopts commonly at present. The VHDL language function is strong. The face covering is broad, flexibility high and have the very good pragmatism. One main body of the book is designed waits for what part group is accomplished owing to that VHDL table tennis game machine, tabl

4、e tennis game machine go to tremble from state machine, marker, decoding display and button. By compiling and composing VHDL procedure to every part, then compiling, simulate, logic synthesis, logic fitting. Carry out programming time be loaded with finally. Then verification and by GW48 type EDA ex

5、periment box, realize table tennis game machines fundamental function.Key words: VHDL; GW48; Table tennis game machineii1引言随着社会的进步和工业技术的发展,在电子线路设计领域中,设计自动化工具已经逐步为设计者所接受,成为主要的设计手段。目前,VHDL已成为许多设计自动化工具普遍采用的标准化硬件描述语言,掌握VHDL语言,用VHDL语言设计电子线路,是电子线路设计者必须掌握的基本技能。VHDL支持数字电路的开发环境,VHDL也支持各种设计方法:自顶向下、自底向上或混合的方法1

6、。VHDL语言功能性强,覆盖面大,灵活性高,具有很好的实用性2。本文设计一个基于VHDL的乒乓游戏机,乒乓游戏机是由5个发光二极管代表乒乓球台,中间的发光二极管兼作球网,用点亮的发光二极管按一定方向移动来表示球的运动。在游戏机的两侧各设置两个开关,甲乙二人按乒乓球比赛规则来操作开关。本设计由译码显示器、记分器、状态机/球台控制器与按键去抖等部分组成。本设计是用实验箱GW48进行模拟乒乓机,用发光二极管代表乒乓球台,最中间的发光二极管作球网,用点亮的发光二极管按一定方向移动来表示球的运动,用按钮设置发球和接球开关。设计总体要求:乒乓机能模拟乒乓球比赛的基本过程和规则,并能自动裁判和记分。本设计的

7、主要任务和要求如下:(1)使用乒乓机的甲乙双放在不同的位置发球或击球。(2)乒乓球的位置和移动方向由灯亮及依次点亮的方向决定。球的速度为0.1s-0.5s移动1位。球过网,接球方向即可击球,提前击球或没击球均判失分。(3)比赛按21分为一局进行,甲乙双方都应设置自己的记分牌,任何一方先记满21分,该方就算胜出,按RESET复位重新开局。2VHDL简介VHDL是Very high speed integrated circuit Hardware Description Language的缩写,即“甚高速集成电路硬件描述语言”,最初由美国国防部和INTER、IBM、TI公司联合开发,1987年成

8、为IEEE标准,即IEEE1076标准(俗称87版VHDL)1。此后,美国国防部要求官方与高速集成电路设计的所有文档必须用VHDL描述,因为VHDL在电子设计领域得到了广泛的应用,渐渐成为工业界的标准。1993年,IEEE对VHDL进行了修订,公布了新的VHDL标准,即IEEE1076-1993版(俗称93版VHDL)3。2.1VHDL的特点及优点VHDL具有以下特点4:(1)支持“自顶向下”的设计方法:设计可按层次分解,采用结构化开发手段,可实现多人、多任务的并行工作方式,使系统的设计效力大幅提高。(2)系统硬件描述能力强:可以同时支持“行为描述”、“数字流描述”和“结构描述”3种描述方式,

9、并可混用5。其中,强大的“行为描述”能力使设计者可以避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统。这一特点使VHDL成为系统设计领域中最佳的硬件描述语言。(3)系统仿真能力强:VHDL最初是作为一种仿真标准问世的,因此VHDL具有仿真语句和库函数。另外,VHDL强大的“行为描述”能力也使其十分适用于系统级仿真。(4)工艺无关性6:在使用VHDL设计系统硬件时,没有嵌入与工艺相关的信息。正因为VHDL的硬件描述与具体工艺无关,因而其程序的硬件实现目标器件有广阔的选择范围,其中包括各种CPLD、FPGA及ASIC等。同时,VHDL具有以下优点7:(1)与其他的硬件描述语言相比,VHDL

10、具有更强的行为描述能力。强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。就目前流行EDA工具和VHDL综合器而言,将基于抽象的行为描述风格的VHDL程序综合成为具体FPGA和CPLD等目标器件的网表文件已不成问题,只是在综合与优化效率上略有差异。(2)VHDL具有丰富的仿真语句和库函数,使得在任何大系统的设计早期,就能查验设计系统的功能可行性,随时可对系统进行仿真模拟,使设计者对整个工程的结构和功能可行性做出判断。(3)VHDL语句的行为描述能力和程序结构,决定了它具有支持大规模设计的分解和已有设计的再利用功能。高效、高速完成符号市场需求的大规模系统设计

11、必须有多人甚至多个开发组共同并行工作才能实现。VHDL中设计实体的概念、程序包的概念、设计库的概念为设计的分解和并行工作提供了有利的支持。(4)用VHDL完成一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动把VHDL描述设计转变成门级网表(根据不同的芯片)。这种方式突破了门级设计的瓶颈,极大地减少电路设计的时间和可能发生的错误,降低了开发成本。利用EDA工具的逻辑优化功能,可以自动地把一个综合后的设计变成一个更小、更高速的电路系统。反过来,设计者还可以容易地从综合和优化的电路获得设计信息,返回去修改VHDL设计描述,使之更加完善。(5)VHDL对设计的描述具有相对独立性。设计者可以

12、不懂硬件的结构,也不必管最终设计的目标器件是什么,而进行独立的设计。正因为VHDL的硬件描述与具体的工艺技术和硬件结构无关,所以VHDL设计程序的硬件实现目标器件有广阔的选择范围,其中包括各种系列的CPLD、FPGA及各种门阵列器件。(6)VHDL具有类属描述语句和子程序调用等功能,对于完成的设计,在不改变源程序的条件下,只需改变类属参量或函数,就能轻易地改变设计的规模和结构。正因为VHDL有如此多的特点和优点,所以本设计运用VHDL进行乒乓球游戏机软设计。2.2设计流图设计流程图如图1所示。这一流程图基本可使用任何基本硬件描述语言的设计。下面对这个流程中的步骤进行说明1:(1)系统层次划分/

13、画出系统框图(Hierarchy/Block Diagram):按照“自顶向下”的设计方法对系统进行划分(确定系统由哪些模块构成,各个模块又由哪些子模块构成)。(2)编码:写出VHDL代码,大多数集成开发环境(如MAX+plus2等)都集成了针对VHDL的编辑。这些编辑器一般都具有VHDL关键词的亮点显示等特点,有的还内嵌了常用的VHDL程序模块。图1 VHDL的设计流程图(3)编译(Compilation):编译器会对VHDL程序进行语法检查,还会产生用于仿真的一些内部信息。这一步骤通常由编译器自动完成,无须我们干预。如果VHDL语言有错误,编译无法通过,则需要修改程序,即回到第(2)步。事

14、实上,VHDL设计过程中,常常根据需要往后退一步,甚至更多。(4)功能仿真(Functional Simulation):VHDL仿真器允许定义输入并应用到设计中,不必生成实际电路就可以观察输出。此仿真主要用于检验系统功能设计的正确性,不涉及具体器件的硬件特性。(5)综合(Synthesis):利用综合器对VHDL代码进行综合优化处理,生成门级描述的网表文件,这是将VHDL语言描述转化为硬件电路的关键步骤。这一步通常由综合器自动完成,但设计者可以设定一些技术上的约束条件(如限定逻辑层次的最大数等)来“帮助”综合器。(6)适配(Fitting):利用适配器将综合后的网表文件针对某一具体的目标器件

15、进行逻辑映射操作,包括底层器件配置、逻辑分割、逻辑优化、布局布线等。此步骤将产生多项设计结果:适配报告,包括芯片内部资源的利用情况、设计的布尔方程描述情况等;适配后的仿真模型;器件编程文件。(7)时序仿真(Timing Simulation):根据适配后的仿真模型,可以进行时序仿真。因为这时已经得到目标器件的实际硬件特性(如时延特性等),所以仿真结果能比较精确的预期芯片的实际性能。如果仿真结果达不到设计要求,就需要修改VHDL源代码或选择不同的目标器件,甚至要重构整个系统,图1就是所设计者极力避免出现的情况。(8)下载CPLD/FPGA(Programming):如果时序仿真通过,就可将“适配

16、”时产生的器件编程文件下载到CPLD或FPGA中(FPGA的编程通过被称为“配置”)。虽然流程图中未标出从此步“往回走”的箭头,但事实上,实际的结果有可能与仿真结果有差异(可能是设计时未考虑到外部硬件的实际情况;也可能是由于仿真时测试的条件不够多,没有发现其中隐藏的错误),这时,必须回头重新找出问题所在。3模块设计乒乓游戏机的组成示意图如图2所示。图2 乒乓游戏机的组成示意图本设计中的乒乓游戏机是由5个发光二极管代表乒乓球台,中间的发光二极管兼作球网,用点亮的发光二极管按一定方向移动来表示球的运动。在游戏机的两侧各设置两个开关,一个是发球开关STARTA、STARTB;另一个是击球开关HITA

17、、HITB。甲乙二人按乒乓球比赛规则来操作开关。当甲方按动发球开关STARTA时,靠近甲方的第一个发光二极管亮,然后发光二极管由甲向乙依次点亮,代表乒乓球的移动。当球过网后按设计者规定的球位,乙方就可以击球。若乙方提前击球或没有击中球,则判乙方失分,甲方的记分牌自动加一分。然后重新发球,比赛继续进行。比赛一直要进行到一方记分牌达到21分,该局才结束。本设计由译码显示器、按键去抖、状态机/球台控制器和记分器等部分所组成。本系统的逻辑分框图如图3所示。图3 系统逻辑分框图3.1七段数码管显示译码器七段数码是纯组合电路,通常的小规模专用IC,如74或4000系列的器件只能作十进制BCD码译码,然而数

18、字系统中的数据处理和运算都是2进制的,所以输出表达都是16进制的,为了满足16进制数的译码显示,最方便的方法就是利用VHDL译码程序在FPGA或CPLD中实现。七段数码管分为共阴极和共阳极两种8。简而言之,对共阴极来说,公共引脚要接地,想要点亮某段数码管,就在相应的引脚加上高电平;对共阴极来说刚好相反,公共引脚提高电平,想要点亮某段数码管,就在相应的引脚加上低电平9。七段BCD码译码器的设计,输出信号LED7S的7位分别接如图4所示数码管的七个段,高位在左,低位在右9。例如当LED7S输出为“1101101” 时,数码管的7个段:g、f、e、d、c、b、a分别接1、1、0、1、1、0、1,接有

19、高电平的段发亮,于是数码管显示“5”。带使能信号EN的译码电路的VHDL程序中,EN为高电平时,译码器正常工作;EN为低电平时,译码器输出0000000,表示数码管无显示。用选择信号赋值语句描述,将综合成组合逻辑电路。图4 共阴数码管及电路图5 多模块共同控制七段数码管译码电路示意图 带使能信号EN的译码电路的VHDL程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DISPLAY IS PORT(EN: IN STD_LOGIC;NUM: IN INTEGER RANGE 0 TO 15;DISPLAY: OUT STD_LOGIC_V

20、ECTOR (0 TO 6);END;ARCHITECTURE DECODER OF DISPLAY ISBEGINPROCESS (EN, NUM)BEGIN IF EN= 1 THEN -使能信号EN为1时,译码器正常工作CASE NUM IS WHEN 0=DISPLAYDISPLAYDISPLAYDISPLAYDISPLAYDISPLAYDISPLAYDISPLAYDISPLAYDISPLAY=”0000000”;END CASE; ELSE DISPLAY=”0000000”; -EN为0,数码管无显示END IF;END PROCESS;END;值得注意的是,本程序是组合逻辑电路,

21、PROCESS的敏感信号参数表中一定要有NUM;否则编译时会提示如下出错信息:“Else Clause following a Clock edge must hold the state of signal Display”。出现此提示信息的原因是:综合器将EN误判为时钟信号,并试图将程序综合成时序逻辑电路,但该程序的格式又不符合综合器对时钟信号描述的要求,因此无法综合。3.2按键去抖电路键盘的按键闭合与释放瞬间,输入的信号会有毛刺。如果不进行消抖处理,系统会将这些毛刺误以为是用户的另一次输入,导致系统的误操作。防抖电路有很多种,最简单、最容易理解的就是计数法。其原理是对键值进行计数,当某一

22、键值保持一段时间不改变时(计数器达到一定值后),才确认它为有效值;否则将其判为无效键值,重新对键值进行计算2。下面是基于计数法的防抖电路程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTUTY ANTITWITTER ISPORT(CLOCK: IN STD_LOGIC;NUMIN: IN INTEGER RANGE 0 TO 15;NUMOUT: OUT INTEGER RANGE 0 TO 15);END;ARCHITECTURE BEHAVIOR OF ANTITWITTER ISSIGNAL TEMPNUM: INTEGER RANGE 0

23、TO 15;SIGNAL COUNTER: INTEGER RANGE 0 TO 31;SIGNAL START: STD_LOGIC;BEGINPROCESS (CLOCK)BEGINIF RISING_EDGE (CLOCK) THEN IF START=0THEN -上电后立即对输出的键值赋予无效值TEMPNUM=15; -此处沿将15作为无效值 NUMOUT=15; -此无效值务必随实际情况改变 START = 1; ELSE IF NUMIN=TEMPNUM THEN -上一键值与此键值不同 TENPNUM=NUMIN; -记录此键值 COUNTER= 0; -并对计数器清0,准备对

24、此键值计时 ELSE IF COUNTER31 THEN; -当键值保持31个时钟周期不变时 NUMOUT=NUMIN; -即确定为有效键值,并输出 COUNTER= 0; ELSE COUNTER=COUNTER+1; END IF;END IF; END IF;END IF;END PROCESS;END;3.3状态机设计3.3.1状态机的6种状态及状态转移本状态机有6种状态,分别是WAITSTATE、ATOB、BTOA、ASCORE、BSCORE和FINALRESULT,其含义如表1所示。表1 状态机的6种状态及含义状 态含 义WAITSTATE等待状态,等待A或B方开球ATOB球从A向

25、B方移动BTOA 球从B向A方移动ASCOREA得一分BSCOREB得一分FINALRESULT比赛结束(最终判分),在此状态下需要按复位键,才能开始下一轮比赛结合表1,从图6中很清楚地看出乒乓游戏机比赛过程中球的移动情况,及加分方法,还可以初步了解到本状态机设计的基本思路。图6 乒乓游戏机状态转移图3.3.2状态机/球台控制程序状态机是种很重要的时序电路,也是本设计的核心部件。状态机属于时序电路范畴,实现一个控制功能更为方便,并提高了控制速度10。本次设计中状态机的符号如图7所示。图7 状态机符号在本设计中,状态机用两个信号表示状态:STATE表示当前状态, TABLESTATE表示下一个状

26、态。此状态机由两个进程构成,状态机的输入/输出引脚的作用如表2所示。其中SCOREAL3.0、SCOREAH3.0、SCOREBL3.0、SCOREBH3.0用七段BCD码译码器显示得分情况,而SCOREA、SCOREB用二进制进行加分,由记分器反馈回来。表2 输入/输出引脚的作用引 脚作 用CLK10Hz的时钟,可由系统时钟分频得到。此时时钟决定了球移动的速度, 可根据实际需要调整。RESET复位键,比赛重新开始,记分器清0STARTA、STARTBA和B双方的开始的开球键HITA、HITB A和B双方的击球键(可以将其与开球键合并)CLEAR 将记分器清0(给记分器的控制信号)INCREA

27、SEA 、INCREASEB分别为A、B双方的加分信号(给记分器的控制信号)SCOREAL3.0SCOREAH3.0SCOREBL3.0SCOREBH3.0SCOREA、SCOREBA、B双方的分数(由记分器给出)LIGHT4.0接5个发光二极管AWIN、BWIN分别接发光二极管,表示A或B方胜出状态机的程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY STATEMACHINE ISPORT (CLK: IN STD_LOGIC; RESET: IN STD_LOGIC; S

28、TARTA, HITA, STARTB, HITB: IN STD_LOGIC;SCOREA, SCOREB: IN INTEGER RANGE 0 TO 21; CLEAR, INCREASEA, INCREASEB: OUT STD_LOGIC; TABLELIGHT: OUT STD_LOGIC_VECTOR (0 TO 4); AWIN, BWIN: OUT STD_LOGIC);END;ARCHITECTURE BEHAVIOR OF STATEMACHINE ISTYPE STATE_TYPE IS (WAITSTATE, ATOB, BTOA, ASCORE, BSCORE, F

29、INALRESULT);SIGNAL STATE: STATE_TYPE;SIGNAL TABLESTATE: INTEGER RANGE 0 TO 4;BEGINPROCESS (CLK, RESET)BEGIN IF RESET=1 THEN -按下复位键,比赛开始 STATE=WAITSTATE; -进入等待状态 CLEAR=1; -记分器清零 AWIN=0;BWIN CLEAR=0; INCREASEA=0; INCREASEB=0; IF(SCOREA =21 ) OR (SCOREB=21))THEN-如果一方先得到21分STATE=FINALRESULT; -比赛结束 ELSE

30、IF STARTA=1THEN -如果A开球 STATE=ATOB; -球从A向B方移动 TABLESTATE=0; -A方第一个灯点亮 ELSE IF STARTB=1THEN -如果B开球(A、B开球有-定的优先级区别 STATE=BTOA; -球从B向A方移动 TABLESTATE=4; -B方第一个灯亮 ELSE STATE -球从A向B移动的过程 IF HITB=1THEN -如果检测到B方击球 IF TABLESTATE=2 THEN -若未过网提前击球 STATE=ASCORE; -判为A胜 ELSE STATE=BTOA; -若过了网击球,球从B-向A移动 END IF; EL

31、SE -若未检测到B方击球 IF TABLESTATE=4 THEN -如果离B方最近的灯-已经亮 STATE=ASCORE; -判为A胜 ELSE TABLESTATE -球从B向A移动的过程 IF HITA=1THEN -如果检测A方击球 IF TABLESTATE=2 THEN -若未过网提前击球 STATE=BSCORE; -判为B胜 ELSE -若过了网击球,球从A STATE=ATOB; -向B移动 END IF; ELSE -若未检测到A击球 IF TABLESTATE=0 THEN -如果离A最近的灯亮了 STATE=BSCORE; -判为B胜 ELSE TABLESTATE

32、-如果A胜 INCREASEA=1; -A方加1分 STATE -如果B胜 INCREASEB=1; -B方加1分 STATE -最后结果 IF(SCOREA=21) THEN -若A方先达到21分 AWIN=1; -表示A方胜出的灯亮 ELSE BWIN STATETABLELIGHTTABLELIGHTTABLELIGHTTABLELIGHTTABLELIGHTTABLELIGHT=00000; END CASE; ELSE TABLELIGHT=00000; END IF; END IF; END PROCESS; END;3.4记分器设计图8 记分器元件符号记分器元件符号如图8所示,本

33、设计中记分器比较简单,只须根据状态机给出的两个信号(INCREASEA和INCREASEB)对六个分数(SCOREAL、SCOREAH和SCOREBL、SCOREBH、SCOREA、SCOREB)进行操作,记分器的程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COUNTER ISPORT (CLK: IN STD_LOGIC;CLEAR: IN STD_LOGIC;INCREASEA, INCREASEB: IN STD_LOGIC;SCOREAL, SCOREAH, S

34、COREBL, SCOREBH: BUFFERSTD_LOGIC_VECTOR (3 DOWNTO 0)SCOREA,SCOREB:BUFFER INTRGER RANGE 0 TO 21);END;ARCHITECTURE COUNT OF COUNTER ISBEGIN PROCESS (CLK, CLEAR) ISBEGIN IF CLEAR=1 THEN -清0 SCOREAL=0000; SCOREAH=0000; SCOREBL=0000; SCOREBH=0000; SCORES=0; SCOREB=0; ELSIF FALLING_EDGE (CLK) THEN IF INCR

35、EASEA=1 THEN -A方加1分 IF SCOREAH0010 THEN -若高位小于2 IF SCOREAL1001 THEN -如果低位小于9SCOREAL=SCOREAL+1; -则低位加1 ELSE SCOREAL=0000; -当低位为9,则清0 SCOREAH=SCOREAH+1; -高位加1 END IF; ELSIF SCOREAH= 0010 THEN -若高位为2 IF SCOREAL0001 THEN -如果低位小于1SCOREAL=SCOREAL+1; -则低位加1 ELSE SCOREAL=0000; -否则高位、低位都清0 SCOREAH=0000;END I

36、F; END IF;SCOREA=SCOREA+1; ELSIF INCREASEB=1 THEN IF SCOREBH2 THEN -若高位小于2 IF SCOREBL1001 THEN -如果低位小于9SCOREBL=SCOREBL+1; -则低位加1 ELSE SCOREBL=0000; -当低位为9,则清0 SCOREBH=SCOREBH+1; -高位加1 END IF; ELSIF SCOREBH=0010 THEN -若高位为2 IF SCOREBL0001 THEN -如果低位小于1SCOREBL=SCOREBL+1; -则低位加1 ELSE SCOREBL=0000; -否则高位、低位都清0 SCOREBH=0000; END IF; END IF; SCOREB=SCOREB+1; END IF; END IF; END PROCESS;END;编写VHDL源程序后,不能将设计文本存入根目录下,本设计都存在文件夹CHENLY中,还要注意设计文本的后缀名一定是“.VHD”,编写时一定要注意实体名跟设计文件名一致,这些是程序能顺利进行编辑和编译、逻辑综合、逻辑适配、编程下载成功的最重要的前提条

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

当前位置:首页 > 应用文书 > 工作计划

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

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