VHDL用多个时钟修改一个信号

时间:2015-01-27 18:36:57

标签: vhdl

我遇到了在一个进程中使用3个时钟的问题 如果我做这样的过程: HC1,HC2可能同时起作用,它们比H慢得多,H是16MHZ的基本时钟。

entity fifo is
    Port ( H : in  STD_LOGIC;
           HC1 : in  STD_LOGIC;
           HC2 : in  STD_LOGIC;
           C1data : in  STD_LOGIC_VECTOR (2 downto 0);
           C2data : in  STD_LOGIC_VECTOR (2 downto 0);
           Buffer1 : out  STD_LOGIC_VECTOR (3 downto 0);
           Buffer2 : out  STD_LOGIC_VECTOR (3 downto 0));
end fifo;

architecture Behavioral of fifo is
    signal Full1,Full2 : STD_LOGIC;
begin
process(H,HC1,HC2)
begin
    if(rising_edge(H)) then
        Full1 <= '0';
        Full2 <= '0';
    else
        if(rising_edge(HC1)) then
            Buffer1(3 downto 1) <= C1data;
            Buffer1(0) <= C1data(2) xor C1data(1) xor C1data(0);
            Full1 <= '1';
        end if;

        if(rising_edge(HC2)) then
            Buffer2(3 downto 1) <= C2data;
            Buffer2(0) <= C2data(2) xor C2data(1) xor C2data(0);
            Full2 <= '1';
        end if;
   end if;

结束过程;

它说:
    错误:Xst:827 - &#34; C:/Users/Administrator/Desktop/test/justatest/fifo.vhd"第45行:信号缓冲区1&lt; 0&gt;无法合成,同步描述不好。当前软件版本不支持您用于描述同步元素(寄存器,内存等)的描述样式。

为什么呢?非常感谢!

1 个答案:

答案 0 :(得分:2)

并非所有有效的VHDL都是可合成的。可合成的内容因工具和目标架构而异。 Xilinx硬件架构无​​法表示代码描述的逻辑(无需借助门控时钟)。合成器仅支持该语言的一个子集,并期望使用某些&#34; set&#34;来描述硬件原语。模板。现代工具对于他们接受的高级描述更加宽容,但他们可以完成的工作是有限的。

数字逻辑综合工具对它们将支持的电路类型做出某些假设。您的电路描述将rising_edge()函数应用于同一过程中的三个不同信号。通常不支持这样的复杂时钟安排。通常的期望是电路由由单个时钟边沿激活的隔离时钟域组成。它们不会像您的示例那样自动创建门控时钟以适应非典型代码,因为这会在电路中引入潜在的危险,而这些危险可能无法通过时序约束和静态时序分析来检测。

在FPGA的情况下,时钟架构被烘焙,并且没有任何摆弄输入描述可以改变它。将时钟馈入逻辑结构以进行门控会扰乱合成器的默认期望,如果可能的话,最好避免使用。

如果HC1HC2实际上是控制信号而不是时钟,则您不应该使用rising_edge()函数来检测其状态的变化。相反,您应该创建由公共时钟H注册的延迟版本。从&#39; 0&#39;更改到&#39; 1&#39;然后通过表达式HC1 = '1' and HC1_prev = '0'检测到。

XST不支持顶级else语句的if条件,因为它不符合XST对描述同步逻辑的期望。您应该取消else并将Full1Full2的初始化移至单独的重置/清除部分。这可以同步或异步完成。有关如何实现此目的的示例,请参阅XST综合指南。