基于FPGA的信号发生器的设计6波形.doc

上传人:知****量 文档编号:91634163 上传时间:2023-05-27 格式:DOC 页数:30 大小:306KB
返回 下载 相关 举报
基于FPGA的信号发生器的设计6波形.doc_第1页
第1页 / 共30页
基于FPGA的信号发生器的设计6波形.doc_第2页
第2页 / 共30页
点击查看更多>>
资源描述

《基于FPGA的信号发生器的设计6波形.doc》由会员分享,可在线阅读,更多相关《基于FPGA的信号发生器的设计6波形.doc(30页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、郑州轻工业学院电子技术课程设计 题 目 _ _ 学生姓名 专业班级 学 号 院 (系) 电气信息工程学院 指导教师 完成时间 2012年06月22日 基于FPGA的函数发生器设计郑州轻工业学院课 程 设 计 任 务 书题目 基于FPGA的信号发生器设计 专业、班级 学号 姓名 主要内容、基本要求、主要参考资料等:主要内容:要求学生使用硬件描述语言设计信号发生器的FPGA源程序,实现如下功能:设计智能信号发生器,要求实现正弦波、方波、三角波、递增、递减斜波和阶梯波六种波形。基本要求:1、 掌握FPGA 的程序设计方法。 2、掌握硬件描述语言语法。 3、程序设计完成后要求在软件中实现功能仿真。主要

2、参考资料:1、姜雪松,吴钰淳.VHDL设计实例与仿真.机械工业出版社, 2007.2、黄志伟.FPGA系统设计与实践M.北京:电子工业出版社,2005.完 成 期 限: 2013.6.212013.6.25 指导教师签名: 课程负责人签名: 2013年 6月 18日26目 录摘 要I1 题目分析12 方案选择22.1 波形函数发生方案对比选择22.2 波形函数输出控制方式选择23 系统细化框图44 各模块程序设计及仿真54.1 递增斜波模块54.2 递减斜波模块64.3 三角波模块74.4 阶梯波模块84.5 正弦波模块104.6 方波模块114.7 输出波形选择模块125 系统联调测试分析1

3、46 设计总结16参考文献17附 录18基于FPGA的函数发生器设计摘 要随着基于CPLD的EDA技术的发展和应用领域的扩大与深入,EDA技术在电子信息、通信、自动控制及计算机等领域的重要性日益突出。作为一个学电子信息专业的学生,我们必须不断地去了解更多的新产品信息,这就更加要求我们对EDA有个全面的认识。信号发生器在我们的日常中有很重要的应用,用VHDL语言去实现设计将会使我们对本学科知识可以更好地掌握。函数发生器是一种多波形的信号源,它可以产生方波、三角波、锯齿波,甚至任意波形。本设计是一个基于VHDL的采用自顶向下设计方法实现的信号发生器,该设计方法具有外围电路简单,程序修改灵活和调试容

4、易等特点,并通过计算机仿真和实验证明了设计的正确性。关键字 FPGA VHDL 函数发生器1 题目分析要求设计一个函数发生器,该函数发生器能够产生递增斜波、递减斜波、方波、三角波、正弦波、及阶梯波,并且可以通过选择开关选择相应的波形输出;系统具有复位的功能;通过按键确定输出的波形及确定是否输出波形。FPGA是整个系统的核心,构成系统控制器,波形数据生成器,加法器,运算/译码等功能。通过以上分析设计要求完成的功能,确定函数发生器可由递增斜波产生模块、递减斜波产生模块、三角波产生模块、阶梯波产生模块、正弦波产生模块、方波产生模块和输出波形选择模块组成,以及按键复位控制和时钟输入。由此可确定为:图1

5、-1 系统的总体原理框波形发生模块时钟clk复位reset波形输出选择模块2 方案选择2.1 波形函数发生方案对比选择波形函数发生是本设计的最重要的部分,实现函数发生的途径也有很多,因此必须选择一种易于实现且精度高的方案,以此来提高本设计的实用性。方案一:通过单片机控制D/A,输出三种波形。此方案输出的波形不够稳定,抗干扰能力弱,不易调节,而且达不到题目要求的六种波形。方案二:使用传统的锁相频率合成方法。通过芯片IC145152,压控振荡器搭接的锁相环电路输出稳定性极好的正弦波,再利用过零比较器转换成方波,积分电路转换成三角波。此方案,电路复杂,干扰因素多,不易实现。方案三:利用MAX038芯

6、片组成的电路输出波形。MAX038是精密高频波形产生电路,能够产生准确的三角波、方波和正弦波三种周期性波形,但无法实现阶梯波和递增递减斜波的产生。方案四:利用在系统编程技术和FPGA芯片产生。用VHDL语言编写程序,调试成功后下载至实验装置的芯片上,再利用外接D/A转换电路实现以上设计功能。此种方案完全可以生成设计要求的6种波形,而且通过软件仿真可以直观的观测的输出的波形参数,方便调试和更改波形参数,外围电路简单,减少器件损耗,精度高。基于方案四的外围电路简单容易实现、波形产生精度高、易于仿真观测调试的优点,因此本设计的函数发生器选择方案四完成波形发生的全部功能。2.2 波形函数输出控制方式选

7、择方案一:控制多路D/A开关输出方式此种方案为每一路输出的波形函数使用一路D/A转换后输出,通过控制开关控制每一路D/A是否工作,决定输出的波形。此种方案可以同时输出多路波形,但是需要路D/A转化器,外围电路复杂,制作成本较高而且控制复杂。方案二:采用数据选择器方式此种方案可以利用VHDL语言写出数据选择器,然后每种函数发生器的输出和数据选择器输入相连接,通过控制开关选择对应的波形输出。方案二完全可以得到方案一的设计要求,而且只需一个D/A转换器就可以。电路不需要外部搭建,节约成本且控制简单方便。在实验课时候已经完成8选1数据选择器的设计制作,因此本次设计可以直接调用。方案三:采用数据分配器方

8、式此种方案利用数据分配器的功能,通过控制开关选择相应的函数发生器模块,使之产生相应的波形输出,并通过数据分配器的使能复位控制决定是否输出波形,此种方案和方案二很相似,也能够实现设计的功能也具有方案二的优点,。基于方案二的设计简便、节约制作元件和成本、控制简便等优点,选择方案二作为波形函数输出控制方式。3 系统细化框图系统时钟输入后,通过复位开关选择是否产生波形,当各个模块产生相应的信号波形后,通过波形选择模块波形选择开关选泽输出不同的波形,再通过D/A转换器转换,就可以把数字信号(由FPGA输出)变成了相应模拟的信号波形。整个系统设计的核心就是FPGA部分。图3系统的最终整体的原理图波形选择模

9、块递增斜波模块递减斜波模块三角波模块阶梯波模块正弦波模块方波模块时钟clk复位reset波形选择开关D/A转换器4 各模块程序设计及仿真4.1 递增斜波模块递增斜波icrs的VHDL程序如附录所示,其中clk是输入时钟端口,reset为输入复位端口,q为八位二进制输出端口。图4-1 -1斜波框图图4-1-2 递增斜波模块仿真图程序设计的当复位信号为0时,输出为0,无对应的波形产生。当复位信号为1时,每当检测到时钟上升沿时,计数器值加1,当增加到最大后清零。计数值增加呈现线性关系,因此输出的波形是递增的斜波。从仿真波形图也能看出这种变化规律。VHDL描述为:ARCHITECTURE behave

10、 OF icrs ISBEGIN PROCESS(clk,reset) VARIABLE tmp: STD_LOGIC_VECTOR(7 DOWNTO 0); BEGINIF reset=0 THEN tmp:= 00000000;-复位信号清零ELSIF clkEVENT AND clk=1 THEN IF tmp=11111111 THEN tmp:=00000000;-递增到最大值清零 ELSE tmp:=tmp+1;-递增运算END IF;END IF;q=tmp;END PROCESS;END behave;4.2 递减斜波模块递减斜波dcrs的VHDL程序如附录所示,其中clk是输

11、入时钟端口,reset为输入复位端口,q为八位二进制输出端口。图4-2-1 递减斜波框图图4-2-2 递减斜波模块仿真图程序设计的是复位信号为0时输出为0,无对应的波形产生。当复位信号为1时,当每当检测到时钟上升沿时,计数值减1,当减到0后赋值到最大。计数值减少呈现线性关系,因此输出的波形是递减的斜波。从仿真波形图也能看出这种变化规律。VHDL描述为:ARCHITECTURE behave OF dcrs ISBEGIN PROCESS(clk,reset) VARIABLE tmp: STD_LOGIC_VECTOR(7 DOWNTO 0); BEGINIF reset=0 THEN tmp

12、:=11111111;-复位信号置最大值ELSIF clkEVENT AND clk=1 THEN-检测时钟上升沿IF tmp=00000000 THEN tmp:=11111111;-递减到0置最大值ELSE tmp:=tmp-1;-递减运算END IF;END IF;q=tmp;END PROCESS;END behave;4.3 三角波模块三角波波delat的VHDL程序如附录所示,其中clk是输入时钟端口,reset为输入复位端口,q为八位二进制输出端口。图4-3-1 三角波框图图4-3-2 三角波模块仿真图三角波波形是对称的,每边呈线形变化,所以可以根据数据做简单运算,就可以得到三角

13、波。程序设计的是reset复位信号为0时输出为0,无对应的波形产生。当复位信号为1时,当每当检测到时钟上升沿时,当计数的数据不是最大值时,数值做递增运算,当增大到最大时,然后再做递减运算,因此输出的波形便呈现出三角波的形状。从仿真波形图也能看出这种变化规律。VHDL描述如下:ARCHITECTURE behave OF delat ISBEGIN PROCESS(clk,reset) VARIABLE tmp: STD_LOGIC_VECTOR(7 DOWNTO 0);VARIABLE a: STD_LOGIC; BEGINIF reset=0 THEN tmp:=00000000;-复位信号

14、为0,置最小值 ELSIF clkEVENT AND clk=1 THEN-检测时钟上升沿 IF a=0 THEN IF tmp=11111110 THENtmp:=11111111; -置最大值a:=1; ELSE -不是最大值时递增tmp:=tmp+1;-递增运算 END IF; ELSE IF tmp =00000001 THENtmp:=00000000; -置最小值a:=0; ELSE -a为1时,执行递减运算tmp:=tmp-1;-递减运算END IF;END IF;END IF;q=tmp;END PROCESS;END behave;4.4 阶梯波模块阶梯波ladder的VHD

15、L程序如附录所示,其中clk是输入时钟端口,reset为输入复位端口,q为八位二进制输出端口。图4-4-1 阶梯波框图图4-4-2 阶梯波模块仿真图阶梯波设计的是数据的递增是以一定的阶梯常数向上增加,所以输出的波形呈现是成阶梯状的,而不是完全呈现是直线增长。VHDL描述如下:ARCHITECTURE behave OF ladder ISBEGIN PROCESS(clk,reset) VARIABLE tmp: STD_LOGIC_VECTOR(7 DOWNTO 0); VARIABLE a: STD_LOGIC; BEGINIF reset=0 THEN tmp:=00000000;-复位

16、信号为0,置最小值ELSIF clkEVENT AND clk=1 THEN-检测时钟上升沿 IF a=0 THEN-判断a数值,计数。 IF tmp=11111111 THENtmp:=00000000; -计数到最大清零a:=1; ELSEtmp:=tmp+16;-阶梯常数为16,可修改a:=1; END IF; ELSEa:=0;-循环计数标志 END IF; END IF;q=tmp;END PROCESS; END behave;4.5 正弦波模块正弦波模块由三个部分组成:6位地址发生器、正弦信号数据ROM和原理图顶层设计文件。8位波形数据输出图4-5-1 结构图上图所示的信号发生结

17、构中图中,顶层文件sin.bdf在FPGA中实现,包含两个部分:ROM的地址信号发生器,由6位计数器担任;一个正弦数据ROM,由LPM_ROM模块构成,6位地址线,8位数据线,一个周期含有64个8位数据。LPM_ROM底层是FPGA中的EAB、ESB或M4K等模块。地址发生器的时钟CLK的输入频率F0与每周期的波形数据点数以及D/A输出频率F的关系是:F=F0/64。正弦波产生原理:通过循环不断地从波形数据ROM文件中依次读取正弦波一个周期在时域上64个采样点的波形数据送入波形DAC,从而产生正弦波。正弦波的频率取决于读取数据的速度。图4-5-2 正弦波模块仿真图图4-5-3 顶层文件原理图s

18、in.bdf4.6 方波模块方波模块的square的VHDL程序描述如下:其中clk为输入时钟端口,clr为输入复位端口,q为整数输出端口。图4-6 方波模块仿真图方波模块的设计是当内部计数cnt达到64时,根据输出标志a的数值输出对应的数值,当a=0输出0,也即是方波周期中的低电平,当a=1,输出255,也即是方波周期中的高电平。连续的输出便成了观测到的方波波形。其VHDL描述如下:ARCHITECTURE behave OF square ISSIGNAL a:BIT;BEGIN PROCESS(clk,clr) VARIABLE cnt:INTEGER; BEGINIF clr=0 TH

19、EN a=0; ELSIF clkEVENT AND clk=1 THEN -检测时钟上升沿IF cnt63 THEN -计数64个点cnt:=cnt+1; -计数 ELSEcnt:=0; -当计数的值大于64时,清零。a=NOT a; -对内部a变量取反,a变化启动进程END PROCESS; END IF;END IF;END PROCESS;PROCESS(clk,a)BEGINIF clkEVENT AND clk=1 THEN IF a=1 THENq=255; -a=1,输出一个波形周期内的高电平 ELSEqqqqqqqNULL; 5 系统联调测试分析通过以上各个模块的细化和分析,

20、最终在Quartus 中完成了整个系统的联合调试,并通过嵌入式逻辑分析的方法回读输出信号的波形符合设计的要求。5.1 调试的结果分析:(复位信号reset高电平,低电平为不输出)(1)第一次sel选择值设为0,输出为递增波,从图中可以看出,输出的波形成线性递增,结果正确。(2)第二次sel选择值设为1,输出为递减波,从图中可以看出,输出的波形成线性递减,结果正确。(3)第三次sel的值设为2,输出为三角波,其仿真波形如下图所示,输出波形线性增大到最大后,再线性减小。(4)第四次sel的值设为3,其输出的波形是阶梯波,其仿真波形见下图,波形递增常数为16,结果正确。(5)第五次sel的值设为4,

21、其输出的波形是正弦波,从图中可以看出,输出的数据的变化规律是正弦规律。(6)第六次sel的值设为5,其输出的波形是方波,从图中仿真的结果可以看出,输出的波形变化规律是按方波规律周期性变化的。(7)当设置为其他值时无波形输出6 设计总结本设计以函数信号发生器的功能为设计对象,运用EDA技术的设计方法,进行各种波形的输入设计、设计处理和器件编程。在VHDL语言的编写中按照语言描述规范,实现了几种波形的软件设计和具体逻辑元件结构的硬件映射。结合FPGA的开发集成环境Quartus2软件,产生了函数信号发生器的各种信号,同时完成了时序和功能仿真,并在GW48-CK型实验开发系统上实现的波形仿真。实验表

22、明采用该方法能准确的产生三角波、阶梯波、正弦波等设计产生的波形,实现了信号发生器的功能。本设计的函数信号发生器在设计上由于设计时考虑的不够全面虽然完成了函数信号的产生,但不够完善。要做成完整实用的信号源还应考虑设计包含的功能有:1) 用键盘输入编辑生成上述6种波形(同周期)的线性组合波形;2) 具有波形存储功能;3) 输出波形的频率范围可调,频率步进;4) 输出波形幅度可调,步进调整;5) 具有显示输出波形的类型、重复频率(周期)和幅度的功能;6) 用键盘或其他输入装置产生任意波形;7) 波形占空比可调等。参考文献1 姜雪松,吴钰淳.VHDL设计实例与仿真.机械工业出版社, 2007.2 黄志

