library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity fenpin is
port(clk:in std_logic;--输入时钟
cmd:in std_logic_vector(7 downto 0);--分频指令cmd
clkout:out std_logic);--输出时钟
end fenpin;
architecture arch of fenpin is
signal clkt:std_logic:='0';
begin
process(clk,cmd)
variable cnt:std_logic_vector(7 downto 0):=(others=>'0');
begin
if cmd="00000000" then--如果是0则不分频
clkt<=clk;
elsif rising_edge(clk) then
if cnt>=cmd-1 then--计数cmd次clkt翻转一次,即可实现2*cmd次的分频
clkt<=not clkt;
cnt:=(others=>'0');
else
cnt:=cnt+1;
end if;
end if;
clkout<=clkt;--输出
end process;
end arch;
请参考下面的程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY FRE_DIV1 IS
PORT
(CLK : IN STD_LOGIC;
D : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
H : OUT STD_LOGIC
);
END ENTITY;
ARCHITECTURE ARCH_FRE_DIV1 OF FRE_DIV1 IS
SIGNAL CLK_OUT : STD_LOGIC;
BEGIN
PROCESS(CLK)
BEGIN
IF (D=X"00") THEN
H<=CLK;
ELSE
H<=CLK_OUT;
END IF;
END PROCESS;
PROCESS(CLK)
VARIABLE CNT,CNT1 : INTEGER RANGE 0 TO 200;
BEGIN
IF CLK'EVENT AND CLK='1' THEN
IF (Cnt=0) THEN
Cnt:=(2*CONV_INTEGER(D)-1);
Clk_OUT<='1';
ELSE
Cnt:=Cnt-1;
Clk_OUT<='0';
END IF;
END IF;
END PROCESS;
END ARCH_FRE_DIV1;
只是拨码开关为全0,不分频;然后根据拨码开关的输入值乘以2进行偶数分频