FPGA:在同一过程中同时使用下降沿和上升沿

时间:2017-04-19 09:27:18

标签: vhdl fpga spartan

我是一个fpga& vhdl newbie ..

我的开发环境如下。

FPGA:Spartan 6 XC6SLX9

编译:ISE 14.04

模拟器:Isim

我制作了一个简单的计数器,但有些事情我无法理解。

以下代码是我写的。我期望的是w_count增加了时钟的每个下降沿,并且在w_count在时钟的上升沿达到N_data时重置为0。在编译过程中没有问题,模拟也像我预期的那样运行良好。但是当应用于真实的fpga时,w_count为每个触发器递增,但在到达N_data时未初始化为零..

w_state_proc : process(r_clk, reset_n_clean)
begin
    if(reset_n_clean = '0') then
        w_count <= 0;
    elsif(r_clk'event and r_clk = '0') then
        if(state = write_state and w_proc = '1') then
            w_count <= w_count + 1;
        end if;
    elsif(r_clk'event and r_clk = '1') then
        if(w_count = N_data) then
            w_count <= 0;
        end if;
    end if;
end process w_state_proc;

当我更改了两个elsif语句的位置时,w_count根本没有增加...

w_state_proc : process(r_clk, reset_n_clean)
begin
    if(reset_n_clean = '0') then
        w_count <= 0;
    elsif(r_clk'event and r_clk = '1') then
        if(w_count = N_data) then
            w_count <= 0;
        end if;
    elsif(r_clk'event and r_clk = '0') then
        if(state = write_state and w_proc = '1') then
            w_count <= w_count + 1;
        end if;
    end if;
end process w_state_proc;

我可以看到很多反馈,不推荐这些陈述,但我不明白为什么这些陈述导致了这些问题。

1 个答案:

答案 0 :(得分:3)

您的FPGA在通用结构中没有双数据速率(DDR)触发器,这就是为什么不推荐 - “原样”它无法实现所需的功能。

此外,您正在使用异步重置。虽然可能,但也非常不推荐,因为FPGA已经具有同步复位触发器,因此它不需要任何额外的逻辑,与ASIC不同,即使没有复位,您也可以获得每个信号的已知值。异步复位会给您带来麻烦,无法以这种或那种方式实现时序收敛。

在您的示例中,无论如何都不需要DDR FF。看起来你拥有行为的原因是w_count可以在时钟周期之间被清除,这样w_count在递增时永远不会是N_data。为什么不将它与一个较小的值进行比较?

或者,您可以使用变量(非常小心!)来实现非常相似的行为:

  w_state_proc : process(r_clk) is
    variable v_count : integer range 0 to N_data;
  begin
    if (rising_edge(r_clk)) then
      v_count := w_count;
      if(state = write_state and w_proc = '1') then
        v_count := v_count + 1;
      end if;

      if(reset_n_clean = '0' or v_count = N_data) then
        w_count <= 0;
      else
        w_count <= v_count;
      end if;

    end if;
  end process w_state_proc;

如果确实需要w_count在半个时钟周期内具有N_data的值,则可以始终使时钟速度提高两倍,并且每隔一个时钟周期使用一次使能信号,并传播与你的管道一起。这会让你陷入其他(非常有教育意义的)麻烦,但可行。