FPGA 系统中的同步与异步复位

2024-04-20

我刚开始使用各种不同的模块创建 FPGA 系统来驱动 I2C 总线(尽管我认为这个问题适用于任何 FPGA 系统),并且所有模块都使用同步复位。

这些模块使用时钟分频器模块进行计时,该模块获取系统时钟并向系统的其余部分输出较低的频率。

我遇到的问题是,当复位信号变低时,时钟分频器复位,因此其他模块依赖的时钟停止 - 因此其他模块不会注册复位

一个明显的解决方案是进行异步复位,但是,在 Xilinx ISE 中,它似乎不喜欢它们,并抛出警告,指出这与 Spartan-6 FPGA 不兼容(特别是当异步代码之后的代码是同步代码时) ,这是因为 I2C 总线使用总线时钟将位放入总线上)。

另一种解决方案是时钟分频器根本不可重置,因此时钟永远不会停止并且所有模块都会正确重置。然而,这意味着时钟分频器寄存器无法初始化/重新初始化为已知状态 - 我被告知这将是一个大问题,尽管我知道您可以使用 := '0'/'1'; 仿真中的操作符,但是一旦在实际的 FPGA 上编程就不起作用了(?)。

同步复位的约定是什么?时钟发生器一般不复位吗?或者它们仅在复位信号的瞬时边沿复位?或者我的建议都不是真正的解决方案!

我放入了时序图和代码来说明我的意思,并显示我一直在使用的代码。

非常感谢!

David

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
library UNISIM;
use UNISIM.VComponents.all;
ENTITY CLK_DIVIDER IS
    GENERIC(INPUT_FREQ : INTEGER;
            OUT1_FREQ  : INTEGER;
            OUT2_FREQ  : INTEGER
    );
    PORT(SYSCLK  : IN  STD_LOGIC;
         RESET_N : IN  STD_LOGIC;
         OUT1    : OUT STD_LOGIC;
         OUT2    : OUT STD_LOGIC);
END CLK_DIVIDER;
architecture Behavioral of Clk_Divider is
    constant divider1 : integer   := INPUT_FREQ / OUT1_FREQ / 2;
    constant divider2 : integer   := INPUT_FREQ / OUT2_FREQ / 2;
    signal counter1   : integer   := 0;
    signal counter2   : integer   := 0;
    signal output1    : std_logic := '0';
    signal output2    : std_logic := '0';
begin
    output1_proc : process(SYSCLK)
    begin
        if rising_edge(SYSCLK) then
            if RESET_N = '0' then
                counter1 <= 0;
                output1  <= '1';
            else
                if counter1 >= divider1 - 1 then
                    output1  <= not output1;
                    counter1 <= 0;
                else
                    counter1 <= counter1 + 1;
                end if;
            end if;
        end if;
    end process;
    output2_proc : process(SYSCLK)
    begin
        if rising_edge(SYSCLK) then
            if RESET_N = '0' then
                counter2 <= 0;
                output2  <= '1';
            else
                if counter2 >= divider2 - 1 then
                    output2  <= not output2;
                    counter2 <= 0;
                else
                    counter2 <= counter2 + 1;
                end if;
            end if;
        end if;
    end process;
    OUT1 <= output1;
    OUT2 <= output2;
end Behavioral;

不要使用用户逻辑生成内部时钟,但如果确实需要多个时钟,请使用设备特定的 PLL/DCM。然后,在派生时钟上运行的所有用户逻辑都应保持复位状态,直到时钟稳定为止,然后可以根据设计要求释放用户逻辑的复位。可以使用同步复位或异步复位。

但在这种情况下,可能会生成一个时钟使能信号,并在每次需要更新信号时断言该使能信号一个周期,以便生成所需的任何协议,例如I2C 协议具有适当的时序。

