【发布时间】:2015-12-07 07:50:39
【问题描述】:
我不熟悉使用各种不同的模块创建 FPGA 系统来驱动 I2C 总线(尽管我认为这个问题适用于任何 FPGA 系统),并且这些模块都使用同步复位。
使用时钟分频器模块为模块提供时钟,该模块获取系统时钟并向系统的其余部分输出较低的频率。
我遇到的问题是,当复位信号变低时,时钟分频器复位,因此其他模块依赖的时钟停止 - 因此其他模块不会注册复位
一个明显的解决方案是进行异步复位,但是,在 Xilinx ISE 中,它似乎不喜欢它们,并发出警告说这与 Spartan-6 FPGA 不兼容(尤其是当异步之后的代码代码是同步的,这是因为 I2C 总线使用总线时钟将位放入总线)。
另一个解决方案是时钟分频器根本无法重置,因此时钟永远不会停止,所有模块都会正确重置。然而,这意味着时钟分频器寄存器无法初始化/重新初始化为已知状态 - 我被告知这将是一个大问题,尽管我知道您可以在模拟中使用 := '0'/'1'; 运算符,但这不起作用一旦在实际的 FPGA 上编程(?)。
同步复位的约定是什么?时钟发生器一般不复位吗?还是它们只在复位信号的瞬时边缘复位?或者我的建议都不是真正的解决方案!
我已经放了一个时序图和我的代码来说明我的意思,并展示我一直在使用的代码。
非常感谢!
大卫
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
library UNISIM;
use UNISIM.VComponents.all;
ENTITY CLK_DIVIDER IS
GENERIC(INPUT_FREQ : INTEGER;
OUT1_FREQ : INTEGER;
OUT2_FREQ : INTEGER
);
PORT(SYSCLK : IN STD_LOGIC;
RESET_N : IN STD_LOGIC;
OUT1 : OUT STD_LOGIC;
OUT2 : OUT STD_LOGIC);
END CLK_DIVIDER;
architecture Behavioral of Clk_Divider is
constant divider1 : integer := INPUT_FREQ / OUT1_FREQ / 2;
constant divider2 : integer := INPUT_FREQ / OUT2_FREQ / 2;
signal counter1 : integer := 0;
signal counter2 : integer := 0;
signal output1 : std_logic := '0';
signal output2 : std_logic := '0';
begin
output1_proc : process(SYSCLK)
begin
if rising_edge(SYSCLK) then
if RESET_N = '0' then
counter1 <= 0;
output1 <= '1';
else
if counter1 >= divider1 - 1 then
output1 <= not output1;
counter1 <= 0;
else
counter1 <= counter1 + 1;
end if;
end if;
end if;
end process;
output2_proc : process(SYSCLK)
begin
if rising_edge(SYSCLK) then
if RESET_N = '0' then
counter2 <= 0;
output2 <= '1';
else
if counter2 >= divider2 - 1 then
output2 <= not output2;
counter2 <= 0;
else
counter2 <= counter2 + 1;
end if;
end if;
end if;
end process;
OUT1 <= output1;
OUT2 <= output2;
end Behavioral;
【问题讨论】:
-
异步重置为时钟分频器,并为其他所有内容进行同步重置(可能在 clkdiv 中从异步中创建)。
-
好的 - 这是否意味着在异步复位期间有一个备用时钟频率输出,以便同步模块仍然注册复位?
-
没有。重置 clkdiv 会启动一个进程(计数器或简单 SM),该进程会在 clkdiv 重置并再次运行后生成重置。
-
啊,我明白了 - 太棒了 - 所以 clkdiv 被重置,并且在被释放后,断言它自己的重置输出,它可以保持任意数量的时钟周期?
-
就是这样。它允许变化,例如等待几个周期,然后断言,然后保持几个周期。但如果您使用多个时钟,请认真考虑 Morten 的建议。
标签: asynchronous vhdl reset clock xilinx