我收到了避免使用门控时钟的建议,因为它可能会导致松弛和时序限制问题。但我想问一下我可以认为什么是门控时钟。
例如:
此代码对时钟进行门控,因为 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
术语“门控时钟”通常在 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
)在敏感度列表中(问题代码中缺失)。由于触发器不需要时钟来改变值,所以发生异步复位;唯一的要求是复位条件为真,然后值的变化与任何时钟异步发生。
因此,在 VHDL 中正确编写触发器的方法是,输入a
和输出z
, 就好像:
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 器件中的实现如下:
这表明向上触发器实际上是在时钟的每个上升沿更新的,因此时钟使能是通过组合设计(LUT)实现的,其中当使能为假(0 ),或者新数据来自a
当启用为真时 (1)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)