基于VHDL的小数分频器设计
- 格式:pdf
- 大小:293.16 KB
- 文档页数:2
VHDL分频器课程设计一、课程目标知识目标:1. 学生能理解VHDL语言的基本概念,掌握VHDL语言的基本语法结构;2. 学生能掌握分频器的工作原理,了解分频器在数字系统中的应用;3. 学生能运用VHDL语言设计简单的分频器电路,并实现预期的分频功能。
技能目标:1. 学生能运用所学知识,独立完成VHDL分频器代码编写;2. 学生能通过仿真软件对所设计的分频器进行功能验证,并分析其性能;3. 学生能运用所学技能解决实际工程问题,具备一定的实践操作能力。
情感态度价值观目标:1. 学生对VHDL语言及数字系统设计产生兴趣,提高学习积极性;2. 学生通过课程学习,培养团队协作精神,提高沟通与交流能力;3. 学生在课程实践中,养成严谨、认真的学习态度,树立正确的工程观念。
课程性质:本课程为实践性较强的专业课,要求学生具备一定的数字电路基础和VHDL语言知识。
学生特点:学生处于高年级阶段,具有一定的专业基础知识和实践能力,但个体差异较大。
教学要求:结合学生特点,注重理论与实践相结合,充分调动学生的学习积极性,提高学生的实践操作能力。
在教学过程中,注重培养学生的团队协作精神和工程观念。
通过本课程的学习,使学生能够掌握VHDL分频器的设计方法,为后续相关课程的学习和实际工程应用打下坚实基础。
二、教学内容1. VHDL语言基础回顾:复习VHDL的基本语法、数据类型、信号与变量、行为描述与结构描述等基本概念,确保学生具备扎实的VHDL编程基础。
教材章节:第二章 VHDL语言基础内容列举:基本语法、数据类型、信号与变量、行为描述与结构描述2. 分频器原理及分类:介绍分频器的工作原理、分类及性能指标,使学生了解不同类型分频器的优缺点及适用场景。
教材章节:第五章 分频器设计与实现内容列举:分频器原理、分类、性能指标3. VHDL分频器设计方法:讲解基于VHDL语言的分频器设计方法,包括计数器法、移位寄存器法等,并分析各种方法的优缺点。
开题报告电子信息工程基于VHDL的分频器设计三、课题研究的方法及措施由于本课题所设计的分频器基于EDA技术,应用VHDL硬件语言设计完成的,因此选择合适的硬件解决原理对分频器性能至关重要的,为了满足不同系统功能需求的分频,本课题将阐述不同原理,不同分频器,同种分频不同原理的设计方案。
占空比可控的整数分设计方案,原理为计数器为带预置数的计数器,其设计的特殊之处在于:可以根据需要,调整数据的位宽,而且计数的初始值是从l开始的,此处计数初始值的设定是设计的一个创新,这样做的目的是为了配合后面比较器的工作,计数器的输出数据作为比较器的输入,比较器的另一输入作为控制端,控制高低电平的比例,从而达到占空比可调的目的。
原理图如图1所示。
图1 占空比可控的原理图部分小数分频的基本原理是采用脉冲吞吐计数器和锁相环技术先设计两个不同分频比的整数分频器,然后通过控制单位时间内两种分频比出现的不同次数来获得所需要的小数分频值。
如设计一个分频系数为lO.1的分频器时。
可以将分频器设计成9次10分频,1次11分频这样总的分频值为如式1所示。
F=(9×10+lxl 1)/(9+1)=10.1 (式1)从这种实现方法的特点可以看出,由于分频器的分频值不断改变.因此分频后得到的信号抖动较大。
当分频系数为N-0.5(N为整数)时,可控制扣除脉冲的时间,以使输出成为一个稳定的脉冲频率。
而不是一次N分频.一次N-1分频。
图2给出了通用小数分频器的电路组成。
图2通用小数分频器的电路组成改进的小数分频设计方案,将两个整数分频器由一个整数分频器和一个半整数分频器代替,结果在如上分析的两个性能方面都有所提高。
利用参数化的设计思想和VHDL描述语言与原理图输入方法相结合的方式,设计并实现了一种抖动性能好且通用性强的小数分频器。
其原理图如下图3。
图3改进小数分频原理图四、课题研究进度计划毕业设计期限:自2011年12月10日至2012年3月10日。
目录一、设计任务与要求 (3)二、总体框图 (3)三、选择器件 (4)四、功能 (5)1、数控分频器 (5)2、BCD译码器 (6)3、扫描器 (11)4、3-8译码器 (13)5、7段数码管显示译码器 (16)五、总体设计电路图 (19)1总体(顶层)电路原理图 (19)2仿真结果 (19)3管脚分配图 (20)4.硬件连接情况 (20)六.心得体会 (20)数控分频器设计一、设计任务与要求数控分频器的功能就是当输入端给定不同输入数据时,将对输入的时钟信号有不同的分频比,以实现所需的输出频率。
基本功能:1、实现8位分频器,依据输入的8位2进制数的不同,有不同的分频比。
如输入10010000,即对输入的时钟信号进行144分频,如输入01001000,即对输入的时钟信号进行72 分频。
2、输出的波形应为占空比位50%的方波。
3、有显示功能,显示当前的分频比,即,输入的二进制数的大小。
总体框图设计思路:数控分频器用计数值可并行预置的加法器设计完成,当在输入端给定不同输入数据时将对输入的时钟信号有不同的分频比。
把输入端输入的八位二进制数直接通过BCD译码器转换为十位BCD码表示的十进制数,通过扫描器对3个数码管进行选通扫描,最后7段数码管显示译码器对选中数码管的赋值进行译码,并驱动数码管显示该数据。
模块的功能:1、数控分频器:实现8位分频器,依据输入的8位2进制数的不同,有不同的分频比。
如输入10010000,即对输入的时钟信号进行144分频。
2、BCD译码器:把输入端的8位2进制数转换成10位BCD码表示的十进制数。
3、扫描器:when “000”=>daout<=dout(3 downto 0);when “001”=>daout<=dout(7 downto 4);when “010”=>daout<=dout(3 downto 2)<="00";daout(1 downto 0)<=dout(9 downto 8);when others=>null;4、3-8译码器:当sel=0时,q=11111110;选择个位数码管亮。
基于CPLD/FPGA的半整数分频器的设计摘要:简要介绍了CPLD/FPGA器件的特点和应用范围,并以分频比为2.5的半整数分频器的设计为例,介绍了在MAX+plus II开发软件下,利用VHDL硬件描述语言以及原理图的输入方式来设计数字逻辑电路的过程和方法。
关键词:VHDL CPLD/FPGA 数字逻辑电路设计半整数分频器1 引言CPLD(Complex programmable Logic Device,复杂可编程逻辑器件)和FPGA(Field programmable Gates Array,现场可编程门阵列)都是可编程逻辑器件,它们是在PAL、GAL等逻辑器件基础上发展起来的。
同以往的PAL、GAL相比,FPGA/CPLD的规模比较大,适合于时序、组合等逻辑电路的应用。
它可以替代几十甚至上百块通用IC芯片。
这种芯片具有可编程和实现方案容易改动等特点。
由于芯片内部硬件连接关系的描述可以存放在磁盘、ROM、PROM、或EPROM中,因而在可编程门阵列芯片及外围电路保持不动的情况下,换一块EPROM芯片,就能实现一种新的功能。
它具有设计开发周期短、设计制造成本低、开发工具先进、标准产品无需测试、质量稳定以及实时在检验等优点,因此,可广泛应用于产品的原理设计和产品生产之中。
几乎所有应用门阵列、PLD和中小规模通用数字集成电路的场合均可应用FPGA和CPLD器件。
在现代电子系统中,数字系统所占的比例越来越大。
系统发展的越势是数字化和集成化,而CPLD/FPGA作为可编程ASIC(专用集成电路)器件,它将在数字逻辑系统中发挥越来越重要的作用。
在数字逻辑电路设计中,分频器是一种基本电路。
通常用来对某个给定频率进行分频,以得到所需的频率。
整数分频器的实现非常简单,可采用标准的计数器,也可以采用可编程逻辑器件设计实现。
但在某些场合下,时钟源与所需的频率不成整数倍关系,此时可采用小数分频器进行分频。
比如:分频系数为2.5、3.5、7.5等半整数分频器。
基于VHDL的各种分频、计数与按键控制的实现本系统利用两种分频可实现多种计数,按键控制数码管闪烁系统框图分频LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;USE ieee.std_logic_unsigned.all;-- Entity DeclarationENTITY flash IS-- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!PORT(key_in : IN STD_LOGIC;flash_out : OUT STD_LOGIC);-- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!END flash;-- Architecture BodyARCHITECTURE flash_architecture OF flash ISsignal key_cnt: std_logic_vector(1 downto 0);BEGINprocess(key_in)beginif key_in 'event and key_in='0' thenif key_cnt="11" thenkey_cnt<="00";elsekey_cnt<=key_cnt+1;end if;end if;end process;flash_out<='0' when key_cnt(0)='0'else '1' when key_cnt(0)='1'else '1';END flash_architecture;LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;USE ieee.std_logic_unsigned.all;-- Entity DeclarationENTITY div_4m_1hz IS-- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!PORT(clk : IN STD_LOGIC;q : OUT STD_LOGIC);-- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE! END div_4m_1hz;-- Architecture BodyARCHITECTURE div_4m_1hz_architecture OF div_4m_1hz IS signal tmp:std_logic_vector(21 downto 0);BEGINprocess(clk)beginif clk'event and clk='1' thentmp<=tmp+1;end if;end process;q<=tmp(21);END div_4m_1hz_architecture;按键控制LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;USE ieee.std_logic_unsigned.all;-- Entity DeclarationENTITY flash IS-- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!PORT(key_in : IN STD_LOGIC;flash_out : OUT STD_LOGIC);-- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!END flash;-- Architecture BodyARCHITECTURE flash_architecture OF flash ISBEGINprocess(key_in)beginif key_in 'event and key_in='0' thenif key_cnt="11" thenkey_cnt<="00";elsekey_cnt<=key_cnt+1;end if;end if;end process;flash_out<='0' when key_cnt(0)='0'else '1' when key_cnt(0)='1'else '1';END flash_architecture;LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;USE ieee.std_logic_unsigned.all;-- Entity DeclarationENTITY flash IS-- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!PORT(key_in : IN STD_LOGIC;flash_out : OUT STD_LOGIC);-- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE! END flash;-- Architecture BodyARCHITECTURE flash_architecture OF flash ISBEGINprocess(key_in)beginif key_in 'event and key_in='0' thenif key_cnt="11" thenkey_cnt<="00";elsekey_cnt<=key_cnt+1;end if;end if;end process;flash_out<='0' when key_cnt(0)='0'else '1' when key_cnt(0)='1'else '1';END flash_architecture;计数LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;USE ieee.std_logic_unsigned.all;-- Entity DeclarationENTITY js10 IS-- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!PORT(js10in : IN STD_LOGIC;key_set:IN STD_LOGIC;js10out : OUT STD_LOGIC_vector(3 downto 0);jw : OUT STD_LOGIC);-- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE! END js10;-- Architecture BodyARCHITECTURE js10_architecture OF js10 ISsignal cnt:std_logic_vector(3 downto 0);BEGINprocess(js10in,key_set)beginif key_set='1' thencnt<=cnt;elsif rising_edge(js10in) thenif cnt= "1001" thencnt<= "0000";jw<='1';elsecnt<=cnt+1;jw<='0';end if;end if;end process;js10out<=cnt;END js10_architecture;LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;USE ieee.std_logic_unsigned.all;-- Entity DeclarationENTITY js6 IS-- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!PORT(js6in : IN STD_LOGIC;key_set:IN STD_LOGIC;js6out : OUT STD_LOGIC_vector(2 downto 0);jw : OUT STD_LOGIC);-- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!END js6;-- Architecture BodyARCHITECTURE js6_architecture OF js6 ISsignal cnt:std_logic_vector(2 downto 0);BEGINprocess(js6in,key_set)beginif key_set='0' thencnt<=cnt;elsif rising_edge(js6in) thenif cnt= "101" thencnt<= "000";jw<='1';elsecnt<=cnt+1;jw<='0';end if;end if;end process;js6out<=cnt;END js6_architecture;译码显示LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;USE ieee.std_logic_unsigned.all;-- Entity DeclarationENTITY ymq_38 IS-- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!PORToe : IN STD_LOGIC;clk:in std_logic;in4 : IN STD_LOGIC_vector(3 downto 0);out8 : OUT STD_LOGIC_vector(7 downto 0) );-- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!END ymq_38;-- Architecture BodyARCHITECTURE a OF ymq_38 ISsignal out8_r:STD_LOGIC_vector(7 downto 0);BEGINprocess(in4)begincase in4 iswhen "0000"=>out8_r<="11000000";when "0001"=>out8_r<="11001111";when "0010"=>out8_r<="10100100";when "0011"=>out8_r<="10110000";when "0100"=>out8_r<="10011001";when "0101"=>out8_r<="10010010";when "0110"=>out8_r<="10000010";when "0111"=>out8_r<="11111000";when "1000"=>out8_r<="10000000";when "1001"=>out8_r<="10010000";when others =>out8_r<="11111111";end case;end process;process(clk,oe)beginif oe='1' thenif clk='1' thenout8<=out8_r;elseout8<="11111111";end if;elseout8<=out8_r;end process;END a;LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;USE ieee.std_logic_unsigned.all;-- Entity DeclarationENTITY ymq38 IS-- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!PORT(ymq38in : IN STD_LOGIC_vector(2 downto 0);oe : IN STD_LOGIC;clk:in std_logic;ymq38out : OUT STD_LOGIC_vector(7 downto 0) );-- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE! END ymq38 ;-- Architecture BodyARCHITECTURE b OF ymq38 ISsignal ymq38out_r:STD_LOGIC_vector(7 downto 0);BEGINprocess(ymq38in)begincase ymq38in iswhen "000"=>ymq38out_r<="11000000";when "001"=>ymq38out_r<="11001111";when "010"=>ymq38out_r<="10100100";when "011"=>ymq38out_r<="10110000";when "100"=>ymq38out_r<="10011001";when "101"=>ymq38out_r<="10010010";when "110"=>ymq38out_r<="10000010";when others =>ymq38out_r<="11111111";end case;end process;process(clk,oe)beginif oe='1' thenif clk='1' thenymq38out<=ymq38out_r;elseymq38out<="11111111";end if;elseymq38out<=ymq38out_r; end if;end process;END b;。
实验六基于VHDL语言的分频器设计与实现报告一、实验目的1、进一步掌握VHDL语言的基本结构及设计的输入方法。
2、掌握VHDL基本逻辑电路的综合设计应用。
二、实验原理在数字电路系统中,分频电路应用得十分广泛。
例如,工程人员常常使用分频电路来得到数字通信中的帧头信号、选通信号以及中断信号等。
因此,分频电路在数字电路系统的设计中也应该作为重要的基本电路来掌握,从而给今后的一些设计带来方便。
三、实验内容1、设计并实现一个6分频的分频电路,要求其输出信号的占空比为50%。
请分析分频电路设计原理并编写VHDL语言程序,利用Max+PlusII开发软件对其进行编译和仿真。
6分频电路实现程序代码如下:2、在实际数字电路设计过程中,往往需要得到占空比不是1:1的分频时钟,方法是:首先描述一个计数器电路,然后根据计数器电路的并行输出信号来决定输出时钟的高低电平。
请设计、编写VHDL 语言程序实现分频后时钟信号的占空比为1:15的16分频电路,并利用Max+PlusII开发软件对其进行编译和仿真。
四、实验设计1.程序代码:图library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity clk_div6 isport(clk:in std_logic;clk_out:out std_logic);end clk_div6;architecture rtl of clk_div6 issignal clk_temp:std_logic;beginprocess(clk)variable counter:integer range 0 to 15;constant md:integer:=2;beginif clk'event and clk='1'thenif counter=md thencounter:=0;clk_temp<=not clk_temp;elsecounter:=counter+1;end if;end if;end process;clk_out<=clk_temp;end rtl;2.仿真结果:五、实验结果分析本实验利用VHDL语言设计分频电路,目的在于进一步掌握VHDL语言的基本结构及设计的输入方法,掌握VHDL基本逻辑电路的综合设计应用。
小数分频VHDL代码本文介绍基于前置N/N+1分频器的小数分频基本原理,以及基于此原理的一位小数分频器的源代码,受数据位宽的影响,本文给出的代码系数整数部分的范围为0-15,如需更大数值可自行修改代码。
一、原理介绍:假设分频系数为N.X,则N*(10-X)+(N+1)*X=10*N-N*X+N*X+X=10*N+X=N.X*10由上式可见只要满足输出十个脉冲的时间内输入脉冲为10*N+X就可实现N.X分频.可对输入时钟进行(10-X)次N分频和X次(N+1)分频实现,由于先进行(10-X)次分频后进行X次(N+1)分频会造成相位有很大变化,可采用N分频和(N+1)分频交替进行的方法来改善相伴变化.实现原理不再过多介绍,请参看sel部分源代码。
二、源代码1:NdotXfd,顶层文件library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity NdotXfd isport (clock : in std_logic;n : in std_logic_vector(3 downto 0);x : in std_logic_vector(3 downto 0);clock_out : out std_logic);end entity;architecture arch of NdotXfd iscomponent numberport(n : in std_logic_vector(3 downto 0);number0 : out std_logic_vector(3 downto 0);number1 : out std_logic_vector(3 downto 0));end component;component fdnport(clock_in : in std_logic;enable : in std_logic;n_of_fd : in std_logic_vector(3 downto 0);clock_out : out std_logic);end component;component selport(clock_in : in std_logic;Xnumber : in std_logic_vector(3 downto 0);sel_out : out std_logic);end component;component mux_21port(a : in std_logic;b : in std_logic;s : in std_logic;y : out std_logic);end component;signal selt : std_logic;signal selt_not : std_logic;signal clock_1 : std_logic;signal clock_2 : std_logic;signal clock_sel: std_logic;signal n_fd : std_logic_vector(3 downto 0);signal n1_fd : std_logic_vector(3 downto 0);beginnumber0 : number port map (n, n_fd, n1_fd);fdn0 : fdn port map (clock, selt_not, n_fd, clock_1);fdn1 : fdn port map (clock, selt, n1_fd, clock_2);mux_210 : mux_21 port map (clock_2, clock_1, selt, clock_sel); sel0 : sel port map (clock_sel, x, selt);selt_not <= not selt;clock_out <= clock_sel;end arch;2:fdn,任意整数分频器(分步系数2--15,可自行修改代码增加分频系数)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fdn isport(clock_in : in std_logic;enable : in std_logic;n_of_fd : in std_logic_vector(3 downto 0);clock_out : out std_logic);end entity;architecture bhv of fdn issignal clock : std_logic;signal q0 : std_logic;signal q1 : std_logic;signal number : std_logic_vector(2 downto 0);signal counter0 : std_logic_vector(3 downto 0);signal counter1 : std_logic_vector(3 downto 0);beginfdn: process(enable, clock_in, n_of_fd, clock, q0, q1)beginnumber(2 downto 0) <= n_of_fd(3 downto 1);if q1 = '0' thenclock <= not clock_in;elseclock <= clock_in;end if;if (enable='1') thenif (n_of_fd(0)='0')thencounter1 <= (others=>'0');q1 <= '0';if rising_edge(clock_in) thenif (number="001") thenq0 <= not q0;elseif counter0 = number-1 thencounter0 <= (others=>'0');q0 <= not q0;elsecounter0 <= counter0 + 1;end if;end if;end if;elsecounter0 <= (others=>'0');q0 <= '0';if rising_edge(clock) thenif counter1 = number thencounter1 <= (others=>'0');q1 <= not q1;elsecounter1 <= counter1 + 1;end if;end if;end if;elseq0 <= '0';q1 <= '0';counter0 <= (others=>'0');counter1 <= (others=>'0');end if;end process fdn;output: process (enable, n_of_fd(0), q0, q1) beginif (enable='1') thenif (n_of_fd(0)='0')thenclock_out <= q0;elseclock_out <= q1;end if;elseclock_out <= '0';end if;end process output;end bhv;3:sel,分频器选择信号判断产生器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity sel isport(clock_in : in std_logic;Xnumber : in std_logic_vector(3 downto 0); sel_out : out std_logic);end entity;architecture bhv of sel issignal XsubTen : std_logic_vector(3 downto 0); signal q : std_logic_vector(4 downto 0);beginXsubTen <= 10 - Xnumber;sel: process(clock_in, q)beginif (clock_in'event and clock_in = '0') then if q + XsubTen >= 10 thenq <= q + XsubTen - 10;elseq <= q + XsubTen;end if;end if;if q >= Xnumber thensel_out <= '0';elsesel_out <= '1';end if;end process sel;end bhv;4:mux2_1,2选1数据选择器library ieee;use ieee.std_logic_1164.all;entity mux_21 isport(a : in std_logic;b : in std_logic;s : in std_logic;y : out std_logic);end entity;architecture bhv of mux_21 isbeginwith s selecty <= a when '1' ,b when others;end bhv;5:number,分频器系数处理器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity number isport( n : in std_logic_vector(3 downto 0); number0 : out std_logic_vector(3 downto 0); number1 : out std_logic_vector(3 downto 0) );end entity;architecture bhv of number isbeginnumber0 <= n;number1 <= n+1;end bhv;。
技术创新《微计算机信息》(嵌入式与SOC)2010年第26卷第10-2期360元/年邮局订阅号:82-946《现场总线技术应用200例》电子设计基于VHDL 的小数分频器设计The design of decimal fraction frequency divider based on the language named VHDL(淮阴工学院)李慧LI Hui摘要:本文主要介绍了一种基于VHDL 语言的双模前置小数分频器的设计,为了测试的需要同时设计了8位数字频率计,在MAX-PLUS Ⅱ平台下实现分频器的仿真,并下载到EPF10K10LC84-3芯片中实现。
关键词:双模;小数分频器;频率计中图分类号:TP386文献标识码:AAbstract:The design of double module decimal fraction frequency divider based on the language named VHDL is mainly presented in this text.8bit digital cymometer is designed for testing at the same time.Simulate is finished on MAX-PLUS Ⅱ,and download is finished in CMOS CHIP named EPF10K10LC84-3.Key words:double module;decimal fraction frequency divider;cymometer文章编号:1008-0570(2010)10-2-0192-021引言分频器是数字电路中最基础也是最常用的电路,整数分频器的实现比较简单,可采用标准的计数器或可编程逻辑器件设计实现。
但在某些特定场合下,时钟源与所需的频率往往不成整数倍关系,此时就需要采用小数分频器对输入的信号进行分频。
而同时本系统可以在不降低参考频率的前提下,提高系统输出频率的分辨率。
2双模前置小数分频原理用来实现小数分频器的方法很多,但其基本原理都基本一样,即在若干个分频周期中采取某种方法使某几个周期多计或少计一个数,从而在整个计数周期的总体平均意义上获得一个小数分频比,设要进行分频比为K 的小数分频,K 可表示为:K=N+10-n×X 式中:n,N,X 均为正整数;n 为到X 的位数,即K 有n 位小数。
另一方面,分频比又可以写成:K=M/P式中:M 为分频器输入脉冲数;P 为输出脉冲数。
令,则:以上是小数分频器的一种实现方法,即在进行10n 次N 分频时,设法多输入X 个脉冲。
3系统模块设计部分本系统主要包括两大部分:一部分是可预置分频系数的小数分频模块设计,另一部分是8位数字频率计的设计(主要是为了验证设计的结果而辅助设计的一个模块)。
具体模块框图如下:图1系统模块图4VHDL 程序实现4.1小数分频模块设计1)、原理分析以实现7.3分频为例,要实现7.3分频,只要在10次分频中做7(即10-3)次除7,3次除8就可以得到:N=(7×7+3×8)/10=7.3,又如,要实现分频系数为7.32的小数分频,只要在每100次分频中做68(100-32)次除7,32次除8即可得到N=(68×7+32×8)/10=7.32。
由上可知,要实现分频比为N.F 的小数分频,只需要对输入信号做N/N+1分频,考虑到该小数分频器要进行多次N 分频和N+1分频,那么就设法将两种分频混合均匀,这种“均匀”工作是通过计数器来完成的,在这里只讨论一位小数的情况,下面简要介绍这种混合的方法:每进行一次分频,计数值为10减去分频系数的小数部分,各次计数值累加。
若累加结果小于10,则进行N+1分频,若大于10或等于10,则进行N 分频。
2)、VHDL 语言实现(以1位小数为例)小数分频器主要由N/N+1分频器、计数器以及控制逻辑几大部分组成。
界面说明部分定义如下:ENTITY sheji_02ISport(clk:in std_logic;--输入信号num_zg,num_zd:in std_logic_vector (3downto 0);--分频系数高低位输入,最大输入为15.9err:out std_logic;fout:buffer std_logic);--输出信号end;分频系数为num_sheding 的分频器设计:process(clk)isbeginif clk'event and clk='1'then if num="0000"then李慧:讲师硕士(10)ÁM K P N X P−=×=+××10ÁP =10ÁM N X=×+192--邮局订阅号:82-946360元/年技术创新电子设计《PLC 技术应用200例》您的论文得到两院院士关注num<=num_sheding-1;num_out<='1';elsenum<=num-1;num_out<='0';end if;end if;end process;计数器部分设计如下:process(num_out)is beginif num_out'event and num_out='1'thenif tmp >=tmp_z then tmp <=tmp -tmp_z;num_sheding <=num_zg;--tmp_z 为小数部分数据else tmp<=tmp+10-tmp_z;num_sheding<=num_zg+1;end if;end if;end process;fout<=num_out;end;3)、波形仿真经过系统平台的编译仿真之后,得到如下的波形图:图2系统波形仿真图从以上波形我们可以看出:7.3分频的分频器在第一个时钟时进行8分频,第二、三个时钟时进行7分频。
4.2测频模块设计本设计模块主要由3个子模块组成:测频信号发生器TESTCTL,8个具有时钟使能的十进制加法计数器CNT10,和一个32位锁存器REG32B 。
这一部分在很多资料上都有记载,在此不再多述。
4.3显示模块设计本模块主要实现8位数字频率值的动态显示,显示锁存器中的数据,主要包括数码管动态扫描、七段数码管译码两大部分。
具体实现如下:process(ck)is --动态扫描进程,其中ck 为数码管扫描时钟beginif ck'event and ck='1'then cnt8<=cnt8+1;end if;case cnt8iswhen "000"=>sel<="10000000";show_data<=data(3downto 0);…when "111"=>sel<="00000001";show_data<=data (31downto 28);when others=>null;end case;end process;process(show_data)is –-译码进程begincase show_data iswhen "0000"=>sm<="1111110";…end case;end process;5实验结果在EDA 实验箱我们对以上设计进行了测试,达到了预期的效果,以7.3分频为例:首先利用测频模块测试输入频率,频率值为16384HZ,然后经过7.3分频,然后分频之后得到的信号再次进行测频,测得的频率值为2244HZ,分频系数为7.3012,达到了要求,误差小,系统分频的精度高。
6结论从测试结果来看,小数分频的功能基本上能够实现,分频的精度高,具有一定的实用性。
本文的创新点:选用FPGA 实现小数分频器,外围电路简单,系统集成化程度高,设计灵活,精度也明显高于普通的小树分频器。
参考文献[1]苏玉娜,程明等.基于FPGA 的单片机外围接口电路设计[J].微计算机信息.2009,5-2:p173-174[2]古天祥.电子测量原理.北京:机械工业出版社,2004[3]潘松,黄继业.EDA 技术实用教程.北京:科学出版社,2002[4]谭会生,张昌凡.EDA 技术及应用.西安:西安电子科技大学出版社,2001作者简介:李慧,(1980-)男(汉族),江苏淮安人,硕士,讲师,主要研究方向为测控技术与仪器。
Biography:LI Hui,(1980-),Male (HAN),Huaian city in Jiangsu Province ,Master ,Lecturer ,Researched Area:Technique and Instrumentation of Measurements.(223003淮阴工学院)李慧通讯地址:(223003江苏淮安市枚乘路1号淮阴工学院电子与电气工程学院)李慧(收稿日期:2009.10.13)(修稿日期:2010.01.05)(上接第152页)[4]张素智,史培中等.基于RFID 的车辆出入安全管理系统设计[J].微计算机信息.2009,5-2:204-206[5]e-Plate Brochure[EB/OL]..[6]谭思亮,邹超群.Visual C++串口通信工程开发与实例导航[M].北京:人民邮电出版社,2003.[7]Serial COM Simply in C#[EB/OL]./tutorial/tutorial_details.aspx?tutorial_id.作者简介:赵文婧(1984-),女,江苏人,徐州工程学院助教,硕士,主要研究方向:射频识别技术;王刚(1967-),男,新疆人,江苏大学特聘教授,博士,主要研究方向:射频识别技术、无线通信、高分辨率检测与成像技术以及超宽带电磁脉冲技术等。
Biography:ZHAO Wen-Jing (1984-),female,Jiangsu Province,assistant of Xuzhou Institute of Technology,Master,Research area:RFID technology.(221000徐州徐州工程学院信电工程学院)赵文婧(212013镇江江苏大学计算机科学与通信工程学院)王刚通讯地址:(221000江苏省徐州市新城区徐州工程学院中心校区信电工程学院电子信息教研室教1楼308室)赵文婧(收稿日期:2010.01.06)(修稿日期:2010.04.25)193--。