找回密码
 注册
关于网站域名变更的通知
查看: 5947|回复: 6
打印 上一主题 下一主题

DCM使用详解

[复制链接]
  • TA的每日心情
    开心
    2024-12-19 15:41
  • 签到天数: 36 天

    [LV.5]常住居民I

    跳转到指定楼层
    1#
    发表于 2010-3-11 09:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    本文翻译自Using Digital Clock Managers (DCMs) in Spartan-3 FPGAs
    9 w. R4 Q) V/ ZDCM主要功能
    . J! z1 n! E/ c! B' K1. 分频倍频:DCM可以将输入时钟进行multiply或者divide,从而得到新的输出时钟。% u& f# H1 u# d. p( }# K1 v( ~# ?) k2 S
    2. 去skew:DCM还可以消除clock的skew,所谓skew就是由于传输引起的同一时钟到达不同地点的延迟差。8 S: z' z5 }* u% ?8 D+ r" q
    3. 相移:DCM还可以实现对输入时钟的相移输出,这个相移一般是时钟周期的一个分数。
    . e9 D, ^) h& w) [0 M4. 全局时钟:DCM和FPGA内部的全局时钟分配网络紧密结合,因此性能优异。# x. Y# q8 p% O: l) {0 i: J* x' j- E
    5. 电平转换:通过DCM,可以输出不同电平标准的时钟。 % `; }9 X) C+ V1 N% ^
    DCM的特点与能力(Spartan-3系列为例)
    • 数量:4 DCM / FPGA(也有例外)
      ' W; f9 I& A  v* x4 y. }-- 应该够用了
    • 数字频率综合器输入(CLKIN):1-280MHz
    • 延迟锁相环输入(CLKIN):18-280MHz
    • 时钟输入源(CLKIN):
      : Q% E% t  g+ I' V  Global buffer input pad
      7 I' K) i: P( I% A' }  Global buffer output
      - x1 d& z9 a5 H5 S4 w6 H  General-purpose I/O (no deskew)4 M" e; s( }# Z: l- c
        Internal logic (no deskew)
      , d9 L1 f6 ?( E- N) m! l" R. m-- 上面最后两个分别是外部的普通IO口和内部的逻辑,没有deskew,所以时钟质量不会很好。
    • 频率综合器输出(CLKFX、CLKFX180):是CLKIN的M/D倍,其中& h: }; E7 h9 B8 c
      M=2..32
      # p3 H, k8 q2 c5 Y( D D=1..32& m& e8 J' f; c& o
      -- 这样看来最大能倍频32倍,最小能16分频。
    • 时钟dividor输出(CLKDV):是CLKIN的下列分频
      8 t& o' E# ?) y8 S  1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 9, 10, 11, 12, 13, 14, 15, or 16
      8 ]' O& E) _% S2 [# _4 E5 u0 _-- 发现没有,最大的分频也是16。不过能支持半分频,比用频率综合器方便。
    • 倍频输出(CLK2X、CLK2X180):CLKIN的2倍频
    • 时钟conditioning、占空比调整:这个对所有时钟输出都施加,占空比为50%。
    • 1/4周期相移输出(CLK0/90/180/270):是CLKIN的1/4周期相移输出。
    • 半周期相移输出(CLK0/180、CLK2X/180、CLKFX/180):相差为180度的成对时钟输出。
    • 相移精度:最高精度为时钟周期的1/256。
    • 时钟输出:9个
      $ `' [4 I" Y* g8 H1 ?. m  到全局时钟网的时钟输出:最多9个中的4个0 P* i, D/ e/ F: Q: g+ s
        到General purpose互联:最多9个  V1 }. _+ M/ W* c, N
        到输出脚:最多9个
      9 C6 m5 w' Z% }7 |4 b1 S-- 可见9个时钟输出可以随意链接内部信号或者外部输出,但是进入全局时钟网的路径最多只有4个。

    + h9 [- Q# m$ m& KDCM的位置在哪?
    $ \! m0 }- e) \; J& T% p* P$ c/ E8 `. k! d
    我们以Spartan3系列为例。% h# E+ C1 X* }: t$ b- m
    FPGA看上去就是一个四方形。最边缘是IO pad了。3 S9 r0 y3 E8 }* n
    除去IO pad,内部还是一个四方形。- ?6 @+ q8 y: s1 V/ Q
    四个角上各趴着一个DCM。" F! t# P. P+ ]$ w
    上边缘和下边缘中间则各趴着一个全局Buffer的MUX。
    2 Q" [" K% n) q2 k这样的好处是四个DCM的输出可以直接连接到全局Buffer的入口。
    9 x1 `/ Y, M  t: _下面是手绘简图,很丑是吧,呵呵。. m: @" M3 A6 ~3 _

    * o/ j7 \. R0 m2 L$ w : o; X( L% u( Q6 C8 }
    DCM是全局时钟网络可选的一部分
    1 t1 R4 w$ f: ?: ~( G" m/ d
    一般,时钟通过一个“全局输入buffer”和“全局时钟buffer” 进入全局时钟网络。如下所示% ]6 o1 ~$ S. g
    GCLK --->( IBUFG ---> BUFG) ---> low skew global clock network( ]: ^( `- r. M% [1 h2 G7 Z
    在需要的时候,DCM也成为全局时钟网络的一环。0 D$ u- Z9 \! p4 R2 f

    7 d& p* \( c  K' r! K, S( A( p4 ] : K6 k* J( a+ O- c
    DCM 内部构成一览
    * h/ Z7 R) j. l$ N" Z' ^  [1. DLL 延迟锁定环
    ! k6 u9 G. S/ g8 F    说是延迟锁定环,但是我觉得叫做延迟补偿环更加贴切。因为DLL的主要功能是消除输入时钟和输出时钟之间的延迟,使得输入输出在外部看来是透明连接。8 U  R" X' M: s" ^
        实现这种功能的原理是:DLL通过输出时钟CLK0或者CLK2X观察实际的线路延迟,然后在内部进行补偿。
    9 {5 H( j5 Z  [+ a1 P& C    一句话,DLL的核心功能是无延迟。" L+ r8 X: X& [2 ^( ~
        DLL的输出是CLK0, CLK90, CLK180, CLK270, CLK2X, CLK2X180, 和 CLKDV。
    + c: {5 I/ J% D* }5 \) d2 Y; j( \# O& Z7 k- f5 e9 b" F
    2. DFS 数字频率综合
    4 t9 g6 ~" c5 O" l& [    DFS的主要功能是利用CLKIN合成新的频率。/ V3 r% }6 r  A- y5 Y( _2 D$ C
        合成的参数是:M(multiplier)和 D(divisor)。通过MD的组合实现各种倍频和分频。' A. v: b. g; d% G2 v0 E
        如果不使用DLL,则DFS的合成频率和CLKIN就不具有相位关系,因为没有延迟补偿,相位就不再同步。
    4 J+ R' i$ y. D/ G+ h, N3 |5 {4 S7 z  R" a) f/ ^1 h9 I
    3. PS 相位偏移" U, v( z$ S; `+ L5 `$ `2 A! E
        注意这个相位偏移不是DLL中输出CLK90/180/270用的。这个PS可以令DCM的所有9个输出信号都进行相位的偏移。偏移的单位是CLKIN的一个分数。9 u" ?, G$ B+ E/ v( m: u
        也可以在运行中进行动态偏移调整,调整的单位是时钟的1/256。9 R! U; q/ [) ~' l- p- E- F
    这个功能我们平时不常用。! D% Q. o% S! Z% f1 N8 d$ ]
    ' I" ~# ~% r& e4 ?' ~5 ~! q
    4. 状态逻辑
    ! }4 j) l8 P4 P: s    这个部分由 LOCKED 信号和 STATUS[2:0] 构成。LOCKED信号指示输出是否和CLKIN同步(同相)。STATUS则指示DLL和PS的状态。 * l4 I: W4 F. c$ _
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////. p# K- l  {% g; Z3 \& Y5 D1 N3 }

    0 R! C+ O* J4 Y, x* m' bDCM_BASE
    ) v0 z3 y; p/ H3 f, LDCM_BASE是基本数字时钟管理模块的缩写,是相位和频率可配置的数字锁相环电路,常用于FPGA系统中复杂的时钟管理。如果需要频率和相位动态重配置,则可以选用DCM_ADV原语;如果需要相位动态偏移,可使用DCM_PS原语。DCM系列原语的RTL结构如图3-8所示。
    , p# [$ r, g, d$ y模块接口信号的说明如表3-8所列。
    : t: }: `3 n6 _/ B' v 5 c+ Y: v. m0 A
    DCM_BASE组件可以通过Xilinx的IP Wizard向导产生,也可以直接通过下面的例化代码直接使用。其Verilog的例化代码模板为: * e' ?9 u  V; [+ v+ A
    1 S+ @$ W6 }2 @- @% D+ v, D
    // DCM_BASE: 基本数字时钟管理电路(Base Digital Clock Manager Circuit) , I, J7 J+ d0 a9 {- L- ?: K3 j
    // 适用芯片:Virtex-4/5   R9 R- {% s  O/ A4 K1 \
    // Xilinx HDL库向导版本,ISE 9.1 % E% \) U* k) C1 a
    DCM_BASE #( ' Q; T% L. I3 Y  {" K
    .CLKDV_DIVIDE(2.0), ' Z' @- g1 M; [
    // CLKDV分频比可以设置为: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5 " n$ `( g6 O2 E, n
    // 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0
    " v3 |" i' E: R3 L.CLKFX_DIVIDE(1), // Can be any integer from 1 to 32 * ]7 S" ~2 |2 U
    // CLKFX信号的分频比,可为1到32之间的任意整数
    0 V: ], I+ s1 T# \) w+ W.CLKFX_MULTIPLY(4),
    4 Q- t6 Q6 J3 `( W0 c// CLKFX信号的倍频比,可为2到32之间的任意整数 " a& _: c- r1 _- Z
    .CLKIN_DIVIDE_BY_2("FALSE"), % N" |" D4 Q: t1 R9 E8 j9 z, ?
    // 输入信号2分频的使能信号,可设置为TRUE/FALSE , D- y% m( T$ P
    .CLKIN_PERIOD(10.0),
    ' k# g& v2 f, V0 C  }// 指定输入时钟的周期,单位为ns,数值范围为1.25~1000.00。
    ' f& O/ H- I' E! n$ H' {6 o. L.CLKOUT_PHASE_SHIFT("NONE"),
    4 F3 D2 u* A% d* O- O. l6 _// 指定移相模式,可设置为NONE或FIXED
    ) F2 n- C# b* h, t4 s% j.CLK_FEEDBACK("1X"),
    - M1 s" y7 Q) R+ y( W* r// 指定反馈时钟的频率,可设置为NONE、1X或2X。相应的频率关系都是针对CLK0而言的。 % _/ e- d8 A* E/ Z5 o3 y- I* ]
    .DCM_PERFORMANCE_MODE("MAX_SPEED"),
    & q# {: Y7 a: ]. L3 H. `( Z) h4 v// DCM模块性能模式,可设置为 MAX_SPEED 或 MAX_RANGE : }% s% }; F2 z' k/ W3 i/ y
    .DESKEW_ADJUST("SYSTEM_SYNCHRONOUS"), - k9 z7 V2 v" A2 R
    // 抖动调整,可设置为源同步、系统同步或0~15之间的任意整数 7 I8 v* g7 N4 T! q
    .DFS_FREQUENCY_MODE("LOW"),
    " L* ^/ p5 V2 T9 Z) d4 v' Y) z// 数字频率合成模式,可设置为LOW或HIGH 两种频率模式
    % f! {+ `4 J" x, D; ]& `.DLL_FREQUENCY_MODE("LOW"),
    4 n8 I" R6 i( G" t4 k. J// DLL的频率模式,可设置为LOW、HIGH或HIGH_SER / T; B9 Q6 x5 m8 M" q  Y6 D( f
    .DUTY_CYCLE_CORRECTION("TRUE"),
    3 A4 A( y3 M+ Q7 v2 X8 w, V// 设置是否采用双周期校正,可设为TRUE或FALSE / }, N% o8 }$ \) \$ B
    .FACTORY_JF(16'hf0f0), * \1 l& J  e# q' M2 Y% D# V
    // 16比特的JF因子参数 7 [6 n7 L+ S6 ]) \) r3 A5 w
    .PHASE_SHIFT(0),
    " h* n: b! S# g* e/ s// 固定相移的数值,可设置为 -255 ~ 1023之间的任意整数
    ' G; t- o" h7 q2 m. \1 M! z9 p.STARTUP_WAIT("FALSE") 7 v5 d+ O* B% n
    // 等DCM锁相后再延迟配置DONE管脚,可设置为TRUE/FALSE
    4 |8 A# `& K% @% E' n# [) DCM_BASE_inst (
    2 ]' S- T4 {% v; }0 }" p.CLK0(CLK0), // 0度移相的DCM时钟输出 6 U7 T: _& [5 C2 D# U: |
    .CLK180(CLK180), // 180度移相的DCM时钟输出 0 w  I9 U1 U: O5 N$ ^
    .CLK270(CLK270), // 270度移相的DCM时钟输出
    / P$ e& O; c. y4 r.CLK2X(CLK2X), // DCM模块的2倍频输出 % u. u% s1 h* A
    .CLK2X180(CLK2X180), // 经过180度相移的DCM模块2倍频输出
    " |! q% l- ^+ l.CLK90(CLK90), // 90度移相的DCM时钟输出
    ( ]# x# _" l* S9 ?. |' Q% W. ].CLKDV(CLKDV), // DCM模块的分频输出,分频比为CLKDV_DIVIDE 4 R# ~9 Q1 M5 q! W3 S# i
    .CLKFX(CLKFX), // DCM合成时钟输出,分频比为(M/D)
    2 x. {: @% F; P& t! o( B.CLKFX180(CLKFX180), // 180度移相的DCM合成时钟输出 3 r4 g. v5 P- Y; W  p
    .LOCKED(LOCKED), // DCM锁相状态输出信号
    , b; e! A8 X) O8 f/ Z8 B+ j.CLKFB(CLKFB), // DCM模块的反馈时钟信号
    * s, J' ~9 d8 V$ M.CLKIN(CLKIN), // DCM模块的时钟输入信号 5 {0 d, v+ Y2 O
    .RST(RST) // DCM 模块的异步复位信号
    & w$ x4 V4 h9 a) g5 L& L); 8 `. O6 b) X' }# Y$ w; B" U- x
    // 结束DCM_BASE模块的例化过程
    + [4 J, O% v! D2 x  `  V在综合结果分析时,DCM系列原语的RTL结构如图3-36所示。 7 G5 ]( Z( ?" p% f+ K) F* F
    % T2 e' T" r2 V1 A; a; U0 l( O
    图3-36 DCM模块的RTL级结构示意图 ' Q+ i" D8 X1 q0 _
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
    1 u- k; y9 P/ T8 t  d' {Spartan-3 DCM的兼容性
    + U, D% p4 F% F  }# [& z3 \
        S3 的DCM和 Virtex-II 以及pro的DCM 功能基本相同。但是S3 DCM的技术属于3代技术,因此在抗噪性能、相移能力方面有进一步提高。(客观的说,对我们的普通应用,不是特别重要。)# }/ A% e% ]& E# \8 t
        但是和Spartan-2系列相比,有很大改进。S2系列不叫DCM叫DLL,可见DFS和PS等功能完全是新加入的,所以S2系列其实除了二倍频几乎没有倍频和分频能力。从这点来讲,S3真的是用起来很爽了。  * G5 p/ g* ]% @" Z4 g

      {0 O2 ~# M* ]  GDCM 输入时钟的限制6 \: q) P1 p% n5 g9 n# x
       
    和所有物理器件一样,DCM的工作范围也是受限的。由于DLL和DFS的要求各不相同,因此DCM的输入频率的限制也视乎是否同时使用DLL和DFS还是单独使用其中之一。如果同时使用,则取限制较严格者作为整个DCM系统的限制。我们来看两者的独立限制。% U. P7 K. u+ F* }3 `( G
    2 S: g# }- L2 j. w8 G4 q
        呵呵,这部分内容不用记哦,需要的时候查一下软件或者手册就可以了。只要明白“CLKIN输入频率有限制,而且DLL、DFS同时使用时取其严格者” 这些道理就可以了。' @3 t/ `! m) U( z" S! U
        除了时钟限制之外,对于时钟的质量也有一定限制,主要有3个:
    5 U( H) F& r9 ~( d- a6 l1. CLKIN cycle-to-cycle jitter:约束了前后两个CLKIN周期的差异;
    " D! r* O; a7 f. |  J( @2. CLKIN period jitter:约束了100万个cycle中最大周期和最小周期之间的差异;
    9 X$ y3 {) i0 P* h( W( A3. CLKFB path delay variation:约束了从外部进来的反馈回路的延迟波动,这种延迟波动在概念上其实和jitter如出一辙。
    ) F0 n! X4 F+ i+ U: W7 G7 K具体数值请查手册,知道有这么回事就可以了。2 k/ \2 B+ T6 r
    LOCKED信号的行为方式
    . B$ p' j* h# }$ {# o
    LOCKED信号用于指示整个DCM系统已经和CLKIN同步,从LOCKED信号有效开始,输出时钟才可以使用,在此之前,输出时钟可能会处于各种复杂的不稳定状态。我们来看一下LOCKED信号的行为状态机。: m0 f. J7 P( i- `. m6 X
    FPGA配置:' g; }$ G7 f3 M! _* z7 ]
        if (CLKIN已经稳定) next_state = 判断同步;. O' Z/ d4 e% r2 g4 H0 i
        else                         next_state = RST_DCM;/ k# i' B8 O& ?$ v0 v, P  r! x
    判断同步:
    ) |: V  a3 P9 O9 g    if (已经同步)          next_state = 判断同步;4 N: E# y! u9 U/ n, _4 C8 X
        else                         next_state = 同步失败;+ K2 Y2 X7 G4 m5 S7 @6 Z- v
    同步失败:                    next_state = RST_DCM;* ]8 c& p6 U# X2 {; ^6 Z. _& P1 b
    RST_DCM:                  next_state = FPGA配置;; @, w/ j0 {' W1 I* ]! Q/ s

    2 b; H+ s1 ~) W现在来看看各个状态下的输出。, J% j! ~' D2 O
    2 T7 F% k$ p9 x0 \4 q
    case (state)
    ( B3 N% U( X! y) Z  P& H    FPGA配置: LOCKED = 0;& Z1 C/ n+ O# N3 f
        判断同步:   LOCKED = 1;
      T1 Q' t/ K9 s; E( y    同步失败:   LOCKED = 0;- G, B* J; P* m9 n0 M
        RST_DCM:LOCKED = 0;+ C$ R0 S; K# X  S/ z
    endcase! [8 I5 ?+ S6 i1 r+ t
    RST 信号——重启锁定& J0 C+ ]) t) S( F- ~( `
       
    RST信号用于在时钟不稳定或者失去锁定时,将DCM的相关功能重置,从而重新启动锁定追踪。
    5 P( \0 [9 j! ?- E    作为一个输入信号,RST无法被DCM自身置位,因此需要我们的应用设计来控制这个RST信号,否则需将其接地。
    4 G0 e, ?2 N, N9 G$ a    置位RST会将延迟tap的位置置0,因此可能会产生glitch或者是duty cycle 发生变化,另外相位偏移也会重置回到默认值。0 A3 _. H' e! K# G; y7 ^9 V- p
    DCM 生成向导/ d$ ?! X: z% B
    安装了ISE就能得到一系列accessories。利用其中的Architecture Wizard 我们可以生成DCM模块。生成的DCM将产生3种输出:, S, E: b# P0 W3 e/ T0 T$ Z
    1. 一个例化了DCM的逻辑综合文件(采用生产商特定格式的VHDL / Verilog)
    4 T- X  ]. j: K2. 一个UCF文件控制特定实现1 \: S. M/ M2 F/ C
    3. 所有其他用户设置都保存到XAW(Xilinx Architecture Wizard)文件中。" Y& Q  i$ B6 G" l" u$ ~# ]
    9 Q& T! ]2 R, D) O
    接下来描述一下向导使用步骤。8 v' X2 s: u5 o' ]5 u
    1. 从ISE或者Arch wizard中启动界面;' ^( e4 V" O4 u  I. E4 c  B
    2. 第一个页面做基本配置:路径、XAW文件名、VHDL / Verilog选择、综合工具、FPGA型号;: ~, R- L9 j& P3 g4 {/ u
    3. 进行General setup,一看就明白,不细说,注意一下几点:& g$ e, w2 m$ B1 N3 c4 D8 O) X
        - CLKIN source 如果选 external 则 DCM 的 CLKIN 会自动连接到 IBUFG。/ T4 E* }; N- I8 N1 J2 }
        - Feedback如果选 internal 则反馈来自 BUFG。# B. w: N+ M7 b. q' v& ^
    4. 高级设置9 g( \# t% X) C
        - 选择FPGA的配置过程是否包含DCM的锁定,如果是,则配置完成信号DONE将在LOCKED信号有效后方能有效。3 s! H# L! A8 i: q
        - 选择CLKIN是否要除2。由于DCM的输入频率有限,对于过高的输入时钟通过除2使之可用。% i* }# t' Y6 g2 N
        - Deskew调整,这个选项建议在咨询xilinx工程师后再使用。0 p. `: f1 F' R
    5. 时钟输出口 Buffer 设置
    7 o' N8 h# S! |    - 默认情况下所有输出口都链接 BUFG 全局时钟网络入口
    $ ^* P$ `  l+ O$ H" F; c. p    - 由于全局时钟网络的入口有限,用户可以定制时钟输出口连接到其他类型的Buffer/ N6 T( a3 M8 w# m
           - Global Buffer:进入全局时钟网络的入口Buffer,共有4个,简称BUFG* h8 a, a) K6 {7 K" T5 A$ S
           - Enabled Buffer:还是上面的4个全局时钟Buffer,但是配置为有使能信号控制,简称BUFGCE
    . E- t8 m' Z; y       - Clock MUX:还是上面的4个全局时钟Buffer,但是配置为 2-to-1 MUX类型,由S信号控制选出,简称BUFGMUX, P: g  r: G" M" V
           - Low skew line:没有buffer了,只能使用 skew 比较小的连线
    4 f0 _( x; U, E5 c7 V       - Local Routing:连到本地,skew的要求不是很严格
    % X  }. M2 ^5 l& ]" o* {9 m       - None:禁止输出$ @7 w. b/ g9 k! V) T
        - 对于Enabled Buffer类型和Clock Mux类型,需要指定En口的名字0 j" M: s" g, X6 g! d# M4 z
        - 需要为输出时钟信号指定名字或者使用默认
    + L! {. u! ?8 M; B0 C) r# f3 E6. 设置DFS
    4 ]; P: J# k9 k    - 设置目标输出频率,然后按calculate,自动生成 M/D 值和 Jitter 值
      l% p; I# U1 B/ T    - 或者手动设置 M/D 值,然后按calculate,自动生成频率和 Jitter 值
    $ H9 ?, v' x6 o, W7. 最后输出所需的3种文件。

    该用户从未签到

    2#
    发表于 2014-7-22 19:20 | 只看该作者
    太棒了,感谢分享

    该用户从未签到

    4#
    发表于 2015-7-21 17:45 | 只看该作者
    感謝分享~~这么好的东西没人气,太没天理了

    该用户从未签到

    5#
    发表于 2015-7-21 17:55 | 只看该作者
    D=1..32,  
    ! x6 B0 o5 D) E8 x2 K0 d-- 这样看来最大能倍频32倍,最小能16分频。# I! ]) B$ i3 s' ^* A2 K
    这个16从哪来?

    该用户从未签到

    6#
    发表于 2015-7-31 09:11 | 只看该作者
    感谢分享哦。

    该用户从未签到

    7#
    发表于 2015-8-14 19:13 | 只看该作者
    多谢楼主的无私分享
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-8-14 07:34 , Processed in 0.125000 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表