使用更少的时钟,结合同步时钟使能信号,可以进行设置静态时序分析 (STA) https://en.wikipedia.org/wiki/Static_timing_analysis更容易,还可以避免重置同步和时钟域交叉 (CDC) https://en.wikipedia.org/wiki/Clock_domain_crossing.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FPGA 系统中的同步与异步复位 的相关文章

  • PHP 中的异步数据库/服务调用:Gearman 与 pthreads

    在我们的 LAMP 站点上 我们遇到一些服务必须多次调用数据库才能提取数据的问题 通常在 PHP 中完成此操作的方式 至少我的经验 是串行的 这显然是低效的 我们可以通过使用缓存和聚合一些查询来缓解一些低效率的问题 但在某些情况下我们仍然需
  • 使用 if 语句更改进程内的信号 - VHDL

    我有这个 VHDL 代码 我想要的是在 sw event 时首先上升 然后 首先自行下降 但当我模拟这个时 首先永远不会跌倒 process rst clk sw begin if clk EVENT and clk 1 then if r
  • Pandas重置索引未生效[重复]

    这个问题在这里已经有答案了 我不确定我在哪里误入歧途 但我似乎无法重置数据帧上的索引 当我跑步时test head 我得到以下输出 正如您所看到的 数据帧是一个切片 因此索引超出范围 我想做的是重置该数据帧的索引 所以我跑test rese
  • javascript async/await 实际上是如何工作的?

    我有一些使用 javascript async await 的代码 function sleep ms return new Promise resolve gt setTimeout resolve ms async function f
  • 在 React 组件中等待异步函数并显示 Spinner

    初学者在这里 尝试从服务器获取一些数据并在获取后将其显示在我的反应组件中 但是 我在将异步函数集成到我的反应组件中时遇到了麻烦 import React useState from react import request from gra
  • C# 5 async/await 线程机制感觉不对?

    为什么让调用线程进入异步方法直到内部 等待 一旦调用异步方法就生成一个线程 这不是更干净吗 这样您就可以确定异步方法会立即返回 您不必担心在异步方法的早期阶段没有做任何昂贵的事情 我倾向于知道某个方法是否要在 我的 线程上执行代码 不管是堵
  • 等待异步 grunt 任务完成

    我收到了 grunt 设置 其中一个新任务应该执行 grunt task run 已经存在的任务 要执行的任务是异步的 新任务应该等待异步任务完成 执行此操作的首选方法是什么 grunt 已经涵盖了这一点 你应该将你的任务声明为异步任务 并
  • 如何在asp.net中异步执行两个作业

    网 我需要你的帮助请帮助我 请参阅我的代码 如果我的第一份工作完成 则退出btn ok代码隐藏并更新到 ASP NET 屏幕 但同时作业 2 必须工作 正在处理批量电子邮件 protected void btn ok object send
  • CompletableFuture:whenCompleteAsync() 不允许我重新抛出异常

    我是 CompletableFuture 世界的新手 我正在尝试做一些负面测试 以允许我故意抛出异常的方式 该异常将决定通过 失败 这是代码片段 protected CompletableFuture
  • 在 TaskCompletionSource.Task(已调用 .SetResult)上调用ContinueWith 方法是否安全?

    使用是否安全ContinueWith 上的方法TaskCompletionSource Task if the TaskCompletionSource SetResult 已经被调用了 这个基本代码有望有助于解决这个问题 this was
  • 在 Celery 中,我如何运行一个任务,然后让该任务运行另一个任务,并保持下去?

    tasks py from celery task import Task class Randomer Task def run self kwargs run Randomer again return random randrange
  • 为什么需要 EndExecuteNonQuery()?

    文档here http msdn microsoft com en us library ca56w9se aspx指出 开发人员必须致电 EndExecuteNonQuery 方法完成 操作 我无法找到一个充分的理由来解释为什么会这样 或
  • 非法的break语句(Node.js)

    尝试在 Node js 和 MongoDB 中查找唯一 ID 方法是创建一个 while 循环来查询 MongoDB 中的现有 ID 直到找到唯一值 如果 ID 已被使用 则最后的数字会递增 直到 Mongo 不返回任何内容 一切正常 除了
  • 异步/等待 - 是*并发*吗?

    我一直在考虑 C 5 中新的异步内容 并且出现了一个特殊问题 据我了解 await关键字是一个简洁的编译器技巧 语法糖来实现连续传递 http en wikipedia org wiki Continuation passing style
  • 在Android的IntentService中等待异步回调

    我有一个IntentService在另一个类中启动异步任务 然后等待结果 问题是IntentService将尽快完成onHandleIntent 方法已经运行完毕了 对吗 这意味着 通常情况下 IntentService异步任务启动后会立即
  • AJAX .post 异步

    以下具体执行什么操作 ajax type POST async false vs ajax type POST async true 这意味着行为有什么区别 From jQuery 站点 http api jquery com jQuery
  • 是否为 VHDL numeric_std 有符号/无符号定义了溢出

    如果我有一个unsigned MAX downto 0 包含值2 MAX 1 VHDL 87 93 200X 标准是否定义了当我将其加一时会发生什么 或者 类似地 当我从零减一时 简短回答 没有溢出处理 溢出进位只是丢失 因此结果就是你的操
  • 浏览器中的javascript:异步任务执行模型

    我正在尝试集中注意力并了解 javascript 异步在单线程浏览器环境中的工作原理 作为异步 我们可以同时处理计时器和 xhr 请求 现在假设我有类似下面的东西 function doStuff for var i 0 i lt 1000
  • 同步写入使用 FILE_FLAG_OVERLAPPED 打开的文件

    我已经使用打开了一个文件 HANDLE handle CreateFileW fileName GENERIC READ GENERIC WRITE 0 NULL OPEN EXISTING FILE FLAG OVERLAPPED NUL
  • future::select 之间有什么区别!和东京::选择?

    我正在使用 Tokio 我想接收来自两个不同的请求mpsc队列 select 似乎是要走的路 但我不确定两者之间有什么区别futures select and tokio select 在什么情况下应该使用其中一种而不是另一种 tokio

