第7章VHDL要素.ppt

上传人:吴艺期 文档编号:373724 上传时间:2018-10-05 格式:PPT 页数:59 大小:784KB
下载 相关 举报
第7章VHDL要素.ppt_第1页
第1页 / 共59页
第7章VHDL要素.ppt_第2页
第2页 / 共59页
第7章VHDL要素.ppt_第3页
第3页 / 共59页
第7章VHDL要素.ppt_第4页
第4页 / 共59页
第7章VHDL要素.ppt_第5页
第5页 / 共59页
亲,该文档总共59页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、第7章 VHDL要素,7.1 算术操作符与优先级,与传统的程序语言一样,VHDL表达式中的基本元素也是由不同类型的运算符相连而成的。这里所说的基本元素称为操作数(Operands),运算符称为操作符(Operators)。,VHDL操作符可分为逻辑操作符(参5.3.3)、关系操作符(参5.1.3)、算术操作符、符号操作符和重载操作符(Overloading Operator)。,7.1.1 算术操作符Arithmetic Operator,【例7-1】用SLL完成3-8译码器的设计,ENTITY decoder3to8 ISport (input: IN INTEGER RANGE 0 TO

2、7;output: OUT BIT_VECTOR ( 7 DOWNTO 0); END decoder3to8;ARCHITECTURE behave OF decoder3to8 ISBEGINoutput=”00000001”SLL input;-被移位部分是常数! END behave;,【例7-2】乘方和取绝对值语法例,SIGNAL a,b:INTEGER RANGE -8 to 7; SIGNAL c:INTEGER RANGE 0 to 5; SIGNAL d:INTEGER RANGE 0 to 3;a=ABS(b);c=2*d;,7.1.2 VHDL操作符优先级,在编程时可充分

3、利用括号,可有效避免错误。,7.2 BUFFER类型与操作符重载函数,【例6-3】4位计数器设计。 题目分析: 计数器:对时钟信号CLK进行计数,即在CLK上升沿时输出值Q=Q+1; 端口设置:CLK为IN BIT,Q=Q+1要实现将输出到端口的值反馈回来加1,只有采用BUFFER端口类型;要实现算术运算,数据类型须采用INTEGER。 注意:表面上BUFFER具有双向端口INOUT的功能,但实际上其输入功能是不完整的,它只能将自己输出的信号再反馈回来。,7.2.1 BUFFER类型,ENTITY CNT4 IS PORT (CLK: IN BIT; Q :BUFFER INTEGER RAN

4、GE(15 DOWNTO 0); END CNT4;,ARCHITECTURE bhv OF CNT4 ISBEGINPROCESS(CLK)BEGINIF CLKEVENT AND CLK=1 THENQ=Q十1;END IF;END PROCESS; END bhv;,BUFFEF类型在多级设计中不便于综合,常用OUT类型。,ENTITY CNT4 1SPORT(CLK:IN BIT;Q :OUT INTEGER RANGE(15 DOWNTO 0); END; ARCHITECTURE bhv OF CNT4 IS SIGNAL Q1: INTEGER RANGE(15 DOWNTO 0

5、); BEGIN PROCESS (CLK)BEGINIF CLKEVENT AND CLK=l THENQ1=Q1+1;END IF;Q=Q1;END PROCESS; END bhv;,- Q模式OUT,不能反馈,设中间信号对应Q,7.2.2 操作符重载函数,【例7-5】带有异步清零、进位输入/输出的4位计数器。 题目分析: 计数器概念同上即在CLK上升沿时输出值Q=Q+1; 异步清零:只要清零信号RES有效,Q=0; 进位输入:在进位输入Ci=1时,才对时钟信号CLK进行计数; 进位输出:Q=1111时来个脉冲本计数器清零,进位输出Co=1,使下级计数器加1计数。 端口设置:我们在5.3

6、.2中介绍,实际设计中尽量采用STD_LOGIC类型,故端口定义见程序。现在出现一个问题,算术运算只能用于整型,不能用于STD_LOGIC类型。要解决此问题,需要用到操作符重载函数,此函数在ieee.std_logic_unsigned程序包中定义,用户可不必自己设计。,LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.ALL;ENTITY cntm16 IS GENERIC (cntwidth : integer : = 4 ); PORT( ci : IN std_logic;res : IN st

7、d_logic; clk : IN std_logic;co : OUT std_logic;q : BUFFER std_logic_vector ( cntwidth-1 DOWNTO 0 ) END cntm16;,-打开操作符重载函数,ARCHITECTURE behave OF cntm16 IS BEGINco1WHEN (q =“1111”AND ci1) ELSE0;PROCESS ( clk , res)BEGINIF (nreset0) THENq(others0); ELSIF(clkevent AND clk=1) THEN IF (ci1 ) THEN qq+1;EN

8、D IF;END IF; -end if_reset END PROCESS; END behave;,7.3 库、程序包,7.3.1 库(Library) 库用于存放预先编译好的程序包(package)和数据集合体,可以用USE语句调用库中不同的程序包。它是为了提高设计效率以及使设计遵循某些统一的语言标准或数据格式,而将一些有用的信息汇集在一个或几个库中以供调用。这些信息可以是预先定义好的数据类型、子程序等设计单元的集合体(程序包),或预先设计好的各种设计实体(元件库程序包)。因此,可以把库看成是一种用来存储预先完成的程序包、数据集合体和元件的仓库。 库的说明格式:LIBRARY 库名; 打

9、开程序包的格式:USE 库名程序包名项目名;-开放指定库中的特定程序包内所选定的项目USE 库名程序包名ALL;-开放指定库中的特定程序包内所有的内容 库的说明语句总是放在实体前面。,LIBRARY ieee; -打开IEEE库 USE ieee.std_logic_1164.ALL; -调用std_logic_1164程序包中的std_logic数据类型定义USE ieee.std_logic_unsigned.ALL; -调用std_logic_unsigned中的操作符重载函数,库分为5种:IEEE库STD库ASIC库用户定义的库及WORK库VITAL库,1、IEEE库,IEEE库是VH

10、DL设计中最为常见的库,它包含有IEEE标准的程序包和其他一些支持工业标准的程序包。 一般基于FPGACPLD的开发,IEEE库中的四个程序包STD_LOGIC_1164、STD_LOGIC_ARITH、STD_LOGIC_SIGNED和STD_LOGIC_ UNSIGNED已足够使用。 注意,在IEEE库中符合IEEE标准的程序包并非符合VHDL语言标准,如STD_LOGIC_1164程序包。 由于IEEE库不属于VHDL标准库,所以在使用其库中内容前,必须事先给予声明。即: LIBRARY ieee; USE ieee.std_logic_1164.ALL;,2、STD库,VHDL语言标准

11、定义了两个标准程序包,即STANDARD和TEXTIO程序包(文件输入输出程序包), STD库符合VHDL标准,在应用中不必显式表达,即如下语句是不必要的: LIBRARY STD; USE STD.STANDARD.ALL;,表7-1 IEEE和STD库中程序包内容,3、WORK库,WORK库是用户的VHDL设计的现行工作库,即用户自己建的目录,存放用户设计和定义的些设计单元和程序包。 自动满足VHDL语言标准,也不必以显式说明。 *4、VITAL库 使用VITAL库,可以提高VHDL门级时序模拟的精度,因而只在VHDL仿真器中使用。 实际上,由于各FPGACPLD生产厂商的适配工具都能为各

12、自的芯片生成带时序信息的VHDL门级网表,用VHDL仿真器仿真该网表可以得到精确的时序仿真结果,因此FPGACPLD设计开发过程中,一股并不需要VITAL库中的程序包。,6.3.2 程序包Package,在VHDL中,常量、数据类型、子程序可以在实体说明部分、结构体部分中加于说明,且实体说明部分所定义的常量、数据类型、子程序在相应的结构体中是可见的(即可以被调用),但对于其他的设计实体是不可见的。 为了使已定义的常数、数据类型、元件调用说明以及子程序能被更多其他的设计实体方便地访问和共享,可以将它们收集在一个VHDL程序包中。多个程序包可以并入一个VHDL库中,使之适用于更一般的访问和调用范围

13、。这一点对于大系统开发,多个或多组开发人员同步工作显得尤为重要。,程序包的组成,程序包由包头(程序包的声明部分)和包体(程序包的内容部分)两部分组成。 包头以PACKAGE开头,保存公用信息,包括常量、数据类型定义、信号声明、子程序声明及元件声明等。 包体以PACKAGE BODY开头,保存专用信息,包括局部数据类型、子程序实现(子程序体)等。当包头包括子程序声明时,包体必须定义子程序体。 程序包结构中,包体并非总是必须的。程序包首可以独立定义和使用。一个完整的程序包中,包头名与包体名同名。,程序包的一般格式: 程序包头: PACKAGE程序包名 IS 包头说明语句;END 程序包名;程序包体

14、: PACKAGE BODY程序包名 IS 包体说明语句;END 程序包名; 包头说明语句的可能情况:USE语句(打开其他程序包)、数据类型定义、子类型定义、常量、信号定义、子程序声明、元件声明等。 程序包包体说明语句中包含着包头中列举的子程序和元件的具体实现,即程序体,而包头则仅仅给出一个子程序名或元件的元件名和端口。,【例7-5】程序包包头,PACKAGE codehead IS -程序包包头开始TYPE byte IS RANGE 0 TO 255; -定义数据类型byteSUBTYPE subbyte IS byte RANGE 0 TO 15; -定义子类型CONSTANT byte

15、_ff :byte:=255; -定义16进制FF常数SIGNAL addend:nibble; -定义信号addendCOMPONENT byte_adder -声明元件,无IS,无“;”PORT(a,b:IN byte; -同端口定义c:OUT byte ;overflow;OUT BOOLEAN);END COMPONENT;FUNCTION my_function(a:IN byte) return byte; -定义函数END codehead; -程序包包头结束,由于元件和函数必须有具体的内容,这些内容要安排在程序包体中。 如果要使用这个程序包中的所有定义,可利用USE语句: US

16、E WORK.codehead.ALL;,常用的预定义的程序包有:,1、 STD_LOGIC_1164程序包: 是最常用的程序包。定义了满足工业标准的两个数据类型STD_LOGIC和STD_ LOGIC_VECTOR。2、STD_LOGIC_ARITH程序包: IEEE库中,此程序包在STD_LOGIC_1164程序包的基础上扩展了三个数据类型UNSIGNED、SIGNED和SMALL_INT,井为其定义了相关的算术运算符和转换函数。,3、STD_LOGIC_UNSIGNED和STD_LOGIC_SIGNED程序包: 在IEEE库中。这些程序包重载了可用于INTEGER型及STD_LOGIC和

17、STD_LOGIC_VECTOR型混合运算的运算符,并定义丁一个由STD_LOGIC_VECTOR型到INTEGER型的转换函数。这两个程序包的区别是,STD_LOGIC_SIGNED中定义的运算符考虑到了符号,是有符号数的运算。 4、STANDARD和TEXTIO程序包。是STD库中的预编译程序包。STANDARD程序包中定义了许多基本的数据类型、子类型和函数。TEXTIO程序包定义了支持文件操作的许多类型和子程序。在使用本程序包之前,需加语句USE STD.TEXTIO.ALL。TEXTIO程序包仅供仿真器使用。,7.4 子程序SUBPROGRAM,子程序是一个VHDL程序模块,与其他软件

18、语言程序中的子程序的目的相似,能更有效地完成重复性的工作。,1、只能使用顺序语句,这一点与进程相似。 2、子程序只能通过子程序调用及子程序的界面端口进行数据传递,不能像进程那样可以从本结构体的并行语句或进程结构中直接读取信号值或者向信号赋值。 3、子程序可以在程序包,结构体和进程中定义。 4、由于只有在程序包中定义的子程序可被其他不同的设计所调用,所以一般应该将子程序放在程序包中。VHDL子程序具有可重载性的特点,即允许有许多重名的子程序,但这些子程序的参数类型及返回值数据类型是不同的 5、子程序有两种类型,即过程PROCEDURE和函数FUNCTION。 6、应该注意,综合后的子程序将映射于

19、目标芯片中的一个相应的电路模块,且每一次调用都将在硬件结构中产生对应于具有相同结构的不同的模块。,7.4.1 函数(FUNCTION),函数可分为用户自定义函数和预定义函数。 预定义函数是库中现成的、具有专用功能的函数,如决断函数、转换函数等。 决断函数用于在多驱动信号时解决信号竞争问题。 转换函数用于从一种数据类型到另一种数据类型的转换,如在元件例化语句中利用转换函数可允许不同数据类型的信号和端口间进行映射。,自定义函数:,函数定义由两部分组成,即函数头和函数体。 函数首定义:FUNCTION 函数名(输入参数表) RETURN 数据类型 A、在进程、结构体中不必定义,在程序包中必须定义 B

20、、函数首相当于标签,入库的是函数体 C、函数名可以是普通的标识符,也可以是运算符,运算符必须加上双引号,这就是所谓的运算符重载。运算符重载就是对VHDL中现存的运算符进行重新定义,以获得新的功能。新功能的定义是靠函数体来完成的,,D、参数表是用来定义输入值的,所以不必以显式表示参数的方向。函数参量可以是信号或常数,参数名需放在关键词CONSTANT或SIGNAL之后,如果没有特别说明,则参数被默认为常数。 E、参数表格式:参数名:数据类型;如:FUNCTION max(a,b :STD_LOGIC) RETURN STD_LOGIC;,2)函数体定义,FUNCTION 函数名(输入参数表) R

21、ETURN 数据类型 IS -函数体说明部分BEGIN顺序语句;RETURN 返回变量名; END FUNCTION 函数名;,3)如果要将一个己编制好的函数并入程序包,函数首必须放在程序包的说明部分,而函数体需放在程序包的包体内。 4)如果只是在一个结构体中定义并调用函数,则仅需函数体即可。,【例7-6】在程序包中定义,在应用程序中调用的例子。,LIBRARY IEEE; USE IEEESTD_LOGIC_1164ALL;PACKAGE packexp IS -定义程序包FUNCTION max(a,b :STD_LOGIC_VECTOR) -定义函数首maxRETURN STD_LOGI

22、C_VECTOR;FUNCTION funcl(a,b,c:REAL) -定义函数首funclRETURN REAL;FUNCTION ”*” (a,b:INTEGER) -定义函数首:运算符号*RETURN INTEGER ;FUNCTION as2 (SIGNAL inl,in2:REAL) -定义函数首as2RETURN REAL ;END packexp ;,-函数功能描述/设计,放在包体内 PACKAGE BODY packexp ISFUNCTION max( a,b :IN STD_LOGIC_VECTOR)-定义函数体-对数据类型、常数、变量等的局部说明RETURN STD_L

23、OGIC_VECTOR IS BEGIN -用顺序语句完成规定算法或转换的部分。-一旦函数被调用,就将执行这部分语句。IF ab THEN RETURN a;ELSE RETURN b;END IF;END FUNCTION max; -结束FUNCTION语句 END; -结束PACKAGE BODY语句 -下面是函数调用,LIBRARY IEEE;-函数应用实例USE IEEESTD_LOGIC_1164ALL;USE WORKpackexpALL;-打开自定义程序包 ENTITY axamp ISPORT(datl,dat2:IN STD_LOGIC_VECTOR(3 DOWNTO 0)

24、;dat3,dat4:IN STD_LOGIC_VECTOR(3 DOWNTO 0);outl,out2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); END; ARCHITECTURE bhv OF axamp ISBEGINoutl= max(datl,dat2);用在赋值语句中的并行函数调用语句PROCESS(dat3,dat4)BEGINout2=max(dat3,dar4); 顺序函数调用语句END PROCESS; END;,3、重载函数(OVERLOADED FUNCTION),VHDL允许函数同名,但要求函数中定义的操作数具有不同的数据类型,以便调用时用以

25、分辨不同功能的同名函数。以此定义的函数称为重载函数。 VHDL的IEEE库中的STD_LOGIC_UNSIGNED程序包中对算术运算符进行了重载,允许被重载的操作符能够对新的数据类型进行操作,或者允许不同的数据类型之间用此操作符进行运算。,【例7-7】重载函数,LIBRARY IEEE; USE IEEESTD_LOGIC_1164ALL; PACKAGE packexp IS; -定义程序包-定义函数首 FUNCTION max(a,b:IN STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR;FUNCTION max(a,b:IN BIT_VECTOR) -

26、定义函数首RETURN BIT_VECTOR;FUNCTION max(a,b;IN INTEGER) -定义函数首RETURN INTEGER; END;,PACKAGE BOOY packexp IS-定义函数体 FUNCTION max(a,b:IN STD_LOGIC_VECTOR) RETURN STD_ Logic_VECTOR ISBEGINIF ab THEH RETURN a;ELSE RETURN b;END IF; END FUNCTION max; -结束MAX语句,FUNCTION max(a, b:IN INTEGER)RETURN INTEGER IS -定义函数

27、体BEGINIF a b THEN RETURN a;ELSE RETURN b;END IF; END FUNCTION max; -结束MAX语句,FUNCTION max( a,b:IN BIT_VECTOR)RETURN BIT_VECTOR IS -定义函数体BEGINIF ab THEN RETURN a;ELSE RETURN b; END IF;END FUNCTION max; -结束FUNCTION语句END; -结束PACKAGE BODY语句,重载函数的调用,LIBRARY IEEE ;USE IEEESTD_LOGIC_1164ALL;USE WORKPackexp.

28、AlL;ENTITY axamp ISPORT(a1,b1:IN STD_LOGIC_VECTOR(3 DOWNTO 0);a2,b2:IN BIT_VECTOR(4 DOWNTO 0);a3,b3:IN INTEGER RANGE 0 TO 15;c1 : OUT STD_ LOGIC_ VECTOR(3 DOWNTO 0);c2 : OUT BIT_ VECTOR(4 DOWHTO 0);c3 : OUT INTEGER RANCE 0 TO 15); END;,ARCHITECTURE bhv OF axamp ISBEGINcl=max(a1,b1);-对函数max STD_LOGIC

29、_VECTOR的调用c2=max(a2,b2);-对函数max BIT_VECTOR的调用c3 =max(d3b3);-对函数max INTEGER的调用 END;,7.4.2 过程(PROCEDURE),1、定义格式: 过程首定义格式(不是必需的):PROCEDURE 过程名 (参数表); 过程体定义格式PROCEDURE 过程名 (参数表) IS (说明部分)BEGIN 顺序语句;END PROCEDURE 过程名;,参数表对常数、变量和信号三类数据对象作出说明,并用关键词IN、OUT和INOUT定义这些参数的的流向。如果没有指定模式,则默认为IN。 过程体:由顺序语句组成的,过程的调用即

30、启动了对过程体的顺序语句的执行。,【例7-8】数据转换子程序,PROCEDURE prgl(VARIABLE value:INOUT BIT_VECTOR(0 TO 3) ISBEGINCASE value ISWHEN “0000”= value:=”0101”;WHEN “0101”=value:=“0000”;WHEN OTHERS=value:=“1111”;END CASE; END PROCEDURE prgl;,2、过程调用,调用格式:过程名(变量表); 变量表顺序按过程定义的变量表顺序 【例6-10】重载过程与过程调用 PROCEDURE calcu ( v1,v2:IN RE

31、AL;SIGNAL out1:INOUT INTEGER) ; PROCEDURE calcu ( v1,v2:In INTEGER; SIGNAL outl:INOUT REAL) ; Calcu (20.15,1.42,signl) ; -调用第一个过程calcu calcu(23, 320,sign2); -调用第二个过程calcu ,先介绍再调用,7.5 元件例化与调用,在庞大的系统设计中,常常将系统分割成几个模块,每个模块完成某一特定的功能。 每个模块分开设计,最后将几个模块连接起来。这样可几人分工协作,提高工作效率。 各模块的设计称为底层文件设计,系统连接称为顶层文件设计。 底层文

32、件可经过元件例化,变成一个元件,顶层文件可对此元件调用并进行端口连接。,元件例化语句由两部分组成:,1、元件声明语句:对一个现成的设计实体进行封装介绍 格式:COMPONENT实体名ISPORT (端口名表);END COMPONENT实体名; 元件声明语句必须放在结构体的ARCHITECTURE和BEGIN之间。如果元件在程序包中定义,元件声明语句必须放在程序包包头内。,2、元件与当前设计实体(顶层文件)的连接:,例化名:元件名PORT MAP( 端口名= 连接端口名,);其中: 1)例化名是必须存在的,它相当于元件编号。 2)PORT MAP是端口映射/连接的意思其中的“端口名”是在元件定

33、义语句中的端口名,“连接端口名”则是顶层系统中准备与接入的元件的端口相连的通信线名,或者是顶层系统的信号名。 3)映射表顺序任意。,【例7-11】 1位全加器说明元件例化与调用的方法,半加器设计: LIBRARY IEEE; USE IEEESTD_LOGIC_1164ALL; ENTITY halfadder IS PORT (a,b:IN STD_LOGIC; co,so:OUT STD_LOGIC); END halhadder;ARCHITECTURE fhl OF halfadder is BEGIN sO = a XOR b; cO = a AND b; END fhl;,全加器的

