【问题标题】:FPGA : using both falling and rising edge in same processFPGA:在同一过程中同时使用下降沿和上升沿
【发布时间】:2017-04-19 09:27:18
【问题描述】:

我是 fpga 和 vhdl 新手..

我的开发环境如下。

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;

我可以看到很多不推荐这些语句的反馈,但我不明白为什么这些语句会导致这个问题..

【问题讨论】:

  • 我怀疑 w_proc 是启用输入?
  • 是的。这是来自 fpga 外部的触发器。

标签: vhdl fpga spartan


【解决方案1】:

您的 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 的值,您始终可以使时钟速度提高一倍,并使用启用信号每隔一个时钟周期激活一次,然后传播在你的管道旁边。这会给你带来一大堆其他(非常有教育意义的)麻烦,但可行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 2021-06-20
    • 2016-01-17
    • 2014-01-08
    • 1970-01-01
    相关资源
    最近更新 更多