来自不同进程的VHDL驱动信号

2023-11-23

我对以下 VHDL 代码有一个小问题:

process (zbroji)
begin
    if rising_edge(zbroji) then
        oduzima <= '0';
        ucitanPrvi <= '1';
        broj1 <= ulaz_broj;
    end if;
end process;

process (oduzmi)
begin
    if rising_edge(oduzmi) then
        oduzima <= '1';
        ucitanPrvi <= '1';
        broj1 <= ulaz_broj;
    end if;

end process;

问题是信号 ucitanPrvi 总是具有值 X。如果我不尝试在两个进程中设置它的值,那么我就没有任何问题......所以我知道我不能从多个进程驱动一个信号,但我不知道如何以不同的方式写这个...... 有谁知道我如何解决这个问题?

Thanks !

编辑:谢谢大家的回复:)现在我明白为什么我不能从多个进程驱动一个信号(至少以我希望它工作的方式)。


如果您想综合真实 FPGA 或 ASIC 的设计,则必须从真实硬件(线路、触发器、门等)角度考虑 VHDL。此外,如果您想在硬件中执行真正的上升沿检测,您将需要一个驱动触发器的系统时钟。鉴于您的原始代码示例, zbroji 或 oduzmi 似乎不是系统时钟,而只是 std_logic 信号。我编写了这个代码示例,假设您的示例具有基本功能,希望您可以采用我的代码和注释并完成您需要的功能。

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity example is
  port (Reset      : in  std_logic;
        SysClk     : in  std_logic;
        zbroji     : in  std_logic;
        oduzmi     : in  std_logic;
        ulaz_broj  : in  std_logic;
        oduzima    : out std_logic;
        ucitanPrvi : out std_logic;
        broj1      : out std_logic
        );

end example;

architecture Behavioral of example is

  -- Delayed version of input signals (1 clock cycle delay)
  signal zbroji_d : std_logic;
  signal oduzmi_d : std_logic;

  signal zbrojiRE : std_logic;
  signal oduzmiRE : std_logic;

