在非时钟信号上使用上升沿是不好的做法吗?还有其他选择吗?

2024-01-03

我正在研究 VHDL 设计并且它可以工作,但是代码非常丑陋,而且我似乎正在尝试围绕语言的设计来实现我的目标,这一事实让我觉得有些事情是错误的。我对 VHDL 还很陌生,但我已经研究该项目的较小部分近一个月了,所以我有了总体想法。然而,这部分有点复杂。

我需要一个过程,该过程将在信号(END_ADC)的上升沿之后创建一个时钟周期长脉冲(LOAD_PULSE),但直到从该信号(END_ADC)的最新上升沿或下降沿过去4个时钟后才创建一个时钟周期长脉冲(LOAD_PULSE)第二个信号(LVAL)。

为了完成等待期,我构建了一个计时器模块来计算微秒和周期,如下所示:

entity uS_generator is
    generic(
        Frequency       : integer := 66                                     -- Frequency in MHz
    );
    Port ( 
        CLK     : in STD_LOGIC;
        RESET   : in STD_LOGIC;
        T_CNT   : out integer range Frequency downto 1 := 1;
        uS_CNT  : out integer range 65535 downto 0 := 0
    );
end uS_generator;

architecture behavior of uS_generator is

    signal T_CNT_INT        : integer range Frequency downto 1 := 1;        -- Counter for 1 uS
    signal uS_CNT_INT       : integer range 65535 downto 0 := 0;

begin

    COUNT: process(CLK, RESET)
    begin
        if RESET = '1' then
            T_CNT_INT   <= 1;
            uS_CNT_INT  <= 0;
        elsif rising_edge(CLK) then
            if T_CNT_INT = (Frequency - 1) then                             -- Increment one clock early so last rising edge sees one uS elapsed.
                uS_CNT_INT <= uS_CNT_INT + 1;
                T_CNT_INT <= T_CNT_INT + 1;
                if uS_CNT_INT = 65535 then
                    uS_CNT_INT <= 0;
                end if;
            elsif T_CNT_INT = Frequency then
                T_CNT_INT <= 1;
            else
                T_CNT_INT <= T_CNT_INT + 1;
            end if;
        end if;
    end process COUNT;

    T_CNT   <= T_CNT_INT;
    uS_CNT  <= uS_CNT_INT;

end behavior;

我用于设计脉冲生成部分的流程如下:

loadPulseProc: process(PIXEL_CLK, END_ADC, RESET)
begin

    if RESET = '1' then
        PULSE_FLAG <= '0';
        LOAD_PULSE <= '0';
    elsif rising_edge(END_ADC) then
        PULSE_FLAG <= '1';
    end if;

    if rising_edge(PIXEL_CLK) then
        if PULSE_FLAG = '1' and END_ADC = '1' and LVAL <= '0' and ADC_TMR_T >= 4 and LVAL_TMR_T >= 4 then
            LOAD_PULSE <= '1', '0' after PIXEL_CLK_T;
            PULSE_FLAG <= '0';
        end if;
    end if;

end process loadPulseProc;

ADCTimerProc: process(END_ADC, RESET)
begin

    if RESET = '1' then
        ADC_TMR_RST <= '1', '0' after PIXEL_CLK_T/10;
    end if;

    if rising_edge(END_ADC) then
        ADC_TMR_RST <= '1', '0' after PIXEL_CLK_T/10;
    end if;

    if falling_edge(END_ADC) then
        ADC_TMR_RST <= '1', '0' after PIXEL_CLK_T/10;
    end if;

end process ADCTimerProc;

LVALTimerProc: process(LVAL, RESET)
begin

    if RESET = '1' then
        LVAL_TMR_RST <= '1', '0' after PIXEL_CLK_T/10;
    end if;

    if rising_edge(LVAL) then
        LVAL_TMR_RST <= '1', '0' after PIXEL_CLK_T/10;
    end if;

    if falling_edge(LVAL) then
        LVAL_TMR_RST <= '1', '0' after PIXEL_CLK_T/10;
    end if;         

end process LVALTimerProc;

PIXEL_CLK_T 是时钟周期,15.152 ns。

