我正在做這個項目,將輸出所需的頻率。對於大多數頻率我可以做出有效的代碼,但是當涉及頻率像300赫茲我有麻煩。VHDL脈衝發生器與任何頻率
因此,這裏是我的代碼大部分:
library ieee;
use ieee.std_logic_1164.all;
entity test is
port(
clk:in std_logic:='0';
clk_o:buffer std_logic:='0'
);
end test;
architecture Behavioral of test is
begin
process(clk)
variable temp:integer range 0 to 1000000:=0;
begin
if(clk'event)then
temp:=temp+1;
if(temp>=1000000)then
clk_o<=not clk_o;
temp:=0;
end if;
end if;
end process;
end Behavioral;
,這將產生50赫茲的頻率,因爲我的FPGA的時鐘速度爲50MHz。所以首先我試圖把它分開,但問題是你不能產生300Hz,因爲50 * 10^6/300是166666.667等等。
然後,我看到你可以使時間類型的變量,使時間最後1/300,但後來我意識到它不合成合格,所以它是不好的。還有REAL類型的變量可以使它更準確,然後整數變量,但它也不合成合格。
所以我沒有想法,如果任何人都可以給我一些提示,我會非常感激。
一個經典的選擇是分別累積小數部分,並在溢出或攜帶時將週期增加一個週期。 – 2014-12-05 14:05:37
將你的時鐘頻率改爲300Hz的整數倍 – OllieB 2014-12-05 15:52:18
如果計數器只應該在時鐘的上升沿增加if條件應該改爲if(clk'event和clk ='1')然後......。仿真會告訴您產生的預期頻率是原來的兩倍,因爲原始進程會在時鐘的上升沿和下降沿都觸發。 – damage 2014-12-05 22:30:42