基于VHDL的自动售货机的设计

更新时间:2023-11-08 21:39:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

自动售货机的设计与实现

自动售货机的设计与实现

摘要:本文介绍了VHDL的特点和应用,以自动售货机为例,详细说明了其实现过程。本系统使用VHDL语言编写,用状态基来实现各功能,使用MAXPLUSⅡ进行仿真,模拟各模块的实现。本文详细介绍如何运用VHDL语言及MAXPLUSⅡ进行仿真,本文设计的自动售货机实现了选择货物,投币,找零,显示,多次交易,在一次购买中选择多个货物等自动售货机的基本功能。本文给出了各个模块的源程序、各模块的连接图以及各个模块的仿真图,并做出了详细的分析。 关键词:VHDL语言,MAXPLUSⅡ,自动售货机

Design and implementation of vending machine

Electronics and Information Science and Technology Candidate:JiangHui

Advisor:CaiJianhua

Abstract: This article introduces the characteristics and application of VHDL, with a example of designing vending machines, describes detailedly the implementation process. The system uses the VHDL language, realizing every function uses state machines, applying MAXPLUS Ⅱ to simulate in order to realize the function every modules.This article describes the use of VHDL language and MAXPLUS Ⅱ simulation, to achieve the vending machine's basic functions , as choose good, coin, give change, buy good more than one time, choose more than one good in one time, display, and so on. This article gives the original program of every modules and the simulating diagram of every modules and the combination of all of the modules, gives detail analyse of every simulating diagram as well.

Keywords:VHDL language,MAXPLUSⅡ,Vending machine

引言

随着科技的发展和社会的进步,自动化商业机械有了越来越广泛的应用,自动售货机

1

自动售货机的设计与实现

作为自动化商业机械的代表被广泛用于公共场所自动售货,给人们的生活带来了极大的方便。特别在发达国家,自动售货机已经十分普及,自动售货机可售出各种成型包装小商品,各种袋装,盒装,软瓶装等小商品。因其无需专人值守而可以每天24小时售货,被称为“无人小超市”。在我国,由于多种原因,自动售货机的市场推广缓慢,处于培育阶段,但可以预见,这种方便快捷的服务形式因其适合现代生活快节奏的需要,在不久的将来必会获得大众的喜爱。随着商品市场的不断繁荣,自动售货机和自动服务设施必将逐步得到广泛的应用。

本文设计研究自动售货机的主要功能模块,主要包括货币处理模块、余额计算模块、显示模块,延时和时控模块,由于条件上的限制,对投币模块中的货币检测未进行处理。相应的主要功能有选择货物,多次购买,出货找零,显示,延时和时控功能。

本文是通过使用VHDL语言,基于FPGA可编程芯片,并通过使用MAXPLUSⅡ软件进行程序设计,模拟仿真,功能验证,以更好的来理解和掌握自动售货机控制系统的工作原理和设计方法,以及学习和掌握基于EDA的电子产品设计方法,进一步加深对VHDL语言以及MAXPLUSⅡ软件、FPGA可编程芯片的认识与了解。更深入的学习EDA技术,更好地掌握本专业知识。

1 本论概述

本文设计的自动售货机是基于VHDL[1](Very High Speed Integrated Circuit Hard-ware Description Language,超高速集成电路硬件描述语言)语言,使用MAXPLUSⅡ软件进行模拟仿真,在FPGA(Field Programmable Gate Arry,现场可编程门阵列)可编程芯片上实现的一款EDA(Electronic Design Automation,电子设计自动化)技术的产品。

1.1系统的工作原理

本文设计的自动售货机有两种饮料可以出售,售价分别为2元和3元。售货机可以识别1元,5元两种货币。如果投入金额总值等于或超过售价就可以将饮料放出,并具有相应的找零钱功能。

(1)用户可多次选择购买的饮料种类,某次饮料种类选定后等待投币。如等待时间超过10秒钟,则认为用户放弃选购,售货机自动回到等待状态,等待新的交易。若在10秒内,再次选中饮料,则再次等待。

2

自动售货机的设计与实现

(2)每次交易完成,售货机自动回到等待状态,等待新的交易。

