VHDL:在一个进程中启用多个时钟

VHDL: having multiple clock enables in one process

你好我是VHDL的新手,我想问一下这样的过程是否可以 我在一个进程中有多个时钟 C256Hz 和 C4Hz 是由 50MHz 时钟驱动的时钟使能

process (Reset, C50Mhz, Go, start_flag, C256Hz, C4Hz)
  begin
  if reset = '1' then
     start_flag <= '0';
  elsif rising_edge (C50Mhz) then
     if C4Hz = '1' then
        if count4 = "11" and single_run_flag = '0' then
           start_flag <= '0';
        end if;
     end if;
   if C256Hz = '1' then
      if Go = '1' and start_flag = '0' then
          start_flag <= '1';
      end if;
   end if;
  end if;
  end process;   `

可以,但是合成出来的效果好不好,要看面料。

敏感度列表应该只有 resetC50MHz,因为这些是唯一实际改变信号的事件。当 C4Hz 切换时,rising_edge(C50MHz)false,因为它们不同步,如果进程 运行 那么什么也不会发生。

可以假设单独启用在任何地方都可用——时钟扇出如此之高以至于每个人都实现单独的时钟分配网络,然后需要在寄存器上启用。所以这个可以放心使用。

异步重置可能并非在所有结构上都可用,但通常是可用的。一些设备将支持异步加载(即您可以决定复位时要取的值),其他设备仅复位(即您只能将寄存器设置为零,初始化为 1 会生成一个倒置的 table,一个寄存器reset-to-zero,下一个 LE 中有一个反相器。

所以总的来说,这个还是比较安全的,这个可以合成为

-- intermediates
do_clear_start_flag := C4Hz = '1' and count4 = "11" and single_run_flag = '0';
do_set_start_flag := C256Hz = '1' and Go = '1' and start_flag = '0';

-- to register
enable_start_flag := do_clear_start_flag or do_set_start_flag;
new_start_flag := do_set_start_flag;

即使设置start_flag没有效果,也无法优化do_set_start_flagstart_flag的旧值检查,因为它可能只是在当前时钟周期复位。

如果以 if C256Hz = '1' 开头的块是 elsif,则第二个中间体将读取

do_set_start_flag := C256Hz = '1' and Go = '1' and do_clear_start_flag = '0'