VHDL語言實現的任意整數分頻器。

2021-04-19 08:54:01 字數 3537 閱讀 5011

fpga中,一般外接的晶振是50mhz,如果電路中乙個模組需要25mhz時鐘,那麼進行乙個2分頻,這個是相當容易的,下面是一種方法,還有可以用乙個二進位制計數器實現。這裡就不寫**了。easy.同樣的原理 ,四分頻也很容易。

process(clk)--clk輸入時鐘;

begin

if(rst = '0') then  --rst復位訊號;

clkout <= '0';

elsif(clk;event and clk = '1')then

clkout <= not clk;

end if;

end process;

但是如果實現乙個三分頻呢??

rel="file-list" href="file:///c:%5cdocume%7e1%5cadmini%7e1%5clocals%7e1%5ctemp%5cmsohtml1%5c01%5cclip_filelist.xml">是不是

3分頻器應該是每

1.5的

clock就

0變1、

1變0,但問題來了,哪來的

1.5個

clock?計數器並不能產生

1.5!!正源觸發與負源觸發的間隔時間剛好是

0.5個

clock?所以我們產生兩個

clock,乙個是

posedge clk,乙個是

negedge clk,最後將兩個

clock做

or,這樣就可以產生出

0.5個

clock了。下面給出**:::

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_arith.all;

use ieee.std_logic_unsigned.all;

entity clk_div_n is

port(clk : in std_logic;

rst : in std_logic;

clkout :out std_logic

);end clk_div_n;

architecture rtl of clk_div_n is

constant n   : integer range 0 to 10 := 6;  --這裡的n可以是任意值,當然要大於1.

signal clk_p : std_logic;

signal clk_n : std_logic;

signal cnt_p : integer range 0 to n;

signal cnt_n : integer range 0 to n;

begin

process(clk_p, clk_n)

begin

if((n mod 2) = 0)then

clkout <= clk_p;

else

clkout <= clk_p or clk_n;

end if;

end process;

process(clk, rst)

begin

if(rst = '0') then

cnt_p <= 0;

elsif(clk'event and clk = '1') then

if(cnt_p = n-1) then

cnt_p <= 0;

else

cnt_p <= cnt_p + 1;

end if;

end if;

end process;

process(clk, rst)

begin

if(rst = '0') then

clk_p <= '0';

elsif(clk'event and clk = '1')then

if (cnt_p < (n/2)) then

clk_p <= '1';

else

clk_p <= '0';

end if ;

end if;

end process;

process(clk, rst)

begin

if(rst = '0') then

cnt_n <= 0;

elsif(clk'event and clk = '0')then

if(cnt_n = n-1) then

cnt_n <= 0;

else

cnt_n <= cnt_n + 1;

end if;

end if;

end process;

process(clk, rst)

begin

if(rst = '0') then

clk_n <= '0';

elsif(clk'event and clk = '0')then

if (cnt_n < (n/2)) then

clk_n <= '1';

else

clk_n <= '0';

end if ;

end if;

end process;

end rtl;            

接下來我給出對應的testbench::有興趣可以用make a simulation in modelsim

library ieee  ;

use ieee.std_logic_1164.all  ;

use ieee.std_logic_arith.all  ;

use ieee.std_logic_unsigned.all  ;

entity clk_div_n_tb  is

end clk_div_n_tb;

architecture clk_div_tb_arch of clk_div_n_tb is

signal clkout   :  std_logic  ;

signal rst   :  std_logic := '0' ;

signal clk   :  std_logic := '1' ;

component clk_div_n 

port (

clk  : in std_logic ;

rst  : in std_logic ;

clkout  : out std_logic

); end component ;

begin

process

begin

wait for 50ns;

clk <= not clk;

end process;

rst <= '1' after 200ns;

test:clk_div_n

port map (

clk    => clk,

rst    => rst,

clkout => clkout) ;

end clk_div_tb_arch;

以下是我的**結果。用的5分頻

VHDL語言實現的任意整數分頻器

process clk clk輸入時鐘 begin if rst 0 then rst復位訊號 clkout 0 elsif clk event and clk 1 then clkout not clk end if end process 但是如果實現乙個三分頻呢?是不是 3分頻器應該是每 1....

VHDL語言實現的任意整數分頻器

process clk clk輸入時鐘 begin if rst 0 then rst復位訊號 clkout 0 elsif clk event and clk 1 then clkout not clk end if end process 但是如果實現乙個三分頻呢?是不是3分頻器應該是每1.5的...

Verilog任意整數分頻電路

define n 5module div n input clk,基準時鐘output clk div n,n分頻後得到的時鐘input rst wire 31 0 n 5 n為分頻係數,n 2即可,n的值為clk除以clk div n後取整 四捨五入 產生備用時鐘1 reg 31 0 cnt1 r...