(3)用按键模拟投入1元,5元两种货币,可连续投币,同时显示投入的金额和还应投入的金额。若某次投币后金额不足,且一定时限内不再投币(10秒左右),则交易失败,并退币,显示退还金额。

(4)具有指示电路,分别指示购买成功、交易取消(交易失败)和找零。 (5)相应显示有延时和时控功能。

1.2 VHDL语言介绍

VHDL[2](Very High Speed Integrated Circuit Hard-ware Description Language)是指超高速集成电路硬件描述语言。VHDL主要用于描述数字系统的结构、行为、功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式,以及描述风格与句法,类似于一般的计算机一个电路模块或一高级语言,如C语言。VHDL的程序结构特点是,将一项工程设计或称设计实体(可以是一个元件、一个电路模块或一个系统)分成外部(或称可视部分,即端口)和内部(或称不可视部分)。在对一个设计实体定义了外部界面后,一旦其内部开发完成,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。 1.2.1 VHDL语言的发展背景

硬件描述语言的发展至今已经有几十年的历史,并已成功应用到系统的仿真、验证和设计综合等方面。其中比较著名的的有VHDL语言、AHDL语言、Verilog HDL语言等。而在七八十年代初期VHDL语言是为美国国防部工作的。它是以ADA语言为根源,就像将被看到的整体结构的VHDL和其他的VHDL报表。

1986年,有人提议VHDL语言作为IEEE标准。它经历了一些修改意见和修改,直至1987年12月获得通过,成为IEEE 1076至1987标准。它的出现为电子设计自动化的普及和推广奠定了坚实的基础。之后IEEE对87版本进行了修订,于1933年推出了较为完善的93版本(被定为ANSI/IEEE std 1076-1993标准),使得VHDL语言的编程更加灵活方便。此后,越来越多的人开始使用VHDL语言进行数字电路系统的设计。而VHDL语言有不同于软件编程语言,在编程结构和规范上有自己的特点,在此,本文就从简单介绍VHDL语言基础开始。

1.2.2 VHDL语言的基本结构

3

自动售货机的设计与实现

一个完整的VHDL语言程序通常包括实体(Entity)、构造体(Architecture)、配置(Configuration)、包集合(Package)和库(Library)5个部分。前4种是可以分别编译的源设计单元。下面分别介绍:

实体:实体是用于描述所设计电路系统的外部接口信号,系统的输入输出端口及属性都是在实体中定义的。一个实体是设计中最基本的。最上层水平的设计是最高层的实体。如果设计分层次,那么最高层的描述将有低层描述的说明附在它里面。

构造体:构造体用于描述系统内部的结构和行为,系统要实现的功能都是在构造体内用语言进行描述的。所有实体可以有一个构造体的说明来模拟。该构造体描述的行为实体。一个单一的实体可以有多个构造体。一个构造体可能是行为而另一个可能是一个结构描述的设计。

配置:配置用于从库中选取所需单元来组成系统设计的不同版本。配置声明是用来约束一个组件实例的一双实体架构。一个配置可以被视为像一个零件清单进行设计。它描述的使用的每一个实体的行为,就像零件列表说明哪一部分用于每一部分的设计。

包集合:包集合存放各种设计模块都能共享的数据类型、常数和子程序等。包集合是一个收集常用数据类型和子程序中使用的设计。想想包含使用的工具建立的设计的一个工具箱作为一个包。

库:库存放已经编译的实体、构造体、包集合和配置。库可由用户生成或者是由ASIC芯片制造商提供,以便在设计中为大家共享。这种功能可以通过特定语句来实现。

除了以上介绍的各种术语,其它术语还有:

驱动程序:这是一个信号上的一个源。如果一个信号有两个来源,那么当两个来源是由两个驱动程序来起作用的。

总线:这个词,“巴士”通常使我想起一组信号或某个特定的通信方式,用于设计的硬件。在VHDL语言,总线是一种特殊的信号,表明可能由驱动程序来完成。

属性:一个关于VHDL对象连接到VHDL的物体或预先确定的数据的属性数据。例如,电流驱动能力的一个缓冲区或最高工作温度的装置。

通用:泛指是VHDL语言传递信息实体参数的任期。例如,如果一个实体是一个门级模型的上升和下降延迟,上升和下降延误的值才能通过成为实体与仿制。

