⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 分频器.txt

📁 好的分频器设计程序
💻 TXT
字号:
 

分频器的硬件描述语言设计 

  

在数字电路中,常需要对较高频率的时钟进行分频操作,得到较低频率的时钟信号。我们知道,在硬件电路设计中时钟信号是最重要的信号之一。 下面我们介绍分频器的 VHDL 描述,在源代码中完成对时钟信号 CLK 的 2 分频, 4 分频, 8 分频, 16 分频。 这也是最简单的分频电路,只需要一个计数器即可。

  

LIBRARY IEEE; 

USE IEEE.STD_LOGIC_1164.ALL; 

USE IEEE.STD_LOGIC_ARITH.ALL; 

USE IEEE.STD_LOGIC_UNSIGNED.ALL; 

 

ENTITY clkdiv IS 

PORT(clk : IN STD_LOGIC; 

clk_div2 : OUT STD_LOGIC; 

clk_div4 : OUT STD_LOGIC; 

clk_div8 : OUT STD_LOGIC; 

clk_div16 : OUT STD_LOGIC); 

END clk_div; 

  

ARCHITECTURE rtl OF clk_div IS 

SIGNAL count : STD_LOGIC_VECTOR(3 DOWNTO 0); 

BEGIN 

PROCESS(clk) 

BEGIN 

IF (clk'event AND clk=' 1' ) THEN 

IF(count=” 1111” ) THEN 

Count <= (OTHERS =>' 0' ); 

ELSE 

Count <= count +1; 

END IF ; 

END IF ; 

END PROCESS; 

clk_div2 <= count(0); 

clk_div4 <= count(1); 

clk_div8 <= count(2); 

clk_div16 <= count(3); 

END rtl; 

  

对于分频倍数不是 2 的整数次幂的情况,我们只需要对源代码中的计数器进行一下计数控制就可以了,如下面源代码描述一个对时钟信号进行 6 分频的分频器。 

 

ENTITY clkdiv IS 

PORT(clk : IN STD_LOGIC; 

clk_div6 : OUT STD_LOGIC); 

END clk_div; 

  

ARCHITECTURE rtl OF clk_div IS 

SIGNAL count : STD_LOGIC_VECTOR(1 DOWNTO 0); 

SIGNAL clk_temp : STD_LOGIC; 

BEGIN 

PROCESS(clk) 

BEGIN 

IF (clk'event AND clk=' 1' ) THEN 

IF(count=” 10” ) THEN 

count <= (OTHERS =>' 0' ); 

clk_temp <=NOT clk_temp; 

ELSE 

count <= count +1; 

END IF ; 

END IF ; 

END PROCESS; 

clk_div6 <= clk_temp; 

END rtl; 

  

前面两个分频器的例子描述的将时钟信号进行分频,分频后得到的时钟信号的占空比为 1 : 1 。在进行硬件设计的时候,往往要求得到一个占空比不是 1 : 1 的分频信号,这时仍采用计数器的方法来产生占空比不是 1 : 1 的分频信号。下面源代码描述的是这样一个分频器:将输入的时钟信号进行 16 分频,分频信号的占空比为 1 : 15 ,也就是说,其中高电位的脉冲宽度为输入时钟信号的一个周期。 

LIBRARY IEEE; 

USE IEEE.STD_LOGIC_1164.ALL; 

USE IEEE.STD_LOGIC_ARITH.ALL; 

USE IEEE.STD_LOGIC_UNSIGNED.ALL; 

  

ENTITY clkdiv IS 

PORT(clk : IN STD_LOGIC; 

clk_div16 : OUT STD_LOGIC); 

END clk_div; 

  

ARCHITECTURE rtl OF clk_div IS 

SIGNAL count : STD_LOGIC_VECTOR(3 DOWNTO 0); 

BEGIN 

PROCESS(clk) 

BEGIN 

IF (clk'event AND clk=' 1' ) THEN 

IF(count=” 1111” ) THEN 

Count <= (OTHERS =>' 0' ); 

ELSE 

Count <= count +1; 

END IF ; 

END IF ; 

END PROCESS; 

  

PROCESS(clk) 

BEGIN 

IF (clk'event AND clk=' 1' ) THEN 

IF(count=” 1111” ) THEN 

Clk_div16 <= ‘ 1' ; 

ELSE 

Clk_div <= ‘ 0' ; 

END IF ; 

END IF ; 

END PROCESS; 

END rtl; 

  

对于上述源代码描述的这种分频器,在硬件电路设计中应用十分广泛,设计人员常采用这种分频器来产生选通信号、中断信号和数字通信中常常用到的帧头信号等。 

希望深入了解的朋友,还可以思考奇数分频,半整数分频和小数分频的方法,在FPGA设计中,这些都是可以实现的,如果您希望更多信息,请继续阅读:

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -