【问题标题】:VHDL modify one signal with mutiple clockVHDL用多个时钟修改一个信号
【发布时间】:2015-01-27 18:36:56
【问题描述】:

我在一个进程中使用 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 -“C:/Users/Administrator/Desktop/test/justatest/fifo.vhd”第 45 行:无法合成 Signal Buffer1,同步描述错误。当前软件版本不支持您用于描述同步元素(寄存器、内存等)的描述样式。

为什么?非常感谢!

【问题讨论】:

  • 好吧,我强烈建议您修复您的问题布局,以帮助我们先破译您的代码。 :D
  • 您可能需要一个时钟和多个“负载”信号等。我还建议先对此进行模拟,看看它是否按照您想要的方式运行,是否有错误的综合代码。
  • 如果您要查看 XST 用户指南(例如 UG627 v 14.5),您会发现带有一个时钟的 if 语句和带有另一个时钟的 elsif 语句在 VHDL Sequential 下没有被列为支持电路,带有敏感度列表的 VHDL 顺序过程。
  • 关于您的错误消息,我假设目标设备是 Xilinx FPGA。但是哪个 Xilinx FPGA 可以在一个硬宏中支持 3 个时钟?所有内部存储器元件都是单时钟(FF、SRL、...)或双时钟(BlockRAM),没有三时钟组件。信号HC1HC2 甚至是真实时钟信号还是更像使能信号。如果是这样,则使用上升沿检测(一个 FF 加和一个 AND2B1 门)。否则我会建议搜索跨时钟技术。

标签: vhdl


【解决方案1】:

并非所有有效的 VHDL 都是可合成的。什么被认为是可综合的因工具和目标架构而异。 Xilinx 硬件架构无​​法表示您的代码所描述的逻辑(不借助门控时钟)。合成器只支持语言的一个子集,并期望使用某些“集合”模板来描述硬件原语。现代工具在接受高级描述方面更加宽容,但它们所能完成的工作是有限度的。

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

在 FPGA 的情况下,时钟架构已经融入其中,再多的修改输入描述也无法改变这一点。将时钟馈送到要选通的逻辑结构会扰乱合成器的默认预期,因此最好尽量避免。

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

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

【讨论】:

  • 感谢您的回答。我要做的是在rising_edge(H),HC1和HC2与H异步时将flag1和flag2更改为0并从缓冲区读取数据,当rising_edge(HC1)或rising_edge(HC2)时,它们将更改相应的标志为 1 并将数据写入缓冲区。
  • 如果 HC1 和 HC2 明显比 H 慢,那么通常的方法是通过一对触发器来同步它们。然后,您可以检测变化,而无需涉及来自混合域的边缘敏感性。实际上,您应该理所当然地这样做,因为合成器是建立在期望完全同步系统的基础上的。如果您不能容忍 2+1 周期延迟,那么您需要使用原语仔细构建必要的逻辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多