进程:一个进程是执行的VHDL中的一个基本单位。一切行动,是在模拟VHDL描述分

[3]

4

自动售货机的设计与实现

为单个或多个进程。

在VHDL语言程序中,最重要的就是实体和构造体部分。它们是一个具体设计的核心。如果说实体是系统和外部交流的桥梁,那么构造体就是处理内外交流的信号加工厂。在构造体中各种信号协调工作,最后得到所需的输出,传送到输出端口和外部进行交流。下面具体说明实体和构造体。 1.2.3 实体

一个VHDL实体指定的实体名称,实体的端口,以及实体相关的信息。所有设计创建使用一个或多个实体。让我们来看看一个简单的实体例子:

ENTITY mux IS

PORT ( a, b, c, d : IN BIT;s0, s1 : IN BIT; x : OUT BIT); END mux;

关键字“实体”是开始一个实体声明的标志,在整本文的说明中,标准封装中关键字的语言和类型全部用大写字母来显示。例如,在前面的示例中,关键字是ENTITY, IS, PORT, IN, INOUT,,等等。如果标准型是少量的。用户创建像复用一样的姓名,在上面的例子中,将以小写显示。

实体的名称是多路复用,该实体有7个端口和端口条款。6个端口,一个是输入端口,另一个是输出端口。4个数据输入端口(a, b, c, d)是位宽类型。这两个多路选择输入是s0 和 s1,也都是位宽类型。输出端口也是位宽类型。实体描述外界的接口。它规定了一些端口,端口方向和端口的类型。比起这里显示的信息,实体可以存放更多的信息,但是这为我们提供了建立更复杂例子的基础。 1.2.4 构造体

实体是描述接口的VHDL模型。构造体描述了实体的基本功能,并包含了模拟实体行为的陈述。构造体始终是涉及实体和描述实体的行为。计数设备的构造体更早的像这样描述:

ARCHITECTURE dataflow OF mux ISSIGNAL select : INTEGER; BEGIN

select <= 0 WHEN s0 = ‘0’ AND s1 = ‘0’ ELSE1 WHEN s0 = ‘1’ AND s1= ‘0’ ELSE2 WHEN s0 = ‘0’ AND s1 = ‘1’ ELSE3;

5

自动售货机的设计与实现

x <= a AFTER 0.5 NS WHEN select = 0 ELSEb AFTER 0.5 NS WHEN select = 1 ELSEc AFTER 0.5 NS WHEN select = 2 ELSEd AFTER 0.5 NS; END dataflow;

关键字ARCHITECTURE本声明描述了一个实体的构架。该构造体的名字是数据流。该实体的构架是一种被称为多路复用的描述。

实体和结构连接之间的原因是一个实体可以有多个构造体来描述实体的行为。例如,一个构造可能是一个行为描述,另一个可能是结构性的描述。

在关键字ARCHITECTURE和BEGIN的文字区域是本地信号和供日后使用的组件。在这个例子中的信号选择被宣布为当地的信号。

构造体的申明区域是由关键字BEGIN开始的。所有在BEGIN和END netlist statement之间的申明被称为并列的申明,因为所有的申明同时执行。

1.3 MAX+PLUSⅡ的介绍

Max+plusⅡ是Altera公司提供的FPGA/CPLD开发集成环境,Altera是世界上最大可编程逻辑器件的供应商之一。Max+plusⅡ界面友好,使用便捷,被誉为业界最易用易学的EDA软件。在Max+plusⅡ上可以完成设计输入、元件适配、时序仿真和功能仿真、编程下载整个流程,它提供了一种与结构无关的设计环境,是设计者能方便地进行设计输入、快速处理和器件编程。

1.3.1 Max+plusⅡ开发系统的特点

开放的界面:Max+plusⅡ支持与Cadence,Exemplarlogic,Mentor Graphics,Synplicty,Viewlogic和其它公司所提供的EDA工具接口。

与结构无关:Max+plusⅡ系统的核心Complier支持Altera公司的FLEX10K、FLEX8000、FLEX6000、MAX9000、MAX7000、MAX5000和Classic可编程逻辑器件,提供了世界上唯一真正与结构无关的可编程逻辑设计环境。

