2014-10-02 51 views
-1
if rising_edge (clk) then 
new_clk <= not new_clk ; 
end if; 

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

编辑:由于不清楚的地方的..

我使用计数器一般降低时钟速度,并通过使用计数器位向量的高指标作出新的时钟。计数器矢量的MSB具有最高的频率闪烁,但由于上升沿的缘故,其频率是时钟的一半。如果可以同时使用上升沿和下降沿的情况,MSB的频率将等于时钟速度。

而在上面的代码中,一些位在连续的上升沿进行置位和清零。但时钟速度再次划分。

+0

我在这里找不到现有的问题,但我确实找到了[这edaboard线程](http://www.edaboard.com/thread133082.html)。 – fru1tbat 2014-10-02 11:51:58

回答

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; 

他们只是一个例子,你应该改变这种代码,你的目的创建两个过程。

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时间将不作为一个普通的 计数器,其中所有位都来自触发器,所以时序分析设置可能不同,这取决于如何使用结果计数器。

因此,除了创建一个计数器在两个边上递增的方法外,可能需要重新考虑解决方案,并使用普通计数器 代替,因为这样会简化计时设置。