【问题标题】:Drive input clock to output将输入时钟驱动到输出
【发布时间】:2016-10-03 22:56:19
【问题描述】:

我有一个 8 位输入和串行输出的模块,我想将输入数据序列化并与时钟同步。

我想在下降沿设置我的数据然后在时钟上升时等待,当时钟再次下降时我设置另一个数据。我不想将直接参考时钟连接到输出,因为当我不使用此模块时,我希望时钟输出处于 1 状态。

我试过这段代码:

process(Clock, ModuleReset)
    begin
        if ModuleReset = '0' then
            OutData <= '0';
            OutCK <= '0';
            counter <= 7;
        elsif falling_edge(Clock) then
                OutCK <= '0';
                OutData <= Data(counter);
        elsif rising_edge(Clock) then
                OutCK <= '1';
        end if;
end process;

合成器给了我这个错误:

“不支持SCK异步加载非常量数据”

当我像这样将代码分成两个块时:

process(Clock, ModuleReset)
    begin
        if ModuleReset = '0' then
            OutData <= '0';
            OutCK <= '0';
            counter <= 7;
        elsif falling_edge(Clock) then
                OutCK <= '0';
                OutData <= Data(counter);
end process;

process(Clock)
        if rising_edge(Clock) then
                OutCK <= '1';
        end if;
end process;

我有这两个错误:

“用于网络 SCK 的多个非三态驱动程序”
“未解决的网络 SCK 三态驱动程序”

我试过的另一个代码是:

process(Clock, ModuleReset)
    if ModuleEN = '1' then
       OutCK <= Clock;
    end if;
    begin
        if ModuleReset = '0' then
            OutData <= '0';
            OutCK <= '0';
            counter <= 7;
        elsif falling_edge(Clock) then
                OutCK <= '0';
                OutData <= Data(counter);
        end if;
end process;

但是输出时钟在不同的频率下看起来很奇怪。

【问题讨论】:

  • 我已经解决了,最后的代码成功了。

标签: vhdl clock fpga


【解决方案1】:

你的最后一个想法,我知道它最终为你工作,是次优的。如果你的时钟很慢,应该没问题,但我建议你还是修一下。

if ModuleEN = '1' then
    OutCK <= Clock;
else
    OutCK <= '1';
end if;

产生具有输出时钟信号的组合逻辑。永远不建议将时钟用作逻辑信号,因为时钟使用的时钟路径不能很好地路由到一般路由资源。输出信号会有潜在的毛刺(对输出接口来说非常糟糕!)和大的延迟/偏斜。

您的第一种方法是使用 DDR 寄存器来转发时钟,这确实是正确且最佳的方法。使用这种方案,您的时钟只使用时钟路径,如果输出时钟和数据的寄存器都位于 IO 块中,它们将具有相同的输出延迟,并且偏差很小。

您没有指定您使用的技术,但我建议您查找如何编写映射到合成器的 DDR 寄存器的代码。或者,您可以手动例化 DDR 输出寄存器原语,可能是 Xilinx 的 ODDR 或 Altera 的 ALTDDIO_OUT。

【讨论】:

  • 从第一条错误消息来看,这似乎是使用 Synplify Pro 合成的。
  • 使用硬 DDR IO 寄存器是特定于平台的优化。它在支持它的 FPGA 平台上是一个有用的优化。但它使设计平台变得特定,并且在没有 DDR IO 的 FPGA 或 ASIC 上不是正确的解决方案。具有组合逻辑的门控时钟解决方案独立于平台,是 ASIC 的正确解决方案,并且在高达 150MHz 左右的 FPGA 中工作良好。因此,哪种解决方案最“正确”取决于应用程序的需求。
【解决方案2】:

您尝试的问题确实是您对同一信号有多个驱动程序,或者您在时钟的上升沿和下降沿都分配了一个信号。这是不可合成的。

试试这个:

process(Clock, ModuleReset, ModuleEN)
begin
    if ModuleEN = '1' then
        OutCK <= Clock;
    else
        OutCK <= '1';
    end if;

    if ModuleReset = '0' then
        OutData <= '0';
        counter <= 7;
    elsif falling_edge(Clock) then
        OutData <= Data(counter);
    end if;
end process;

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 2020-09-20
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多