2014-10-02 52 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時間將不作爲一個普通的 計數器,其中所有位都來自觸發器,所以時序分析設置可能不同,這取決於如何使用結果計數器。

因此,除了創建一個計數器在兩個邊上遞增的方法外,可能需要重新考慮解決方案,並使用普通計數器 代替,因爲這樣會簡化計時設置。