您的位置:首页 > 其它

FPGA学习心得——分频器

2012-07-30 17:08 274 查看
分频器是FPGA设计过程中使用频率非常高的基本单元之一。其基于FPGA的实现主要包括:1、通过FPGA芯片内部集成锁相环(如altera的PLL,Xilinx的DLL)来进行时钟的分频、倍频以及相移设计;2、对于时钟要求不太严格的设计,可以通过硬件描述语言进行时钟分频。通过后者进行分频器设计可以实现节省锁相环资源,达到对时钟操作的目的。
百度文库中可以搜到这样一片文章——《使用VHDL进行分频器设计》,文章中介绍了几乎所有可能用到的分频器(整数分频器、半整数分频器、小数分频器以及积分分频器)的设计,很好很强大。
作为刚开始学FPGA的新手,把自己在学习过程中的一点心得记录下来,一则为了鼓励自己继续努力,认真钻研;二则也算是一种记录生活的方式吧。
1、假设系统时钟为50MHz,现在要分频出250KHz(即5ms)的偶数分频器,基于硬件描述语言的分频器设计程序一般有如下两种:

(1)

Proc_Clk_5ms : process(Clk)
variable cnt_clk : integer range 0 to 125000 := 0;
begin
if(rising_edge(Clk)) then
if(cnt_clk < 125000) then
cnt_clk 	:= cnt_clk + 1;
else
cnt_clk 	:= 0;
Clk_scan <= not Clk_scan;
end if;
Clk_5ms	<= Clk_scan;
end if;
end process Proc_Clk_5ms;

(2)

Proc_Clk_5ms : process(Clk)
variable cnt_clk : integer range 0 to 125000 := 0;
begin
if(rising_edge(Clk)) then
if(cnt_clk < 125000) then
cnt_clk 	:= cnt_clk + 1;
Clk_scan	<= '0';
elsif(cnt_clk < 249999) then
cnt_clk 	:= cnt_clk + 1;
Clk_scan	<= '1';
else
cnt_clk 	:= 0;
end if;
Clk_5ms	<= Clk_scan;
end if;
end process Proc_Clk_5ms;

第一种方式是通过计数后反向来实现分频时钟的高低电平跳变,第二种方式则直接对分频时钟赋值处理。

在计数的过程中,需要注意的是:计数变量cnt_clk的范围,如果cnt_clk从0开始计算,则应该注意cnt_clk的最大取值!

2、在使用分频时钟的时候,不能直接将分频得到的CLK_CLOCK定义为Port的in端口,否则会出错(the signal CLK_BUFGP has no load)。这时可以将CLK_CLOCK设置成Signal,然后外接一个按键作为Reset触发信号,也可以不用外接按键,直接采用延时的方式来作为CLK_CLOCK的Reset触发。在书上有看到CLK_CLOCK在Port中定义为buffer的端口,这种方式是可以的,不过也得使用Reset触发信号。

更正下:今天看到有把CLK_CLOCK设置成Port的in端口的,文中使用原理图搭建框架,然后再编写相应子模块的程序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: