找回密码
 注册
关于网站域名变更的通知
查看: 5902|回复: 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 & g6 F3 E6 j; T. U$ A
    DCM主要功能, l' }1 k' X& ^/ g6 x' R$ g
    1. 分频倍频:DCM可以将输入时钟进行multiply或者divide,从而得到新的输出时钟。! y0 d' Y( l4 }- e' T
    2. 去skew:DCM还可以消除clock的skew,所谓skew就是由于传输引起的同一时钟到达不同地点的延迟差。# z' q  x# I- w7 W! a# o
    3. 相移:DCM还可以实现对输入时钟的相移输出,这个相移一般是时钟周期的一个分数。
    ' \* v. n( N. M( ?4. 全局时钟:DCM和FPGA内部的全局时钟分配网络紧密结合,因此性能优异。
    / P3 S- a) c# Q9 Q# |  u5. 电平转换:通过DCM,可以输出不同电平标准的时钟。
    % i) r2 ^9 a% O4 l7 @DCM的特点与能力(Spartan-3系列为例)
    • 数量:4 DCM / FPGA(也有例外)
      & y0 b) G( A( F" P-- 应该够用了
    • 数字频率综合器输入(CLKIN):1-280MHz
    • 延迟锁相环输入(CLKIN):18-280MHz
    • 时钟输入源(CLKIN):4 G# l6 m+ \( f. I0 \, V" K3 N; p
        Global buffer input pad
      9 i% x  K. b% f3 b& L- w  Global buffer output9 }( Y/ \) g  e7 D
        General-purpose I/O (no deskew)0 z( Y: ^  ]/ R- I  A0 n/ I" J
        Internal logic (no deskew)
      + e2 E  Z/ }! C& m; l, s-- 上面最后两个分别是外部的普通IO口和内部的逻辑,没有deskew,所以时钟质量不会很好。
    • 频率综合器输出(CLKFX、CLKFX180):是CLKIN的M/D倍,其中6 v! V: Q* z& s, {/ J7 U
      M=2..32" A1 p% q  ?, {- [, N
      D=1..32
      - l; w1 R! k8 f4 E5 T" W  m-- 这样看来最大能倍频32倍,最小能16分频。
    • 时钟dividor输出(CLKDV):是CLKIN的下列分频- L4 I( o4 U3 G" ~" T# C
        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
      , b7 ^  }: j5 C& _-- 发现没有,最大的分频也是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个) G. \( F$ v# I9 g; A1 U$ E
        到全局时钟网的时钟输出:最多9个中的4个
      " |# Q* E: y7 ~# u  到General purpose互联:最多9个) ?1 d. S8 P1 @# o$ v6 [
        到输出脚:最多9个
      ; h6 h+ a, v% P$ d4 t" B) i& ^-- 可见9个时钟输出可以随意链接内部信号或者外部输出,但是进入全局时钟网的路径最多只有4个。

    1 |! f  M5 e, J" G6 P4 l5 S! vDCM的位置在哪?6 D/ g+ n! @5 ?; @: x% g
    我们以Spartan3系列为例。
    ) H. i2 }( {9 I/ J# [FPGA看上去就是一个四方形。最边缘是IO pad了。
    * A9 E" q2 d/ R8 M除去IO pad,内部还是一个四方形。
    + \2 G& ]6 T  W+ m, \9 d四个角上各趴着一个DCM。, L* E  j. z7 V2 n
    上边缘和下边缘中间则各趴着一个全局Buffer的MUX。( g  X. q: I' L! i" I1 c
    这样的好处是四个DCM的输出可以直接连接到全局Buffer的入口。5 S8 Y6 |0 P2 b/ {* ?
    下面是手绘简图,很丑是吧,呵呵。
    4 C9 {2 Y6 |0 l, f: B& f; u
    ( o- |4 f; F% X! N' [
    & U/ ^! z6 W) O8 A4 xDCM是全局时钟网络可选的一部分( P& |0 H+ m7 D5 Y7 y- [3 ~4 {4 y
    一般,时钟通过一个“全局输入buffer”和“全局时钟buffer” 进入全局时钟网络。如下所示
      H  \8 C+ u8 }# b5 FGCLK --->( IBUFG ---> BUFG) ---> low skew global clock network
    2 S* l, M4 g) H4 c& Y在需要的时候,DCM也成为全局时钟网络的一环。6 \+ o) C( Z, a% ~% r6 j3 j

    ; T( E4 r# g* C0 v ' {+ f# x  ]$ O1 j6 ^
    DCM 内部构成一览
    % \& O* u3 i. W. b1. DLL 延迟锁定环
    8 |$ \8 ^9 i+ u    说是延迟锁定环,但是我觉得叫做延迟补偿环更加贴切。因为DLL的主要功能是消除输入时钟和输出时钟之间的延迟,使得输入输出在外部看来是透明连接。
    : H4 m8 A8 y7 A' G; ]    实现这种功能的原理是:DLL通过输出时钟CLK0或者CLK2X观察实际的线路延迟,然后在内部进行补偿。4 W2 X" ]7 L5 h
        一句话,DLL的核心功能是无延迟。) l% y& E/ N7 K# N1 t/ \' N
        DLL的输出是CLK0, CLK90, CLK180, CLK270, CLK2X, CLK2X180, 和 CLKDV。% \! z$ z4 n+ n* ?$ y7 X
    ; C7 ~1 G6 C" j$ Y6 f
    2. DFS 数字频率综合
    " j1 z  e3 g8 o$ n    DFS的主要功能是利用CLKIN合成新的频率。
    3 N4 ?, K2 ~: B. s, F# e    合成的参数是:M(multiplier)和 D(divisor)。通过MD的组合实现各种倍频和分频。
    ! j; ^5 T; ~( |) e    如果不使用DLL,则DFS的合成频率和CLKIN就不具有相位关系,因为没有延迟补偿,相位就不再同步。+ Z) F- T0 N& V' l, {4 C2 v

    3 f0 S8 J, ^* D6 `: |4 J3. PS 相位偏移' c$ ]. X# ~; m
        注意这个相位偏移不是DLL中输出CLK90/180/270用的。这个PS可以令DCM的所有9个输出信号都进行相位的偏移。偏移的单位是CLKIN的一个分数。
    6 r+ N, [" z0 }$ g    也可以在运行中进行动态偏移调整,调整的单位是时钟的1/256。1 h. n9 ^) O5 A
    这个功能我们平时不常用。
    , J) O; s+ ^, {4 O0 f+ D  l; d+ J$ w" s$ c1 B
    4. 状态逻辑' M, v+ Y6 d  C: W' Q1 v; C$ Q
        这个部分由 LOCKED 信号和 STATUS[2:0] 构成。LOCKED信号指示输出是否和CLKIN同步(同相)。STATUS则指示DLL和PS的状态。 - g1 y) l: Z& x$ A4 y) t
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////  d: r0 `1 ]7 ?( m* e

    / h7 b* {+ g2 K$ I: ^DCM_BASE 9 V5 I1 E8 V( t1 U+ w
    DCM_BASE是基本数字时钟管理模块的缩写,是相位和频率可配置的数字锁相环电路,常用于FPGA系统中复杂的时钟管理。如果需要频率和相位动态重配置,则可以选用DCM_ADV原语;如果需要相位动态偏移,可使用DCM_PS原语。DCM系列原语的RTL结构如图3-8所示。
    / ^- H6 Y2 u3 p! Q6 {+ R0 }, z模块接口信号的说明如表3-8所列。
    4 ?; E4 ~% h  B& D
    5 O9 p" ]/ j3 \, XDCM_BASE组件可以通过Xilinx的IP Wizard向导产生,也可以直接通过下面的例化代码直接使用。其Verilog的例化代码模板为:
    : d2 ?: B/ X2 H! i9 H& Y
    2 W( V6 L  P1 c5 r; T. g2 \! Y' o// DCM_BASE: 基本数字时钟管理电路(Base Digital Clock Manager Circuit) # w. S  G. ~, A7 U# @! @6 J
    // 适用芯片:Virtex-4/5
    6 g* J7 v- w2 i// Xilinx HDL库向导版本,ISE 9.1
    4 \# _& x% m% d5 jDCM_BASE #(
    ) ~; v/ q& }# A8 C6 d.CLKDV_DIVIDE(2.0), " T5 o7 W9 r) z8 e  Q
    // CLKDV分频比可以设置为: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5
    7 S$ V, D) I9 A! R- H1 s6 M1 A// 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0
    7 `$ Y0 A4 P7 S.CLKFX_DIVIDE(1), // Can be any integer from 1 to 32 $ s" P6 V  M0 k) M7 j: T% S* K
    // CLKFX信号的分频比,可为1到32之间的任意整数
    . N; {8 w. I3 l% b.CLKFX_MULTIPLY(4), ! K& y1 @- @4 U/ ^
    // CLKFX信号的倍频比,可为2到32之间的任意整数 ( M) ^( H5 d! m! v* @& l
    .CLKIN_DIVIDE_BY_2("FALSE"),
    * Q& L/ U; J+ X+ @2 |// 输入信号2分频的使能信号,可设置为TRUE/FALSE
    8 p& B6 M' R- k+ B& H! a. `.CLKIN_PERIOD(10.0), 5 o; Q' A9 A' k
    // 指定输入时钟的周期,单位为ns,数值范围为1.25~1000.00。
    9 F; f! q1 v) s" Y.CLKOUT_PHASE_SHIFT("NONE"),
    1 d1 Y( I! o6 f6 o& v; o// 指定移相模式,可设置为NONE或FIXED ; M2 Z, ]7 w+ ]$ ]1 H
    .CLK_FEEDBACK("1X"), 3 I9 _' [( O) S# {1 f2 N1 y: Q
    // 指定反馈时钟的频率,可设置为NONE、1X或2X。相应的频率关系都是针对CLK0而言的。
    6 L! q7 z* E. g# |.DCM_PERFORMANCE_MODE("MAX_SPEED"), 0 F9 \9 N) a' q
    // DCM模块性能模式,可设置为 MAX_SPEED 或 MAX_RANGE
    4 [% N6 l3 A; c6 b.DESKEW_ADJUST("SYSTEM_SYNCHRONOUS"),
    " F- G- P1 p- m) A% F// 抖动调整,可设置为源同步、系统同步或0~15之间的任意整数   \# }) r3 Q2 M# P
    .DFS_FREQUENCY_MODE("LOW"), 5 n0 O8 i7 N: Z, H. H! B
    // 数字频率合成模式,可设置为LOW或HIGH 两种频率模式 - X3 R4 `( ?& j; `! V, I
    .DLL_FREQUENCY_MODE("LOW"), : e/ g) p9 {5 g" R$ g# [
    // DLL的频率模式,可设置为LOW、HIGH或HIGH_SER
    " w* c0 A# ^' K7 v.DUTY_CYCLE_CORRECTION("TRUE"),
    ; [3 \' S. ]& B0 Q2 B" ~5 r// 设置是否采用双周期校正,可设为TRUE或FALSE & q6 u5 h' k2 d7 c9 Z+ |5 \/ j
    .FACTORY_JF(16'hf0f0), , C5 r9 Z1 {% x# F+ e7 C% n5 m6 w
    // 16比特的JF因子参数
    ; a/ `8 }4 l7 V$ ?' T" @.PHASE_SHIFT(0), 9 x2 E' |; P2 g- Z
    // 固定相移的数值,可设置为 -255 ~ 1023之间的任意整数
    8 ~; {) l, D9 p9 i" ?3 i.STARTUP_WAIT("FALSE") + d8 I+ O# I. p, Z) D) _- l
    // 等DCM锁相后再延迟配置DONE管脚,可设置为TRUE/FALSE
    $ o  q( v9 l: ]4 A) DCM_BASE_inst (
    , b; N0 ?0 T1 \$ l.CLK0(CLK0), // 0度移相的DCM时钟输出 % z; u, M& p- {
    .CLK180(CLK180), // 180度移相的DCM时钟输出
    4 [8 @; n5 B0 Z* k% w2 _/ F* j; F.CLK270(CLK270), // 270度移相的DCM时钟输出
    + x* P/ B8 @" U.CLK2X(CLK2X), // DCM模块的2倍频输出
    ; a* s+ l* n& O2 K4 }. L.CLK2X180(CLK2X180), // 经过180度相移的DCM模块2倍频输出 4 f, `: ]8 L$ c' Q) \
    .CLK90(CLK90), // 90度移相的DCM时钟输出 4 m$ s7 X& K1 _' ]3 J
    .CLKDV(CLKDV), // DCM模块的分频输出,分频比为CLKDV_DIVIDE
    ' p0 ?8 u' Z: U  Q1 V. I7 ^/ R: l" @.CLKFX(CLKFX), // DCM合成时钟输出,分频比为(M/D) " ?, g$ ?8 l1 W2 ?2 X: p. x2 ~5 c
    .CLKFX180(CLKFX180), // 180度移相的DCM合成时钟输出 & [4 D6 |, ]/ M! k* g
    .LOCKED(LOCKED), // DCM锁相状态输出信号 . m  O. M) T1 F  _' v
    .CLKFB(CLKFB), // DCM模块的反馈时钟信号 ) ?! c) u. `" ]+ T
    .CLKIN(CLKIN), // DCM模块的时钟输入信号
    1 M8 b, W3 N8 J: u& C1 @.RST(RST) // DCM 模块的异步复位信号
    ( X! L: x- [* o. Q; Z, ?3 R  U- D);   r8 z, S9 T$ [2 I6 J0 k, r% j) E, U
    // 结束DCM_BASE模块的例化过程 0 b' {, F8 I( W% j. c+ B1 P
    在综合结果分析时,DCM系列原语的RTL结构如图3-36所示。 7 X" R" X5 n! h# i

    ) N1 P0 C! Z4 B5 `+ H图3-36 DCM模块的RTL级结构示意图
    , C. [, [% k2 V8 T  F: E* w/////////////////////////////////////////////////////////////////////////////////////////////////////////////0 o' ?! X2 v4 o  E& i( X/ O
    Spartan-3 DCM的兼容性
    ' \, G: r, n+ w/ y9 K
        S3 的DCM和 Virtex-II 以及pro的DCM 功能基本相同。但是S3 DCM的技术属于3代技术,因此在抗噪性能、相移能力方面有进一步提高。(客观的说,对我们的普通应用,不是特别重要。)8 G6 S$ k& H% R# G5 {" o. m
        但是和Spartan-2系列相比,有很大改进。S2系列不叫DCM叫DLL,可见DFS和PS等功能完全是新加入的,所以S2系列其实除了二倍频几乎没有倍频和分频能力。从这点来讲,S3真的是用起来很爽了。  
    / r7 H1 f1 o# y+ [
    . Y' b: }/ Z" a$ Q. \: ZDCM 输入时钟的限制! f* t* N+ X: i
       
    和所有物理器件一样,DCM的工作范围也是受限的。由于DLL和DFS的要求各不相同,因此DCM的输入频率的限制也视乎是否同时使用DLL和DFS还是单独使用其中之一。如果同时使用,则取限制较严格者作为整个DCM系统的限制。我们来看两者的独立限制。
    + U, m3 S8 N% T& H
    2 ?2 ]8 F' E# [  d1 T4 m    呵呵,这部分内容不用记哦,需要的时候查一下软件或者手册就可以了。只要明白“CLKIN输入频率有限制,而且DLL、DFS同时使用时取其严格者” 这些道理就可以了。
    ! u7 G6 i* G; |; V, n) R    除了时钟限制之外,对于时钟的质量也有一定限制,主要有3个:  \$ P7 H+ X9 S; \
    1. CLKIN cycle-to-cycle jitter:约束了前后两个CLKIN周期的差异;
    ! `. z# O# }* e: S- k2. CLKIN period jitter:约束了100万个cycle中最大周期和最小周期之间的差异;
    & d, X* \/ ~, s9 W' i. H) W/ r3. CLKFB path delay variation:约束了从外部进来的反馈回路的延迟波动,这种延迟波动在概念上其实和jitter如出一辙。
    6 L; c2 _% v5 P/ d" g+ C& I7 ]具体数值请查手册,知道有这么回事就可以了。
    - _3 z5 I$ ~& m; Q8 I9 L' XLOCKED信号的行为方式
    # b% r" @( r) C" J+ M. I( z+ ^
    LOCKED信号用于指示整个DCM系统已经和CLKIN同步,从LOCKED信号有效开始,输出时钟才可以使用,在此之前,输出时钟可能会处于各种复杂的不稳定状态。我们来看一下LOCKED信号的行为状态机。7 s3 g: M1 C3 a1 e
    FPGA配置:
    7 f/ K1 F+ O- h- [/ x1 `$ h4 Q$ F    if (CLKIN已经稳定) next_state = 判断同步;
    & ]! `/ b/ {8 o; o    else                         next_state = RST_DCM;
    6 `! g) T2 e- b7 ~3 n7 G判断同步:
    9 C; S# h5 ]6 h1 o    if (已经同步)          next_state = 判断同步;' x/ A# F# s  Q: Q
        else                         next_state = 同步失败;
    4 f5 @0 i) C/ i) d6 o同步失败:                    next_state = RST_DCM;3 ?) S, r; X8 w1 `! V9 v" v
    RST_DCM:                  next_state = FPGA配置;
    ; f; l) k9 Y4 n# S4 r4 j0 P% x6 Z- G
    现在来看看各个状态下的输出。9 B, H$ n' h1 h! _- M

    4 e9 |6 ~" k/ {  Pcase (state)  e- V5 J$ J* F  }
        FPGA配置: LOCKED = 0;3 G1 L9 C' f' Z9 S' t- w$ |* g
        判断同步:   LOCKED = 1;
    ; `" }! i' p9 M: t    同步失败:   LOCKED = 0;8 L; }6 y' E/ t! A% j$ p
        RST_DCM:LOCKED = 0;1 r! B. \# j: [  I
    endcase
    ! K! P: ~4 _  m0 r* S; T% Q( D& nRST 信号——重启锁定
    * X- j# T; x0 J6 H6 V* P! p   
    RST信号用于在时钟不稳定或者失去锁定时,将DCM的相关功能重置,从而重新启动锁定追踪。0 a( |0 y3 X- o6 l. N8 s% Y( K
        作为一个输入信号,RST无法被DCM自身置位,因此需要我们的应用设计来控制这个RST信号,否则需将其接地。( Q6 z6 }. D, `6 y+ p9 A
        置位RST会将延迟tap的位置置0,因此可能会产生glitch或者是duty cycle 发生变化,另外相位偏移也会重置回到默认值。5 l8 Q) S( ~; r2 T. [/ _
    DCM 生成向导4 Q/ r7 s/ r- d7 o8 w9 g
    安装了ISE就能得到一系列accessories。利用其中的Architecture Wizard 我们可以生成DCM模块。生成的DCM将产生3种输出:
    * {+ ~& G; Z/ i6 X& w. q0 D5 l) H1. 一个例化了DCM的逻辑综合文件(采用生产商特定格式的VHDL / Verilog)) q' _8 z5 h' {
    2. 一个UCF文件控制特定实现
    ! u. |2 v! u5 z4 z3. 所有其他用户设置都保存到XAW(Xilinx Architecture Wizard)文件中。
    3 P, K& W! f& v1 l  i7 m" I
      H( `; N3 B: g- Z( w, \' D( m) z$ n7 K3 E9 b接下来描述一下向导使用步骤。0 T' j3 W8 Z6 ^
    1. 从ISE或者Arch wizard中启动界面;
    0 ?# S- J' }, ^7 T2. 第一个页面做基本配置:路径、XAW文件名、VHDL / Verilog选择、综合工具、FPGA型号;6 d% O8 P; Z$ @, O  E( m) n
    3. 进行General setup,一看就明白,不细说,注意一下几点:
    , Q3 J4 K& ^* S& P7 h6 T, K  k    - CLKIN source 如果选 external 则 DCM 的 CLKIN 会自动连接到 IBUFG。
    0 D: s4 {2 i0 U3 ^    - Feedback如果选 internal 则反馈来自 BUFG。4 W9 w. C& t% A6 T& X' `0 [# i! r
    4. 高级设置* X$ i8 n' H0 F
        - 选择FPGA的配置过程是否包含DCM的锁定,如果是,则配置完成信号DONE将在LOCKED信号有效后方能有效。! W( H' L6 q* h  U, l( Q' y! ]1 h
        - 选择CLKIN是否要除2。由于DCM的输入频率有限,对于过高的输入时钟通过除2使之可用。2 J2 Z+ a* @0 d. u& b
        - Deskew调整,这个选项建议在咨询xilinx工程师后再使用。" p7 s" @0 ]# E
    5. 时钟输出口 Buffer 设置
    % F/ P8 g" }+ N) X' s' V    - 默认情况下所有输出口都链接 BUFG 全局时钟网络入口
    / X  f2 a% n$ i5 p& L, l; ]    - 由于全局时钟网络的入口有限,用户可以定制时钟输出口连接到其他类型的Buffer
    1 L/ g" ^2 h0 v) {" ]1 c; B0 _       - Global Buffer:进入全局时钟网络的入口Buffer,共有4个,简称BUFG/ K0 t8 a4 z. C/ }1 }  I
           - Enabled Buffer:还是上面的4个全局时钟Buffer,但是配置为有使能信号控制,简称BUFGCE1 _5 a( O$ k# f4 b/ Y
           - Clock MUX:还是上面的4个全局时钟Buffer,但是配置为 2-to-1 MUX类型,由S信号控制选出,简称BUFGMUX
    4 y9 J# J1 f2 r' r       - Low skew line:没有buffer了,只能使用 skew 比较小的连线' ]( V3 ^. i0 Q/ a# T- U
           - Local Routing:连到本地,skew的要求不是很严格) B! e' P* P3 H% {" r7 U8 I8 K( z
           - None:禁止输出$ h. `# W) g! c; u+ |( _
        - 对于Enabled Buffer类型和Clock Mux类型,需要指定En口的名字
    - W  U! x' y8 Z: ?    - 需要为输出时钟信号指定名字或者使用默认
      u: ?% M3 N% T1 R! t1 q: p5 i6. 设置DFS" h4 x8 v" C9 x
        - 设置目标输出频率,然后按calculate,自动生成 M/D 值和 Jitter 值
    ! Q* V) k: ~9 t' i; d    - 或者手动设置 M/D 值,然后按calculate,自动生成频率和 Jitter 值5 ^* `0 G  _; l7 n, ^" i
    7. 最后输出所需的3种文件。

    该用户从未签到

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

    该用户从未签到

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

    该用户从未签到

    5#
    发表于 2015-7-21 17:55 | 只看该作者
    D=1..32,  
      Q. }" B" y- Z-- 这样看来最大能倍频32倍,最小能16分频。
    - A: N7 w0 }) X6 b- s这个16从哪来?

    该用户从未签到

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

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-6-19 02:35 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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