10001927杨润达 课程设计报告
- 格式:doc
- 大小:290.71 KB
- 文档页数:13
通达学院2012/2013学年第二学期软件设计实验报告模块名称8位格雷码编码器、高速分频器专业通信工程学生班级100019学生学号********学生姓名杨润达指导教师王奇、孔凡坤、周小燕、梅中辉8位格雷码编码器及高速分频器设计实验目的:1.全面了解如何应用该硬件描述语言进行高速集成电路设计2.通过软件使用、设计与仿真环节使学生熟悉EDA-VHDL开发环境3.通过对基本题、综合题的设计实践,使学生掌握硬件系统设计方法(自底向上或自顶向下),熟悉VHDL语言三种设计风格,并且培养应用VHDL语言解决实际问题的能力。
实验设备:PC机实验课题:一、8位格雷码编码器1、主要功能设计一个8位(bit)二进制码输入,输出8位格雷码的编码器(输入:B7 ---B0并行8位,输出G7---G0并行8位,提示:当i<7时:G(i)=B(i+1)xorB(i),G(7)=B(7)。
2、设计原理根据组合逻辑电路的分析方法,先列出其真值表再通过卡诺图化简,可以很快的找出格雷码与二进制码之间的逻辑关系。
其转换规律为:高位同,从高到低看异同,异出‘1’,同出‘0’。
也就是将二进制码转换成格雷码时,高位是完全相同的,下一位格雷码是‘1’还是‘0’,完全是相邻两位二进制码的“异”还是“同”来决定。
下面举一个简单的例子加以说明。
假如要把二进制码10110110转换成格雷码,则可以通过下面的方法来完成,方法如图1-1。
图1-13、功能仿真说明:B7~B0为输入信号,二进制码为:10110110 G7~G0为输出信号,格雷码为:111011014、实验代码:见附录一二、高速分频器设计1、主要功能设计一个分频器,对10Mhz的时钟源进行分频,以得到4Hz,3Hz,2Hz,1Hz 的时钟。
2、设计原理○1整体思路因为10Mhz时钟源速度很快,直接分频成1Hz级别的时钟的话分频系数太大,虽然思路简单,但是在实现时会造成quartus的寄存器资源消耗殆尽,导致编译失败。
所以我先通过10分频和100000分频将10Mhz时钟源分频为10Hz的时钟源,然后对10Hz的时钟源分别进行2.5分频,3.3分频,5分频,10分频。
从而得到4Hz,3Hz,2Hz,1Hz的时钟源。
原理框图如图2-1所示。
图2-1○22.5分频模块原理设计一个模3的计数器,再设计一个扣除脉冲电路,加在模3计数器输出之后,每来两个脉冲就扣除一个脉冲(实际上是使被扣除的脉冲变成很窄的脉冲,可由异或门实现),就可以得到分频系数为2.5的小数分频器。
设需要设计一个分频系数为N-0.5的分频器,其电路可由一个模N计数器、一个二分频器和一个异或门组成,如图2-2所示。
在实现时,模N计数器可设计成带预置的计数器,这样就可以实现任意分频系数为N-0.5的分频器。
电路原理图如图2-2所示。
图2-2○33.3分频模块设计[3]设置一个计数器,令其初始值为0;在时钟源clk的每一个上升沿,计数器加上Q,若计数器里面的值小于P,则发出删除一个脉冲的信号,将delete置为低电平;若其值大于P,则将计数器的值减去P,并且将delete置为高电平,不发出删除脉冲的信号。
本实验中要将一个10Hz的时钟源分频为3Hz的时钟信号,则Q=3,P=10。
电路原理图如图2-3所示。
图 2-3○45分频模块设计定义两个计数器,分别对输入时钟的上升沿和下降沿进行计数,然后把这两个计数值输入一个组合逻辑,用其控制输出时钟的电平。
这是因为计数值为奇数,占空比为50%,前半个和后半个周期所包含的不是整数个clkin的周期。
5分频,前半个周期包含2.5个clkin周期,后半个周期包含2.5个clkin周期。
○510分频模块设计定义一个计数器对输入时钟进行计数,在计数的前一半时间里,输出高电平,在计数的后一半时间里,输出低电平,这样输出的信号就是占空比为50%的偶数分频信号。
10分频,计数值为0~4输出高电平,计数值为5~9输出低电平。
3、功能仿真由于题目所给的10Mhz时钟信号频率过大,如果直接对它进行分频的话将难以看到完整的结果,但如果将仿真时间调长,则仿真速度过慢,所以在仿真中,我将第一次分频的分频系数调低,然后选择适当的输入时钟频率,以验证2.5分频,3.3分频,5分频,10分频的正确性。
仿真结果如图2-4所示。
图2-44、实验代码见附录二设计总结本实验主要是运用VHDL语言实现格雷码编码器和高速分频器的设计,相对于其他的来说,本实验比较简单,但在实际做的时候还是遇到不少的问题。
①在编译时出现了许多错误,经过反复修改编译,再修改再编译最终排除了所有的错误。
②在仿真时一开始看不到完整的结果,通过调节分频系数以及输入时钟频率的等手段仿真成功,验证了2.5分频,3.3分频,5分频,10分频的正确性。
收获和体会在老师布置好题目后,我仔细进行设计,通过查阅各参考书,最终把实验做出来了,达到了老师对本实验的要求。
在这次设计中我收获颇丰,首先最直接的收获就是我巩固了这节课所学的知识,把它运用到实践中去,并且学到了许多在课本中所没有的知识,通过查阅相关知识,进一步加深对EDA的了解。
其次,我们不管做什么都不能粗心,如我们在输入程序是,把字母打错了时,保存文件时命名与程序中的名称不一样时,都会导致编译错误,在此过程中虽然浪费了不少时间,但这也让我注意到在实际做设计时应该注意的问题,意识到自己的不足,对学过的知识了解不够深刻,掌握的不足够。
总的来说,这次设计还算成功,也让我明白了要把理论知识与实践结合起来,从实践中强化自己的理论,才能更好提高自己的实际动手能力和独立思考能力。
如果在设计过程中遇到问题时,我们要有耐心并细心的查找错误,这也是学习的过程。
格雷码编码器源代码library ieee;use ieee.std_logic_1164.all;entity green isport(B:in std_logic_vector(7 downto 0);G:out std_logic_vector(7 downto 0)); end green;architecture code of green isbeginG(7) <= B(7);G(6) <= B(7) XOR B(6);G(5) <= B(6) XOR B(5);G(4) <= B(5) XOR B(4);G(3) <= B(4) XOR B(3);G(2) <= B(3) XOR B(2);G(1) <= B(2) XOR B(1);G(0) <= B(1) XOR B(0);end code;高速分频器源代码library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_signed.all;use ieee.std_logic_unsigned.all;entity div2 isgeneric(N10: integer:=10;N105: integer:=100000;N3: integer:=3;N5: integer:=5;N2: integer:=3;N10: integer:=10);port(cp_10mhz:in std_logic;delete: buffer std_logic;cp_10hz:out std_logic;cp_4hz:buffer std_logic;cp_3hz:out std_logic;cp_2hz:out std_logic;cp_1hz:out std_logic--tempout:inout std_logic);end div2;architecture clk of div2 issignal cp1mhz:std_logic;signal cnt_1mhz: integer range 0 to N10-1;signal cp10hz:std_logic;signal cnt_10hz: integer range 0 to N105-1; signal cnt_1hz: integer range 0 to N10-1;signal cnt_2hz1, cnt_2hz2: integer range 0 to N5-1; signal cnt_3hz: integer :=0;SIGNAL clk_4hz, dix: STD_LOGIC;SIGNAL cnt_4hz: integer range 0 to N5-1; constant P :integer:=10;constant Q :integer:=3;--SIGNAL delete: std_logic;beginclk_4hz <= cp10hz XOR dix;--clk<=cp10hz xor div2;------------------------------------------------------------------------------------process(cp_10mhz) --计数----1Mhzbeginif(cp_10mhz'event and cp_10mhz='1') thenif(cnt_1mhz<N10-1) thencnt_1mhz <= cnt_1mhz+1;elsecnt_1mhz <= 0;end if;end if;end process;process(cnt_1mhz) --根据计数值,控制输出时钟脉冲的高、低电平beginif(cnt_1mhz<N10/2) thencp1mhz <= '1';elsecp1mhz <= '0';end if;end process;------------------------------------------------------------------------------------------------------------------process(cp1mhz) --计数--------------10Hz--------------beginif(cp1mhz'event and cp1mhz='1') thenif(cnt_10hz<N105-1) thencnt_10hz <= cnt_10hz+1;elsecnt_10hz <= 0;end if;end if;end process;process(cnt_10hz) --根据计数值,控制输出时钟脉冲的高、低电平beginif(cnt_10hz<N105/2) thencp10hz <= '1';cp_10hz <= '1';elsecp10hz <= '0';cp_10hz <= '0';end process;----------------------------------------------------------------------------------------------------------------process(cp10hz) --计数--------------1Hz--------------beginif(cp10hz'event and cp10hz='1') thenif(cnt_1hz<N10-1) thencnt_1hz <= cnt_1hz+1;elsecnt_1hz <= 0;end if;end if;end process;process(cnt_1hz) --根据计数值,控制输出时钟脉冲的高、低电平beginif(cnt_1hz<N10/2) thencp_1hz <= '1';elsecp_1hz <= '0';end if;end process;--------------------------------------------------------------------------------------------------------------process(cp10hz)-----------------2Hz---------------------beginif(cp10hz'event and cp10hz='1') then --shangshengyanjishu if(cnt_2hz1<N5-1) thencnt_2hz1 <= cnt_2hz1+1;elsecnt_2hz1 <= 0;end if;end if;end process;process(cp10hz)beginif(cp10hz'event and cp10hz='0') then --xiajiangyanjishuif(cnt_2hz2<N5-1) thencnt_2hz2 <= cnt_2hz2+1;elsecnt_2hz2 <= 0;end if;end if;cp_2hz <= '1' when cnt_2hz1<(N5-1)/2 or cnt_2hz2<(N5-1)/2 else '0'; ------------------------------------------------------------------------------------------------------------process(clk_4hz)---------------------------4Hz-------beginif(clk_4hz'event and clk_4hz='1') thenif(cnt_4hz=0) thencnt_4hz <= N2-1; --置整数分频值Ncp_4hz <= '1';elsecnt_4hz <= cnt_4hz-1; --模N计数器减法计数cp_4hz <= '0';end if;end if;end process;process(cp_4hz)beginif(cp_4hz'event and cp_4hz='1') thendix <= not dix; --输出时钟二分频end if;end process;--------------------------------------------------------------------------------------------------------------process(cp10hz)------------------3hz------------------beginif(cp10hz'event and cp10hz='1') thencnt_3hz<=cnt_3hz+Q;if(cnt_3hz<P) thendelete<='0';elsecnt_3hz<=cnt_3hz-P;delete<='1';end if;end if;end process;process(cp10hz,delete)begincp_3hz<=cp10hz and delete;end process;end clk;设计成绩评定。