这个设计是有效的,模拟显示它按照我的要求进行,但只有在通过将它们分成真正应该在一起的单独的 if 语句来避免由于使用多个上升沿或下降沿调用而导致的错误之后才发生重大麻烦。据我所读,使用上升沿和下降沿似乎仅保留用于时钟,那么这只是不好的做法吗?如何避免这种行为但仍然创建相同的输出?

Thanks!


Yes, rising_edge()/falling_edge()只能用于时钟信号。虽然它在模拟中工作,但它可能会在综合中引起问题和意外的硬件。

综合工具根据函数的参数推断时钟,并将此类信号/线路放置在 FPGA 中的特殊轨道上(假设您的设计目标是 FPGA)。该工具将进一步推断特殊的时钟缓冲区,并在您的输入时钟引脚不是支持时钟的引脚时发出警告。

引入多个时钟可能会导致异步设计,并使其容易出现交叉时钟故障。

检测信号的上升沿或下降沿是由如下所示的边缘检测电路完成的,该电路将前一个时钟周期中的信号与当前值进行比较。

所需信号:

signal mySignal_d : std_logic := '0'; 
signal mySignal_re : std_logic;

需要的逻辑:

mySignal_d <= mySignal when rising_edge(Clock); 
mySignal_re <= not mySignal_d and mySignal; 

第一行转换为 1 位 D 触发器(您也可以使用进程)。当第二条线产生一个周期选通信号时mySignal由低到高的变化。我在用着*_d指示原始输入的延迟信号和*_re对于上升沿。

生成的信号仍然同步Clock.

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

