版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
CPLD/FPGA应用设计
教材和参考书教材:
《EDA技术与FPGA应用设计》
参考资料:《EDA技术及应用》谭会生西安电子科技大学出版社《EDA技术与VHDL》潘松科学出版社可编程逻辑器件(第1、2章)EDA开发软件使用(第3章)VHDL硬件描述语言(第4-7章)教学内容第1章可编程逻辑器件概述ASICPLD概述PLD设计与开发本章内容:第1章可编程逻辑器件概述ASIC(ApplicationSpecificIntegratedCircuit):专用集成电路。PLD(programmablelogicdevice):可编程逻辑器件是一种由用户根据自己要求来构造逻辑功能的数字集成电路。PLD现已成为实现ASIC的一种非常重要、而又十分方便有效的手段。1.1.1数字逻辑电路设计方法
1.1数字逻辑电路设计与ASIC软件逻辑设计(软件组装的LSI和VLSI,如微处理器、单片机等,系统功能由软件设计实现,是一种软件的设计方法);
专用集成电路设计(ASIC),是根据用户需要设计的集成电路,用户需要通过软件设计描述,用软件设计硬件)。
硬件逻辑设计(由中小规模集成器件设计数字电路,即硬件设计硬件,设计方法在数字逻辑设计课程中讲述);
1.1.2ASIC及其设计方法
ASIC是指专门为某一应用领域或为专门用户需要而设计制造的LSI或VLSI电路,它可以将某些专用电路或电子系统设计在一个芯片上,构成单片集成系统。
按照功能的不同可分为:微波ASIC、模拟ASIC、数字ASIC。
1.1.2ASIC及其设计方法
ASIC设计方法可分为:全定制和半定制两类。
全定制:全定制是一种基于晶体管级的设计方法,它主要针对要求得到最高速度、最低功耗和最省面积的芯片设计,其设计周期较长,设计成本较高,适用于对性能要求很高(如高速芯片)或批量很大的芯片(如存储器、通用芯片)的设计生产。
1.1.2ASIC及其设计方法
半定制:一种约束性设计方法。约束的目的是简化设计、缩短设计周期和提高芯片的产品率。主要有门阵列、标准单元和可编程器件(PLD)3种。
门阵列:是一种预先制造好的硅阵列(称母片),内部包括几种基本逻辑门、触发器等,芯片中留有一定的连线区。用户根据所需要的功能设计电路,确定连线方式,然后再交生产厂家布线。
1.1.2ASIC及其设计方法
标准单元:是以预先配置好、经过测试的标准单元库为基础的。设计时选择库中的标准单元构成电路,然后调用这些标准单元的版图,并利用自动布局布线软件(CAD工具)完成电路到版图一一对应的最终设计。和门阵列相比,标准单元设计灵活、功能强,但设计和制造周期较长,开发费用也比较高。
1.1.2ASIC及其设计方法
可编程逻辑器件PLD:是一种通用型器件,用户利用EDA工具对器件编程以实现所需要的逻辑功能。PLD是用户可配置的器件,其规模大,功能强,价格便宜,相配套的EDA软件完善,设计人员在实验室即可设计和制造出芯片,而且可反复编程,修改错误,设计周期短,可靠性高。
1.1.2ASIC及其设计方法
EDA技术ASIC设计FPGA/CPLD可编程ASIC
设计
门阵列(MPGA);标准单元(CBIC);全定制;(FCIC);
ASIC设计SOPC/SOC混合ASIC设计1.2PLD概述
1.2.1PLD发展
1.2.1PLD发展
1.2PLD概述
70年代80年代90年代PROM和PLA器件PAL器件GAL器件FPGA器件EPLD器件CPLD器件内嵌复杂功能模块的SoPC电路符号表示
PLD的互补缓冲器PLD的互补输入PLD中与阵列表示
PLD中或阵列的表示阵列线连接表示
PROMPROM基本结构:其逻辑函数是:PROMPROM的逻辑阵列结构逻辑函数表示:PROMPROM表达的PLD图阵列用PROM完成半加器逻辑阵列PLAPLA逻辑阵列示意图PLAPLA与PROM的比较PALPAL结构:PAL的常用表示:1.2.1PLD发展
70年代80年代90年代PROM和PLA器件PAL器件GAL器件FPGA器件EPLD器件CPLD器件内嵌复杂功能模块的SoPC
1.2.2PLD分类
按集成密度分类
1.2.2PLD分类
按编程工艺分类(1)一次性编程的熔丝(Fuse)或反熔丝(Anti-fuse)器件;
(2)紫外线擦除、电编程器件;
(3)EEPROM编程器件,即电擦除、电可编程元件。ISP器件采用此方法,编程次数可达10000次;
(4)SRAM编程器件,特点是断电后信息丢失,多数FPGA基于此技术。
1.2.2PLD分类
按结构特点分类(1)阵列型PLD:基本结构为与或阵列;
(2)FPGA:基本结构为门阵列。PLD基本结构:
1.3PLD逻辑表示法
(1)与阵列固定,或阵列可编程,如EPROM;
(2)与阵列和或阵列都可以编程,如PLA;(3)与阵列可以编程,或阵列固定,如PAL。1.3PLD逻辑表示法
【例1-1】试分别用PLD的3种阵列结构来表示逻辑函数:1.3PLD逻辑表示法
【例1-1】试分别用PLD的3种阵列结构来表示逻辑函数:1.4PLD的设计与开发
1.4.1PLD设计流程
1.4.2PLD开发工具
Lattice
Diamond软件Lattice
Diamond软件是Lattice公司针对其CPLD和FPGA产品开发的EDA软件,支持原理图输入方式和ABEL-HDL、VHDL、VerilogHDL等硬件描述语言输入方式。LatticeDiamond可以进行功能仿真和时序仿真,是目前流行的EDA软件中最容易掌握的之一,它的界面友好,操作方便,功能强大,并与第三方EDA工具兼容良好。1.4.2PLD开发工具
Vivado软件Vivado软件是Xilinx公司2012年推出的完整的PLD集成开发环境,支持Xilinx公司最新的Kintex-7、Artix-7、Virtex-7、UltraScale、Zynq系列产品,支持多语言开发,具有很好的综合及仿真功能,是业界最强大的EDA设计工具之一。1.4.2PLD开发工具
QuartusIIQuartusII系统是由Altera公司提供的开发软件。该软件提供了一种与结构无关的设计环境,支持Altera的各种PLD系列芯片的设计。支持原理图和各种HDL设计输入选项。1.4.2PLD开发工具
PangoDesignSuite软件PangoDesignSuite软件是紫光同创研发的一款拥有国产自主知识产权的大规模FPGA开发软件,可以支持千万门级FPGA器件的设计开发。该软件支持工业标准的开发流程,可实现从RTL(RegisterTransferLevel,寄存器传输级)综合到配置数据文件生成下载的全套操作。1.4.2PLD开发工具
TangDynasty软件TangDynasty软件是安路科技自主开发的FPGA集成开发环境,支持工业标准的设计输入,包含完整的电路优化流程及丰富的分析与调试工具,并提供良好的第三方设计验证工具接口,为所有基于安路科技FPGA产品的应用设计提供有力支持。1.4.2PLD开发工具
Gowin云源软件Gowin云源软件是专为高云半导体FPGA芯片而配套的集成电路设计与实现工具,覆盖了从RTL电路功能描述到生成FPGA位流文件的完整流程,包括优化设计、自动设计、图形交互设计等功能。1.4.2PLD开发工具
ModelSim仿真软件ModelSim是MentorGraphics公司开发的一款非常优秀的仿真软件,具有友好的仿真界面,不仅支持VHDL、Verilog及VHDL和Verilog混合硬件描述语言仿真,还支持系统级描述语言SystemC和SystemVerilog。该仿真软件仿真速度快、精度高。ModelSim可集成到ISE及QuartusII等PLD开发软件中,从而可在PLD开发软件中直接调用ModelSim进行波形仿真。1.4.2PLD开发工具
Synplify综合软件Synplify、SynplifyPro和SynplifyPremier是Synplicity公司开发的PLD综合工具,支持大多数半导体厂商的CPLD和FPGA产品,有着综合速度快、综合效率高等优点,最近几年在综合软件市场中排名保持第一。1.4.3IP核复用技术
IP可分为软核、固核和硬核。软核是用VHDL、VerilogHDL等硬件描述语言描述的功能模块,是与具体实现的工艺无关的IP核。固核是以网表文件的形式提交用户使用的IP核,是完成了综合后的可重用IP模块。硬核是一些已经经过布局、并对尺寸和功耗进行优化的、不能由使用者修改的IP核。硬核以设计的最终阶段产品——掩膜提供。小结
PLD/ASICCPLD/FPGAEDAHDL:VHDL、VerilogHDLLATTICE、ALTERA、XILINIXISPDesginExpertSystem、QuartusII、ISE第2章大规模可编程逻辑器件CPLD/FPGACPLD结构原理FPGA结构原理PLD产品介绍编程、配置本章内容:2.1CPLD结构与工作原理Lattice公司ispLSI系列的CPLD产品为例详细介绍:
CPLD的内部结构;CPLD的主要技术特征;CPLD的设计编程方法。
PLD基本结构:
1.3PLD逻辑表示法
(1)与阵列固定,或阵列可编程,如EPROM;
(2)与阵列和或阵列都可以编程,如PLA;(3)与阵列可以编程,或阵列固定,如PAL。PLA与PROM的比较PALPAL结构:PAL的常用表示:逻辑宏单元输入/输出口输入口时钟信号输入三态控制可编程与阵列固定或阵列GAL16V8GAL2.1CPLD结构与工作原理可编程逻辑块:CPLD的主要组成部分,用以实现系统逻辑功能的配置;I/O模块:实现CPLD输入/输出信号的引脚驱动及电平匹配;可编程互联通道:实现CPLD内部各个功能模块的互联通信。CPLD的内部结构:ispLSI1000和ispLSI1000E系列为通用器件;ispLSI2000系列的器件适用于高速系统的设计;
ispLSI3000系列的器件适用于复杂系统设计,集成度高、速度高;
ispLSI5000系列的器件为68bit超宽输入系列;
ispLSI6000系列的器件在结构上增加了存储器;
ispLSI8000系列器件是多寄存器超大结构。
ispMACH系列器件的特征是超大、超宽、超快;
2.1.1Lattice公司的CPLD器件Lattice公司的isp系列器件主要包括ispLSI和ispMACH系列:2.1.2ispLSI1016输出布线区ORPA0A1A2A3A4A5A6A7集总布线区(GRP)B7B6B5B4B3B2B1B0输出布线区ORP通用逻辑块(GLB)宏模块时钟分配网络I/O0I/O1I/O2I/O3I/O4I/O5I/O5I/O7I/O8I/O9I/O10I/O11I/O12I/O13I/O14I/O15I/O16I/O17I/O18I/O19I/O20I/O21I/O22I/O23I/O24I/O25I/O26I/O27I/O28I/O29I/O30I/O31
通用逻辑模块GLB输入/输出单元IOC集总布线区GRP输出布线区ORP时钟分配网络CDN图2-12.1.2ispLSI1016
通用逻辑模块GLB2.1.2ispLSI1016
输入/输出单元IOCMUXMUXMUXMUXVccMUXMUXDQR/LresetI/O输出至集总布线区IOCLK0IOCLK1RESET来自输出布线区来自输出布线区来自OE选择器表示EEMOS编程单元2.1.2ispLSI1016
输入/输出单元IOC2.1.2ispLSI1016
集总布线区GRPispLSI结构的中央是全局布线区(GRP),它连接所有的内部逻辑:提供高速的内部连线,可实现IOC到GLB或者GLB到GLB的互连。特点是其输入输出之间的延迟恒定且可预知。2.1.2ispLSI1016
输出布线区ORP:GLB和IOC之间的可编程互连阵列,可提高分配IO管脚的灵活性,简化布线软件2.1.2ispLSI1016
时钟分配网络CDN:用于产生5个全局时钟信号,分配给GLB和I/O用;可将时钟专用GLB的4个输出送入时钟分配网络,以建立用户定义的内部时钟。通用逻辑块B0O0O1O2O3CLK0CLK1CLK2IOCLK0IOCLK1Y1Y2Y0时钟分配网络2.1.2ispLSI1016
宏模块结构:器件采用的一种分块结构1.Ultra-MOS工艺
利用Ultra-MOS工艺生产的ispLSI器件具有高密度,高性能的特点。目前ispLSI系列器件的系统工作速度已达200MHz,集成度可达58000个逻辑门。2.1.3ispLSI器件的主要技术特性2.在系统编程功能
所有的ispLSI系列器件均为ISP器件,具有在系统编程能力。
所谓“在系统可编程”是指对器件、电路板、整个电子系统进行逻辑重构和功能修改的能力,这种重构可以在制造之前,调试过程中,甚至在交付用户使用之后进行。2.1.3ispLSI器件的主要技术特性3.边界扫描测试功能
边界扫描技术主要解决芯片的测试问题,借助一个4信号线的接口及相应的软件则可实现对电路板上所有支持边界扫描的芯片内部逻辑和边界引脚的测试。
ispLSI器件中ispLSI3000、6000及8000系列器件支持IEEE1149.1.边界扫描测试标准。它们可以通过5个ISP编程管脚中的4个来传递边界扫描信号。
2.1.3ispLSI器件的主要技术特性JTAG边界扫描测试边界扫描电路结构边界扫描数据移位方式JTAG边界扫描测试4.加密功能
ispLSI器件具有加密功能,用于防止非法拷贝JEDEC数据文件。ispLSI器件中提供了一段特殊的加密单元,该单元被加密以后就不能读出器件的逻辑配置数据。由于ispLSI器件的加密单元只能通过对器件重新编程才能擦除,已有的解密手段一般不能破解,器件的加密特性较好。2.1.3ispLSI器件的主要技术特性5.短路保护
ispLSI器件采取了两种短路保护手段。首先,选用电荷泵给硅片基底加上一个足够大的反向偏置电压,这个反向偏置电压能够防止输入负电压毛刺而引起的内部电路自锁;其次,器件输出采用N沟道方式,取代传统的P沟道方式,消除SCR自锁现象。2.1.3ispLSI器件的主要技术特性
编程是指将EDA软件设计的熔丝图文件(JEDEC)写入PLD器件的过程(下载)。
1、ispLSI编程信号线:
ispEN:编程使能,低电平有效;
SCLK:时钟;
SDI:串行数据输入;
SDO:串行数据输出;
MODE:方式控制。2.1.4ispLSI器件的编程2、下载电路
编程电缆又称为下载电缆,该电缆连接计算机的并行口和ispLSI芯片。电缆中有简单的控制电路。
2.1.4ispLSI器件的编程Lattice公司的下载电缆
3、多个器件的编程
有并行和串行两种方式,但都需要在EDA软件的支持下完成。串行菊花链编程结构:
2.1.4ispLSI器件的编程2.2FPGA结构与工作原理(1)以Xilinx公司的Spartan3E系列FPGA产品为例可配置逻辑块CLB可配置I/O模块IOB可编程互联资源IR2.2FPGA结构与工作原理可配置逻辑块CLB每个slice内部包含两个4输入查找表LUT2.2FPGA结构与工作原理4输入查找表LUT2.2FPGA结构与工作原理可配置I/O模块IOB:可配置I/O模块用来配置FPGA芯片引脚与外部模块通信信号的传输方向及输出信号的驱动电流大小。FPGA的引脚可配置成:输入信号、输出信号、双向传输信号及高阻态。可编程互联资源IR:可编程互联资源连接FPGA内部的各功能模块(如:IOB,CLB,交换矩阵、DCM、BlockRAM等),实现各功能模块之间的通信。...IOCIOC...IOCIOC...IOCIOC...IOCIOC...IOCIOC...IOCIOC...IOCIOC...IOCIOC...IOCIOC...IOCIOC...IOCIOC...IOCIOCEABEAB嵌入式阵列块(2)Cyclone/CycloneII系列器件的结构与原理LAB:逻辑阵列块3.4.2Cyclone/CycloneII系列器件的结构与原理图3-34CycloneLE结构图LE:基本编程单元2.3CPLD/FPGA产品Altera公司产品
Xilinx公司
Lattice公司紫光同创安路科技高云半导体2.3.1Altera公司产品低成本的Cyclone系列:Cyclone、CycloneII、CycloneIII、CycloneIV、CycloneV等;中端的Arria系列:包括ArriaGX、ArriaII、ArriaV等;高端的Stratix系列:包括Stratix、StratixII、StratixIII、StratixIV、StratixV等2.3.2Xilinx公司CPLD产品:CoolRunner、XC9500系列
;低端Spartan
:Spartan2、Spartan2E、Spartan3、Spartan3E、Spartan3A、Spartan6
;高端Virtex:有Virtex2、Virtex2P、Virtex4、Virtex5、Virtex6、Virtex7系列。2.3.3Lattice公司CPLD产品有ispMACH4000ZE、MachXO、MachXO2系列;LatticeECP3、LatticeECP2/M、LatticeSC/M、LatticeXP2等系列2.3.4紫光同创紫光同创的PLD产品分为三大系列:Titan、Logos(FPGA)和Compa(CPLD)系列。Titan系列是第一款国产具有自主产权的千万门级高性能FPGA产品,其中Titan-2系列FPGA支持高速SERDES、PCIeGen3、DDR3/4等高性能模块及接口。Logos系列FPGA采用先进成熟工艺和全新LUT5结构,集成RAM、DSP、ADC、SERDES、DDR3等丰富的片上资源和I/O端口。2.3.5安路科技安路科技FPGA有SALEAGLE和SALELF两大系列。SALEAGLE系列又分EG4和AL3两个系列。AL3系列FPGA有5种器件,定位于低成本、低功耗可编程市场,其内部资源见表2-8。EG4是安路科技推出的“猎鹰”系列产品,有丰富的逻辑、DSP、BRAM、高速差分I/O端口等资源。SALELF系列FPGA共有3代产品,单芯片方案,即时启动,无须外部Flash,支持OTP模式,55nm工艺,部分产品内嵌硬核MCU。2.3.6高云半导体高云半导体FPGA有晨熙系列、小蜜蜂系列、Arora-V系列和GoBridge系列等。晨熙系列采用55nmSRAM工艺,具有高性能DSP、高速LVDS(低电压差分信号)接口及丰富的B-SRAM(块状SRAM)资源,适用于高速、低成本的应用场合。晨熙系列主要有GW2A、GW2AR、GW2AN等产品。2.4编程与配置ISP编程与FPGA配置2.4编程与配置在系统编程
ISP(CPLD采用)
FPGA配置
主动配置方式:由FPGA从外部程序存储器EEPROM或Flash中主动读取配置代码;被动配置方式:由外部处理器将配置代码写入到FPGA中。2.4编程与配置JTAG模式:在开发软件中通过下载电缆直接将配置代码下载到FPGA,是项目设计验证阶段常用的下载方式。2.5CPLD与FPGA比较CPLD相对FPGA内部逻辑资源较少,且价格便宜;FPGA内部资源多,并可嵌入微处理IP核;编程与配置;CPLD结构适合于组合逻辑设计,FPGA适合于时序逻辑设计。CPLD内部逻辑单元间的连线为连续式布线,信号延迟时间可预测,而FPGA内逻辑单元间信号延迟不可预测。CPLD保密性好,FPGA保密性差。器件速度及功耗的选择。第3章常用EDA软件Lattice:ispEXPERT、LatticeDiamond
Altera:MAX+PLUSII、
QuartusIIXilinx:Foundation、ISE、Vivado本章内容:原理图/VHDL文本编辑综合FPGA/CPLD适配FPGA/CPLD编程下载FPGA/CPLD器件和电路系统时序与功能门级仿真1、功能仿真2、时序仿真逻辑综合器结构综合器1、isp方式下载2、JTAG方式下载3、针对SRAM结构的配置
4、OTP器件编程
功能仿真FPGA/CPLD设计流程3.2QuartusII操作指南
开发过程:
一、建立设计工程
二、源文件输入
三、编译(设计处理)
四、仿真验证
五、器件编程(下载)1.QuartusⅡ软件启动2.创建工程3.选择FPGA器件3.2.1建立设计工程步骤1:软件启动图4-1进入MAX+plusII,建立一个新的设计文件步骤2:创建工程步骤3:选择FPGA器件EP1C12Q240C8Assignments--Device1.建立原理图文件2.输入基本单元符号3.放置输入输出引脚符号4.连线5.为引线和引脚命名6.保存设计文件3.2.2源文件输入
(以原理图文件为例)步骤1:建立原理图文件
步骤2:输入基本单元符号
步骤2:输入基本单元符号
(1)在图形编辑器窗口的工作区中双击鼠标左键,或单击工具栏的符号按钮步骤2:输入基本单元符号
(2)选择所需要的图元或符号步骤3:放置输入输出引脚符号
步骤4:连线
符号之间的连线包括信号线NodeLine和总线BusLine。Quartus Ⅱ软件会自动根据端口是单信号端口还是总线端口画出信号线或总线。连线:将鼠标移动到其中一个端口上,这时鼠标指示符自动变为“+”形状,按住鼠标的左键并拖动鼠标到达第二个端口,放开左键即可。连线拐弯:在需要拐弯处放开鼠标左键,然后再继续按下左键拖动即可。连线删除:单击这根连接线并按Del键即可。步骤5:为引线和引脚命名步骤6:保存设计文件1.编译过程:选择Tools菜单的CompilerTool项3.2.3编译
2.分析综合(Analysis&Synthesis)1.建立波形仿真文件2.功能仿真和时序仿真设置3.启动仿真器3.2.4仿真验证
步骤1:建立波形仿真文件
(1)创建一个新的矢量波形文件步骤1:建立波形仿真文件
(1)创建一个新的矢量波形文件(2)在矢量波形文件中加入输入、输出节点选择View的UtilityWindows下的NodeFinder命令,弹出NodeFinder界面,查找要加入波形文件中的节点名;在Filter列表中选择Pins:all,在Named栏中键入“*”,然后点击List按钮,在NodesFound栏即列出设计中的所有节点名;选择要加入波形文件中的节点,然后按住鼠标左键,拖动到波形编辑器左边Name列的空白处放开。
步骤1:建立波形仿真文件
(3)编辑波形步骤2:功能仿真和时序仿真设置
(1)选择Assignments的Settings…命令,在Settings对话框的Category列表中选择Simulator,显示仿真器页面(2)功能仿真类型选择Functional,选择Processing的GenerateFunctionalSimulationNetlist命令,产生功能仿真网表文件;时序仿真类型选Timing,编译设计产生时序仿真的网表文件。步骤3:启动仿真器
在完成上面的仿真器设置以后,选择Processing的StartSimulation命令即可启动仿真器。同时状态窗口和仿真报告窗口自动打开,并在状态窗口中显示仿真进度以及所用时间。仿真结束后,在仿真报告窗口显示输出节点的仿真波形。1.引脚分配
(1)选择Assignments/AssignmentEditor菜单命令,在分配编辑器的类别(Category)列表中选择Locationspin,或直接选择Assignments的Pins菜单命令。(2)用鼠标左键双击To单元,将弹出包含所有引脚的下拉框,从中选择一个引脚名。(3)用鼠标左键双击Location单元,从下拉框中可以指定目标器件的引脚号。(4)完成所有设计中引脚的指定,关闭AssignmentEditor界面,保存分配。(5)在进行编译之前,检查引脚分配是否合法。选择Processing→Start→StartI/OAssignmentAnalysis菜单命令,当提示I/O分配分析成功时,点击OK按钮关闭提示。3.2.5器件编程
2.编程(1)全局编译选择Processing/StartCompilation,全局编译成功后,可以进行编程下载。(2)打开编程器窗口选择Tool/Programer命令,打开编程器窗口。(3)设置下载形式第一次使用下载时,需要选择下载形式。在编程器窗口,点击HardwareSetup按钮,打开HardwareSetup对话框,然后点击AddHardware,选择USB-Blaster[USB-0]后单击SelectHardware,则把下载形式设置为USB-Blaster[USB-0](4)下载下载可以选择JTAG方式和AS方式。JTAG方式把文件直接下载到FPGA里面,AS方式把文件下载到配置芯片里面。选择AddFile,添加.sof文件,选中Program/Configure,点击Start后开始下载。3.2.5器件编程
将设计项目设置成可调用元件
File---Create/Update---CreatesymbolFilesforCurrentFile设计顶层文件
File---new---blockdiagram/schematicFile;
保存在相同目录;设置成顶层文件:PROJECT/SETASTOP—LEVELENTITY;
分析综合;建立仿真文件,进行仿真。3.2.6层次设计讲解张三3.4Vivado软件操作Vivado为Xilinx公司2012年推出的新一代可编程逻辑器件集成开发工具,支持XilinxZynq系列产品。Vivado包含综合、实现、仿真、调试等工具,同时还支持高层次综合(HLS)功能,使FPGA设计更加高效。Vivado软件已由最初的2012版更新到2022版。本教程将基于Vivado2017.4版本,以设计一个4位二进制加法计数器为例,介绍该软件的基本开发使用流程。3.4.1Vivado简介在Vivado启动界面的菜单栏中选择“File”→“NewProject”命令,或点击“QuickStart”栏下的“CreateProject”新建工程,在新建工程设置界面,输入工程名“cnt_4”,工程名通常为设计程序的实体名,工程存放路径选择为E:/FPGA/vivado_test,如图所示。3.4.2
新建工程单击“Next”按钮,弹出新建工程类型选择界面,默认选择RTLProject;单击“Next”按钮,出现编程语言选择界面,本例将Targetlanguage设置为VHDL,Simulatorlanguage也设置为VHDL,如图所示。3.4.2
新建工程点击“Next”按钮,出现约束文件添加界面,本例暂不添加约束文件,继续点击“Next”按钮,出现目标芯片选择界面,本例选择Zynq-7000系列下的型号为xc7z020clg400-2的FPGA芯片,如图所示。3.4.2
新建工程点击“Next”按钮,出现新建工程概要界面,显示新建工程名、目标芯片等信息,点击“Finish”按钮,完成工程创建,新建工程界面如图所示。3.4.2
新建工程在工程管理区点击PROJECTMANAGER栏下的AddSources图标,弹出新建文件类型选择界面,选择默认的“Addorcreatedesignsources”选项;点击“Next”按钮,在弹出界面中选择“CreateFile”按钮;在文件名设置窗口输入文件名cnt_4,如图所示。3.4.3
新建VHDL源文件点击“OK”按钮,显示源文件添加完成界面,如图所示。3.4.3
新建VHDL源文件点击“Finish”按钮,显示端口定义对话框,如图所示。可以在该对话框中定义端口信号名及端口类型,也可不用定义端口信息,在后面程序设计时输入端口信号名及类型,本例不在该对话框中定义端口,直接单击“OK”按钮,在弹出的对话框中选择“Yes”。3.4.3
新建VHDL源文件在文件管理区显示出新建的源文件“cnt_4.vhd”,如图所示,双击该文件,在界面右边编辑区显示新建源文件模板,定义了库、程序包、实体名、结构体名。3.4.3
新建VHDL源文件在模板中输入程序代码,输入完成后的代码如图所示。程序编辑完成后,点击保存按钮进行保存。3.4.3
新建VHDL源文件在界面左边工程管理区“SYNTHESIS”下点击“RunSynthesis”综合工具对输入的源文件进行综合,若输入程序没有语法错误,则综合通过,弹出综合完成对话框,如图所示。若输入程序有语法错误,则综合不通过,需根据错误提示信息对程序进行修改,修改后再次综合,直至程序综合完成,确保程序无语法错误。在综合完成对话框中,点击Cancel按钮,暂不执行Implementation实现操作。3.4.3
新建VHDL源文件程序综合正确表明无语法错误,程序逻辑功能是否正确不能确定,需要通过波形仿真来测试。下面对上述程序描述的4位二进制加法计数器进行波形仿真,验证其逻辑功能是否正确。本例将使用VHDL硬件描述语言编写波形测试激励文件,设置输入信号的波形。3.4.4
波形仿真在工程管理区点击PROJECTMANAGER栏下的AddSources图标,弹出新建文件类型选择界面,选择“Addorcreatesimulationsources”选项;点击“Next”按钮,在弹出界面中选择“CreateFile”;在文件名设置窗口输入文件名cnt_4_tb,如图所示。3.4.4
波形仿真——创建波形文件点击“OK”按钮,在显示的源文件添加界面点击“Finish”按钮;端口定义对话框可定义端口信号名及端口类型,也可暂不定义端口信息,在后面程序设计时输入端口信号名及类型,本例不在该对话框中定义端口,直接单击“OK”按钮,在弹出的对话框中选择“Yes”,则完成波形激励文件的创建,如图所示。3.4.4
波形仿真——创建波形文件点击“OK”按钮,在显示的源文件添加界面点击“Finish”按钮;端口定义对话框可定义端口信号名及端口类型,也可暂不定义端口信息,在后面程序设计时输入端口信号名及类型,本例不在该对话框中定义端口,直接单击“OK”按钮,在弹出的对话框中选择“Yes”,则完成波形激励文件的创建,如图所示。3.4.4
波形仿真——编辑波形文件在文件管理区“SimulationSources”的“sim_1”下显示新建波形激励文件cnt_4_tb.vhd,双击该文件,在界面右边编辑区显示新建文件模板,在模板中输入程序代码,输入完成后的波形激励文件代码如图所示。程序编辑完成后,点击保存按钮进行保存。3.4.4
波形仿真——创建波形文件在工程管理区右键点击“SIMULATION”,在显示列表中选择SimulationSettings选项;在仿真参数设置界面,点击“Simulation”图标,在xsim.simulate.runtime栏设置仿真时间,本例仿真时间设置为1000ns,如图所示,设置完成后点击OK按钮。3.4.4
波形仿真——波形仿真参数设置在工程管理区点击“SIMULATION”下的“RunSimulation”图标,在显示列表中选择RunBehavioralSimulation选项,波形仿真结果如图所示。3.4.4
波形仿真由仿真波形图可以看出,在复位信号有效时间内,计数器cnt值为0,复位无效后,在每个时钟信号的上升沿触发下,计数器cnt加1,实现了程序设计的四位二进制加法计数器功能。在工程管理区点击“RTLANALYSIS”下的“OpenElaboratedDesign”图标,在弹出的窗口中点击“OK”按钮,显示RTL综合原理图,如图所示。3.4.5
管脚定义在菜单栏选择“Window”→“I/OPorts”命令;在弹出的管脚定义界面设置输入输出信号连接的FPGA芯片管脚,如图所示。3.4.5
管脚定义管脚定义完成后,点击保存按钮,弹出约束文件设置对话框,输入文件名cnt_4,文件类型默认“XDC”格式,点击“OK”按钮,则在文件管理区Constraints栏下显示新建的约束文件cnt_4.xdc。双击打开cnt_4.xdc约束文件,在文本编辑区显示文件内容,如图所示,根据约束文件管脚定义格式,也可通过新建约束源文件,输入管脚约束代码,实现管脚定义功能。3.4.5
管脚定义下载配置过程包括生成比特流文件,启动编程工具将生成的比特流文件下载到FPGA内部,或将生成的比特流文件转换成EEPROM文件,并下载到FPGA的配置存储芯片中。下面介绍JTAG下载模式下将比特流文件直接下载到FPGA内部的流程。3.4.6
下载配置在工程管理区点击“PROGRAMANDDEBUG”下的“GenerateBitstream”图标,在弹出的窗口中点击“OK”按钮,执行结束后将在工程目录下生成cnt_4.bit下载文件,如图所示。3.4.6
下载配置——生成下载文件在工程管理区点击“PROGRAMANDDEBUG”下的“OpenHardwareManager”图标,弹出下载管理界面,如图所示。使用下载电缆连接开发板与计算机,开发板上电,点击下载管理界面中的“AutoConnect”图标自动连接FPGA设备,右键点击扫描到的FPGA芯片xc7z020,选择ProgramDevice,将下载文件cnt_4.bit下载到FPGA芯片内部。3.4.6
下载配置——下载第4章VHDL语言基础常见的HDL有ABEL、AHDL、VHDL、VerilogHDL和SystemC等。HDLIEEE工业标准硬件描述语言VHDL、Verilog超高速集成电路硬件描述语言VHDL,美国国防部研究计划硬件描述语言HDL第4章VHDL语言基础覆盖面广,描述能力强,多层次硬件描述语言VHDL有良好的可读性,既是程序又是文件VHDL的移植性很强VHDL生命周期长,硬件描述与器件工艺无关代码量大,书写烦琐VHDL第4章VHDL语言基础基本组成语言要素本章内容:4.1基本结构参数部分实体部分结构体例:2选1多路选择器的VHDL描述4.1基本结构sy0a1b2选1多路选择器的VHDL描述4.1基本结构2选1多路选择器的VHDL描述方法一:ENTITYmux21aISPORT(a,b:INBIT;s:INBIT;y:OUTBIT);ENDENTITYmux21a;ARCHITECTUREoneOFmux21aISSIGNALd,e:BIT;BEGINd<=aAND(NOTS);e<=bANDs;y<=dORe;ENDARCHITECTUREone;4.1基本结构实体结构体2选1多路选择器的VHDL描述方法二:ENTITYmux21aISPORT(a,b,s:INBIT;y:OUTBIT);ENDENTITYmux21a;ARCHITECTUREoneOFmux21aISBEGINPROCESS(a,b,s)BEGINIFs='0'THENy<=a;ELSEy<=b;ENDIF;ENDPROCESS;ENDARCHITECTUREone;4.1基本结构sy0a1b【例4-1】
LIBRARYieee;--库程序包调用
USEieee.std_logic_1164.ALL;
USEieee.std_logic_unsigned.ALL;
4.1基本结构ENTITYcntm16IS--实体cntm16
GENERIC(cntwidth:integer:=4);
PORT
(ci:INstd_logic;
nreset:INstd_logic;
clk:INstd_logic;
co:OUTstd_logic;
qcnt:BUFFERstd_logic_vector(cntwidth-1DOWNTO0)
);
ENDcntm16;
4.1基本结构ARCHITECTUREbehaveOFcntm16IS--结构体
BEGIN
co<=’1’WHEN(qcnt=”1111”ANDci=’1’)ELSE‘0’;
PROCESS(clk,nreset)
BEGIN
IF(nreset=’0’)THEN
qcnt<=”0000”
ELSIF(clk’eventANDclk=’1’)THEN
IF(ci=’1’)THEN
qcnt<=qcnt+1;
ENDIF;
ENDIF;
ENDPROCESS;
ENDbehave;
4.1基本结构模块结构
参数部分:库(LIBRARY)、程序包(USE);
实体(ENTITY):[类属]、端口(PORT);
结构体(ARCHITECTURE):赋值、进程(PROCESS-IF)。
4.1基本结构4.1基本结构调用程序包语句实体及实体声明语句结构体1结构体2结构体n标准程序包标准程序包定义程序包定义程序包进程1进程2进程nVHDL程序设计约定
语句结构描述中方括号“[]”内的内容为可选内容。程序文字的大小写是不加区分的。程序中的注释使用双横线“--”。建议书写使用层次缩进格式。建议各个源程序文件的命名均与其实体名一致。4.1基本结构库说明
存放已经编译的实体、结构体、程序包和配置,用于设计共享,是编程资源。
library<库名>;
4.1.1参数部分程序包引用使用USE子句指明要使用库中某一个设计单元。
use<库名>.<程序包名>.all;【例4-2】LIBRARYieee;
USEieee.std_logic_1164.ALL;实体(ENTITY)
实体是一个设计实体的表层设计单元,其功能是对这个设计实体与外部电路进行接口描述。它规定了设计单元的输入/输出接口信号或引脚,是设计实体经封装后对外的一个通信界面。类似于原理图中的一个部件符号。4.1.2实体部分实体格式ENTITY实体名IS[GENERIC(常数名:数据类型[:设定值])];--类属表
PORT--端口表(端口名:方向(端口模式)端口类型;
:;
端口名:方向(端口模式)端口类型
);END实体名;ENTITY实体名IS
4.1.2实体部分GENERIC类属参数
定义端口界面常数(端口宽度、器件延迟时间)。类属参量的值可由设计实体的外部提供。书写格式:GENERIC([常数名:数据类型[:设定值]{;常数名:数据类型[:=设定值]});例4-1
GENERIC(cntwidth:integer:=4);
4.1.2实体部分PORT端口
用于定义模块所有的输入/输出信号,相当于定义一个模块符号需要定义端口信号名、端口模式、端口数据类型例4-1
4.1.2实体部分CICONRESETQCNT[3..0]CLKCNTM16端口模式端口模式说明(以设计实体为主体)IN输入,只读模式,将变量或信号信息通过该端口读入OUT输出,单向赋值模式,将信号通过该端口输出BUFFER具有读功能的输出模式,可以读或写,只能有一个驱动源INOUT双向,可以通过该端口读入或写出信息PORT端口模式端口数据类型VHDL数据类型:预定义数据类型、自定义数据类型只能使用已经定义的数据类型例4-1中数据类型Std_logic和Std_logic_vector,在ieee.std_logic_1164.all程序包中说明,使用时首先打开。实体实例【例4-3】4位全加器的实体描述。Libraryieee;Useieee.std_logic_1164.all;Entityadd4isPort(a,b:instd_logic_vector(3downto0);Ci:instd_logic;Sum:outstd_logic_vector(3downto0);Co:outstd_logic);Endadd4;结构体(ARCHITECTURE)
结构体主要用来描述实体的内部结构,即描述一个实体的功能。描述方式行为描述方式、数据流描述方式、结构描述方式、混合描述方式4.1.3结构体部分结构体格式ARCHITECTURE结构体名OF实体名IS[结构体说明部分];BEGIN
结构体描述部分;END结构体名;4.1.3结构体部分结构体组成4.1.3结构体部分行为描述
描述该设计单元的功能,主要使用函数、过程和进程语句,以算法形式描述数据的变换和传送
结构体描述风格例4-4Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;Useieee.std_logic_arith.all;Entityeqcomp4isPort(a,b:instd_logic_vector(3downto0);equals:outstd_logic);Endeqcomp4;Architecturebehavioralofeqcomp4isBeginComp:process(a,b)BeginIfa=bthenEquals<=’1’;ElseEquals<=’0’;Endif;Endprocesscomp;Endbehavioral;
行为描述结构描述
描述该设计单元的硬件结构,调用库中的元件或是设计模块,主要使用元件说明语句及元件例化语句
结构体描述风格例4-5U0xnor2x(0)a(0)b(0)U1xnor2x(1)a(1)b(1)U2xnor2x(2)a(2)b(2)U3xnor2x(3)a(3)b(3)U4and4equalsabcdyArchitecturestructofeqcomp4isComponentxnor2--元件说明
Port(a,b:instd_logic;X:outstd_logic);Endcomponent;Componentand4--Port(a,b,c,d:instd_logic;y:outstd_logic);Endcomponent;Signalx:std_logic_vector(0to3);
结构描述BeginU0:xnor2portmap(a(0),b(0),x(0));--元件例化
U1:xnor2portmap(a(1),b(1),x(1));U2:xnor2portmap(a(2),b(2),x(2));U3:xnor2portmap(a(3),b(3),x(3));U4:and4portmap(x(0),x(1),x(2),x(3),equals);Endstruct;
结构描述数据流描述从信号到信号的数据流的路径形式进行描述。使用并行的信号赋值语句,既显式表示了该设计单元的行为,也隐式表示了该设计单元的结构。
结构体描述风格例4-6Architecturedataflowofeqcomp4isBeginEquals<=’1’when(a=b)else‘0’;并行信号赋值语句Enddataflow;
一个实体可有多种方案的结构体,但仿真和综合时要用configuration配置语句选择一个结构体映射到硬件电路,即为实体选择、指定或者激活一个结构体。
结构体配置4.1.3结构体部分4.1.4语法小结数据类型信号赋值属性库和程序包实体结构体端口定义端口模式逻辑操作符IF语句变量对象进程语句顺序语句并行语句说明部分元件说明元件例化信号对象类属定义CASE语句条件操作符配置条件信号赋值数字文字规则运算符运算符重载类型定义4.2VHDL语言要素文字规则数据对象数据类型运算符属性4.2.1文字规则标示符数值字符串下标4.2.1文字规则标示符1、标识符由字母、数字及下划线组成;
2、以字母开头;
3、下划线不能放在结尾;
4、下划线不能连用;
5、不能使用保留字;
6、VHDL不区分大小写。4.2.1文字规则数值表示(1)整数表示
整数表示十进制数值,如:
11,123,135E2(=13500),12_345_678(=12345678)
(2)实数表示
实数也表示十进制数值,必须带有小数点,如:
1.252.01.56E-3(0.00156)1_120.123_678(11120.123678)数值表示(3)数制基数表示
有5部分组成:十进制数表示数值的基数;隔离符号“#”;该基数下对应的数值;隔离符号“#”;十进制表示的指数部分。
2#1110#--二进制表示数值14
8#120#--八进制表示数值80
16#A0#--十六进制表示数值160
10#12#E2--十进制表示数值1200
16#D#E1--十六进制表示数值2084.2.1文字规则字符串
字符、字符串:单引号引起来的ASCII字符(数值、符号或字母);双引号中的一维的字符数组。
如:‘R’,‘a’,‘*’,‘Z’,‘-’
,‘0’;“ERROR”,“NOTE”
两种类型字符串:文字字符串和数位字符串(位矢量,是BIT数据类型的一维数组)。B“1_0101_1010”--二进制数数组,长度是9O“17”--八进制数数组,长度为6X“A2E0”--十六进制数数组,位矢数组长度是164.2.1文字规则下标名及下标段名1、用于指示数组型变量或信号的某一元素或某一段元素
2、语句格式分别为:
名(表达式);
名(表达式1to/downto表达式2);
3、signala,b:bit_vector(7downto0);
signalc,d:bit;
a<=“01000111”;--给a(7)到a(0)赋值为“01000111”
c<=a(6);--把a(6)值’1’
赋值给c
b(7downto4)<=a(3downto0);--a的低4位赋给b的高4位
b(0to3)<=a(4to7);--a的高4位赋给b的低4位
d<=a(0);--把a(0)值’1’
赋值给d
4.2.2数据对象数据对象类似于一种容器,接受不同数据类型的赋值
常量变量信号对象种类:
信号signal、变量variable、常量constant、文件file。
常量:不对应电路中的物理量,但可以说明全局量。在结构体、实体、程序包、进程、函数、过程中均可使用。
变量:程序运算的中间量,并不对应电路中的物理量。变量说明局部量,用于进程、函数、过程。
信号:电路中的物理量,对应于电路的连线和节点。信号说明全局量,用于描述结构体、实体、程序包。
4.2.2数据对象对象特点:
1、信号和变量可以被连续地赋值;
2、常量只能被赋值一次;
3、信号和变量的赋值形式和执行过程不同:变量是立即赋值(:=),没有延迟,而信号赋值要有一定的延迟(<=)。4.2.2数据对象对象说明的格式
对象种类对象名:数据类型[:=表达式];
1、对象种类:Constant(常数)、Signal(信号)、Variable(变量)、File(文件)
2、表达式用于设定初始值,是可选项。
4.2.2数据对象【例4-8】常量说明实例:CONSTANTDBUS﹕BIT_VECTOR:=“01011010”;定义BIT_VECTOR位矢量型常量DBUS,取值“01011010”。CONSTANTVCC﹕REAL:=5.0;定义REAL实数型常量VCC,取值5.0。CONSTANTDELY﹕TIME:=25ns;定义TIME时间型常量DELY,取值25ns。4.2.2数据对象【例4-9】变量说明实例:VARIABLEx,y:INTEGER;定义变量x和y,整数类型。VARIABLEcount:INTEGERRANGE0TO255:=10;定义变量count,整数类型,取值在0-255,初始值为10。4.2.2数据对象【例4-10】信号说明实例:SIGNALsys_clk:BIT:=’0’;
SIGNALdata_bus:Std_Logic_Vector(7Downto0):=(others=>’1’);
4.2.2数据对象【例4-12】
libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;
entitybcdadderisport(op1,op2:inintegerrange0to9;result:outintegerrange0to31);endbcdadder;4.2.2数据对象architecturebehaveofbcdadderisconstantajustnum:integer:=6;signalbinadd:integerrange0to18;beginbinadd<=op1+op2;process(binadd)variabletmp:integer:=0beginifbinadd>9thentmp:=adjustnum;elsetmp:=0;endif;result<=binadd+tmp;endprocess;endbehave;4.2.2数据对象4.2.3数据类型VHDL是一种强类型语言,要求设计实体中的每一个常数、信号、变量、函数以及设定的各种参量都必须具有确定的数据类型,并且只有数据类型相同的量才能互相传递和作用。VHDL中的数据类型:标量(整数、浮点、枚举、物理)、复合(数组、记录)、文件、存取
。VHDL中的数据类型引用方式有:预定义、自定义
和类型转换等。标准数据类型(可直接引用)在VHDL标准程序包STANDARD中定义的,在实际使用中,已自动包含进VHDL的源文件中,因而不必通过USE语句以显式调用。
4.2.3数据类型标准数据类型(1)整数(INTEGER)
整数类型的数代表正整数、负整数和零。整数在硬件电路中是用二进制表示的,但其不能被看作位矢量(枚举型),不能使用逻辑操作符。整数常量的书写方式示例如下:2--十进制整数10E4--十进制整数16#D2#--十六进制整数2#11011010#--二进制整数标准数据类型(2)实数
VHDL的实数类型类似于数学上的实数,或称浮点数,取值范围为-1.0E38~+1.0E38。书写时一定要有小数。仅能在VHDL仿真器中使用,VHDL综合器不支持实数,因为实数类型的实现相当复杂,目前在电路规模上难以承受。实数常量的书写方式举例如下:65971.333333 --十进制浮点数8#43.6#E+4--八进制浮点数43.6E-4 --十进制浮点数(3)位(BIT)
位数据类型也属于枚举型,取值‘1’或‘0’。可以进行逻辑运算,运算结果仍是位数据类型。VHDL综合器用一个二进制位表示BIT。在程序包STANDARD中定义的源代码是:TYPEBITIS(‘0’,‘1’);例:signala,b,c:bit;c<=aandb;
标准数据类型(4)位矢量(BIT_VECTOR)
位矢量是基于BIT数据类型的数组。在程序包STANDARD中定义的源代码是:TYPEBIT_VECTORISARRAY(NATURALRANGE<>)OFBIT;位矢量是用双引号括起来的一组位数据。Signala:bit_vector(7downto0):=”11001010”;
标准数据类型(5)布尔(BOOLEAN)
布尔数据类型实际上是一个二值枚举型数据类型,它的取值有FALSE和TRUE两种。可以进行关系运算和逻
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 北京市海淀区2025-2026学年八年级上学期期末地理试题(原卷版)
- 《GBT 16992-2008飞机维护及其安全警告标志》专题研究报告
- 《GBT 21844-2008化合物(蒸气和气体)易燃性浓度限值的标准试验方法》专题研究报告
- 《GBT 16265-2008包装材料试验方法 相容性》专题研究报告
- 《GBT 2828.3-2008计数抽样检验程序 第3部分:跳批抽样程序》专题研究报告
- 道路安全指示牌课件
- 道路安全员驾驶培训课件
- 2026年鲁教版初二道德与法治教育上册月考综合考核试题及答案
- 2026年海南高职单招语文试题解析及答案
- 2026年初级药士考试题库(附含答案)
- 2025~2026学年山东省菏泽市牡丹区第二十一初级中学八年级上学期期中历史试卷
- 2025至2030中国细胞存储行业调研及市场前景预测评估报告
- 《中华人民共和国危险化学品安全法》解读
- 水暖施工员考试及答案
- 2025年省级行业企业职业技能竞赛(老人能力评估师)历年参考题库含答案
- 2025年北京高中合格考政治(第一次)试题和答案
- 培养员工的协议书
- 1.1《子路、曾皙、冉有、公西华侍坐》教学课件2025-2026学年统编版高中语文必修下册
- DB6109∕T 317-2025 库区消落带桑树生态修复技术规程
- 2025天津中煤进出口有限公司面向中国中煤内部及社会招聘第五批电力人才52人(公共基础知识)测试题附答案解析
- 2025至2030氢过氧化叔丁基(TBHP)行业运营态势与投资前景调查研究报告
评论
0/150
提交评论