GT收发器PHY层设计(2)GT_module模块设计

文章目录

  • 前言
  • 一、设计框图
  • 二、例化IP核端口
  • 三、common_reset_i模块
  • 四、gt_usrclk_source模块
  • 五、IBUFDS_GTE2和gtwizard_0_common模块
  • 六、顶层模块gt_module
  • 总结

前言

根据官方的example design设计一个自定义协议的高速PHY设计

一、设计框图

在这里插入图片描述
设计思路及代码思路参考FPGA奇哥系列网课
IP核解析参考xilinx文档PG168 7 Series FPGAs Transceiver Wizard v3.6

二、例化IP核端口

即框图当中的gtwizard_0模块
所有端口含义都可以在PG168当中进行了解
需要特别关注的在代码里进行了简单的注释

gtwizard_0  gtwizard_0_i
(
    .sysclk_in                      (i_sysclk               ), //SYSCLK是一个自由运行的系统/板载时钟,用于驱动示例设计中的FPGA逻辑。当启用DRP接口时,DRP_CLK连接到示例设计中的SYSCLK。需要在XDC中对此时钟进行约束。
    .soft_reset_tx_in               (i_tx_rst               ), 
    .soft_reset_rx_in               (i_rx_rst               ), 
    .dont_reset_on_data_error_in    (0                      ), 
    .gt0_tx_fsm_reset_done_out      (o_tx_done              ),
    .gt0_rx_fsm_reset_done_out      (),     
    .gt0_data_valid_in              (1                      ), 
    .gt0_tx_mmcm_lock_in            (gt0_txmmcm_lock_i      ), 
    .gt0_tx_mmcm_reset_out          (gt0_txmmcm_reset_i     ), 
    .gt0_rx_mmcm_lock_in            (gt0_rxmmcm_lock_i      ),
    .gt0_rx_mmcm_reset_out          (gt0_rxmmcm_reset_i     ), 
    .gt0_drpaddr_in                 (i_drpaddr              ),     
    .gt0_drpclk_in                  (i_sysclk               ),     
    .gt0_drpdi_in                   (i_drpdi                ),     
    .gt0_drpdo_out                  (o_drpdo                ),     
    .gt0_drpen_in                   (i_drpen                ),     
    .gt0_drprdy_out                 (o_drprdy               ),     
    .gt0_drpwe_in                   (i_drpwe                ),     

    .gt0_dmonitorout_out            (),     
    .gt0_loopback_in                (i_loopback             ),  
    .gt0_eyescanreset_in            (0                      ), 
    .gt0_rxuserrdy_in               (1                      ),
    .gt0_eyescandataerror_out       (), 
    .gt0_eyescantrigger_in          (0                      ),
    .gt0_rxclkcorcnt_out            (                       ),
    .gt0_rxusrclk_in                (gt0_rxusrclk_i         ), 
    .gt0_rxusrclk2_in               (gt0_rxusrclk2_i        ), 
    .gt0_rxdata_out                 (o_rx_data              ),//接收数据,位宽为IP配置的用户位宽
    .gt0_rxdisperr_out              (), 
    .gt0_rxnotintable_out           (), 
    .gt0_gtxrxp_in                  (i_gt_rx_p              ),//输入差分引脚    
    .gt0_gtxrxn_in                  (i_gt_rx_n              ),//输入差分引脚    
    .gt0_rxbyteisaligned_out        (o_rx_ByteAlign         ),//接收数据字节对齐指示信号
    .gt0_rxdfelpmreset_in           (0                      ), 
    .gt0_rxmonitorout_out           (),     
    .gt0_rxmonitorsel_in            (0                      ), 
    .gt0_rxoutclkfabric_out         (),     
    .gt0_gtrxreset_in               (i_rx_rst               ), 
    .gt0_rxpmareset_in              (i_rx_rst               ), 
    .gt0_rxpolarity_in              (i_rx_polarity          ), 
    .gt0_rxcharisk_out              (o_rx_char              ),//标记接收的有效的8B/10BK字符。高位比特对应数据路径的高位字节。
    .gt0_rxresetdone_out            (o_rx_done              ), 
    .gt0_txpostcursor_in            (i_txpostcursor         ), 
    .gt0_txprecursor_in             (i_txpercursor          ), 
    .gt0_gttxreset_in               (i_tx_rst               ), 
    .gt0_txuserrdy_in               (1                      ), 
    .gt0_txusrclk_in                (gt0_txusrclk_i         ), 
    .gt0_txusrclk2_in               (gt0_txusrclk2_i        ), 
    .gt0_txdiffctrl_in              (i_tx_diffctrl          ), 
    .gt0_txdata_in                  (i_tx_data              ),//与接收同理 
    .gt0_gtxtxn_out                 (o_gt_tx_n              ),//与接收同理     
    .gt0_gtxtxp_out                 (o_gt_tx_p              ),//与接收同理     
    .gt0_txoutclk_out               (gt0_txoutclk_i         ), 
    .gt0_txoutclkfabric_out         (),     
    .gt0_txoutclkpcs_out            (),     
    .gt0_txcharisk_in               (i_tx_char              ),//与接收同理  
    .gt0_txresetdone_out            (),     
    .gt0_txpolarity_in              (i_tx_polarity          ), 

    .gt0_qplllock_in                (i_qplllock             ),
    .gt0_qpllrefclklost_in          (i_qpllrefclklost       ),
    .gt0_qpllreset_out              (w_gt_qpll_reset        ),
    .gt0_qplloutclk_in              (i_qplloutclk           ),
    .gt0_qplloutrefclk_in           (i_qplloutrefclk        ) 
);

