65.9K
CodeProject 正在变化。 阅读更多。
Home

VHDL 频率分频器。

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2012年8月20日

LGPL3

1分钟阅读

viewsIcon

45876

downloadIcon

438

本文简要介绍了一个使用VHDL的分频器,以及计算缩放因子的过程。

Figure 1: Frequency divider simulation.

引言

本文简要介绍了一个使用VHDL的分频器,以及计算缩放因子的过程。

缩放因子

分频器是一个简单的组件,其目标是降低输入频率。该组件通过使用缩放因子和计数器来实现。缩放因子是输入频率与期望输出频率之间的关系。

Scaling factor equation.

假设输入频率为50MHz,并且我们需要一个200Hz的输出频率,那么我们得到

Scaling factor for this example.

因此,分频器的计数器每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;

最后,我展示了仿真的结果

Figure 1: Frequency divider simulation.

© . All rights reserved.