任意整数分频,占空比为50%(VHDL)
--希望能对大家有帮助
--**************************************-- --程序名:任意整数分频,占空比为50%
--**************************************-- library ieee;
use ieee.std_logic_1164.all; entity clk_div is
generic(n:integer:=2);--n的值是要分频的系数,n>=2 port (clock : in std_logic:='0'; clk_out : out std_logic); end clk_div;
architecture sea of clk_div is signal temp : std_logic:='0';
begin
process(clock,temp)
variable a,a1,a2 : integer range 0 to n; variable temp1,temp2 : std_logic:='0'; begin
if (n rem 2)=1 then
if rising_edge(clock) then
if a1=n-1 then a1:=0;temp1:='0';
elsif a1<((n+1)/2-1) then temp1:='1';a1:=a1+1; elsif a1>=((n+1)/2-1) then temp1:='0';a1:=a1+1; end if; end if;
if falling_edge(clock) then
if a2=n-1 then a2:=0;temp2:='0';
elsif a2<((n+1)/2-1) then temp2:='1';a2:=a1+1; elsif a2>=((n+1)/2-1) then temp2:='0';a2:=a2+1; end if; end if;
temp<=temp1 or temp2;
elsif rising_edge(clock) then
if a=(n/2-1) then a:=0;temp<=not temp; else a:=a+1; end if; end if;
end process; clk_out<=temp;
end sea; --程序结束
1、代码中分成了两个大部分:偶数分频和奇数分频的处理;而在奇数分频中,为了获得50%的分频比,特意加入了对时钟下降沿的响应,这是这段代码精华的所在;
2、对应以上三块分频处理中,分别设置了三个指针(a\\a1\\a2)和中间信号(temp\\temp2\\temp2) 3、每个模块,都用中间参数a”盯住“ 半点 n/2 (代码中使用(n+1)/2-1 这个具体数值)和满点n(代码中使用了n-1)这两个点来监视计数过程,从而(间接地)控制输出时钟的状态; 具体说,就是n=奇数时;满n复位,半n置位;n=偶数时,在半n(自然包括了满n)时取反。 4、为获得50%的占空比,充分利用了时钟的两个沿,巧妙的配合了一个简单的或运算,就解决了奇数分频比条件下的50% 精确占空系数问题(这样,从原理上说这个精度只受输入时钟占空比的影响)。
1:可以用bit位来实现对n的控制,在结构体中将bit位的值转换为十进制赋给n 就行了,不过这个时候的n是全局变量(shared variable)或是信号量;
2:这段代码我当时只是作了功能和时序仿真,综合没有问题,在开始学VHDL时,我看到别人的任意整数分频,占空比不是50%,而占空比不是50%的分频很好实现,但要实现占空比为50%的分频,我当时确实费了不少时间.我在画时序图时,将时序逻辑与组合逻辑结合起来,才写出了上面的程序.