
16进制频率计数器.doc
10页实验课程名称:EDA技术与应用实验项目名称16进制频率计实验实验成绩实 验 者专业班级组 别同 组 者实验日期一、实验目的1.掌握计数器的基本原理,进一步加深对频率计数器工作原理及电路组成的理解与掌握2.熟悉VHDL文本输入法的使用方法,掌握更复杂的EDA设计技术流程和数字系统设计方法,完成8位十六进制频率计的设计二、实验仪器 1.计算器及操作系统 2.Quartus II软件三、 实验原理 1.根据频率的定义和频率测量的基本原理,测定信号的频率必须有一个脉宽为1s的输入信号脉冲计数允许的信号;一秒结束后,计数器被锁入锁存器,计数器清零,为下一测频计数周期做好准备测频控制信号可以由一个独立的发生器来产生,即图1中的FTCTRL 2.FTCTRL的计数使能信号CNT_EN能产生一个1秒脉宽的周期信号,并对频率计中的32位二进制计数器COUNTER32B(图2)的ENABL使能进行同步控制 当CNT_EN高电平时允许计数;低电平时停止计数,并保持其所计的脉冲数在停止计数期间,首先需要一个锁存信号LOAD的上跳沿将计数器在前一秒钟的计数值锁存进各锁存器REG32B中,并由外部的十六进制7段译码器译出,显示计数值。
设置锁存器的好处是数据显示稳定,不会由于周期性的清零信号而不断闪烁锁存信号后,必须有清零信号RST_CNT对计数器进行清零,为下一秒的计数操作准备四、 实验内容1.测频控制电路 设计频率计的关键是设计一个测频率控制信号发生器,产生测量频率的控制时序控制时钟信号clk取为1Hz,2分频后即可产生一个脉宽为1秒的时钟test-en,此作为计数闸门信号当test-en为高电平时,允许计数;当test-en由高电平变为低电平(下降沿到来)时,应产生一个锁存信号,将计数值保存起来;锁存数据后,还要在下次test-en上升沿到来之前产生清零信号clear,将计数器清零,为下次计数作准备2 .32位锁存器:设置锁存器的作用是显示的数据稳定,不会由于周期性的清零信号而不断闪烁锁存器的位数应跟计数器完全一样3.计数器:计数器以待测信号作为时钟,清零信号clear到来时,异步清零;test-en为高电平时开始计数五、 实验步骤1.建立工作库文件夹和编辑设计文件1)新建一个文件夹首先利用Windows资源管理器,新建一个文件夹2)输入源程序打开QuartusⅡ,选择File→new命令,在New窗口中的Design File栏选择编辑文件的语言类型,这里选择VHDL File选项。
然后在VHDL文本编译窗口中输入以下VHDL程序3)文件存盘2.创建工程 选择File→new Project Wizard命令建立工程,将设计文件加入工程中3.编译前设置 在对工程进行编译处理前必须给予必要的设置和约束4.全程编译 选择Processing→Start Compilation命令,启动全程编译5.时序仿真打开波形编辑器,选择File→new命令,在New窗口中选择Vector Waveform File选项设置仿真时间区域,编辑输入波形,仿真器参数设置,启动仿真器,观察仿真结果①测频控制电路程序如下:LIBRARY IEEE; --测控控制电路USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_1164.ALL;ENTITY FTCTRL IS PORT (CLKK:IN STD_LOGIC;--1HZ CNT_EN:OUT STD_LOGIC; --计数器时钟使能 RST_CNT:OUT STD_LOGIC; --计数器清零 Load:OUT STD_LOGIC); --输出锁存信号END FTCTRL;ARCHITECTURE behave OF FTCTRL ISSIGNAL Div2CLK:STD_LOGIC;BEGINPROCESS(CLKK)BEGINIF CLKK'EVENT AND CLKK='1' THEN --1HZ时钟2分频Div2CLK<=NOT Div2CLK;END IF;END PROCESS;PROCESS(CLKK,Div2CLK)BEGINIF CLKK='0' AND Div2CLK='0' THEN RST_CNT<='1'; --产生计数器清零信号 ELSE RST_CNT<='0';END IF;END PROCESS;Load<=NOT Div2CLK;CNT_EN<=Div2CLK;END behave;图1 测控控制电路的RTL图 图2 测控控制电路时序仿真图图3 测控控制器元器件图②32位锁存器程序如下:LIBRARY IEEE; --32位锁存器USE IEEE.STD_LOGIC_1164.ALL;ENTITY REG32B IS PORT (LK:IN STD_LOGIC; DIN:IN STD_LOGIC_VECTOR(31 DOWNTO 0); DOUT:OUT STD_LOGIC_VECTOR(31 DOWNTO 0));END REG32B;ARCHITECTURE behave OF REG32B ISBEGINPROCESS(LK,DIN)BEGINIF LK'EVENT AND LK='1' THEN DOUT<=DIN;END IF;END PROCESS;END behave; 图4 32位锁存器的RTL图图5 32位锁存器的时序仿真图图6 32位锁存器元器件图③计数器程序如下:LIBRARY IEEE; --32位计数器USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COUNTER32B ISPORT(FIN:IN STD_LOGIC; --时钟信号 CLR:IN STD_LOGIC; --清零信号 ENABL:IN STD_LOGIC; --计数使能信号 DOUT:OUT STD_LOGIC_VECTOR(31 DOWNTO 0));--计数结果END COUNTER32B;ARCHITECTURE behave OF COUNTER32B ISSIGNAL CQI:STD_LOGIC_VECTOR(31 DOWNTO 0);BEGIN PROCESS(FIN,CLR,ENABL) BEGINIF CLR='1' THEN CQI<=(OTHERS=>'0'); --清零ELSIF FIN'EVENT AND FIN='1' THEN IF ENABL='1' THEN CQI<=CQI+1; END IF; END IF;END PROCESS;DOUT<=CQI;END behave;图7 32位计数器的RTL图图8 32位计数器的时序仿真图 图9 32位计数器的元器件图4 频率计顶层文件设计程序如下:LIBRARY IEEE; --频率计顶层文件LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY FREQTEST ISPORT(CLK1HZ:IN STD_LOGIC; FSIN:IN STD_LOGIC; DOUT:OUT STD_LOGIC_VECTOR(31 DOWNTO 0));END FREQTEST;ARCHITECTURE struc OF FREQTEST ISCOMPONENT FTCTRLPORT( CLKK:IN STD_LOGIC;--1HZ CNT_EN:OUT STD_LOGIC; --计数器时钟使能 RST_CNT:OUT STD_LOGIC; --计数器清零 Load:OUT STD_LOGIC); --输出锁存信号END COMPONENT; COMPONENT COUNTER32BPORT( FIN:IN STD_LOGIC; --时钟信号 CLR:IN STD_LOGIC; --清零信号 ENABL:IN STD_LOGIC; --计数使能信号 DOUT:OUT STD_LOGIC_VECTOR(31 DOWNTO 0));--计数结果END COMPONENT; COMPONENT REG32BPORT( LK:IN STD_LOGIC; DIN:OUT STD_LOGIC_VECTOR(31 DOWNTO 0); DOUT:OUT STD_LOGIC_VECTOR(31 DOWNTO 0));END COMPONENT; SIGNAL TSTEN1:STD_LOGIC;SIGNAL CLR_CNT1:STD_LOGIC;SIGNAL Load1:STD_LOGIC;SIGNAL DTO1:STD_LOGIC_VECTOR(31 DOWNTO 0);SIGNAL CARRY_OUT1:STD_LOGIC_VECTOR(6 DOWNTO 0);BEGINU1: FTCTRL PORT MAP(CLKK=>CLK1HZ,CNT_EN=>TSTEN1, RST_CNT=>CLR_CNT1,Load=>Load1);U2: REG32B PORT MAP( LK=>Load1,DIN=>DTO1,DOUT=>DOUT );U3: COUNTER32B PORT MAP(FIN=>FSIN,CLR=>CLR_CNT1, ENABL=>TSTEN1,DOUT=>DTO1);END struc;图10 8位十六进制频率计电路图六. 实验结果及分析工程编译通过后,必须对其功能和时序性质进行仿真测试。
打开波形编辑器,选择File→new命令,在New窗口中选择Vector Waveform File选项设置仿真时间区域,编辑输入波形,仿真器参数设置,启动仿真器,观察仿真结果8位十六进制频率计时序仿真波形如下,仿真结果说明十六进制频率计。