在非时钟信号上使用上升沿是不好的做法吗?还有其他选择吗? 的相关文章

  • 为什么允许在 for 循环中使用列表订阅? [复制]

    这个问题在这里已经有答案了 Python 如何接受以下构造 l 1 2 3 4 for i l i in enumerate l print l i 似乎没有任何抱怨 愉快地打印出来1 2 3 4 这是如何被允许的以及它到底有什么作用 Th
  • 将 echo 和 print 合并到一个语句中

    echo 1 print 2 3 返回 214 脚本如何以 14 结尾 当你这样做时 echo 1 print 2 3 PHP 会做 demo http codepad viper 7 com OfrNrs line op fetch ex
  • 什么是@”运算符?

    我在互联网上搜索了这意味着什么 包括 and 单独 正是在这个code https gist github com jakeballard 11240204 Win32ShowWindowAsync Add Type memberDefin
  • to_proc 方法在 Ruby 中意味着什么?

    我正在学习 Rails 并关注这个线程 https stackoverflow com questions 1961030 我被困住了to proc方法 我认为符号只是字符串的替代品 它们就像字符串 但在内存方面更便宜 如果我还缺少任何其他
  • jquery 隐藏简单的 javascript 错误

    我在 chrome 和 firefox 中使用 jQuery 和 flot 当我编写代码时 我发现执行在一些愚蠢的事情上会默默失败 例如访问不存在的哈希结构等 感觉 jQuery 中有一些 try catch 逻辑 让我看不到任何错误 有没
  • 数字后面附加“.f”的目的是什么?

    I saw 1 3 f在一个程序中 想知道什么 f是为了 于是尝试了我自己的程序 include
  • Linux/Ubuntu 目录位置 ~/.vim/syntax/

    文件夹的默认位置在哪里 vim syntax 在Linux系统上 我正在尝试添加一个 Python 插件 您正在寻找 runtimepath 选项 该文档非常详细 使用 help runtimepath 但我会尝试在这里总结一下 The 运
  • 如何迭代 Bash 中变量定义的数字范围?

    当范围由变量给出时 如何在 Bash 中迭代数字范围 我知道我可以做到这一点 在 Bash 中称为 序列表达式 文档 http www gnu org software bash manual bashref html Brace Expa
  • 与 Perl 和 Ruby 比较的相似语言特性 __END__

    背景 Perl 和 Ruby 有 END and DATA 允许将任意数据直接嵌入源代码文件中的标记 尽管这种做法可能不适合通用编程用途 但它对于例行任务的 一次性 快速脚本非常有用 问题 还有哪些其他编程语言支持相同或类似的功能 它们是如
  • main.cpp 是必需的吗?

    我试图编译一个程序cmake 我最终删除了我的main cpp文件 我刚刚将其复合到另一个包含我的项目名称的文件中 即 我刚刚将主函数剪切并粘贴到该文件中 问题是我有一个main cpp未发现错误 不确定是否在C 一个名为main cpp是
  • 快速向量初始化 C++ [重复]

    这个问题在这里已经有答案了 可能的重复 C 使用硬编码元素初始化 STL 向量的最简单方法 https stackoverflow com questions 2236197 c easiest way to initialize an s
  • 在 C++ 中,为什么我们不能使用 > 和 < 来比较迭代器? [复制]

    这个问题在这里已经有答案了 我被问过这个问题 我真的不知道为什么 如果你有指针int x 您可以将指针与 gt and lt 因为它代表内存位置 例如0x0000 0x0004 0x0008等等 我知道迭代器和指针是不同的 但它们的行为方式
  • 是否为 VHDL numeric_std 有符号/无符号定义了溢出

    如果我有一个unsigned MAX downto 0 包含值2 MAX 1 VHDL 87 93 200X 标准是否定义了当我将其加一时会发生什么 或者 类似地 当我从零减一时 简短回答 没有溢出处理 溢出进位只是丢失 因此结果就是你的操
  • Ruby 试图掌握一种新的表示法。 (inject(:) 与 select(and:even?);为什么有 &?)

    所以 我刚刚了解到 而不是写这样的东西 1 2 3 4 5 inject x y x y gt 15 我可以写 1 2 3 4 5 inject gt 15 我还了解到 而不是写 1 2 3 4 5 select x x even gt 2
  • SyntaxError:创建类实例时语法无效[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我在 Python shell 3 3 2 中运行这段代码 但它给了我SyntaxError invalid syntax cla
  • 括号中的波形符字符

    在 MATLAB 中 以下代码执行什么操作 m func returning matrix 波浪号运算符 的作用是什么 在 Matlab 中 这意味着不要将函数中相应的输出参数分配到赋值的右侧 因此 如果func returning mat
  • 你能在 Python 语法中添加新的语句吗?

    您可以添加新的语句 例如print raise with 到 Python 的语法 说 允许 mystatement Something Or new if True print example 没那么多 如果你should 而是如果可能的
  • 在yaml中写入#(在字符串中)

    我是新使用 yml 文件 用于我的框架中的翻译 我试图在翻译中添加一个 将是一个推特分享 blabla 这可能吗 因为文件将其翻译为评论 只需将值放在单引号或双引号内 它就不会被视为注释 就像是 en twitter share hasht
  • Swift 完成处理程序语法

    此代码用于回答此处的问题 如何在 Swift 中发出 HTTP 请求 https stackoverflow com questions 24016142 how to make an http request in swift let u
  • Oracle 语法 - 我们是否必须在新旧语法之间进行选择?

    我在一个由大约 8 名开发人员组成的团队中负责大约 1 000 000 行源代码的代码库 我们的代码基本上是一个使用 Oracle 数据库的应用程序 但代码随着时间的推移而不断发展 我们有大量九十年代中期的源代码 团队中就我们用于查询 Or

随机推荐

  • jQuery load() 在 IE 中抛出“权限被拒绝”错误

    我正在通过 AJAX 使用 jQuery 加载页面load 功能 它在 IE8 中不起作用 给出 权限被拒绝 错误 使用 IE 调试器 似乎当 jQuery 尝试打开 xhr 时 ie 会阻止它 问题是 我的页面有一个 javascript
  • jars 似乎不再被签名。 JARSigningException:找到未签名的条目

    NB 7 4RC2 Win 7 在 Java 控制面板中 选中 保留临时 Internet 文件 复选框 我正在使用受信任的证书签署我的 Web Start 应用程序 然而 dist lib 中的第 3 方 jar 似乎未签名 C Prog
  • 更改代码后,PowerShell ISE 有时会出现不可预测的行为

    我正在使用 PowerShell ISE PS 版本 5 0 如果我运行这段代码 Write Host This 它输出 This 如果我像这样修改脚本 Write Host That 它输出 That 伟大的 正如预期的那样 现在 如果我
  • 无法在第二轮中将项目添加到集合中

    基本上我的 Windows 服务应用程序中有一个阻塞集合 每次我想向集合中添加 4 个项目然后对其进行处理 第一轮还好 第二轮就失败了 错误是 BlockingCollection 已被标记为已完成添加 My code public sta
  • Python - 以毫秒为单位的时间差对我不起作用

    我读过一些关于此的文章 并认为我有一些有效的代码 如果两个值之间的差异小于 1 秒 则显示的毫秒是正确的 如果差异超过一秒 它仍然只显示毫秒的差异 如下 Correct now wind 2013 08 25 08 43 04 776209
  • 在自己的数据集上训练 Tensorflow 对象检测

    在花了几天时间尝试完成这项任务之后 我想分享一下我如何回答这个问题的经验 我该如何使用TS 物体检测 https github com tensorflow models tree master research object detect
  • if (true) 的目的

    我见过一些这样写的代码 if true do something 你为什么要做这样的事情 这个结构有什么特别的地方吗 THanks 几乎任何现代编译器都会对此进行优化 我的猜测是 有人在开发过程中把它放在那里 让他们轻松删除代码块 通过更改
  • 如何防止argv中丢失双引号?

    好吧 我知道我可以这样循环 for int i 1 i lt argc 1 i cout lt lt argv i lt lt endl 但是这样双引号就丢失了 那就是一个字符串 something here 被视为 args 数组的一个元
  • 在绘图表达式中使用变量

    我试图将回归结果 即 R2 放入图表中 但似乎无法弄清楚如何从表达式中调用变量 它粘贴变量名称 这是我的代码 R2Val lt signif summary sMod pre90 r squared 1 2 text 92 4 expres
  • zsh compinit:安装 Homebrew 后,Mac 上出现不安全目录错误消息

    在我的 Mac 上安装 Homebrew 和 Homebrew Cask 后 以管理员身份 用户 ID 为 admin 运行 MacOS 10 12 6 我收到错误消息 zsh compinit insecure directories r
  • 发生整数溢出时无符号和有符号整数的行为差异[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 从 iOS 7.1 到 iOS 8 发送数据时 BLE 花费太多时间

    我有一个奇怪的问题 我正在开发一个应用程序 我在其中发送20 20 字节的块 一切正常 当我发送字节数据时从 iOS 8 到 iOS 8设备从一个设备传输到另一个设备大约需要 4 5 秒 但我的问题是当我从iOS 7 1 至 iOS 8或者
  • 状态机;为什么只有最后一个状态有效?

    我有一个有 6 个状态 3 个主要状态 的状态机 只有最后一个状态有效 但前 2 个状态无效 共 3 个 只有最后一个状态有效 我发现了问题 当我移除去抖电路时它可以工作 但我需要去抖电路 我从网上得到了去抖电路 如果有人可以提供帮助 我会
  • 使用 RestSharp 将 JSON 数组反序列化为 C# 结构

    我使用 RestSharp 和动态地将不同的 JSON 结构转换为各种 C 结构IRestResponse
  • 使用 IMultiValueConverter 将多个命令参数传递给 viewModel

    我有以下代码
  • Haskell 列表中的连续数字

    我是 haskell 的新手 我正在尝试一些我之前为 java 完成的编码问题 但是下面的问题让我难住了 基本上 这个想法是编写一个接受整数列表 Int 的函数 确定整数列表中是否包含连续的 1 例如 以下内容的输出将是 输入 func 0
  • Xamarin.forms android权限提示不显示

    我正在使用权限插件 https github com jamesmontemagno PermissionsPlugin作者 詹姆斯 蒙特马尼奥 我基本上复制了该示例 但是在请求它的行之后权限未知 甚至没有对话框显示 var status
  • 通过 javascript 访问车把变量

    我正在为 Express js 框架生成一个把手视图 并且需要从单独的 JavaScript 文件内部访问传递给视图的变量 例如 var foo user name 有人有主意吗 帮手 的价值user name如果您想将其包含在 a 中 则
  • Haskell 你好世界,Eclipse IDE

    我在 eclipseFP 和 Haskell 中使用 hello world 时遇到问题 我有以下代码 module Main where main putStr Hello world 当我用它编译时 ghc exe H1 hs o hw
  • 在非时钟信号上使用上升沿是不好的做法吗?还有其他选择吗?

    我正在研究 VHDL 设计并且它可以工作 但是代码非常丑陋 而且我似乎正在尝试围绕语言的设计来实现我的目标 这一事实让我觉得有些事情是错误的 我对 VHDL 还很陌生 但我已经研究该项目的较小部分近一个月了 所以我有了总体想法 然而 这部分