34、顶层设计,LIBRARY IEEE; USE IEEESTD_LOGIC_1164ALL; ENTITY fulladder ISPORT (ain,bin,cin:IN STD_LOGIC;cout,sum:OUT STD_LOGIC ); END fulladder;,ARCHITECTURE fdl OF fulladder ISCOMPONENT halfadder ISPORT ( a,b:IN STD_ LOGIC;co,so :OUT STD_LOGIC);END COMPONENT halfadder;SIGNAL d,e,f : STD_ LOGIC;BEGINul:half

35、adder PORT MAP(a=ain,b=bin,co=d,so=e);u2:halfadder PORT MAP(a=e, b=cin,co=f,so=sum);cout=d OR f; END fdl;,7.6 类型转换函数,VHDL要求每一个常数、信号、变量、函数以及设定的各种参量都必须具有确定的数据类型。只有相同数据类型的量才能互相传递和运算。,【例7-13】利用转换函数CONV_INTEGER( )完成的3-8译码罪的设计,LIBRARY IEEE; USE IEEESTD_LOGIC_1164ALL; USE IEEESTD_LOGIC_UNSIGNEDALL; ENTITY

36、decoder3to8 ISPORT ( input:IN STD_LOGIC_VECTOR (2 DWNTO 0);output: OUT STD_LOGIC_VECTOR (7 DOWNTO 0); END decoder3to8; ARCHITECTURE behave OF decoder3to8 ISBEGINPROCESS (input)BEGINoutput 0 );output(CONV_INTEGER(input) = l;END PROCESS; END behave;,7.7 生成语句,生成语句有一种复制作用,它可以生成与某个元件或设计单元电路完全相同的一组并行元件或设计

37、单元电路结构。 生成语句格式:标号:FOR 循环变量 IN 取值范围GENERATE 说明语句;BEGIN并行语句;END GENERATE标号; 或: 标号: IF 条件 GENERATE说明语句;BEGIN并行语句;END GENERATE 标号;,【例7-14】利用GENERATE语句产生如图的4D触发器。,LIBRARY ieee; USE ieee.std_logic_1164.ALL;ENTITY dff_4 IS PORT (clk , clrn , prn : IN std_logic;d: IN std_logic_vector (0 TO 3 );q: OUT std_lo

38、gic_vector (0 TO 3 ); END dff_4;,ARCHITECTURE body OF dff_4 ISCOMPONENT dff PORT (d , clk , clrn , prn : IN std_logic;q : OUT std_logic);END COMPONENT; BEGIN dff4: FOR i IN 3 DOWNTO 0 GENERATEu: dff PORT MAP (d (i), clk, clrn, prn, q (i);END GENERATE; END body;,如果电路的输入、输出端是不规则的,则不规则部分可用IF-GENERATE语句

39、设计,规则部分采用FOR-GENERATE设计。,SIGNAL x : std_logic_vector (0 TO 2 );,shifter : FOR i IN 0 TO 3 GENERATEu1 : IF i = 0 GENERATEdffx : dff PORT MAP (a, clk, clrn, prn, x(i);END GENERATE u1;u23 : IF (i 0 AND i/=(m-1) GENERATEdffx : dff PORT MAP(x (i-1), clk , clrn , prn , x(i) );END GENERATE u23;U4 : IF (i=(m-1) GENERATEdffx : dff PORT MAP(x (i-1), clk , clrn , prn , b );END GENERATE u4;END GENERATE;,

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

当前位置:首页 > 教学课件 > 大学教育

copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1