与上升和下降边缘一起使用来制作计数器?

时间:2014-10-02 11:13:00

标签: vhdl counter clock fpga

if rising_edge (clk) then
new_clk <= not new_clk ;
end if;

使用该语句时,实际上时钟速度除以2是因为单边触发。如果我们想用一个与时钟速度相同的计数器计数,需要什么语句呢?有没有办法同时使用上升沿和下降沿?

编辑:因为不清楚..

我通常使用计数器来降低时钟速度,并通过使用更高的计数器位向量索引来制作新的时钟。计数器矢量的MSB具有最高频率闪烁但其频率是时钟的一半,因为上升沿事物。如果可以同时使用上升沿和下降沿两种情况,则MSB的频率将等于时钟速度。

在上面的代码中,在连续的上升沿处设置一个位并清零。但时钟速度再次分裂。

2 个答案:

答案 0 :(得分:2)

这个问题有点不清楚,但我认为其目的是制作一个 计数器在时钟的上升沿和下降沿递增。

通常的FPGA和ASIC原语确实包含可以改变状态的触发器 无论是上升还是下降,所以假设目标技术也是如此 只有对上升或下降边缘敏感的触发器。

如果是LSB,则可以创建在每个边缘有效递增的计数器 直接由时钟产生,并产生剩余的计数器位 作为传统的柜台。代码可以如下所示,最终计数输出打开 z_o

-- Resulting counter output combined from ordinary counter and clk_i
z_o <= cnt(cnt'left downto 1) & (not clk_i);

-- Ordinary counter for top of resulting counter
process (clk_i, rst_i) is
begin
  if rising_edge(clk_i) then
    cnt(cnt'left downto 1) <= std_logic_vector(unsigned(cnt(cnt'left downto 1)) + 1);
  end if;
  if rst_i = '1' then
    cnt(cnt'left downto 1) <= (others => '0');
  end if;
end process;

波浪可以在下面看到:

enter image description here

请注意,z_o上的结果计数器的时间不会像普通人那样 所有位都来自触发器的计数器,因此时序分析设置可能 必须有所不同,具体取决于使用结果计数器的方式。

所以可以选择创建一个在两个边上递增的计数器 值得重新考虑解决方案,并使用普通计数器 相反,因为这将简化时序设置。

答案 1 :(得分:0)

1)如果我们想用一个与时钟速度相同的计数器计数,需要什么语句呢?

您只需要创建一个这样的同步过程:

PROCESS(CLK, RESET) 
IF  reset = '1' then
   COUNT <= (OTHERS => '0');
ELSIF rising_edge(clk) then
   COUNT <= COUNT + '1';
END IF;

2)有没有办法同时使用上升沿和下降沿?

您必须以这种方式创建两个流程

PROCESS(CLK,RES)
IF  reset = '1' then
   COUNT_pos <= (OTHERS => '0');
ELSIF rising_edge(clk) then
   COUNT_pos <= COUNT_neg + '1';
END IF;
PROCESS(CLK,RES)
IF  reset = '1' then
   COUNT_neg <= (OTHERS => '0');
ELSIF falling_edge(clk) then
   COUNT_neg <= COUNT_pos + '1';
END IF;

它们只是您应该为此目的更改此代码的示例。