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

时间:2017-01-12 20:26:15

标签: vhdl fpga

您好我是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;   `

1 个答案:

答案 0 :(得分:0)

没关系,但是合成是否会产生良好的结果取决于面料。

灵敏度列表应该只有resetC50MHz,因为这些是实际更改信号的唯一事件。当C4Hz切换时,rising_edge(C50MHz)false,因为这些不是同步的,如果要运行该流程,则不会发生任何事情。

可以假设单独的启用在任何地方都可用 - 时钟扇出非常高,每个人都实现了独立的时钟分配网络,然后需要启用寄存器。所以这是安全的。

异步重置可能并非在所有结构上都可用,但通常是。有些设备会支持异步加载(即你可以决定复位时要采用的值),其他设备只能复位(即你只能将寄存器设置为零,初始化为1会生成一个倒置表,一个寄存器带有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_flagdo_set_start_flag的旧值检查无法优化,即使设置start_flag之前已设置无效,因为它可能只是重置当前的时钟周期。

如果以if C256Hz = '1'开头的广告代码为elsif,则第二个中间版将为

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