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

2024-04-18 07:52
文章标签 时钟 逻辑 系列 复位 srio

本文主要是介绍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

这篇关于SRIO系列-时钟逻辑与复位逻辑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/914189

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma

Java基础回顾系列-第三天-Lambda表达式

Java基础回顾系列-第三天-Lambda表达式 Lambda表达式方法引用引用静态方法引用实例化对象的方法引用特定类型的方法引用构造方法 内建函数式接口Function基础接口DoubleToIntFunction 类型转换接口Consumer消费型函数式接口Supplier供给型函数式接口Predicate断言型函数式接口 Stream API 该篇博文需重点了解:内建函数式

Java基础回顾系列-第二天-面向对象编程

面向对象编程 Java类核心开发结构面向对象封装继承多态 抽象类abstract接口interface抽象类与接口的区别深入分析类与对象内存分析 继承extends重写(Override)与重载(Overload)重写(Override)重载(Overload)重写与重载之间的区别总结 this关键字static关键字static变量static方法static代码块 代码块String类特