endmodule

三、common_reset_i模块

用于产生QPLL的复位信号

assign w_qpll_reset = w_commonreset | w_gt_qpll_reset   ;
gtwizard_0_common_reset # 
(
    .STABLE_CLOCK_PERIOD            (                       )    
)
common_reset_i
(    
    .STABLE_CLOCK                   (i_sysclk               ),           
    .SOFT_RESET                     (i_tx_rst               ),      
    .COMMON_RESET                   (w_commonreset          )          
);

四、gt_usrclk_source模块

用户时钟的产生模块,发送端和接收端的逻辑需要通过gt0_txusrclk2_igt0_rxusrclk2_i驱动。这里对示例工程里面的gt_usrclk_source进行了简单的修改,在原本的example design里,IBUFDS_GTE2原语被放到了gt_usrclk_source模块里,该模块就是用来将外部差分参考时钟转为单端时钟信号。在原本的gt_usrclk_source里,它将输入的外部差分参考时钟信号转化为单端后又从该模块输出了出去,所以完全可以直接放到顶层去。

gtwizard_0_GT_USRCLK_SOURCE gt_usrclk_source
(
 
    .GT0_TXUSRCLK_OUT           (gt0_txusrclk_i         ),
    .GT0_TXUSRCLK2_OUT          (gt0_txusrclk2_i        ),
    .GT0_TXOUTCLK_IN            (gt0_txoutclk_i         ),
    .GT0_TXCLK_LOCK_OUT         (gt0_txmmcm_lock_i      ),
    .GT0_TX_MMCM_RESET_IN       (gt0_txmmcm_reset_i     ),
    .GT0_RXUSRCLK_OUT           (gt0_rxusrclk_i         ),
    .GT0_RXUSRCLK2_OUT          (gt0_rxusrclk2_i        ),
    .GT0_RXCLK_LOCK_OUT         (gt0_rxmmcm_lock_i      ),
    .GT0_RX_MMCM_RESET_IN       (gt0_rxmmcm_reset_i     )
);  

五、IBUFDS_GTE2和gtwizard_0_common模块

gtwizard_0_common 就是QPLL,里面例化了一个GTXE2_COMMON原语
gtwizard_0_common 只需要例化一次,因为一个QUAD只有一个QPLL

IBUFDS_GTE2 IBUFDS_GTE2_u0  
(
    .O               (w_gtrefclk    ),
    .ODIV2           (),
    .CEB             (0),
    .I               (i_gtrefclk_p  ),
    .IB              (i_gtrefclk_n  )
);