完全集成化:Max+plusⅡ的设计输入、处理与较验功能全部集成在统一的开发环境下,这样可以加快动态调试、缩短开发周期。

丰富的设计库:Max+plusⅡ提供丰富的库单元供设计者调用,其中包括74系列的全部器件和多种特殊的逻辑功能(Macro-Function)以及新型的参数化的兆功能(Mage-Function)。

6

自动售货机的设计与实现

模块化工具:设计人员可以从各种设计输入、处理和较验选项中进行选择从而使设计环境用户化。

硬件描述语言(HDL):Max+plusⅡ软件支持各种HDL设计输入选项,包括VHDL、Verilog HDL和Altera自己的硬件描述语言AHDL。

Opencore特征:Max+plusⅡ软件具有开放核的特点,允许设计人员添加自己认为有价值的宏函数。

1.3.2 Max+plusⅡ 功能简介

原理图输入(Graphic Editor):MAX+PLUSII软件具有图形输入能力,用户可以方便的使用图形编辑器输入电路图,图中的元器件可以调用元件库中元器件,除调用库中的元件以外,还可以调用该软件中的符号功能形成的功能块。

硬件描述语言输入(Text Editor):MAX+PLUSII软件中有一个集成的文本编辑器,该编辑器支持VHDL,AHDL和Verilog硬件描述语言的输入,同时还有一个语言模板使输入程序语言更加方便,该软件可以对这些程序语言进行编译并形成可以下载配置数据。

波形编辑器(Waveform Editor):在进行逻辑电路的行为仿真时,需要在所设计电路的输入端加入一定的波形,波形编辑器可以生成和编辑仿真用的波形(*.SCF文件),使用该编辑器的工具条可以容易方便的生成波形和编辑波形使用时只要将欲输入波形的时间段用鼠标涂黑,然后选择工具条中的按钮,例如,如果要某一时间段为高电平,只需选择按钮”1”。

还可以使用输入的波形(*.WDF文件)经过编译生成逻辑功能块,相当于已知一个芯片的输入输出波形,但不知是何种芯片,使用该软件功能可以解决这个问题,设计出一个输入和输出波形相同CPLD电路。

管脚(底层)编辑窗口(Floorplan Editor):该窗口用于将已设计好逻辑电路的输入输出节点赋予实际芯片的引脚,通过鼠标的拖拉,方便的定义管脚的功能。

自动错误定位:在编译源文件的过程中,若源文件有错误,Max+Plus2软件可以自动指出错误类型和错误所在的位置。

逻辑综合与适配:该软件在编译过程中,通过逻辑综合 (Logic Synthesizer)和适配(Fitter) 模块,可以把最简单的逻辑表达式自动的吻合在合适的器件中。

设计规则检查:选取Compile\\Processing\\Design Doctor菜单,将调出规则检查医生,

7

自动售货机的设计与实现

该医生可以按照三种规则中的一个规则检查各个设计文件,以保证设计的可靠性。一旦选择该菜单,在编译窗口将显示出医生,用鼠标点击医生,该医生可以告诉你程序文件的健康情况。

多器件划分(Partitioner):如果设计不能完全装入一个器件,编译器中的多器件划分模块,可自动的将一个设计分成几个部分并分别装入几个器件中,并保证器件之间的连线最少。

编程文件的产生: 编译器中的装配程序(Assembler)将编译好的程序创建一个或多个编程目标文件:

EPROM配置文件(*.POF)例如,MAX7000S系列

SRAM文件(*.SCF)例如,FLEX8000系列的配置芯片EPROM JEDEC文件(*.JED) 十六进制文件(*.HEX) 文本文件(*.TTF) 串行BIT流文件(*.SBF)

仿真:当设计文件被编译好,并在波形编辑器中将输入波形编辑完毕后,就可以进行行为仿真了,通过仿真可以检验设计的逻辑关系是否准确。

分析时间(Analyze Timing):该功能可以分析各个信号到输出端的时间延迟,可以给出延迟矩阵和最高工作频率。

器件编程:当设计全部完成后,就可以将形成的目标文件下载到芯片中,实际验证设计的准确性。