begin

  -- Generate 1 clock cycle delayed version of
  -- signals we want to detect the rising edge
  -- Assumes active high reset
  -- Note: You should only use the rising_edge macro
  -- on an actual global or regional clock signal. FPGA's and
  -- ASICs place timing constraints on defined clock signals
  -- that make it possible to use rising_edge, otherwise, we have
  -- to generate our own rising edge signals by comparing delayed
  -- versions of a signal with the current signal.
  -- Also, with any respectable synthesizer / simulator using
  -- rising_edge is almos exactly the same as (clk'event and clk='1')
  -- except rising_edge only returns a '1' when the clock makes a
  -- valid '0' to '1' transition. (see link below)
  EdgeDetectProc : process (Reset, SysClk)
  begin
    if Reset = '1' then
      zbroji_d <= '0';
      oduzmi_d <= '0';
    elsif rising_edge(SysClk) then
      zbroji_d <= zbroji;
      oduzmi_d <= oduzmi;
    end if;
  end process EdgeDetectProc;

  -- Assert risinge edge signals for one clock cycle 
  zbrojiRE <= '1' when zbroji = '1' and zbroji_d = '0' else '0';
  oduzmiRE <= '1' when oduzmi = '1' and oduzmi_d = '0' else '0';

  -- Assumes that you want a single cycle pulse on ucitanPrvi on the
  -- rising edege of zbroji or oduzmi;
  ucitanPrvi <= zbrojiRE or oduzmiRE;

  -- Based on your example, I can't tell what you want to do with the
  -- broj1 signal, but this logic will drive broj1 with ulaz_broj on
  -- either the zbroji or oduzmi rising edge, otherwise '0'.
  broj1 <= ulaz_broj when zbrojiRE = '1' else
           ulaz_broj when oduzmiRE = '1' else
           '0';

  -- Finally, it looks like you want to clear oduzima on the rising
  -- edge of zbroji and assert oduzima on the rising edge of
  -- oduzmi
  LatchProc : process (Reset, SysClk)
  begin
    if Reset = '1' then
      oduzima <= '0';
    elsif rising_edge(SysClk) then
      if zbrojiRE = '1' then
        oduzima <= '0';
      elsif oduzmiRE = '1' then
        oduzima <= '1';
      end if;
    end if;
  end process LatchProc;

end Behavioral;

前面的代码假设您有一个系统时钟。在像 ModelSim(免费学生版)这样的模拟器中,您可以使用不可综合的测试平台代码生成 100 MHz 时钟,如下所示...

ClockProc : process
begin 
   SysClk <= '0';
   wait for 5 ns;
   SysClk <= '1';
   wait for 5 ns;
end process ClockProc;

在实际的 FPGA/ASIC 实现中,您可能需要使用芯片中运行的外部振荡器,将信号驱动到 DCM(数字时钟管理器),它将向所有 VHDL 逻辑输出非常干净的时钟信号,这样您就可以获得无故障的设计。

最后,这是关于rising_edge和rising_edge之间差异的一个很好的解释 (clk'事件和clk='1')

http://vhdlguru.blogspot.com/2010/04/difference- Between-risingedgeclk-and.html

希望有帮助。

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

来自不同进程的VHDL驱动信号 的相关文章

  • 来自不同进程的VHDL驱动信号

    我对以下 VHDL 代码有一个小问题 process zbroji begin if rising edge zbroji then oduzima lt 0 ucitanPrvi lt 1 broj1 lt ulaz broj end i
  • 在 VHDL 中找到运算符“+”的“0”定义

    首先我想指出 这是我第一次尝试 VHDL 所以请客气一点 我想读取 X1 X4 输入并在输出处生成输入的总和 这是我的代码 library IEEE use IEEE STD LOGIC 1164 ALL entity counter of
  • 是否有理由在 VHDL 和 Verilog 中初始化(而不是重置)信号?

    我从未初始化过信号 这样 任何缺少重置或分配的信号都将是未知的或已初始化 在一些参考代码中它们有初始化 这违背了我的愿望 此外 由于初始化不可综合 因此可能会出现模拟 综合不匹配的情况 在这种情况下有什么理由初始化信号吗 编辑 2011 年
  • 无法使用 VHDL 2008 Quartus Prime 进行编译

    我正在使用 Quartus Prime Lite Edition 并且我想使用一元运算符nand像这样的 std logic vector library ieee use ieee std logic 1164 all use ieee
  • 调试 VHDL Modelsim 中的迭代限制错误

    我正在 Modelsim 上为 d 触发器编写 VHDL 代码 当我尝试模拟它时出现错误 错误 vsim 3601 在 400 ps 时达到迭代限制 我不确定这意味着什么 但我已经检查了大部分源代码以查找错误 但没有成功 谁能猜出问题可能是
  • ERROR:Xst:827 = 信号计数无法合成,同步描述错误

    我正在尝试模拟电梯 结果出现错误 ERROR Xst 827 Signal count cannot be synthesized bad synchronous description 我正在关注此来源的代码 https www yout
  • 我需要多少个进程来监视两个信号?

    我是一名 vhdl 初学者 需要帮助解决我的问题 我有两个需要监控的信号 一个是 CHECK 另一个是 OK 每次我要求检查时 我都应该得到好的结果 高或低 我需要连续监测6个连续的CHECK脉冲 并计数OK 如果我有 6 OK 低 那么我
  • VHDL 中的行为模型程序和数据流模型程序之间的混淆

    我正在使用 Douglas L Perry 所著的教科书 VHDL 示例编程 第四版 他在第 4 页给出了 Dataflow 编程模型的示例 Code I ENTITY mux IS PORT a b c d IN BIT s0 s1 IN
  • 使用 VHDL 实例化 FPGA 中的 RAM

    我试图按照中的指导实现双端口 RAM这篇优秀的博文 http danstrother com 2010 09 11 inferring rams in fpgas 然而 ModelSim 在编译时给出以下警告 Warning fifo ra
  • 使用“downto”进行 VHDL std_logic_vector 索引

    我想单独设置 std logic vector 的位 以便轻松设置单个位或位组的注释 这是我所拥有的 signal DataOut std logic vector 7 downto 0 DataOut lt 5 gt 1 Instruct
  • 如何在 Sphinx 运行时预处理源文件?

    我已经为我的项目设置了 Sphinx 文档 并希望提取源文件的文档字符串并将它们嵌入到最终文档中 不幸的是 Sphinx 不支持源文件的语言 VHDL VHDL 似乎没有 Sphinx 域 所以我的想法如下 挂钩 Sphinx 运行并在 S
  • VHDL门控时钟如何避免

    我收到了避免使用门控时钟的建议 因为它可能会导致松弛和时序限制问题 但我想问一下我可以认为什么是门控时钟 例如 此代码对时钟进行门控 因为 StopCount 对它进行门控 process ModuleCLK begin if rising
  • 有没有办法使用 std textio 在 vhdl 中多次读取文件?

    我试图了解如何在 vhdl 中读取文件 如果我打开一个文件 通读它 测试文件结尾 关闭文件 然后重新打开该文件 然后再次开始读取 它会从开头开始吗 文件 非常感谢 向 VHDL 语言的权威寻求答案 IEEE 标准 1076 2008 5 5
  • Quartus初始化RAM

    我制作了一个实体 其中 quartus 成功识别 RAM 并为其实例化 RAM 宏功能 如果我可以从文件初始化 RAM 那就太好了 我找到了制作此类文件 mif 文件 的教程 现在我已经创建了该文件 我不知道如何让 quartus 初始化该
  • 使用 1 位 ALU 制作 16 位 ALU

    你好 我正在尝试从几个 1 位 ALU 创建一个 16 位 ALU 我创建了一个名为 basic alu1 的包 其中包含 1 位 ALU 的组件 其代码是 library ieee use ieee std logic 1164 all
  • 是否可以使用循环创建同一组件的多个实例?

    我有一个组件 Component CAU is port CLK in std logic RESET in std logic START in std logic V DIRECTION in vector 3d P ORIGIN in
  • ACTIV HDL - VHDL -“信号无法合成,同步描述错误”

    我在 Xilinx 中综合此代码时遇到错误 这个错误是 信号 Z 1 无法合成 同步描述错误 entity uk3 is port rst in BIT C in INTEGER clk in BIT S out INTEGER end u
  • 如何从 Spartan 6 写入 Nexys 3 FPGA 板上的 Micron 外部蜂窝 RAM?

    我到处都查过了 数据表 Xilinx 网站 digilent 等等 但什么也没找到 我能够使用 Adept 工具来验证我的蜂窝 RAM 是否正常运行 但我找不到任何库存 VHDL 代码作为控制器来写入数据和从中读取数据 帮助 找到了此链接
  • 在单周期数据路径中加载半字和加载字节

    有人询问如何在单周期数据路径中实现加载字节而无需更改数据存储器 解决方案如下 替代文本 http img214 imageshack us img214 7107 99897101 jpg http img214 imageshack us
  • FPGA 系统中的同步与异步复位

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

随机推荐

  • 线性 SVM 模型的权重(在 R 中)?

    Using kernlab我用如下代码训练了一个模型 my model lt ksvm result f1 f2 f3 data gold kernel vanilladot 由于它是一个线性模型 我更喜欢在运行时将分数计算为特征值的简单加
  • CXF/ JAX-RS :从拦截器返回自定义响应

    当REST调用过程中发生异常时 我们需要返回自定义的错误代码和错误消息 我们创建了一个异常映射器提供程序 它适用于应用程序代码中的异常 但是 当 CXF 代码发生异常时 例如 我编写的 CustomValidationInterceptor
  • 如何在可变参数模板中匹配空参数包

    我有代码 template
  • 在 Xamarin.Forms 中使用 Thread.Sleep

    我想执行以下操作 MainPage new ContentPage Content new StackLayout Children new Button Text Thread Sleep Command new Command gt T
  • 确定 nvcc 需要哪些 gencode(compute_、arch_)值 - 在 CMake 中

    我使用 CMake 作为我的代码的构建系统 其中涉及 CUDA 我正在考虑将决定哪个任务自动化compute XX and arch XX我需要传递给我的 nvcc 以便为我当前计算机上的 GPU 进行编译 有没有办法做到这一点 使用 NV
  • 如何在 jqgrid 中添加新的按钮/图像列

    我在 ASP net MVC Web 应用程序中使用 JQgrid 我可以使用以下命令添加名为编辑的新按钮列formatters 但是 问题是我无法获取单击按钮的行中的列的值 例如 如果我单击第四行上的按钮编辑 新添加 我将需要获取该特定行
  • 在 Azure 存储上托管 SQLite DB?

    我需要在 Azure 上托管一个 SQLite 数据库 该数据库将在多个 Web 应用程序之间共享 我唯一的选择似乎是 Azure Blob 或文件存储 因为它们摆脱了提供在 Web 实例之间共享的专用存储的 Azure 网站 但是 似乎没
  • 如何条件正则表达式

    我想要一个正则表达式 如果它有 3 个实例 它就做一件事 在字符串中 如果它有超过 3 个实例 则为其他内容 例如 aaa bbb ccc ddd one part of the regex aaa bbb ccc ddd eee the
  • 创建 R 包时包含 jar 文件

    我创建了一个 R 框架包 lib jarFileHere jar R r code file R The r code file R尝试引用一个类文件jar文件在这里 jar library rJava library rjson onLo
  • 如何从 Blob 转到 ArrayBuffer

    我正在研究 Blob 我注意到当你有 ArrayBuffer 时 你可以轻松地将其转换为 Blob 如下所示 var dataView new DataView arrayBuffer var blob new Blob dataView
  • 如何在Go中调用linux共享库函数?

    我有一个 so 文件 我想在 Go 代码中调用其函数 我该如何去做呢 我已经阅读了 cgo 和 syscall 包 它们接近我想要的 但我没有看到任何可以调用 so 文件中的函数的地方 我想完全实现 ctypes 包在 Python 中的功
  • 如何在添加数组之前检查特定对象是否已存在于数组中[重复]

    这个问题在这里已经有答案了 我有这个数组 name Olvier id 123 name Olvier id 124 现在我的目标是防止再次将相同的对象添加到数组中 name Olvier id 123 有没有一种方法可以做到这一点 如果您
  • document.getElementsByTagName("*") 或 document.all

    document getElementsByTagName 适用于 IE Firefox Opera 但不适用于 Chrome 和 Safari document all适用于 IE Chrome Safari 但不适用于 Firefox
  • 如何在 MVC 中实现工作单元:职责

    谁有责任 谁负责启动和完成 MVC 架构中的工作单元 这不是控制者的责任 它违反了SRP 控制器根本不应该知道 UoW 在 Web 中 通常对服务器的每个请求使用一个 UoW 在这种情况下 UoW 应在请求结束时进行处理 并在请求开始后的某
  • 从 unique_ptr 初始化shared_ptr

    后续this问题 最近我一直在处理一些指向 C 风格数组的智能指针 我最终做了推荐的事情并使用指向向量的智能指针代替 但在那段时间 我得到了一些建议 不要使用shared ptr
  • 如何更改整个应用程序的语言? [复制]

    这个问题在这里已经有答案了 我正在制作一个应用程序 我希望在其中有一个显示语言选择页面的页面 到目前为止 我已经包括了英语 印地语和马拉地语 并将英语设置为默认值 我的问题是 如何在所选语言中更改整个应用程序的语言 选择语言后 每当我重新打
  • Facebook“赞”按钮和 # URL 字符串?

    如果 ajax Web 应用程序中的 赞 按钮引用同一页面但使用不同的 字符串 Facebook 会如何处理这些按钮 它是否将它们视为不同的页面来 点赞 例如 如果我得到 4 个 赞 点击 mysite com articles story
  • python 中发生异常时的变量范围[重复]

    这个问题在这里已经有答案了 while True try 2 0 except Exception as e break print e 给出 整数除或以零为模 我以为范围e是在while阻止并且外部无法访问它print陈述 我错过了什么
  • ipython 笔记本 - $DISPLAY 变量错误[重复]

    这个问题在这里已经有答案了 我正在 ubuntu 虚拟机上运行 IPython 笔记本 到目前为止 一切都很好 除了我无法进行交互式 matplotlib 绘图 我得到的错误是 TclError no display name and no
  • 来自不同进程的VHDL驱动信号

    我对以下 VHDL 代码有一个小问题 process zbroji begin if rising edge zbroji then oduzima lt 0 ucitanPrvi lt 1 broj1 lt ulaz broj end i