gtwizard_0_common #
(
    .WRAPPER_SIM_GTRESET_SPEEDUP(),
    .SIM_QPLLREFCLK_SEL         (3'b010)
)
common0_i
(
    .QPLLREFCLKSEL_IN           (3'b010             ),//参考时钟选择如下图所示,具体看自己的板卡接入了哪一路参考时钟
    .GTREFCLK0_IN               (0                  ),
    .GTREFCLK1_IN               (w_gtrefclk         ),
    .QPLLLOCK_OUT               (w_qplllock         ),
    .QPLLLOCKDETCLK_IN          (i_sysclk           ),
    .QPLLOUTCLK_OUT             (w_qplloutclk       ),
    .QPLLOUTREFCLK_OUT          (w_qplloutrefclk    ),
    .QPLLREFCLKLOST_OUT         (w_qpllrefclklost   ),    
    .QPLLRESET_IN               (w_qpllreset        ) 
);

在这里插入图片描述

六、顶层模块gt_module

在该模块里我们可以例化多个gt_channel模块,需要注意的一点是w_qpllreset信号只需要一个gt_channel的信号即可。

module gt_module(
    input                   i_sysclk                    ,
    input                   i_gtrefclk_p                ,
    input                   i_gtrefclk_n                ,
    input                   i_rx0_rst                   ,
    input                   i_tx0_rst                   ,
    output                  o_tx0_done                  ,
    output                  o_rx0_done                  ,
    input                   i_tx0_polarity              ,
    input  [3 :0]           i_tx0_diffctrl              ,
    input  [4 :0]           i_tx0postcursor             ,
    input  [4 :0]           i_tx0percursor              ,     
    input                   i_rx0_polarity              ,
    input  [2 :0]           i_loopback0                 ,
    input  [8 :0]           i_0_drpaddr                 , 
    input                   i_0_drpclk                  ,
    input  [15:0]           i_0_drpdi                   , 
    output [15:0]           o_0_drpdo                   , 
    input                   i_0_drpen                   ,
    output                  o_0_drprdy                  , 
    input                   i_0_drpwe                   ,
    output                  o_rx0_ByteAlign             ,
    output                  o_rx0_clk                   ,
    output [31:0]           o_rx0_data                  ,
    output [3 :0]           o_rx0_char                  ,
    output                  o_tx0_clk                   ,
    input  [31:0]           i_tx0_data                  ,
    input  [3 :0]           i_tx0_char                  ,

    input                   i_rx1_rst                   ,
    input                   i_tx1_rst                   ,
    output                  o_tx1_done                  ,
    output                  o_rx1_done                  ,
    input                   i_tx1_polarity              ,
    input  [3 :0]           i_tx1_diffctrl              ,
    input  [4 :0]           i_tx1postcursor             ,
    input  [4 :0]           i_tx1percursor              ,     
    input                   i_rx1_polarity              ,
    input  [2 :0]           i_loopback1                 ,
    input  [8 :0]           i_1_drpaddr                 , 
    input                   i_1_drpclk                  ,
    input  [15:0]           i_1_drpdi                   , 
    output [15:0]           o_1_drpdo                   , 
    input                   i_1_drpen                   ,
    output                  o_1_drprdy                  , 
    input                   i_1_drpwe                   ,
    output                  o_rx1_ByteAlign             ,
    output                  o_rx1_clk                   ,
    output [31:0]           o_rx1_data                  ,
    output [3 :0]           o_rx1_char                  ,
    output                  o_tx1_clk                   ,
    input  [31:0]           i_tx1_data                  ,
    input  [3 :0]           i_tx1_char                  ,

    output                  o_gt_tx0_p                  ,
    output                  o_gt_tx0_n                  ,
    input                   i_gt_rx0_p                  ,
    input                   i_gt_rx0_n                  ,
    output                  o_gt_tx1_p                  ,
    output                  o_gt_tx1_n                  ,
    input                   i_gt_rx1_p                  ,
    input                   i_gt_rx1_n                    
);

wire    w_gtrefclk          ;

wire    w_qplllock          ;
wire    w_qpllrefclklost    ;
wire    w_qpllreset         ;
wire    w_qplloutclk        ;
wire    w_qplloutrefclk     ;

IBUFDS_GTE2 IBUFDS_GTE2_u0  
(
    .O               (w_gtrefclk    ),
    .ODIV2           (),
    .CEB             (0),
    .I               (i_gtrefclk_p  ),
    .IB              (i_gtrefclk_n  )
);

gtwizard_0_common #
(
    .WRAPPER_SIM_GTRESET_SPEEDUP(),
    .SIM_QPLLREFCLK_SEL         (3'b010)
)
common0_i
(
    .QPLLREFCLKSEL_IN           (3'b010             ),//1:参考时钟0;2:参考时钟1 3:北时钟 4:南时钟
    .GTREFCLK0_IN               (0                  ),
    .GTREFCLK1_IN               (w_gtrefclk         ),
    .QPLLLOCK_OUT               (w_qplllock         ),
    .QPLLLOCKDETCLK_IN          (i_sysclk           ),
    .QPLLOUTCLK_OUT             (w_qplloutclk       ),
    .QPLLOUTREFCLK_OUT          (w_qplloutrefclk    ),
    .QPLLREFCLKLOST_OUT         (w_qpllrefclklost   ),    
    .QPLLRESET_IN               (w_qpllreset        ) 
);

gt_channel gt_channel_u0(
    .i_sysclk                    (i_sysclk          ),
    .i_gtrefclk                  (w_gtrefclk        ),
    .i_rx_rst                    (i_rx0_rst         ),
    .i_tx_rst                    (i_tx0_rst         ),
    .o_tx_done                   (o_tx0_done        ),
    .o_rx_done                   (o_rx0_done        ),
    .i_tx_polarity               (i_tx0_polarity    ),
    .i_tx_diffctrl               (i_tx0_diffctrl    ),
    .i_txpostcursor              (i_tx0postcursor   ),
    .i_txpercursor               (i_tx0percursor    ),     
    .i_rx_polarity               (i_rx0_polarity    ),
    .i_loopback                  (i_loopback0       ),
    .i_drpaddr                   (i_0_drpaddr       ), 
    .i_drpclk                    (i_0_drpclk        ),
    .i_drpdi                     (i_0_drpdi         ), 
    .o_drpdo                     (o_0_drpdo         ), 
    .i_drpen                     (i_0_drpen         ),
    .o_drprdy                    (o_0_drprdy        ), 
    .i_drpwe                     (i_0_drpwe         ),
    .i_qplllock                  (w_qplllock        ), 
    .i_qpllrefclklost            (w_qpllrefclklost  ), 
    .o_qpllreset                 (w_qpllreset       ),
    .i_qplloutclk                (w_qplloutclk      ), 
    .i_qplloutrefclk             (w_qplloutrefclk   ), 
    .o_rx_ByteAlign              (o_rx0_ByteAlign   ),
    .o_rx_clk                    (o_rx0_clk         ),
    .o_rx_data                   (o_rx0_data        ),
    .o_rx_char                   (o_rx0_char        ),
    .o_tx_clk                    (o_tx0_clk         ),
    .i_tx_data                   (i_tx0_data        ),
    .i_tx_char                   (i_tx0_char        ),

    .o_gt_tx_p                   (o_gt_tx0_p        ),
    .o_gt_tx_n                   (o_gt_tx0_n        ),
    .i_gt_rx_p                   (i_gt_rx0_p        ),
    .i_gt_rx_n                   (i_gt_rx0_n        )
);

gt_channel gt_channel_u1(
    .i_sysclk                    (i_sysclk          ),
    .i_gtrefclk                  (w_gtrefclk        ),
    .i_rx_rst                    (i_rx1_rst         ),
    .i_tx_rst                    (i_tx1_rst         ),
    .o_tx_done                   (o_tx1_done        ),
    .o_rx_done                   (o_rx1_done        ),
    .i_tx_polarity               (i_tx1_polarity    ),
    .i_tx_diffctrl               (i_tx1_diffctrl    ),
    .i_txpostcursor              (i_tx1postcursor   ),
    .i_txpercursor               (i_tx1percursor    ),     
    .i_rx_polarity               (i_rx1_polarity    ),
    .i_loopback                  (i_loopback1       ),
    .i_drpaddr                   (i_1_drpaddr       ), 
    .i_drpclk                    (i_1_drpclk        ),
    .i_drpdi                     (i_1_drpdi         ), 
    .o_drpdo                     (o_1_drpdo         ), 
    .i_drpen                     (i_1_drpen         ),
    .o_drprdy                    (o_1_drprdy        ), 
    .i_drpwe                     (i_1_drpwe         ),
    .i_qplllock                  (w_qplllock        ), 
    .i_qpllrefclklost            (w_qpllrefclklost  ), 
    .o_qpllreset                 (                  ),
    .i_qplloutclk                (w_qplloutclk      ), 
    .i_qplloutrefclk             (w_qplloutrefclk   ), 
    .o_rx_ByteAlign              (o_rx1_ByteAlign   ),
    .o_rx_clk                    (o_rx1_clk         ),
    .o_rx_data                   (o_rx1_data        ),
    .o_rx_char                   (o_rx1_char        ),
    .o_tx_clk                    (o_tx1_clk         ),
    .i_tx_data                   (i_tx1_data        ),
    .i_tx_char                   (i_tx1_char        ),

    .o_gt_tx_p                   (o_gt_tx1_p        ),
    .o_gt_tx_n                   (o_gt_tx1_n        ),
    .i_gt_rx_p                   (i_gt_rx1_p        ),
    .i_gt_rx_n                   (i_gt_rx1_n        )
);

endmodule

总结

那么现在我们需要进行GT设计的时候,只需要正确配置时钟信号,然后控制输入输出数据以及K码指示信号等用户数据接口即可,需要例化多个GT channel的话就再gt_module当中例化多个gt_channel模块即可,不可以例化多次gt_module,因为gtwizard_0_common 包含在gt_module中,而gtwizard_0_common 只能例化一次

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/510315.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mysql 数据库基本操作

mysql 数据库基本操作 1、创建五张表 – user 表:后台用户表 – product 表:产品表 – account 表:客户账户表 – product_account 表 : 客户购买表 – customer 表 : 客户表 2、创建表 SQL 语句: 注意&#xff1a…

简单而复杂的Python

Python是一种简单&复杂的编程语言。简单的时候可以到极致: print(hello world!)另一方面,Python 也具有许多复杂的语法特性,例如面向对象编程、装饰器、迭代器、生成器等等。这些特性使得 Python 适用于各种不同的编程任务和项目。 当我…

ROS中的栅格地图

目录 一、ROS中栅格地图格式 二、C节点发布地图 2.1 发布者发布地图的C实现 三、python节点发布地图 一、ROS中栅格地图格式 机器人导航所使用的地图数据,就是ROS导航软件包里的map_server 节点,在话题/map中发布的消息数据,消息类型是na…

智能锁也能用上GPT技术了?大扭力电机更配中国门?这家公司再次引领行业

智能锁也能用上GPT技术了?小小智能锁电机,竟然能拉动2.5吨SUV? 今日,中国智能锁领军品牌德施曼在北京举办「2024德施曼创新技术预沟通会」,德施曼技术研发中心总监桑胜伟揭秘了两项行业突破性技术——GPTfinger及龙霆…

vulnhub pWnOS v2.0通关

知识点总结: 1.通过模块来寻找漏洞 2.msf查找漏洞 3.通过网站源代码,查看模块信息 环境准备 攻击机:kali2023 靶机:pWnOS v2.0 安装地址:pWnOS: 2.0 (Pre-Release) ~ VulnHub 在安装网址中看到,该靶…

Deferred library xxx was not loaded

Deferred 延迟修饰词作用下的文件库尚未完成载入

Mysql的MHA

目录 一、MHA概念 1.1 MHA 的组成 1.2 MAH特性 1.3 MHA原理 1.4当主挂了以后会给哪个从服务器? 二、搭建MysqlMHA 2.1实验思路 2.2实验准备 2.3服务搭建 1. 关闭防火墙和selinux 2、修改 master(192.168.91.103)、Slave1&#xff0…

vue3鼠标向下滑动,导航条改变背景颜色和logo的封装

代码中使用了element-plus组件&#xff0c;需先安装 向下滑动前 向下滑动后&#xff08;改变了logo 字体 背景颜色&#xff09; <script lang"ts" setup> import router from /router; import { ArrowDown } from element-plus/icons-vue import { ref, …

课程15 光在晶体中的传播(三)(视频P53-55)

旋光与菲涅尔棱镜 旋光现象 说明从石英晶片出射的&#xff0c;依然是线偏振光&#xff0c;其偏振面却发生了旋转。 左旋石英与右旋石英 ![左旋石英与右旋石英![](https://img-blog.csdnimg.cn/direct/6ead0356c3c740169ba6e723863b743b.png) 旋光异构体 右旋石英表现出φR &a…

基于单片机30mv和300v量程的电压表仿真设计

**单片机设计介绍&#xff0c;基于单片机30mv和300v量程的电压表仿真设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机30mV和300V量程的电压表仿真设计&#xff0c;是一个旨在通过单片机实现宽量程电压测量和显示的综合性项目…

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之RTE模块配置详解(上)

RTE模块配置详解 - 上 一、RTE模块配置实操1.1 打开RTE模块1.2 RTE模块错误消除在这里插入图片描述 这里我们利用工具的自动处理功能。二、Configurator工具Validation总结本节我们就手把手详解RTE配置实现,其实也没有什么过多的操作。。。这个模块更多是工具自动处理的。 一、…

python当中的复数到底有什么用

复数看起来很简单&#xff0c;就是一个数加另外一个数&#xff0c;然后带有J的就是复数。 复数在 Python 中的内部类型是 complex。Python 提供了对复数的内置支持&#xff0c;因此可以直接进行复数的相关计算。复数由实部和虚部构成&#xff0c;可以使用 "j" 或 &qu…

golang语言系列:Authentication、OAuth、JWT 认证策略

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 golang语言系列 文章&#xff0c;主要对编程通用技能 Authentication、OAuth、JWT 认证策略 进行学习 1.Basic Authentication认证 每个请求都需要将 用户名密码 进行base64编码后&#xff0c;放在请求头的Aut…

Scikit-Learn K均值聚类

Scikit-Learn K均值聚类 1、K均值聚类1.1、K均值聚类及原理1.2、K均值聚类的优缺点 2、Scikit-Learn K均值聚类2.1、Scikit-Learn K均值聚类API2.2、K均值聚类案例 1、K均值聚类 K-均值&#xff08;K-Means&#xff09;是一种聚类算法&#xff0c;属于无监督学习。K-Means在机器…

python使用subprocess模拟输入adb命令

如何在Python中执行ADB命令 1. 简介 ADB&#xff08;Android Debug Bridge&#xff09;是Android开发工具包&#xff08;SDK&#xff09;提供的一个命令行工具&#xff0c;用于与Android设备进行通信和调试。在Python中&#xff0c;我们可以通过调用系统命令来执行ADB命令。本…

vue项目视频播放ckplayer使用

ckplayer 官方网址&#xff0c;点击访问 1&#xff0c;打开网页后能看到这里&#xff0c;我现在使用的是最新 X3版手册 2&#xff0c;这个ckplayer不是npm 插件&#xff0c;要下载安装包解压到项目里面使用 安装包网址 通过gitee下载 3&#xff0c;解析安装包到项目中 publ…

ChatGPT会取代Salesforce顾问吗?

当ChatGPT问世时&#xff0c;许多Salesforce顾问很乐意使用该工具完成日常任务。然而&#xff0c;许多专业人士仍未使用过该工具或发现它的多种功能。Salesforce顾问负责处理复杂的项目、兼顾客户需求&#xff0c;并在不断发展的生态系统中通过各种云服务保持领先地位。因此&am…

【图论】【拓扑排序】1857. 有向图中最大颜色值

本文涉及的知识点 图论 拓扑排序 LeetCode1857. 有向图中最大颜色值 给你一个 有向图 &#xff0c;它含有 n 个节点和 m 条边。节点编号从 0 到 n - 1 。 给你一个字符串 colors &#xff0c;其中 colors[i] 是小写英文字母&#xff0c;表示图中第 i 个节点的 颜色 &#xf…

【深耕 Python】Data Science with Python 数据科学(7)书352页练习题

写在前面 关于数据科学环境的建立&#xff0c;可以参考我的博客&#xff1a; 【深耕 Python】Data Science with Python 数据科学&#xff08;1&#xff09;环境搭建 往期数据科学博文&#xff1a; 【深耕 Python】Data Science with Python 数据科学&#xff08;2&#xf…

鸿蒙实战开发-如何实现多设备自适应服务卡片

​介绍 本示例展示Js工程中服务卡片的布局和使用&#xff0c;其中卡片内容显示使用了一次开发&#xff0c;多端部署的能力实现多设备自适应。用到了卡片扩展模块接口&#xff0c;ohos.app.form.FormExtensionAbility 。 卡片信息和状态等相关类型和枚举接口&#xff0c;ohos.…