我遇到了在一个进程中使用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;无法合成,同步描述不好。当前软件版本不支持您用于描述同步元素(寄存器,内存等)的描述样式。
为什么呢?非常感谢!
答案 0 :(得分:2)
并非所有有效的VHDL都是可合成的。可合成的内容因工具和目标架构而异。 Xilinx硬件架构无法表示代码描述的逻辑(无需借助门控时钟)。合成器仅支持该语言的一个子集,并期望使用某些&#34; set&#34;来描述硬件原语。模板。现代工具对于他们接受的高级描述更加宽容,但他们可以完成的工作是有限的。
数字逻辑综合工具对它们将支持的电路类型做出某些假设。您的电路描述将rising_edge()
函数应用于同一过程中的三个不同信号。通常不支持这样的复杂时钟安排。通常的期望是电路由由单个时钟边沿激活的隔离时钟域组成。它们不会像您的示例那样自动创建门控时钟以适应非典型代码,因为这会在电路中引入潜在的危险,而这些危险可能无法通过时序约束和静态时序分析来检测。
在FPGA的情况下,时钟架构被烘焙,并且没有任何摆弄输入描述可以改变它。将时钟馈入逻辑结构以进行门控会扰乱合成器的默认期望,如果可能的话,最好避免使用。
如果HC1
和HC2
实际上是控制信号而不是时钟,则您不应该使用rising_edge()
函数来检测其状态的变化。相反,您应该创建由公共时钟H
注册的延迟版本。从&#39; 0&#39;更改到&#39; 1&#39;然后通过表达式HC1 = '1' and HC1_prev = '0'
检测到。
XST不支持顶级else
语句的if
条件,因为它不符合XST对描述同步逻辑的期望。您应该取消else
并将Full1
和Full2
的初始化移至单独的重置/清除部分。这可以同步或异步完成。有关如何实现此目的的示例,请参阅XST综合指南。