是VHDL中的rising_edge可合成的

时间:2014-11-07 06:58:16

标签: vhdl vhd

在我编写此语句时的编码中,它是模拟的,但不可合成。为什么?现在该怎么做才能解决这个问题???

IF ((DS0='1' OR DS1='1')and rising_edge(DS0) and rising_edge(DS1) AND DTACK='1' AND BERR='1') THEN
RV0 <= not RV;
else
RV0 <= RV;

2 个答案:

答案 0 :(得分:4)

进行FPGA设计时最重要的事情就是考虑硬件。

FPGA由许多硬件块组成,具有一组预定的输入和输出 - 您编写的代码需要能够映射到这些块。因此,即使您编写语法正确的代码,也并不意味着它实际上可以映射到手头的硬件。

您的代码尝试做的是:

IF ((DS0='1' OR DS1='1')and rising_edge(DS0) and rising_edge(DS1) AND DTACK='1' AND BERR='1') THEN
(...)

如果DS0DS1目前有上升优势(暗示它们同时也是'1',那么第一部分会(DS='1' OR DS1='1')为冗余),如果{ {1}}和DTACK都是BERR,然后做点什么。

这需要一个输入模块,它需要两个时钟输入(因为你有两个信号要同时测试上升沿),而且这个模块在我遇到的任何FPGA中都不存在 - 而且,有多接近这两个时钟事件需要被视为“同时”吗?除非你在某个时间间隔内指定它,例如通过使用真实的时钟信号(在时钟信号转到触发器的时钟输入的意义上),它确实没有意义。 ,如Morten Zilmers回答的那样,对1DS0进行抽样。

通常,您需要在设计中使用一个专用时钟信号(然后对需要运行较慢的部件使用时钟使能),或实现一些跨时钟域同步如果您需要使用不同的时钟运行设计的不同部分。

根据您使用的IDE环境,您可以访问一些语言模板来设计各种块,这可以帮助您正确描述可用的硬件块。在Xilinx ISE中,您可以在编辑&gt;中找到它们。例如,语言模板可以查看VHDL&gt; <合成构成体>编码示例&gt;拖鞋。

答案 1 :(得分:2)

增加了sonicwave关于思考硬件和综合的好答案 可用的元素。

rising_edge函数通常用于检测a的上升沿 信号和合成通常将该信号用作a的时钟输入 触发器或同步RAM。

如果你想要的话,是检测DS0DS1何时从'0''1'在&#34;同一&#34;时间,然后通常在每个上升边缘进行这种检查 clock的一个,并通过保持值来检测更改 之前的上升clock

代码可能如下所示:

...
  signal CLOCK    : std_logic;
  signal DS0_PREV : std_logic;
  signal DS1_PREV : std_logic;
begin
  process (CLOCK) is
  begin
    if rising_edge(CLOCK) then
      if (DS0 = '1' and DS0_PREV = '0') and  -- '0' to '1' change of DS0
        (DS1 = '1' and DS1_PREV = '0') and   -- '0' to '1' change of DS1
        DTACK = '1' AND BERR = '1' then
        RV0 <= not RV;
      else
        RV0 <= RV;
      end if;
      DS0_PREV <= DS0;  -- Save value
      DS1_PREV <= DS1;  -- Save value
    end if;
  end process;
...