(我會發布這EE但似乎這裏還有更多VHDL問題...)VHDL:創建基於一個非常快的時鐘速度很慢時鐘脈衝
背景:我使用Xilinx Spartan-6LX9 FPGA和Xilinx ISE 14.4(webpack)。
今天我偶然發現了一個令人畏懼的「PhysDesignRules:372 - 門控時鐘」警告,並且我看到有很多關於這個問題的討論。一致認爲似乎是使用FPGA上的一個DCM來進行時鐘分割,但是......我的DCM看起來沒有能力從32 MHz到4.096 KHz(根據向下5 MHz的嚮導) 32MHz ......並且爲了這種低頻目的嘗試鏈接多個DCM似乎是荒謬的)。我現在的設計使用clk_in來計數到指定的值(15265),將該值重置爲零,並切換clk_out位(所以我最終的佔空比爲50%,FWIW)。它完成了這項工作,我可以輕鬆使用clk_out的上升沿來驅動設計的下一個階段。它似乎工作得很好,但... 門控時鐘(即使它不在時鐘偏移將恕我直言,非常相關的範圍內)。 (注:所有時鐘測試是使用在給定的時鐘敏感過程rising_edge()函數來完成)
所以,我的問題:
如果我們談論得出一個相對緩慢的CLK_OUT從快得多 clk_in,門控仍然認爲不好? 或者這種「計數到x併發送一個脈衝」的事情非常典型的用於FPGA在KHz範圍內生成一個「時鐘」,而不是其他一些不必要的副作用可能會觸發此警告呢?
有沒有更好的方法來從MHz範圍的主時鐘創建一個低KHz範圍的時鐘,請記住,使用多個DCM似乎在這裏過度殺傷(如果在給定非常低的輸出頻率)?我意識到50%佔空比可能是多餘的,但假設使用板載DCM中的一個時鐘和而不是,那麼將如何使用FPGA執行主時鐘分頻?
編輯:給定以下(其中CLK_MASTER是32 MHz的輸入時鐘和CLK_SLOW是所希望的慢速率時鐘,並且LOCAL_CLK_SLOW是存儲時鐘的狀態爲全佔空比事情的方式),我瞭解到,這個配置使得警告:
architecture arch of clock is
constant CLK_MASTER_FREQ: natural := 32000000; -- time := 31.25 ns
constant CLK_SLOW_FREQ: natural := 2048;
constant MAX_COUNT: natural := CLK_MASTER_FREQ/CLK_SLOW_FREQ;
shared variable counter: natural := 0;
signal LOCAL_CLK_SLOW: STD_LOGIC := '0';
begin
clock_proc: process(CLK_MASTER)
begin
if rising_edge(CLK_MASTER) then
counter := counter + 1;
if (counter >= MAX_COUNT) then
counter := 0;
LOCAL_CLK_SLOW <= not LOCAL_CLK_SLOW;
CLK_SLOW <= LOCAL_CLK_SLOW;
end if;
end if;
end process;
end arch;
鑑於此配置不導致警告:
architecture arch of clock is
constant CLK_MASTER_FREQ: natural := 32000000; -- time := 31.25 ns
constant CLK_SLOW_FREQ: natural := 2048;
constant MAX_COUNT: natural := CLK_MASTER_FREQ/CLK_SLOW_FREQ;
shared variable counter: natural := 0;
begin
clock_proc: process(CLK_MASTER)
begin
if rising_edge(CLK_MASTER) then
counter := counter + 1;
if (counter >= MAX_COUNT) then
counter := 0;
CLK_SLOW <= '1';
else
CLK_SLOW <= '0';
end if;
end if;
end process;
end arch;
因此,在這種情況下,這一切都是因爲缺乏的其他的(就像我說的,50%的佔空比最初很有趣,但最終並不需要,當時的「本地」時鐘的切換看起來相當聰明......)我大部分在右邊跟蹤它出現。
什麼在這一點上並不清楚,我就是用計數器(存儲大量的位)不會導致警告,但受存儲和切換輸出位確實原因警告。想法?
耐人尋味......這幾乎是我在做什麼已經,雖然我是用邏輯來切換本地STD_LOGIC位,當它達到規定值(沒有「其他「條款),然後將其分配給輸出(無論如何,不再需要50%佔空比的東西)。將其切換出來,然後添加一個else子句(相當於上面的「clk_enable_200kHz <='0';」)擺脫了警告!所以我有正確的想法,除了我試圖以這種方式獲得50%的任務週期...因此我想知道,是否真的有效地創造了一個觸發器,事實是這一切的原因? – MartyMacGyver 2013-03-06 11:06:31
這聽起來很奇怪。您是否在這兩種情況下都以相同的方式使用了門控時鐘信號?警告應取決於邏輯信號被用作時鐘,而不取決於如何生成該邏輯信號。 – sonicwave 2013-03-06 12:15:11
我已經用「之前和之後」代碼更新了我的問題(我測試了兩個表單,只有「之前」之一觸發了這個錯誤......雖然顯然它有一個額外的存儲位,你會看到)。在這一點上,這是一個有點學術的人,但是理解爲什麼我在第一個地方做的是「錯誤的」(我能想到的是這與無其他「別的」或額外的位有關切換或兩者的結合,所有其他事情在整個過程中都是相同的。) – MartyMacGyver 2013-03-06 12:18:53