23、伟.FPGA系统设计与实践M.北京:电子工业出版社,2005.3 潘松,黄继业.EDA技术与实用教程(第三版),科学出版社,2006.4 褚振勇,翁木云.FPGA设计及应用.西安电子科技大学出版社,2002.5 朱正伟.EDA技术及应用.清华大学出版社,2005.6 林明权. VHDL数字控制系统设计范例.电子工业出版社,2003.7 李辉.PLD与数字系统设计.西安电子科技大学出版社,2005.5.8 王志鹏,付丽琴.可编程逻辑器件开发技术MAX+PLUS II.北京国防工业出版社,2005.3.9 王道先.VHDL电路设计技术.北京国防工业出版社,2004.1.附 录1. 递增波形源程序-

24、递增模块程序LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY icrs IS PORT(clk,reset: IN STD_LOGIC; q: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); END icrs; ARCHITECTURE behave OF icrs ISBEGINPROCESS(clk,reset)VARIABLE tmp : STD_LOGIC_VECTOR(7 DOWNTO 0);BEGINIF reset=0 THEN tmp:= 00

25、000000;-复位信号清零ELSIF clkEVENT AND clk=1 THEN IF tmp=11111111 THEN tmp:=00000000;-递增到最大值清零 ELSE tmp:=tmp+1;-递增运算 END IF; END IF; q=tmp; END PROCESS; END behave;2. 递减波形源程序-递减模块源程序LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY dcrs ISPORT (clk,reset:IN STD_LOGIC; q:OUT

26、STD_LOGIC_VECTOR(7 DOWNTO 0);END dcrs;ARCHITECTURE behave OF dcrs ISBEGINPROCESS(clk,reset)VARIABLE tmp:STD_LOGIC_VECTOR(7 DOWNTO 0); BEGINIF reset=0 THEN tmp:=11111111;-复位信号置最大值ELSIF clkEVENT AND clk=1 THEN-检测时钟上升沿IF tmp=00000000 THEN tmp:=11111111;-递减到0置最大值ELSE tmp:=tmp-1;-递减运算END IF; END IF;q=tmp

27、;END PROCESS; END behave;3. 三角波形源程序-三角波模块程序LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY delta IS PORT(clk,reset:IN STD_LOGIC; q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);end delta;ARCHITECTURE behave OF delta ISBEGIN PROCESS(clk,reset) VARIABLE tmp:STD_LOGIC_VECTOR(7 DOW

28、NTO 0); VARIABLE a:STD_LOGIC; BEGINIF reset=0 THEN tmp:=00000000;-复位信号为0,置最小值 ELSIF clkEVENT AND clk=1 THEN-检测时钟上升沿 IF a=0 THEN IF tmp=11111110 THENtmp:=11111111; -置最大值a:=1; ELSE -不是最大值时递增tmp:=tmp+1;-递增运算 END IF; ELSE IF tmp =00000001 THENtmp:=00000000; -置最小值a:=0; ELSE -a为1时,执行递减运算tmp:=tmp-1;-递减运算 E

29、ND IF; END IF; END IF; q=tmp; END PROCESS;END behave;4. 阶梯波形程序源程序-阶梯波模块LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY ladder ISPORT(clk,reset:IN STD_LOGIC; q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);END ladder;ARCHITECTURE behave OF ladder ISBEGINPROCESS(clk,reset)VARIABL

30、E tmp: STD_LOGIC_VECTOR(7 DOWNTO 0); -定义内部变量VARIABLE a: STD_LOGIC; BEGINIF reset=0 THEN tmp:=00000000;-复位信号为0,置最小值ELSIF clkEVENT AND clk=1 THEN-检测时钟上升沿 IF a=0 THEN-判断a数值,计数。 IF tmp=11111111 THENtmp:=00000000; -计数到最大清零a:=1; ELSEtmp:=tmp+16;-阶梯常数为16,可修改a:=1; END IF; ELSEa:=0;-循环计数 END IF; END IF;q=tmp

31、;END PROCESS; END behave;5. 正弦波源程序波形数据ROM文件sin_rom.vhd如下:LIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY altera_mf;USE altera_mf.all;-使用宏功能库中的所有元件ENTITY sin_rom ISPORT(address: IN STD_LOGIC_VECTOR (5 DOWNTO 0);inclock: IN STD_LOGIC ;q: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);END sin_rom;ARCHITECTURE SYN

32、OF sin_rom ISSIGNAL sub_wire0: STD_LOGIC_VECTOR (7 DOWNTO 0);COMPONENT altsyncram例化altsyncram元件,调用了LPM模块altsyncramGENERIC ( -参数传递语句address_aclr_a: STRING;init_file: STRING;intended_device_family: STRING;-类属参量数据类型定义lpm_hint: STRING;lpm_type: STRING;numwords_a: NATURAL;operation_mode: STRING;outdata_a

33、clr_a: STRING;outdata_reg_a: STRING;widthad_a: NATURAL;width_a: NATURAL;width_byteena_a: NATURAL);PORT (clock0: IN STD_LOGIC ; -altsyncram元件接口声明address_a: IN STD_LOGIC_VECTOR (5 DOWNTO 0);q_a: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);END COMPONENT;BEGINq NONE,init_file = sin_data.mif,intended_device_family

34、 = Cyclone,-参数传递映射lpm_hint = ENABLE_RUNTIME_MOD=NO,lpm_type = altsyncram,numwords_a = 64, -数据数量64operation_mode = ROM, -LPM模式ROMoutdata_aclr_a = NONE, -无异步地址清零outdata_reg_a = UNREGISTERED, -输出无锁存widthad_a = 6, -地址线宽度6width_a = 8, -数据线宽度8width_byteena_a = 1)PORT MAP (clock0 = inclock,address_a = addr

35、ess,q_a = sub_wire0);END SYN;6. 位地址信号发生器cnt.vhd如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt is -定义计数器的实体 port(clk: in std_logic; clr: in std_logic; q: out std_logic_vector(5 downto 0);-6位输出地址线end cnt;architecture bhv of cnt is begin process(clk,clr)variable

36、cqi:std_logic_vector(5 downto 0);-定义内部变量 begin if clr=0 then cqi:=(others =0);-计数器异步复位 elsif clk event and clk=1 then 检测时钟上升沿 cqi:=cqi+1; -计数 end if;q =cqi;-赋值,输出 end process ; end bhv;END SYN;7. 波源程序LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY square ISPORT(clk,clr:IN STD_LOGIC; q:OUT INTEGER

37、RANGE 0 TO 255); END square; ARCHITECTURE behave OF square ISSIGNAL a:BIT;BEGINPROCESS(clk,clr)VARIABLE cnt:INTEGER; -定义内部整数变量BEGINIF clr=0 THEN a=0; ELSIF clkEVENT AND clk=1 THEN-检测时钟上升沿IF cnt63 THEN-计数64个点cnt:=cnt+1;-计数 ELSEcnt:=0; -当计数的值大于64时,清零。a=NOT a; -对内部a变量取反,a变化已启动进程END PROCESS; END IF; END IF; END PROCESS; PROCESS(clk,a)BEGINIF clkEVENT AND clk=1 THEN IF a=1 THENq=255; -a=1,输出一个波形周期内的高电平 ELSEqqqqqqqNULL; END CASE; END PROCESS;END behave;

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

当前位置:首页 > 教育专区 > 教案示例

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

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