VHDL 频率分频器。





5.00/5 (3投票s)
本文简要介绍了一个使用VHDL的分频器,以及计算缩放因子的过程。
引言
本文简要介绍了一个使用VHDL的分频器,以及计算缩放因子的过程。
缩放因子
分频器是一个简单的组件,其目标是降低输入频率。该组件通过使用缩放因子和计数器来实现。缩放因子是输入频率与期望输出频率之间的关系。
假设输入频率为50MHz,并且我们需要一个200Hz的输出频率,那么我们得到
因此,分频器的计数器每250000个周期产生一个200Hz的输出信号。
代码
无需进一步延迟,列表1显示了分频器的源代码。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity clk200Hz is
Port (
clk_in : in STD_LOGIC;
reset : in STD_LOGIC;
clk_out: out STD_LOGIC
);
end clk200Hz;
architecture Behavioral of clk200Hz is
signal temporal: STD_LOGIC;
signal counter : integer range 0 to 124999 := 0;
begin
frequency_divider: process (reset, clk_in) begin
if (reset = '1') then
temporal <= '0';
counter <= 0;
elsif rising_edge(clk_in) then
if (counter = 124999) then
temporal <= NOT(temporal);
counter <= 0;
else
counter <= counter + 1;
end if;
end if;
end process;
clk_out <= temporal;
end Behavioral;
第1行和第2行等效于C/C++的#include
或Python的import
语句。系统的输入和输出在第4行到第10行之间声明。
第16行到第28行的frequency_divider
过程通过使用从1到124999的计数器来生成200Hz信号。为什么是124999而不是250000?时钟信号是一个占空比为50%(有效时间和非有效时间相同)的方波;在这种情况下,125000个周期有效,125000个周期非有效。由于计数器从零开始,上限为125000 - 1。
reset信号是任何数字系统的重要组成部分,它在此组件中的功能是重启计数器。
仿真
为了验证我所说的一切,使用Xilinx ISE 13.1软件生成了一个测试平台。幸运的是,该软件可以自行创建大部分测试平台。
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY clk200Hz_tb IS
END clk200Hz_tb;
ARCHITECTURE behavior OF clk200Hz_tb IS
COMPONENT clk200Hz
PORT(
clk_in : IN std_logic;
reset : IN std_logic;
clk_out: OUT std_logic
);
END COMPONENT;
-- Inputs
signal clk_in : std_logic := '0';
signal reset : std_logic := '0';
-- Outputs
signal clk_out : std_logic;
constant clk_in_t : time := 20 ns;
BEGIN
-- Instance of unit under test.
uut: clk200Hz PORT MAP (
clk_in => clk_in,
reset => reset,
clk_out => clk_out
);
-- Clock definition.
entrada_process :process
begin
clk_in <= '0';
wait for clk_in_t / 2;
clk_in <= '1';
wait for clk_in_t / 2;
end process;
-- Processing.
stimuli: process
begin
reset <= '1'; -- Initial conditions.
wait for 100 ns;
reset <= '0'; -- Down to work!
wait;
end process;
END;
最后,我展示了仿真的结果