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

Vhdl 与上升和下降边缘一起使用来制作计数器?,vhdl,counter,clock,fpga,Vhdl,Counter,Clock,Fpga,当使用该语句时,实际上时钟速度除以2,因为一条边触发。如果我们想用和时钟速度相同的计数器计数,需要什么语句?是否有一种同步使用上升和下降边缘的方法 编辑:因为不规则 我通常使用计数器来降低时钟速度,并通过使用计数器位向量的更高索引来制作新的时钟。计数器向量的MSB具有最高频率闪烁,但由于上升沿的原因,其频率为时钟的一半。如果可以同时使用上升沿和下降沿情况,MSB的频率将等于时钟速度 在上面的代码中,在连续的上升沿上设置并清除一个位。但是时钟速度又被除法了。1如果我们想用一个与时钟速度相同的计数器

当使用该语句时,实际上时钟速度除以2,因为一条边触发。如果我们想用和时钟速度相同的计数器计数,需要什么语句?是否有一种同步使用上升和下降边缘的方法

编辑:因为不规则

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


在上面的代码中,在连续的上升沿上设置并清除一个位。但是时钟速度又被除法了。

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

您只需要创建一个如下所示的同步过程:

if rising_edge (clk) then
new_clk <= not new_clk ;
end if;
2是否有一种同步使用上升沿和下降沿的方法

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

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

它们只是示例,您应该根据自己的目的更改此代码

这个问题有点不清楚,但我想我们的目的是为了 在时钟上升沿和下降沿上递增的计数器

通常的FPGA和ASIC原语确实包括改变其上状态的触发器 既有上升沿,也有下降沿,因此假设目标技术 只有对上升沿或下降沿敏感的触发器

如果LSB 直接从时钟生成,并生成剩余的计数器位 作为常规计数器。代码可以如下所示,最终计数输出为on 佐奥:

可以在下面看到波浪:

请注意,z_o上生成的计数器的计时与普通计数器的计时不同 所有位都来自触发器的计数器,因此时序分析设置可能 必须不同,这取决于结果计数器的使用方式

因此,除了在两条边上创建一个递增的计数器之外,它还可以 值得重新考虑一般的解决方案,并使用普通计数器
相反,因为这将简化计时设置。

我在这里找不到现有问题,但我确实找到了。
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;
-- 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;