VHDL门控时钟如何避免
VHDL Gated Clock how to avoid
我收到了避免门控时钟的建议,因为它可能会导致松弛和时序约束问题。但是我想问一下我可以考虑像门控时钟。
例如:
此代码已对时钟进行门控,因为 StopCount 对其进行了门控。
process(ModuleCLK)
begin
if (rising_edge(ModuleCLK) and StopCount = '0') then
if ModuleEN = '0' then
RESET <= '0';
POWER <= '1';
EN <= '0';
CLOCK <= '0';
SERIAL <= '0';
elsif
这段代码也有门控时钟?
process(ModuleCLK)
begin
if ModuleEN = '0' then
RESET <= '0';
POWER <= '1';
EN <= '0';
CLOCK <= '0';
SERIAL <= '0';
elsif (rising_edge(ModuleCLK)) then
术语 "gated clock" 通常用于 ASIC 技术中的时钟,其中时钟脉冲仅在条件为真 (1) 时生成,因此门控时钟是 属性时钟源。门控时钟可以用锁存器和与门来制作,如下所示,这种设计需要特别注意解决你提到的时序问题,因此不适合FPGA设计:
您显示的代码使用触发器上的启用来根据启用更新触发器值,因此这是时钟启用,而不是门控时钟。
第一个代码可以,也应该写成:
process (ModuleCLK) is
begin
if rising_edge(ModuleCLK) then
if StopCount = '0' then
... -- Update at clock if StopCount = '0'
这反映了设计在 FPGA 中的典型实现方式,其中触发器始终计时 (ModuleCLK
),但输出仅在条件 (StopCount = '0'
) 为是的。
第二个代码示例看起来像异步重置,除了代码应该在敏感列表中有重置条件(ModuleEN
)(问题代码中缺少)。由于触发器改变值不需要时钟时钟,因此发生异步复位;唯一的要求是复位条件为真,然后值的变化与任何时钟异步发生。
因此,在输入 a
和输出 z
的 VHDL 中正确编写触发器的方法如下:
process (reset, clock) is
begin
if reset = '1' then
z <= '0';
elsif rising_edge(clock) then
if enable = '1' then
z <= a;
end if;
end if;
end process;
在 Altera Quartus II 中,这将创建如下 RTL 图:
Arria II 器件中的实现是:
这表明触发器up实际上在时钟的每个上升沿更新,因此时钟使能是通过组合设计(LUT)实现的,其中当前数据反馈到触发器启用为假 (0),或者当启用为真 (1) 时 a
给出新数据。
我收到了避免门控时钟的建议,因为它可能会导致松弛和时序约束问题。但是我想问一下我可以考虑像门控时钟。 例如:
此代码已对时钟进行门控,因为 StopCount 对其进行了门控。
process(ModuleCLK)
begin
if (rising_edge(ModuleCLK) and StopCount = '0') then
if ModuleEN = '0' then
RESET <= '0';
POWER <= '1';
EN <= '0';
CLOCK <= '0';
SERIAL <= '0';
elsif
这段代码也有门控时钟?
process(ModuleCLK)
begin
if ModuleEN = '0' then
RESET <= '0';
POWER <= '1';
EN <= '0';
CLOCK <= '0';
SERIAL <= '0';
elsif (rising_edge(ModuleCLK)) then
术语 "gated clock" 通常用于 ASIC 技术中的时钟,其中时钟脉冲仅在条件为真 (1) 时生成,因此门控时钟是 属性时钟源。门控时钟可以用锁存器和与门来制作,如下所示,这种设计需要特别注意解决你提到的时序问题,因此不适合FPGA设计:
您显示的代码使用触发器上的启用来根据启用更新触发器值,因此这是时钟启用,而不是门控时钟。
第一个代码可以,也应该写成:
process (ModuleCLK) is
begin
if rising_edge(ModuleCLK) then
if StopCount = '0' then
... -- Update at clock if StopCount = '0'
这反映了设计在 FPGA 中的典型实现方式,其中触发器始终计时 (ModuleCLK
),但输出仅在条件 (StopCount = '0'
) 为是的。
第二个代码示例看起来像异步重置,除了代码应该在敏感列表中有重置条件(ModuleEN
)(问题代码中缺少)。由于触发器改变值不需要时钟时钟,因此发生异步复位;唯一的要求是复位条件为真,然后值的变化与任何时钟异步发生。
因此,在输入 a
和输出 z
的 VHDL 中正确编写触发器的方法如下:
process (reset, clock) is
begin
if reset = '1' then
z <= '0';
elsif rising_edge(clock) then
if enable = '1' then
z <= a;
end if;
end if;
end process;
在 Altera Quartus II 中,这将创建如下 RTL 图:
Arria II 器件中的实现是:
这表明触发器up实际上在时钟的每个上升沿更新,因此时钟使能是通过组合设计(LUT)实现的,其中当前数据反馈到触发器启用为假 (0),或者当启用为真 (1) 时 a
给出新数据。