1.3.3 Max+plusⅡ设计过程

设计流程:使用Max+plusⅡ软件设计流程由以下几部分组成。如图1所示:

8

自动售货机的设计与实现

图1 开发流程图

(1)、设计输入:可以采用原理图输入、HDL语言描述、EDIF网表输入及波形输入等几种方式。

(2)、编译:

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

(3)、仿真:仿真包括功能仿真、时序仿真和定时分析,可以利用软件的仿真功能来验证设计项目的逻辑功能是否正确。

(4)、编程与验证:用经过仿真确认后的编程文件通过编程器(Programmer)将设计下载到实际芯片中,最后测试芯片在系统中的实际运行性能。

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

设计步骤:

(1)输入项目文件名(File/Project/Name)

(2)输入源文件(图形、VHDL、AHDL、Verlog和波形输入方式)

(Max+plusⅡ/graphic Editor;Max+plusⅡ/Text Editor;Max+plusⅡ/Waveform Editor)

(3)指定CPLD型号(Assign/Device) (4)设置管脚、下载方式和逻辑综合的方式

9

自动售货机的设计与实现

(Assign/Global Project Device Option,Assign/Global Logic Synthesis) (5)保存并检查源文件(File/project/Save & Check) (6)指定管脚(Max+plusⅡ/Floorplan Editor)

(7)保存和编译源文件(File/project/Save & Compile) (8)生成波形文件(Max+plusⅡ/Waveform Editor) (9)仿真(Max+plusⅡ/Simulator) (10)下载配置(Max+plusⅡ/Programmer) 常用菜单简介:

该软件的菜单主要有:MAX+PLUSⅡ菜单(MAX+PLUSⅡ)、文件菜单(File),该文件菜单随所选功能的不同而不同、模板菜单(Templates),该模板使编写VHDL和AHDL设计文件更容易和方便、指定菜单(Assign)、选择菜单(Option)。该软件的菜单繁多,要想都学会有一定的难度,主要原因是资料问题。但是常用的菜单会使用还是可能的。

如何获得帮助:

最直接的帮助来自于Max+plusⅡ的Help菜单。若需要某个特定项目的帮助信息,可以同时按+键或者选用工具栏中的快速帮助按钮“”。此时,鼠标变为带问号的箭头,点击“特定的项目”就可弹出相应的帮助信息。这里的“特定项目”,可以包含某个器件的图形、文本编辑中的单词,菜单选项,甚至可以是一个弹出的窗口。

2 自动售货机的设计

2.1 设计说明

本文设计的自动售货机[4]可销售牛奶(2元)、果汁(3元)两种商品;售货机可识别1元和5元两种货币,在一次购买过程中,可购买一个或多个商品,系统会自动计算所需钱数和找零钱数并自动找零。另外有3个发光二极管、6个LCD数码管。3个发光二极管分别用来显示交易成功、交易失败、正在找零。6个LCD数码管:2个用来显示所需金额,2个用来显示已付金额,2个用来显示找零数。 2.1.1 流程说明

本文设计的自动售货机当通电时,表示一次投币销售过程的开始。顾客选择一种商品或多种则进入投币状态。若不投币,则自动返回初始状态。投币后,系统自动计算所投钱数。若投币够,则出货找零。若投币不够,等待10秒后,顾客没有继续投币,则退币并回

10

自动售货机的设计与实现

到初始状态。本系统的投币销售流程图如图2所示:

图2 流程图

2.1.2 各模块说明

本文设计的自动售货机总体分三个模块[5]:总控模块、二进制译码模块、BCD码译码模块。其它功能本文不予讨论。

总控模块:总控模块是本系统最重要的模块,该模块大体有5个输入端口和6个输出端口。其输入端口包括 clk、coin1(投入一元货币)、coin5(投入5元货币)、price2(选择2元的商品)、price3(选择3元的商品),输出端口有paid(已投入多少钱)、needed(还需要多少钱)、moneyout(找零)、success(灯亮表示交易成功)、failure(灯亮表示交易失败)、

11

自动售货机的设计与实现

showmoneyout(灯亮表示正在找零)。该模块实现了本系统最重要的交易过程,包括选择商品、投入货币、计算货币,找零出货等。

