驱动输入时钟输出
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。
我有一个具有 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。