湖北职业技术学院《EDA技术》课程设计报告题目动态输出4位十进制频率计的设计所在学院电子信息工程学院专业班级电信08304学生姓名马强学号08024839指导教师王芳完成日期2010年11月18 日目录一、概述 (3)二、设计正文 (4)(一)设计目的 (4)(二)设计实现 (4)1、端口说明 (4)2、Cnt10模块说明 (5)3、Tctl模块说明 (6)4、锁存器reg16模块说明 (8)5、Scan_led模块说明 (9)6、顶层文件仿真 (10)7、硬件下载 (11)三、总结 (13)四、感言 (14)五、参考文献 (15)概述此次设计的主要目的是学习掌握频率计的设计方法;掌握动态扫描输出电路的实现方法;学习较复杂的数字系统设计方法。
通过单位时间(1秒)内频率的计数来实现频率计的设计。
此设计主要用四位十进制计数器,所以频率计数范围为100~9999Hz。
然后锁存防止闪烁显示,最后由译码扫描显示电路输出到数码管进行显示输出。
并且下载后会有一秒钟的延时后才会显示输出所计频率输出。
设计下载后能够进行仿真频率的计数和静态显示,但是分频的设计程序有所缺陷导致长时间显示后会有1Hz的抖动。
通过这次的设计能够更清楚的理解VHDL程序的描述语言,进行简单程序的编写和仿真。
动态输出4位十进制频率计的设计一、目的1.学习掌握频率计的设计方法。
2.掌握动态扫描输出电路的实现方法。
3.学习较复杂的数字系统设计方法二、设计实现4位十进制频率计外部接口如图1所示,顶层文件如图2所示,包含4中模块;Tctl、reg16、scan_led和4个cnt10。
(1)端口说明F1Hz:给Tctl模块提供1Hz的频率输入。
Fin:被测频率输入。
scan_led:给scan_led模块提供扫描输入频率输入。
bt[1..0]:片选信号输出。
sg[6..0]:译码信号输出。
cout:进位输出。
图一四位十进制频率计的外部接口图二四位十进制频率计顶层文件(2)cnt10模块说明cnt10为含异步清零和同步时钟使能的十进制计数器,采用级联的方法进行计数,计数范围与所用cnt10级联个数有关,本次设计采用的是四个cnt10的级联,所以测频范围为0~9999Hz。
计数模块cnt10的源代码如下所示:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY cnt10 ISPORT(rst,en,clk:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);cout:OUT STD_LOGIC);END cnt10;ARCHITECTURE BEHAV OF cnt10 ISSIGNAL cnt:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(rst,en,clk)BEGINIF rst='1'THEN cnt<="0000";ELSIF(clk'EVENT AND clk='1')AND en='1'THENIF cnt="1001"THENcnt<="0000";cout<='1';ELSEcnt<=cnt+1;cout<='0';END IF;END IF;END PROCESS;Q<=cnt;END BEHAV;(3)Tctl模块说明根据频率的定义和测量的基本原理,测定信号的频率必须有一个脉宽为1秒的对输入信号脉冲计数允许的信号;1秒计数结束后,计数值锁入锁存器的锁存信号和为下一测频计数周期做准备的计数器清0信号。
这三个信号可以由一个测频控制信号发生器Tctl产生,其设计要求是Tctl的计数使能信号en能产生一个1秒脉宽的周期信号,并对频率计的每一计数器cnt10的en使能进行同步控制、当en 高电平时,允许计数;低电平时停止计数,并保持其所计的脉冲数。
在停止计数期间,首先需要一个锁存信号load的上升沿将计数器前1秒钟的计数值锁存进各锁存器reg16中,并由外部的译码器译出并显示计数值。
锁存信号之后,必须有一清零信号rst对计数器进行清零,为下1秒钟的技术操作做准备。
控制模块Tctl源代码如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY Tctl ISPORT ( clkk: IN STD_LOGIC;en,rst,load: OUT STD_LOGIC);END;ARCHITECTURE behav OF Tctl ISSIGNAL div2clk: STD_LOGIC;BEGINPROCESS(clkk)BEGINIF clkk'EVENT AND clkk='1'THEN div2clk <= NOT div2clk;END IF;END PROCESS;PROCESS (clkk, div2clk)BEGINIF clkk='0' AND div2clk='0' THENrst<='1';ELSE rst<= '0';END IF;END PROCESS;load<= NOT div2clk;en<=div2clk;END behav;Tctl工作时序波形图如图三所示:图三频率计测频控制器Tctl侧可控时序图图中clkk的频率为1Hz,en的高电平持续时间为1秒,此时计数器开始工作,当en低电平的时候停止计数,并将计数值经过load 锁存的reg16中最后通过scan_led译码显示输入。
en的计时长度为1秒,即en的周期为2秒。
计数器在en高电平计数完成即en从高电平跳跃到低电平时将计数结果锁存的reg16中。
rst在满足clkk和en均为低电平的时候对已锁存入锁存器的计数信号进行清零工作,为下一个技术周期做准备。
(4)锁存器reg16模块说明设置锁存器的目的是使显示的数据稳定,不会不会由于周期性的清零信号而不断闪烁。
每次显示数据位上一计数周期锁存的计数值。
16锁存器源代码如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY reg16 ISPORT ( load: IN STD_LOGIC;din: IN STD_LOGIC_VECTOR(15 DOWNTO 0);Dout: OUT STD_LOGIC_VECTOR(15 DOWNTO 0));END ;ARCHITECTURE behav OF reg16 ISBEGINPROCESS(load,din)BEGINIF load'EVENT AND load='1' THENDout<=DIN;END IF;END PROCESS;END behav;(5)scan_led模块说明动态显示是把所有的LED管的输入信号连在一起,这种连接方式有两个优点:一,节约器件的I/O端口;二,降低功耗。
每次向LED 写数据时,通过片选信号选通其中一个LED管并把数据写入,因此每一个时刻只有一个LED是亮的。
为了能持续看到LED上面的显示类容,必须对LED管进行扫描,即一次循环点亮各个LED管。
利用人眼的视觉暂留,加上发光器件的余辉效应,在一定的扫描频率下,人眼就会看到多个LED一起点亮。
扫描的大小必须合适才能达到很好的效果。
如果扫描频率太低,就会产生闪烁;而扫描频率太高会造成LED的频繁开启和关断,增加LED的功耗。
通常扫描频率选择50Hz比较合适。
本次设计为四位LED动态扫描输出,clk为扫描扫描时钟,考虑到cnt8的分频作用,此次设计采用的频率为200Hz;sg[6..0]为当前正在显示的LED地址的已译码数据;bt[1..0]为输出的片选信号,决定某LED在某时刻显示数据;Din[15..0]为4位一组的BCD码,共四位供显示输出的数据输入。
Scan_led的内部以下三个进程:计数模块扫描时钟发生器、多路选通器模块和译码模块。
4位LED动态扫描输出scan_led源代码如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY scan_led ISPORT (clk: IN STD_LOGIC;Din: in STD_LOGIC_VECTOR(15 DOWNTO 0);sg: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);bt: OUT STD_LOGIC_VECTOR(1 DOWNTO 0));END;ARCHITECTURE behav OF scan_led ISSIGNAL cnt8: STD_LOGIC_VECTOR(1 DOWNTO 0);SIGNAL q: STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINp1: PROCESS(cnt8)BEGINcase cnt8 iswhen "00" =>bt<="00";q<=Din(3 downto 0);when "01" =>bt<="01";q<=Din(7 downto 4);when "10" =>bt<="10";q<=Din(11 downto 8);when "11" =>bt<="11";q<=Din(15 downto 12);when others =>null;end case;END PROCESS p1;p2: process(clk)beginif clk'event and clk='1' then cnt8<=cnt8+1;end if;end process p2;p3: process(q)begincase q iswhen "0000" =>sg<="0111111";when "0001" =>sg<="0000110";when "0010" =>sg<="1011011";when "0011" =>sg<="1001111";when "0100" =>sg<="1100110";when "0101" =>sg<="1101101";when "0110" =>sg<="1111101";when "0111" =>sg<="0000111";when "1000" =>sg<="1111111";when "1001" =>sg<="1101111";when others =>null;end case;END PROCESS p3;END behav;(6)顶层文件仿真将各模块按照图二顶层文件连接编译通过后进行波形仿真。