驱动输入时钟输出

Drive input clock to output

我有一个具有 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;

合成器给我这个错误:

"Asynchronous load of non-constant data for SCK is not supported"

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

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;

我有这两个错误:

"Multiple non tristate drivers for net SCK"
"Unresolved tristate drivers for net 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;

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

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

试试这个:

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;

据我所知,你最后的想法最终对你有用,但不是最理想的。如果你的时钟很慢,应该没问题,但我还是建议你修复它。

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

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

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

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