随机推荐

  • 如何将 CSS 样式仅应用于文本

    我正在尝试将样式应用于 HTML 文本之类的内容 我想要的基本上是 我得到的基本上是 正如您所看到的 第一行是缩进的 但其他行没有缩进 到目前为止 我已经将文本包含在 span 它嵌套在一个 div slide text text back
  • 作为 Windows 服务运行时,.Net Core 6 Worker Service 不写入日志

    我使用 C Net Core 6 Visual Studio 2022 创建了一个辅助服务 如果通过 Visual Studio 运行或直接从 Windows 资源管理器 PowerShell 启动 它会按预期写入日志文件 但是 当作为 W
  • 如何强制子进程刷新标准输出缓冲区?

    平台 Windows 8 1 IDE vs2013 使用c c 进程 A 使用管道重定向读取子进程的标准输出 但子进程不会在 printf 之后调用 fflush 以在子进程运行结束之前处理 A 无法从管道读取任何内容 ps 我有子进程的源
  • 具有可定制内容的 JSF 迭代复合组件

    我想创建一个复合组件 可以将迭代元素的实际布局传递给复合组件 这是一个简化的示例并且有效
  • 如何访问分区 Athena 表的子目录中的数据

    我有一个 Athena 表 每天都有一个分区 其中实际文件按小时位于 子目录 中 如下所示 s3 my bucket data 2019 06 27 00 00001 json s3 my bucket data 2019 06 27 00
  • python中字典列表中的top-k

    有没有一种简单的方法来执行此示例中的最大 k 个键 值对 s1 val 0 s2 val 10 s3 val 5 s4 val 4 s5 val 6 s6 val 7 s7 val 3 shapelets s1 s2 s3 s4 s5 s6
  • 如何通过光标url缩小图像的大小?

    我有一张尺寸为 105x105 的图像 我使用以下 CSS 脚本将其用作光标 class 1 child 1 cursor url theBell png 20 20 auto 当我将鼠标移到元素上时会出现图像 但它太大了 我不知道如何减小
  • 在 C# 中动态更改命名空间

    我想做这样的事情 如果定义了 DEBUG 则命名空间为 Test 或者命名空间为 TestB 请参阅下面的示例代码 我可以这样做吗 或者您有更好的想法来实现这一目标吗 提前致谢 if DEBUG SomekindofAttribute Na
  • 使用 Turbolinks 渲染同一页面时无法使用 Flash

    我试图在点击更新端点后显示闪存消息 我想让用户保持在同一页面上并告诉他信息已更新 我启用了 Turbolink 我的操作如下 def update form Form find params id if form update form p
  • “提供程序包”未正确加载

    VS 2013 专业版 版本 12 0 31101 00 更新 4 突然间 每当我尝试打开一个项目 MVC 项目或 Python 项目 时 我都会得到 ProviderPackage 包未正确加载 问题 可能是由配置更改或安装引起的 另一个
  • Vue 3 - 如何将组件和混入与根组件一起包含?

    我尝试将语法从 Vue 2 转换为 Vue 3 但我不确定如何包含mixins and 成分 如果您在 Vue 2 中看到以下代码 import App from App vue const app new Vue mixins globa
  • 模态内部的不同输出(Laravel 5.4)

    我的 trips blade php 中有这段代码 问题是当我的 t gt employees 位于模态之外时 我检索所有员工 但是当我将 t gt employees 放入模态中时 我只能检索 1 个数据 我无法找出这种情况下的任何错误
  • 如何清除ID未知的Interval?

    假设有人 邪恶 给我们设置了一个计时器setInterval 但我们不知道它的 ID 我们没有 setInterval 返回的对象的引用 也没有它的值 function setInterval function console log pw
  • Visual Studio:在“从程序集中添加工具箱项目”上停留了 11 个小时

    昨晚卸载并重新安装了 Visual Studio 2015 但安装并更新后 一旦我打开软件 它说 Adding toolbox items from assembly C Program Files x86 Microsoft SDK s
  • “ORA-01008:并非所有变量都绑定”错误

    我正在使用以下方法通过使用 jdbc 计算工资单 但 ORA 01008 并非所有变量都绑定 错误未删除 有什么想法吗 我正在使用以下代码 public double getPayroll ResultSet rs null ResultS
  • 如何将 CIPixellate Core Image Filter 添加到 Sprite Kit 场景?

    如何将 CIPixellate Core Image Filter 添加到 Sprite Kit 场景 我有一个 SpriteKit 场景 它是 SKScene 或其子类 我想向场景添加一个核心图像滤镜 特别是 CIPixellate 过滤
  • 对话框片段中的空指针

    我正在尝试从Class当给这个充气时Dialog Fragment但当Class有价值观 这对我来说很奇怪 也许我错过了一些东西 这是代码 对话片段 public class Dialog Fragment extends DialogFr
  • 如何使用 XPATH 找到两个 H3 之间的所有节点?

    如何使用 XPATH 找到两个 H3 之间的所有节点 在 XPath 1 0 中 实现此目的的一种方法是使用 Kayessian 方法进行节点集交集 ns1 count ns2 count ns2 上面的表达式精确选择属于节点集的节点 ns
  • Perl 相当于(Python-)列表理解

    我正在寻找用 Perl 表达这个 Python 片段的方法 data A None B yes C None key list k for k in data if data k in this case the same as filte
  • FPGA 系统中的同步与异步复位

    我刚开始使用各种不同的模块创建 FPGA 系统来驱动 I2C 总线 尽管我认为这个问题适用于任何 FPGA 系统 并且所有模块都使用同步复位 这些模块使用时钟分频器模块进行计时 该模块获取系统时钟并向系统的其余部分输出较低的频率 我遇到的问