当前位置:文档之家› VHDL非整数分频器设计实验报告

VHDL非整数分频器设计实验报告

非整数分频器设计一、 输入文件输入时钟CLK: IN STD_LOGIC二、 设计思路1. 方法一:分频比交错(1) 确定K 值先根据学号S N 确定M 和N :为了保证同学们的学号都不相同,取学号的后四位,即N S =1763()mod 1920(mod 17)017mod 17S SSN N ifN then M else M N =+===由以上公式,得N=(1763 mod 19)+20=35 M=(1763 mod 17)=12 然后根据下式计算分频比K 的值:8()9N M MK N-+===8.34285714(2) 确定交错规律使在35分频的一个循环内,进行12次9分频和23次8分频,这样,输出F_OUT 平均为F_IN 的8.34285714分频。

为使分频输出信号的占空比尽可能均匀,8分频和9分频应‘交替’进(3) 设计框图:要求同步时序设计(4)代码在实体内定义两个进程(PROCESS P1和PROCESS P2),一个进程控制输出8/9分频,一个进程控制35分频周期比例输出。

控制器输出FS_CTL信号控制输出是8分频还是9分频,分频器输出C_ENB信号来控制35分频计数器计数。

LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY DIV IS--定义实体,实体名DIVPORT(F_IN: IN STD_LOGIC;--输入时钟信号F_OUT: OUT STD_LOGIC--输出时钟信号);END DIV;ARCHITECTURE A OF DIV ISSIGNAL CN1: INTEGER RANGE 0 TO 7;--8分频计数器SIGNAL CN2: INTEGER RANGE 0 TO 8;--9分频计数器SIGNAL CN: INTEGER RANGE 0 TO 34;--整体计数器SIGNAL C_ENB: STD_LOGIC;--整体计数器时钟驱动信号SIGNAL FS_CTL: STD_LOGIC;--控制8、9分频比例信号,高电平8分频,低电平9分频BEGINP1:PROCESS(F_IN)--8、9分频计数进程BEGINIF (F_IN'EVENT AND F_IN='1') THENIF(FS_CTL='0') THEN--9分频IF CN2=8 THEN--计数CN2<=0;ELSECN2<=CN2+1;END IF;IF CN2>4 THEN--控制输出,占空比0.5F_OUT<='1';ELSEF_OUT<='0';END IF;IF CN2=8 THEN--控制整体计数器驱动信号C_ENB<='1';ELSEC_ENB<='0';END IF;ELSEIF CN1=7 THEN--8分频计数,同上CN1<=0;ELSECN1<=CN1+1;END IF;IF CN1>3 THENF_OUT<='1';ELSEF_OUT<='0';END IF;IF CN1=7 THENC_ENB<='1';ELSEC_ENB<='0';END IF;END IF;END IF;END PROCESS P1;P2:PROCESS(C_ENB)--整体计数进程BEGINIF (C_ENB'EVENT AND C_ENB='1') THEN--由驱动信号驱动IF CN=34 THEN--计数CN<=0;ELSECN<=CN+1;END IF;IF (CN=34 OR CN=2 OR CN=5 OR CN=8 OR CN=11 OR CN=14 OR CN=17 OR CN=20 OR CN=23 OR CN=26 OR CN=29 OR CN=32) THEN FS_CTL<='0';ELSEFS_CTL<='1';END IF;--8、9分频比例分配ELSE CN<=CN;END IF;END PROCESS P2;END A;2. 方法二:累加器分频(1) 设计思路假设累加器位数为8,则累加器的模值N M 为28=256。

若STEP =27,则分频比为:2569.8414814827M N K STEP ===类似地,通过改变模值N M 和步长STEP 就可以以任意精度逼近要求地分频比。

确定累加器位数M 和STEP ,K=8.34285714,得M=30,230=1073741824,STEP=128701931,此时分频比为8.342857140193180162930……,分频比精度高于10-8 (2) 原理图F-OUT(3) 代码LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_SIGNED.ALL;ENTITY DIV2 IS--定义实体,实体名DIV2PORT(F_IN: IN STD_LOGIC;--输入时钟 F_OUT: OUT STD_LOGIC--输出时钟); END DIV2;ARCHITECTURE A OF DIV2 ISSIGNAL CNT: STD_LOGIC_VECTOR(29 DOWNTO 0):="000000000000000000000000000000";--30位CONSTANT STEP : INTEGER := 128701931; BEGINP1: PROCESS(F_IN) BEGINIF F_IN'EVENT AND F_IN='1' THEN CNT<=CNT+STEP;--步长相加 END IF;END PROCESS P1;F_OUT<=CNT(29);--溢出位输出 END A;3.方法一和方法二合并LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DIV3 IS--定义实体,实体名DIV3PORT(CLK: IN STD_LOGIC;--输入时钟OUT1,OUT2: OUT STD_LOGIC--两个输出时钟比较输出); END DIV3;ARCHITECTURE A OF DIV3 ISCOMPONENT DIV--方法一模块PORT(F_IN: IN STD_LOGIC;F_OUT: OUT STD_LOGIC);END COMPONENT;COMPONENT DIV2--方法二模块PORT(F_IN: IN STD_LOGIC;F_OUT: OUT STD_LOGIC);END COMPONENT;BEGINU1: DIV PORT MAP(CLK,OUT1);U2: DIV2 PORT MAP(CLK,OUT2);END A;三、仿真结果1.方法一:分频比交错(1)波形图a.一个周期b.两个周期c.放大观察分频2.方法二:累加器分频(1)波形图3.方法一和方法二合并两种方法波形比较:第一种方法产生的分频器为8分频和9分频按照一定得比例交错得到,所以在一个周期内分频比平均为8.34285714,而第二种方法是利用累加器分频,所以分频比也是呈现交替变化,但是两种方法的周期不同,所得到的分频也有一定的时序差异。

如果截取的部分小于一个周期,第一种交错方法的带哦的分频比将不等于8.34285714,存在误差。

而第二种方法在截取部分短时精确度高于第一个周期,因为分频比较为平均。

结论:第一种方法在截取部分短时没有第二种方法精确,而第二种方法分频比较为平均。

四、 实验心得在数字电路与逻辑设计实验课中,我们学习了用VHDL 语言编写了整数分频器的方法。

而在本次实验中,使用了两种方法得到分频比为小数的分频器。

两种方法都不是很困难,但是在实验的过程中,第一种方法要去同步时序设计方法,所以在编写VHDL 代码的过程中总是出现信号时序的问题,比如不能重复复制,来源过多,逻辑过于复杂等等。

不过最后都一一解决。

所以本次实验不仅仅是巩固知识的过程,也是自我提高的过程。

原来以为在设计了交通灯程序后自己对VHDL 语言的掌握已经不错,看来还有很大的程度要提高。

五、 思考题1. 在你的实验中,分频比交错的规律是怎样的?在35分频的一个循环内,进行12次9分频和23次8分频,这样,输出F_OUT 平均为F_IN 的8.34285714分频。

为使分频输出信号的占空比尽可2. 你的STEP 值是怎么确定的?为什么这样确定?假设累加器位数为8,则累加器的模值NM 为28=256。

若STEP =27,则分频比为:2569.8414814827M N K STEP ===类似地,通过改变模值N M (2的M 次幂)和步长STEP 就可以以任意精度逼近要求地分频比。

确定累加器位数M 和STEP , K=8.34285714,得M=30,STEP=128701931,精度高于10-8。

相关主题