library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity fredivn1 is
GENERIC(N:integer:=7); --可以是3,5,7,9,11,。。。
port(clk:in std_logic;
outclk:out std_logic);
end fredivn1;
architecture rtl of fredivn1 is
signal count1,count2:integer range 0 to N;
signal q,outclk1,outclk2:std_logic;
begin
q<=outclk1 and outclk2;
outclk<=q xor outclk1;
process(clk)
begin
if(clk'event and clk='1') then
if(count1=N-1) then
count1<=0;
else
count1<=count1+1;
if count1<(integer(N/2)) then
outclk1<='0';
else
outclk1<='1';
end if;
end if;
end if;
end process;
process(clk)
begin
if(clk'event and clk='0') then
if(count2=N-1) then
count2<=0;
else
count2<=count2+1;
if count2<(integer(N/2)) then
outclk2<='1';
else
outclk2<='0';
end if;
end if;
end if;
end process;
end rtl;
程序出自《CPLD/FPGA 常用模块与综合系统设计 实例精讲》 作者 罗苑棠
电子工业出版社
本人对程序中粗体字部分进行了修改 ,既
signal count1,count2:integer range 0 to N;
原书为signal count1,count2:integer ;
本人用Quartus II 发现如果 使用原书为signal count1,count2:integer ;则
count1,count2 默认生成32位长度,同时count1,count2自累加也是32位长度;消耗141个LE;仿真时间长度不够出来结果也是有问题;
如果改成signal count1,count2:integer range 0 to N;
如果改成signal count1,count2:integer :=0; 但是
count1,count2 默认生成32位长度,同时count1,count2自累加也是32位长度;消耗139个LE;仿真也正确;
所以大家在使用integer时,对数据进行范围限制;这样可可好的节约器件资源。。。
解决问题;
VHDL 50%占空比奇数分频器 总结:
1.对输入时钟上升沿进行计数,然后让一个内部信号在前一半时间里为低,后一半时间为高
if count1<(integer(N/2)) then --integer(N/2),这里的N=7;integer(N/2)=3,
outclk1<='0'; --当N<3输出0
else
outclk1<='1'; --当N>=3输出1;
2.对输入时钟下降沿进行计数,然后让一个内部信号在前一半时间里为高,后一半时间为低
if count2<(integer(N/2)) then --当N<3输出高
outclk2<='1';
else
outclk2<='0'; --当N>=3输出低
3.把1和2信号波形相与,得到一个半CLK周期的高电平信号
4.把3的信号与1的信号相异或就可得到占空比我1:1的7分频奇数分频时钟;
下面是modelsim 6.1g的仿真波形(3分频,50%占空比)
https://static.assets-stash.eet-china.com/album/old-resources/2009/2/4/13ce1ebb-0aff-4573-8131-cb1ff35e5c97.rar 里面是modelsim仿真波形图片在PDF里面
下面是图片,点击图片然后展开图片就可以了
仿真波形outclk有毛刺,实测输出来能良好,器件为EPM570T144C5,经24M 3 分频,8分频,50M 5分频,24.576M,3分频,8分频。70M 7分频效果良好。。。
文章评论(0条评论)
登录后参与讨论