二进制译码模块:该模块有一个输入端和两个输出端。输入端b是一个4位的二进制数,输出端bcd0、bcd1,是两个4位的BCD码。该模块的主要功能是实现将主控模块输出的二进制数(paid、needed、moneyout)转换成BCD码,以便输出到七段显示数码器上而显示出来。该模块的原理是将一个4位的二进制数转换成2个4位的BCD码,分别为高4位和低4位。

BCD码译码模块:该模块有一个输入端和一个输出端。输入端d是一个4位的BCD码,输出端q是一个7位数,输出连接到一个LCD数码管以显示出来。 2.1.3 各模块的连接

各模块的连接如图3所示:

图3 硬件模块连接图

如图3所示,左边的5个端口为输入端口,连接的模块是主控模块。中间的3个输出端口连接3个LED指示灯,分别指示交易成功、交易失败、需要找零。中间的3个模块是二进制译码模块,分别将主控模块输出的paid、needed、moneyout转换成两个4位的BCD码。最右边的6个模块是BCD译码模块,输出端口连接6个LCD七段显示数码管。

2.2 状态之间的转换

本文所设计的自动售货机进程可分为7个状态:a,b,c,d,e,f,g。a为开始状态,当有键按下时即进入b状态(投币状态)。当等待十秒还没投币时即进入e状态,e状态返回

12

[6]

自动售货机的设计与实现

a状态。当有货币投入,但投币不够时,即进入c状态(继续投币),若等待十秒不投,即进入g状态(退钱),若投币但还不够,则继续投币。当投币够了,即进入d状态(出货找零)。之后进入f状态(延时)后返回a状态。

3 仿真时序图

3.1 主控模块的仿真

图4 主控模块只选一次但不投币的仿真

如图4所示:选择3元商品,不再投币,所需货币显示3元,10秒后,failure为高电平,表示交易失败,延时显示后,回到初始状态。源程序见附录的主控模块。

图5 主控模块多次选择但不投币的仿真

如图5所示:选择3元商品后,在10秒内,再次选择2元商品;此后,不再投币,所需货币先为3元,后为5元,10秒后,failure出现高电平,表示交易失败,延时显示后,回

13

自动售货机的设计与实现

到初始状态。源程序见附录的主控模块。

图6 主控模块交易成功但不找零的仿真

如图6所示:选择3元商品后,在10秒内,再次选择2元商品;所需货币先是3元,后为5元,此后,在一定时限内投入5元钱,所需货币为0元,success为高电平,表示交易成功,不找零,延时显示后,回到初始状态。源程序见附录的主控模块。

图7 主控模块交易成功且找零的仿真

如图7所示:选择3元商品后,在10秒内,再次选择2元商品;所需货币先为3元,后为5元,此后,在一定时限内先后投入1元和5元,所需货币分别变为4元,0元,success为高电平,表示交易成功。showmoneyout为高电平,表示要找零,moneyout显示为1元,表示找零1元。延时显示,其后回到初始状态。源程序见附录的主控模块。

14

自动售货机的设计与实现

图8 主控模块连续交易成功的仿真

如图8所示:先分别选择3元和2元的商品,所需货币先后显示3元和5元,再投入1元和5元,所需货币显示分别为4元,0元。success为高电平,表示一次交易成功,同时showmoneyout也为高电平,表示需要找零,moneyout显示为1元,再选择3元的商品,投入5元,所需货币先后为3元和0元。success为高电平,表示第二次交易成功,showmoneyout为高电平,表示要找零,moneyout显示为2元。图8显示连续交易。源程序见附录的主控模块。

图9 主控模块钱不够但不再投币的仿真

如图9所示:选择3元商品后,在10秒内,再次选择2元商品;所需货币先后显示3元和5元。此后,在一定时限内投入1元,所需货币显示4元,其后,等待再次投币,若超过一定时限(10秒)不再投币,认为放弃,failure为高电平,表示交易失败。showmoneyout为高电平,表示要退币,moneyout显示1元,即退币1元;延时显示后,回到初始状态。源程序见附录的主控模块。

15

本文来源:https://www.bwwdw.com/article/wcyv.html

Top