FPGA学习心得——分频器

        分频器是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端口的,文中使用原理图搭建框架,然后再编写相应子模块的程序。

你可能感兴趣的:(FPGA)