SRIO系列-时钟逻辑与复位逻辑

一、前言

上一篇讲述了SRIO协议的基本概念,传输的HELLO帧格式、事务类型等,本篇说一下SRIO IP核的时钟关系。

基本的IP设置可以参考此篇文章:【高速接口-RapidIO】Xilinx SRIO IP 核详解-CSDN博客

二、时钟关系

 PHY可以在两个时钟域上运行: phy_clk,这是主核心时钟,和gt_pcs_clk,这是用于串行收发器接口。gt_clk不由PHY使用,但由串行收发器接口使用。gt_pcs_clk是gt_clk速率的一半。作为一般规则,phy_clk等于(gt_clk *操作链路宽度)/4。所以对于一个2x的核,phy_clk的频率是gt_clk的一半。如果核心列车下降到1x模式,phy_clk必须切换到gt_clk速率的四分之一。串行收发器还需要一个使用收发器的的参考时钟(refclk)。当生成核心时,参考时钟频率被选择(可用选项取决于体系结构和线路速率。

时钟频率关系
phy_clkphy_clk = (gt_clk * link width)/4主要的核时钟
gt_pcs_clkgt_pcs_clk = 1/2 * gt_clk主要终于Serial Transceiver interface
refclk见下表用于Serial Transceiver interface
log_clklog_clk >=phy_clk
cfg_clkcfg_clk = log_clk配置寄存器接口时钟

 不同lane下的时钟关系:

 对于7系列FPGAs,使用MMCM从串行收发器(GT)参考时钟生成时钟。时钟方案的方框图如下:

在SRIO的例子工程中,时钟主要有共享逻辑中的时钟模块提供,在这个模块中通过MMCM得到满足上述时钟关系的各时钟域时钟。

   srio_gen2_0_srio_clksrio_clk_inst (.sys_clkp                (sys_clkp        ),// input to the clock module.sys_clkn                (sys_clkn        ),// input to the clock module.sys_rst                 (sys_rst         ),// input to the clock module.mode_1x                 (mode_1x         ),// input to the clock module.log_clk                 (log_clk_out     ),// output from clock module.phy_clk                 (phy_clk_out     ),// output from clock module.gt_clk                  (gt_clk_out      ),// output from clock module.gt_pcs_clk              (gt_pcs_clk_out  ),// output from clock module.refclk                  (refclk_out      ),// output from clock module.drpclk                  (drpclk_out),      // output from clock module.clk_lock                (clk_lock_out_int) // output from clock module);

二、复位逻辑

SRIO每个时钟域都有一个指定的复位,复位应该声明各自时钟域的至少四个时钟周期,并同步取消复位。

在例子工程的复位模块中,会有一个异步的复位输入,在这个模块中,会将这个复位同步到各个时钟域,并且需要把复位的脉冲扩展到最小的复位时钟周期请求。

当重置SRIO端点设备时必须要将链路两端的设备一起复位,去保证AckID的对齐,从而减少数据包和控制字符的丢失。实现这一过程的方式是对核的复位进行握手。从接收端接收到的复位信号会通过phy_rcvd_link_reset给到用户设计。在接收到链路重置时应该置位sys_rst信号,还可以向用户应用程序响应phy_rcvd_link_reset的断言。

向对端发送重置请求,请求置位phy_rcvd_link-reset信号,直到端口初始化输出变低。

在例子工程中,srio_rst对复位进行同步,在这个模块中会有一个状态机执行上述的操作。

module srio_gen2_0_srio_rst(input            cfg_clk,                 // CFG interface clockinput            log_clk,                 // LOG interface clockinput            phy_clk,                 // PHY interface clockinput            gt_pcs_clk,              // GT Fabric interface clockinput            sys_rst,                 // Global reset signalinput            port_initialized,        // Port is intializedinput            phy_rcvd_link_reset,     // Received 4 consecutive reset symbolsinput            force_reinit,            // Force reinitializationinput            clk_lock,                // Indicates the MMCM has achieved a stable clockoutput reg       controlled_force_reinit, // Force reinitializationoutput           cfg_rst,                 // CFG dedicated resetoutput           log_rst,                 // LOG dedicated resetoutput           buf_rst,                 // BUF dedicated resetoutput           phy_rst,                 // PHY dedicated resetoutput           gt_pcs_rst               // GT dedicated reset);// {{{ Parameter declarations -----------// Reset State Machinelocalparam  IDLE       = 4'b0001;localparam  LINKRESET  = 4'b0010;localparam  PHY_RESET1 = 4'b0100;localparam  PHY_RESET2 = 4'b1000;// }}} End Parameter declarations -------wire sys_rst_buffered;// {{{ wire declarations ----------------reg   [0:3]   reset_state      = IDLE;reg   [0:3]   reset_next_state = IDLE;(* ASYNC_REG = "TRUE" *)reg  [3:0]        cfg_rst_srl;(* ASYNC_REG = "TRUE" *)reg  [3:0]        log_rst_srl;(* ASYNC_REG = "TRUE" *)reg  [3:0]        phy_rst_srl;(* ASYNC_REG = "TRUE" *)reg  [3:0]        gt_pcs_rst_srl;reg               sys_rst_int;wire              reset_condition = sys_rst || phy_rcvd_link_reset || sys_rst_int;// }}} End wire declarations ------------assign cfg_rst = cfg_rst_srl[3];always @(posedge cfg_clk or posedge reset_condition) beginif (reset_condition) begincfg_rst_srl <= 4'b1111;end else if (clk_lock) begincfg_rst_srl <= {cfg_rst_srl[2:0], 1'b0};endendassign log_rst = log_rst_srl[3];always @(posedge log_clk or posedge reset_condition) beginif (reset_condition) beginlog_rst_srl <= 4'b1111;end else if (clk_lock) beginlog_rst_srl <= {log_rst_srl[2:0], 1'b0};endend// The Buffer actively manages the reset due to the// nature of the domain crossing being done in the buffer.assign buf_rst = reset_condition;assign phy_rst = phy_rst_srl[3];always @(posedge phy_clk or posedge reset_condition) beginif (reset_condition) beginphy_rst_srl <= 4'b1111;end else if (clk_lock) beginphy_rst_srl <= {phy_rst_srl[2:0], 1'b0};endendassign gt_pcs_rst = gt_pcs_rst_srl[3];always @(posedge gt_pcs_clk or posedge reset_condition) beginif (reset_condition) begingt_pcs_rst_srl <= 4'b1111;end else if (clk_lock) begingt_pcs_rst_srl <= {gt_pcs_rst_srl[2:0], 1'b0};endend// This controller is used to properly send link reset requests that were// made by the user.always@(posedge log_clk) beginreset_state <= reset_next_state;endalways @* begincasex (reset_state)IDLE: begin// Current State Outputssys_rst_int             = 1'b0;controlled_force_reinit = 1'b0;// Next State Outputsif (force_reinit)reset_next_state = LINKRESET;elsereset_next_state = IDLE;endLINKRESET: begin// Current State Outputssys_rst_int             = 1'b0;controlled_force_reinit = 1'b1;// Next State Outputsif (~port_initialized)reset_next_state = PHY_RESET1;elsereset_next_state = LINKRESET;endPHY_RESET1: begin// Current State Outputssys_rst_int             = 1'b1;controlled_force_reinit = 1'b0;// Next State Outputsreset_next_state = PHY_RESET2;endPHY_RESET2: begin// Current State Outputssys_rst_int             = 1'b1;controlled_force_reinit = 1'b0;// Next State Outputsif (force_reinit)reset_next_state = PHY_RESET2;elsereset_next_state = IDLE;enddefault: begin// Current State Outputssys_rst_int             = 1'b0;controlled_force_reinit = 1'b0;// Next State Outputsreset_next_state = IDLE;endendcaseend
endmodule

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java EE】多线程-进阶-锁策略

目录 1.常见的锁策略 1.1乐观锁 vs 悲观锁 1.2重量级锁 vs 轻量级锁 1.3自旋锁&#xff08;Spin Lock&#xff09; 1.4公平锁 vs 非公平锁 1.5可重入锁和不可重入锁 1.6读写锁 2.CAS 2.1什么事CAS 2.2CAS是怎么实现的 2.3CAS有哪些应用 2.3.1实现原子类 2.3.2实现自…

自动驾驶(八十四)---------中间件对比分析

很久没有写博客了&#xff0c;CSDN无故非法删了我第82篇&#xff0c;让我很恼火&#xff0c;一直提不起兴趣重新写一遍第82篇。但回初心&#xff0c;知识需要用自己的语言输出&#xff0c;所以今天对比分析自动驾驶中间件&#xff1a; 1. 中间件介绍 在自动驾驶架构中&#xf…

SAP打印输出设置

SAP打印输入有很多方式&#xff0c;适合不同的应用场景。 一.打印输出总体概览图 二.前台打印 这个是比较常见的&#xff0c;前端打印的出现减轻了管理员的工作量&#xff0c;用户可以选择自己电脑上的打印机输出&#xff0c;不需要所有打印机都在SAP平台中进行配置&#xff0…

【Next】动态路由、加载 UI 和流式传输

动态路由 动态段作为 params 属性传递给 layout、page、route 和 generateMetadata 函数。 /app/blog/[slug]/page.tsx export default function Page({params}: {params:{slug:string}}) {return <h1>Slug Page -- {params.slug}</h1> };/app/shop/[...slug]/pa…

(vue)el-select选择框加全选/清空/反选

(vue)el-select选择框加全选/清空/反选 <el-form-item label"批次"><el-selectv-model"formInline.processBatch"multiplecollapse-tagsfilterableplaceholder"请选择"style"width: 250px"no-data-text"请先选择企业、日…

常用的启发式算法有哪些

常用的启发式算法主要包括模拟退火算法&#xff08;SA&#xff09;、蚁群算法&#xff08;ACO&#xff09;、粒子群算法&#xff08;PSO&#xff09;、遗传算法&#xff08;GA&#xff09;、禁忌搜索算法&#xff08;TS&#xff09;以及超启发式算法&#xff08;Hyper-Heuristi…

Java使用documents4j将word和excel转pdf

pom.xml添加documents4j依赖 <!-- documents4j --> <dependency><groupId>com.documents4j</groupId><artifactId>documents4j-local</artifactId><version>1.0.3</version> </dependency> <!-- documents4j 转 wor…

《Kubernetes部署篇:基于Kylin V10+ARM架构CPU+外部etcd使用containerd部署K8S 1.26.15容器版集群(一主多从)》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;企业级K8s集群运维实战 1、在当前实验环境中安装K8S1.25.14版本&#xff0c;出现了一个问题&#xff0c;就是在pod中访问百度网站&#xff0c;大…

Java基础知识总结(59)

&#xff08;1&#xff09;Set集合 Set也是集合中的一个容器&#xff0c;程序可以依次把若干个对象放进Set&#xff0c;但是Set无法保存元素添加的顺序&#xff0c; Set不允许包含相同的元素&#xff0c;如果把两个相同的元素加入同一个Set中&#xff0c;则添加失败&#xff0…

Openlayers动态刷新Arcgis MapServer服务图层

Openlayers动态刷新Arcgis MapServer服务图层 最近做一个图层编辑的功能&#xff0c;在前端新增一个图块之后需要刷新Arcgis切片服务&#xff0c;实时显示效果。刚开始使用source的refresh方法&#xff0c;结果不生效&#xff0c;后来在source上更新一个时间戳参数实现了刷新切…

UTS iOS插件

1、UTS插件无法出现 再uniapp x中使用时&#xff0c;必须给这个插件高度和宽度&#xff0c;否则出不来&#xff01; <uts-hello-view buttonText"点击按钮内容" style"width:375px;height: 375px;background-color: aqua;"></uts-hello-view>…

python后端相关知识点汇总(十二)

python知识点汇总十二 1、什么是 C/S 和 B/S 架构2、count(1)、count(*)、count(列名)有啥区别&#xff1f;3、如何使用线程池3.1、为什么使用线程池&#xff1f; 4、MySQL 数据库备份命令5、supervisor和Gunicorn6、python项目部署6.1、entrypoint.sh制作6.2、Dockerfile制作6…

vue 的报告页面,生成pdf,使用html2canvas , 下载pdf格式文件。多页分页下载

1. 新建一个js 文件 &#xff0c; 命名 为 html2canvas.js ,html2canvas 文件和jspdf.min.js 放同一目录下。下载文件已上传啦 2. 在vue 文件中引入html2canvas.js 文件 <script>import * as html2Canvas from ./html2canvas.js </script> 3 点击下载&#xff…

oracle insert操作分批量提交

对临时表做insert插入时没有做批量提交&#xff0c;可能会导致undo表空间撑爆&#xff0c;修改脚本对插数进行2万一次的批量提交&#xff0c;并且修改索引和同义词创建时间在插数操作结束后。 原语句&#xff1a; insert into 目标表 select * from 源表;改为2w次一提交&…

OpenCV基本图像处理操作(十)——图像特征harris角点

角点 角点是图像中的一个特征点&#xff0c;指的是两条边缘交叉的点&#xff0c;这样的点在图像中通常表示一个显著的几角。在计算机视觉和图像处理中&#xff0c;角点是重要的特征&#xff0c;因为它们通常是图像中信息丰富的区域&#xff0c;可以用于图像分析、对象识别、3D…

探索人工智能在医疗领域的革命性应用

人工智能&#xff08;AI&#xff09;正在全球范围内逐步改变医疗行业的面貌&#xff0c;从提高诊断精度到优化治疗方案&#xff0c;AI技术正成为医疗创新的核心驱动力。本文将深入探讨AI在医疗领域的应用&#xff0c;并通过一个具体的Python代码示例&#xff0c;展示如何利用机…

30天算法挑战赛,一天一个算法(第一天,二分查找)

二分查找 1. 板子 int left 0; int right n - 1; while (left < right) {int mid (right - left) / 2 left;if (nums[mid] < target) {left mid 1;} else {right mid - 1;}return left; }2. 应用题 1. 查找题单 在排序数组中查找元素的第一个和最后一个位置 搜…

JavaIO操作-File

1、File类 1.1 File类说明 存储在变量,数组和对象中的数据是暂时的,当程序终止时他们就会丢失.为了能够永 久的保存程序中创建的数据,需要将他们存储到硬盘或光盘的文件中.这些文件可以移动,传送,亦可以被其他程序使用.由于数据存储在文件中,所以我们需要学习一个和文件有密…

openharmony 编译源码及docker相关操作

目录 一、环境搭建: 二、编译链下载及相关配置 三、编译及版本烧录 一、环境搭建: 1、拉取docker镜像,openharmony。默认版本为ubuntu 18.04

DDoS攻击愈演愈烈,谈如何做好DDoS防御

DDoS攻击是目前最常见的网络攻击方式之一&#xff0c;各种规模的企业包括组织机构都在受其影响。对于未受保护的企业来讲&#xff0c;每次DDoS攻击的平均成本为20万美元。可见&#xff0c;我们显然需要开展更多的DDoS防御工作。除考虑如何规避已发生的攻击外&#xff0c;更重要…