VHDL语言完成4位十进制计数器、4位锁存器、测频控制器的设计
VHDL语言实现四位频率计的仿真设计

VHDL语言实现四位频率计的仿真设计
钟晓强
【期刊名称】《科技创新导报》
【年(卷),期】2008(000)008
【摘要】本文介绍了VHDL语言及其基本特点,讨论了VHDL语言在EDA中的诸多优点,并以四位频率计电路的设计为例,综合说明用VHDL语言设计数字电路的方法以及VHDL语言在数字电路设计仿真中的重要作用,并给出了频率计电路的时序仿真波形.以验证结果与设计指标之间的一致性是否满足实际要求.
【总页数】2页(P206-207)
【作者】钟晓强
【作者单位】浙江工商职业技术学院,浙江宁波,315012
【正文语种】中文
【中图分类】TP31
【相关文献】
1.基于VHDL语言的数字频率计的设计与仿真 [J], 董秀洁;杨艳
2.一种基于VHDL语言的数字频率计设计 [J], 王刚
3.一种基于VHDL语言数字频率计的设计与实现 [J], 谢煜;黄为
4.基于VHDL语言的数字频率计的设计 [J], 牟洪江;杨虹;王玲
5.一种基于VHDL语言的频率计的设计与实现 [J], 谭华
因版权原因,仅展示原文概要,查看原文内容请购买。
实验三 4位十进制频率计设计

实验三4位十进制频率计设计一、实验目的1.掌握数字频率计的Verilog描述方法;2.学习设计仿真工具的使用方法3.学习层次化设计方法;二、实验原理根据频率的定义和频率测量的基本原理,测定信号的频率必须有一个脉宽位1秒的输入信号脉冲计数允许信号;1秒计数结束后,计数值锁入锁存器的锁存信号和为下一次测频计数周期做准备的计数器清零信号。
这3个信号由测频控制信号发生器产生,它的设计要求是,测频控制信号发生器的计数使能信号输出CNT_EN 能产生一个1秒脉宽的周期信号,并对频率计的每一计数器CNT10的ENA使能端进行同步控制。
当CNT_EN 高电平时,允许计数;当CNT_EN低电平时停止计数,并保持所计的脉冲数。
在停止计数期间,首先需要一个锁存信号LOAD的上跳沿将计数器在前1秒钟的计数值锁存进各个锁存器REG4B中,并由外部的七段译码器译出,显示计数值。
设置锁存器的好处是,显示数据稳定,不会由于周期性的清零信号而不断闪烁。
信号锁存之后,还必须用清零信号RST_CNT对计数器进行清零,为下1秒钟的计数操作做准备。
三、实验内容1、用4位十进制计数器对用户输入时钟进行计数,计数间隔为1秒,计数满1秒后将计数值(即频率值)锁存到4位寄存器中显示,并将计数器清0,再进行下一次计数。
2、为上述设计建立元件符号3、设计仿真文件,进行验证。
4、编程下载并在实验箱上进行验证四、实验步骤程序源代码module FREG (clk1HZ,uclk,led0,led1,led2,led3,rst,en,load);input clk1HZ, uclk;output [3:0]led0,led1,led2,led3;output load,rst,en;wire in_load,in_rst,in_en,c0,c1,c2;wire [3:0]dout0,dout1,dout2,dout3;assign load=in_load;assign rst=in_rst;assign en=in_en;CNTL u1(.CLK(clk1HZ),.CNL_EN(in_en),.RST_CNL(in_rst),.LOAD(in_load));CNT10 u2 (.CLK(uclk),.EN(in_en),.RST(in_rst),.COUT(c0),.DOUT(dout0));CNT10 u3 (.CLK(c0),.EN(in_en),.RST(in_rst),.COUT(c1),.DOUT(dout1));CNT10 u4 (.CLK(c1),.EN(in_en),.RST(in_rst),.COUT(c2),.DOUT(dout2));CNT10 u5 (.CLK(c2),.EN(in_en),.RST(in_rst),.DOUT(dout3));RGB4 u6 (.DIN(dout0),.LOAD(in_load),.DOUT(led0));RGB4 u7 (.DIN(dout1),.LOAD(in_load),.DOUT(led1));RGB4 u8 (.DIN(dout2),.LOAD(in_load),.DOUT(led2));RGB4 u9 (.DIN(dout3),.LOAD(in_load),.DOUT(led3));endmodulemodule CNT10(CLK,RST,EN,COUT,DOUT); //4位计数器input CLK,RST,EN;output COUT;output[3:0] DOUT;reg[3:0] Q; reg COUT;always @ (posedge CLK or posedge RST)beginif(RST) Q=0;else if(EN) beginif(Q<9) Q=Q+1;else Q=0;endendalways @ (Q)if(Q==4'b1001) COUT=1;else COUT=0;assign DOUT=Q;endmodulemodule RGB4(DIN,LOAD,DOUT); //数据缓存器input LOAD;input[3:0] DIN;output[3:0] DOUT;reg[3:0] DOUT;always @ (posedge LOAD)DOUT=DIN;endmodulemodule CNTL(CLK,CNL_EN,RST_CNL,LOAD);//控制部分input CLK;output CNL_EN,RST_CNL,LOAD;reg CLKDIV,CNL_EN,LOAD,RST_CNL;always @ (posedge CLK)CLKDIV=~CLKDIV;always @ (posedge CLK) beginCNL_EN=CLKDIV;LOAD=~CLKDIV;endalways @ (CLK) beginif(CLK==1'b0&&CNL_EN==1'b0)RST_CNL=1;elseRST_CNL=0; endendmoduleRTL视图仿真结果功能分析:在波形中,CLK1HZ的频率为1HZ,以CLK1HZ为输入,产生en,rst,load的输出波形。
实验3 ,4位十进制的频率计设计

EDA实验报告实验三、4位十进制的频率计设计班级115学号姓名日期2010.11.2一、实验目的1、设计4位十进制频率计,学习较复杂的数字系统设计方法,熟悉对Quartus II 软件的使用。
2、用4位十进制计数器对用户输入时钟UCLK进行记数二、实验原理:根据频率的定义和频率测量的基本原理,测定信号的频率必须有一个脉宽为1秒的对输入信号脉冲计数允许的信号;1秒计数结束后,计数值被锁入锁存器,计数器清零,为下一测频计数周期作准备。
这3个信号可以由一个测频控制信号发生器产生下图中的TESTCTL,它的设计要求是:TESTCTL的计数使能信号CNT_EN能产生一个1秒脉宽的周期信号,并对频率计的每一计数器CNT10的ENA使能端进行同步控制。
当CNT_EN高电平时,允许计数;低电平时停止计数,并保持其所计的脉冲数。
在停止计数期间,首先需要一个锁存信号LOAD的上跳沿将计数器在前1秒钟的计数值锁存进各锁存器REG4B中,并由外部的7段译码器译出,显示计数值。
设置锁存器的好处是:显示的数据稳定,不会由于周期性的清零信号而不断闪烁。
锁存信号之后,必须有一清零信号RST_CNT对计数器进行清零,为下1秒钟的计数操作作准备。
4位十进制频率计设计的原理框图四、实验步骤及结果五、1破解软件2、新建工程3、程序输入及编译新建文件并输入程序并进行编译。
实验VHDL程序代码:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY EX10 ISPORT (clk1Hz : IN STD_LOGIC; -- 1 Hz clockuclk : IN STD_LOGIC; -- user clock inputled0 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); led1 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); led2 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); led3 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);p_cnt_en : OUT STD_LOGIC; -- IO01p_rst_cnt: OUT STD_LOGIC; -- IO00p_load : OUT STD_LOGIC -- IO02);END EX10;ARCHITECTURE behv OF EX10 ISCOMPONENT cnt10PORT (clk : IN STD_LOGIC;rst : IN STD_LOGIC;ena : IN STD_LOGIC;outy: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);cout: OUT STD_LOGIC);END COMPONENT;COMPONENT reg4bPORT (load: IN STD_LOGIC;din : IN STD_LOGIC_VECTOR(3 DOWNTO 0);dout: OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END COMPONENT;COMPONENT testctlPORT (clkk : IN STD_LOGIC;cnt_en : OUT STD_LOGIC;rst_cnt: OUT STD_LOGIC;load : OUT STD_LOGIC);END COMPONENT;SIGNAL cnt_en : STD_LOGIC;SIGNAL rst_cnt : STD_LOGIC;SIGNAL load : STD_LOGIC;SIGNAL dout0, dout1, dout2, dout3: STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL cout0, cout1, cout2, cout3: STD_LOGIC;BEGINp_cnt_en <= cnt_en ;p_rst_cnt <= rst_cnt;p_load <= load ;u_testctl:testctl PORT MAP (clkk => clk1Hz ,cnt_en => cnt_en ,rst_cnt => rst_cnt,load => load); u_cnt10_0:cnt10 PORT MAP (clk => uclk ,rst => rst_cnt,ena => cnt_en ,outy => dout0 ,cout => cout0 );u_cnt10_1:cnt10 PORT MAP (clk => cout0 ,rst => rst_cnt,ena => cnt_en ,outy => dout1 ,cout => cout1 );u_cnt10_2:cnt10 PORT MAP (clk => cout1 ,rst => rst_cnt,ena => cnt_en ,outy => dout2 ,cout => cout2 );u_cnt10_3:cnt10 PORT MAP (clk => cout2 ,rst => rst_cnt,ena => cnt_en ,outy => dout3 ,cout => cout3 );u_reg4b_0:reg4b PORT MAP (load => load ,din => dout0, dout => led0);u_reg4b_1:reg4b PORT MAP (load => load ,din => dout1,dout => led1);u_reg4b_2:reg4b PORT MAP (load => load ,din => dout2,dout => led2);u_reg4b_3:reg4b PORT MAP (load => load ,din => dout3,dout => led3);END behv;TESTCTL.VHD 程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY testctl ISPORT (clkk : IN STD_LOGIC;cnt_en : OUT STD_LOGIC;rst_cnt: OUT STD_LOGIC;load : OUT STD_LOGIC);END testctl;ARCHITECTURE behv OF testctl IS SIGNAL div2clk: STD_LOGIC;BEGINPROCESS(clkk)BEGINIF clkk'EVENT AND clkk = '1' THENdiv2clk <= NOT div2clk;END IF;END PROCESS;PROCESS(clkk, div2clk) BEGINIF clkk = '0' AND div2clk = '0' THENrst_cnt <= '1';ELSErst_cnt <= '0';END IF;load <= NOT div2clk;cnt_en <= div2clk;END PROCESS;END behv;LIBRARY IEEE;USEIEEE.STD_LOGIC_1164.ALL; USEIEEE.STD_LOGIC_UNSIGNED. ALL;ENTITY cnt10 ISPORT (clk : IN STD_LOGIC;rst : IN STD_LOGIC;ena : IN STD_LOGIC; outy: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);cout: OUT STD_LOGIC);END cnt10;ARCHITECTURE behv OF cnt10 ISSIGNAL cqi: STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(clk, rst, ena) BEGINIF rst = '1' THENcqi <= "0000";cout <= '0';ELSIF clk'EVENT AND clk = '1' THENIF ena = '1' THENIF cqi = "1001" THENcqi <= "0000";cout <= '1';ELSEcqi <= cqi + 1;cout <= '0';END IF;END IF;END IF;outy <= cqi;END PROCESS;END behv;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY reg4b ISPORT (load: IN STD_LOGIC;din : IN STD_LOGIC_VECTOR(3 DOWNTO 0); dout: OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END reg4b;ARCHITECTURE behv OF reg4b ISBEGINPROCESS(load)BEGINIF load'EVENT AND load = '1' THENdout <= din;END IF;END PROCESS;END behv;打开RTL图形时序仿真:打开“assignments”中的“assignments editor”打开EDA,装入模式10.根据EDA 管脚进行指定保存,并下载“sof”文件到EDA启动EDA软件。
4位加法计数器的VHDL描述

0
十进制整数
35
十进制整数
10E3
十进制整数
16#D9#
十六进制整数
8#720#
八进制整数
2#11010010# 二进制整数
1.3 4位加法计数器的另一种表达方式
【例5-2】 LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; USE IEEE.STD_LOGIC_UNSIGNED.ALL ; ENTITY CNT4 IS PORT ( CLK : IN STD_LOGIC ; Q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ) ; END ; ARCHITECTURE bhv OF CNT4 IS
BEGIN PROCESS (CLK)
BEGIN IF CLK'EVENT AND CLK = '1' THEN Q <= Q + 1 ; END IF;
END PROCESS ; END bhv;
4位加法计数器的VHDL描述
1.2 整数、自然数和正整数数据类型
整数常量的书写方式示例如下:
1
十进制整数
1.3 4位加法计数器的另一种表达方式 4位加法计数器由两大部分组成:
图5-1 4位加法计数器RTL电路
4位加法计数器的VHDL描述
1.3 4位加法计数器的另一种表达方式
图5-2 4位加法计数器工作时序
4位加法计数器的VHDL描述
1.3 4位加法计数器的另一种表达方式
数据类型: 整数类型INTEGER、自然数类型、正整数类型POSITIVE。
EDA技术实用教程
4位加法计数器的VHDL描述
1.1 4位加法计数器
EDA实验三 硬件描述语言的层次化设计(频率计)

实验三硬件描述语言的层次化设计一、4位十六进制频率计1.建立新工程,命名为bit4_16,建立VHD文件COUNTER4B.vhd,编写4位十六进制计数器程序,并对文件编译,将文件另存为可调用symbol元件。
计数器仿真结果:2.建立测频控制器的VHD文件:FTCTRL.vhd,编写测频控制器程序,并对文件编译,将文件另存为可调用symbol元件。
测频控制器的仿真波形:3.建立4位锁存器文件的VHD文件:REG4B.vhd。
编写锁存器程序,并对文件编译,将文件另存为可调用symbol元件。
4.建立总的4位十进制频率计的原理图文件: fenpin.bdf对其进行波形仿真,因学号为19,故将时钟信号频率设定在119HZ,然后进行波形仿真波形仿真结果:仿真结果如下:输入频率119HZ,频率计测得的频率为77H HZ,可知仿真结果无误。
关于76nCEO管脚的处理方法如图:二.8位十进制频率计1.建立新工程,命名为bit8_10,建立VHD文件COUNTER4B.vhd,编写4位十进制计数器程序,并对文件编译,将文件另存为可调用symbol元件。
计数器仿真结果:2.建立测频控制器的VHD文件:FTCTRL.vhd,编写测频控制器程序,并对文件编译,将文件另存为可调用symbol元件。
测频控制器的仿真波形:3.建立4位锁存器文件的VHD文件:REG4B.vhd。
编写锁存器程序,并对文件编译,将文件另存为可调用symbol元件。
4.建立总的4位十进制频率计的原理图文件: fenpin2.bdf,并对其进行仿真,因学号28,故将时钟信号频率设定在128HZ,然后进行波形仿真仿真结果;波形仿真结果:因学号19,输入频率119HZ,频率计测得的频率也为119HZ,可知仿真结果正确。
4位10进制计数器

4位10进制计数显示模块设计
一、实验目的:设计4位10进制计数显示模块。
二、实验要求:
(1)、叙述设计思想;
(2)、4位10进制计数显示模块的VHDL描述;
(3)、画出顶层VHDL文件的图形描述;
(4)、调试程序、下载到实验板验证设计的正确性。
三、实验步骤
1、设计思路
4位10进制计数显示要实现四位数有0000开始,没过1s自动加1,并且可以循环计数。
同时,有使能端(ENA)可以控制暂停计数和继续计数,有复位端(RST)可以是四位数复位(0000)。
要实现这个功能需要用到6个主要元件:分频器、计数器、数码管显示译码器、段控制元件、位选择元件和动态扫描元件。
过程如下图图1所示。
图1
2、实验各个模块的VHDL描述:(1)、分频器元件的VHDL语言
(2)、十进制计数器元件的VHDL语言
(3)、动态扫描元件的VHDL语言(4)、位控制元件的VHDL语言
(5)七段数码显示译码器VHDL语言(6)、段控制元件的VHDL语言
3、顶层VHDL文件的图形描述
4、调试程序、下载到实验板验证设计的正确性。
通过对程序进行调试和引脚合理的分配之后,将程序下载到实验板上,实验结果与预期的一样。
四、实验体会
通过该次实验,对VHDL语言的基本用法和作用有了更深入的理解,运用起来更加熟练;同时,通过元件生成和顶层文件的图形描述,使我对quartus II软件的使用有了更深入了解,这使得我CPLD设计过程更加熟练。
层次化4位加法器设计 VHDL

课程设计说明书学院专业题目学号姓名同组人员报告完成日期成绩指导教师实验一层次化4位加法器设计一.实验目的1、掌握用 VHDL 设计全加器的方法并实现。
2、熟悉设计平台及VHDL层次化设计。
二.实验仪器1、硬件:计算机Gxsoc/sops-Dev-LabCycloneII EP2C35F672C8 核心板2、软件:正版Quartus8.0三.实验设计要求学习用VHDL或原理图设计方法,掌握全加器的设计方式及表示方式,极其与二进制表示的转换方法,完成编译、综合、适配、仿真和实验箱上的硬件测试,通过数码管观察结果。
采用层次化方法实现4位加法器,完成编译,仿真,引脚锁定,下载。
四.实验原理通过动态扫描两组4BIT的二进制数据,同时还有一个单BIT 的进位,把三者按照二进制加法原理进行加,求出和及进位,并通过电路显示出各部分数据(输入,输出)。
加数、被加数、“和”显示在共阳数码管上,进位输出显示在LED上。
五.程序代码1、半加器Hadder代码LIBRARY Ieee;USE Ieee.Std_Logic_1164.all;ENTITY HADDER ISPort (a,b: In Bit;Co, So: Out Bit);END HADDER;ARCHITECTURE fh1 Of HADDER Is BEGINSo <= (a Xor b);Co <= (a And b);END fh1;2、或门ora代码LIBRARY Ieee;USE Ieee.Std_Logic_1164.all;ENTITY ora ISPort ( a: in Std_Logic;b: in Std_Logic;c: out Std_Logic);END ora;ARCHITECTURE org OF ora ISBEGINc <= a Or b;END org;3、1位全加器f_hadder代码LIBRARY Ieee;USE Ieee.Std_Logic_1164.all;ENTITY f_ADDER ISPort (x: In Std_Logic;y: In Std_Logic;cin: In Std_Logic;cout: Out Std_Logic;sum: Out Std_Logic);END f_ADDER;ARCHITECTURE fd1 Of f_ADDER Is Component HADDERPort( a,b: In Std_Logic;co,so: Out Std_Logic);END Component;Component oraPort(a,b: In Std_Logic;c: Out Std_Logic);END Component;Signal d,e,f: Std_Logic;BeginU1: HADDERPort Map(a=>X,b=>Y,Co=>d,so=>e);U2:HADDERPort Map(a=>e,b=>cin,Co=>f,so=>sum);U3:ora Port Map(a=>d,b=>f,c=>cout);END ARCHITECTURE fd1;4、4位全加器Qadd:Library ieee;Use ieee.std_logic_1164.all;Entity Qadd isPort (a:in std_logic_VECTOR(3 DOWNTO 0);b:in std_logic_VECTOR(3 DOWNTO 0);--cin:in std_logic;s:out std_logic_VECTOR(3 DOWNTO 0)); End Qadd;Architecture one of Qadd isSignal c0,c1,c2,c3 : std_logic;Component f_ADDERPort (x: In Std_Logic;y: In Std_Logic;cin: In Std_Logic;cout: Out Std_Logic;sum: Out Std_Logic);END Component;Beginu1 :F_ADDERPort map(sum=>s(0),cout=>c0,X=>a(0),Y=>b(0),cin=>'0');u2 :F_ADDERPort map(sum=>s(1),cout=>c1,X=>a(1),Y=>b(1),cin=>c0 );u3 : F_ADDERPort map(sum=>s(2),cout=>c2,X=>a(2),Y=>b(2),cin=>c1 );u4 : F_ADDERPort map(sum=>s(3),cout=>c3,X=>a(3),Y=>b(3),cin=>c2 ); END;六.仿真结果程序代码进行编译后,建立waveform文件,设定输入输出端口进行仿真,仿真结果如图1-1所示。
基于VHDL4位电子密码锁的设计

理工大学本科实验报告题目:基于VHDL 4位电子密码锁的设计课程名称:数字电路课程设计学院(系):电子信息与电气工程专业:电子英强班级:学生:学号:完成日期:2013.7.8成绩:2013 年7 月08 日题目:基于VHDL 4位电子密码锁的设计1 设计要求○1电子密码锁为4位8421BCD码,多于4位,密码只取前4位。
○2在输入密码错误,给出一个错误信号,有三次输入机会,若三次密码都输入错误,则给出一个报警信号,此后只能由密码管理员取消报警信号。
○3在输入密码正确的情况下,可以再次设定密码。
○4每次输入一个密码,将显示在7段数码管上,并依次左移。
○5每次输入密码的时候,按取消(cancel)键可以取消这次密码的输入,课重新输入4位密码。
2 设计分析及系统方案设计在实验室DE2开发板的条件下,考虑到key键只有4个,可以用switch开关来实现密码输入模块,用switch[9]~switch[0] 来实现数字9~0的输入,并通过译码模块将其转化为8421BCD码,由8421BCD码来驱动7段数码管作为密码锁的显示模块。
每按一个键,产生一个上升沿,给4个数码管做时钟,实现没输入一个数左移一位的效果。
为了实现密码输入多于4位,可以构造一个模为4的计数器来控制只取前4位密码。
共有三次输入密码的机会,可以构造一个模为3的计数器来控制。
密码比较模块:当按下确定键(yes)键,则将输入的密码和置密码进行比较。
密码输入模块:当输入密码正确时,再输入密码,利用重置密码键(set_psw)直接将其赋值给置的密码psw即可实现。
LED 显示模块,用来显示密码输入的正确与否。
若输入密码与置密码一致,则锁打开,输出一个高电平给LEDG ,绿灯亮,密码错误则输出一个高电平给LEDR ,红灯亮。
综合上述分析,本系统的硬件部分主要由密码锁输入译码模块、密码锁显示模块、密码锁控制模块、密码比较和重置模块和LED 显示模块五个部分组成。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子设计自动化实验
实验名称综合性实验二、硬件描述语言的层次化设计
实验设备
(1)EDA实验箱(型号 ),(2)计算机,(3)EDA软件(QuartusII)
实验目的
1、熟悉EDA软件(QuartusII)的硬件描述语言输入设计方法;
2、掌握VHDL语言的层次化设计方法和仿真分析方法;
3、了解功能仿真、时序仿真和时序参数分析的意义。
实验容
1、用VHDL语言完成4位十进制计数器、4位锁存器、测频控制器的设计,包括
编译、综合、仿真;**
2、采用层次化设计的方法,用VHDL语言的元件例化语句写出4位十进制频率计的顶层文件,并分别给出其测频功能和时序仿真分析波形图,并加以分析;**
3、用EDA实验箱进行硬件验证,并分析测量结果;建议硬件测试实验电路采用NO.0 电路结构,待测信号F_IN接clock0;测频控制时钟CLK接clock2;**
4、在2基础上将其扩展为8位十进制频率计,或带译码输出的4位十进制频率计。
实验报告要求
根据以上实验容写出实验报告:
1、简述4位频率计模块的工作原理及其设计、编译、仿真分析过程;
2、给出模块设计文件、仿真测试文件、仿真结果波形图及其分析报告;
3、简述硬件验证过程和验证结果。
1、简述4位频率计模块的工作原理
根据频率的定义和频率测量的基本原理,测定信号的频率必须有一个脉宽为1秒的对输入信号脉冲计数允许的信号;1秒计数结束后,计数值锁入锁存器的锁存信号和为下一测频计数周期作准备的计数器清0信号。
这3个信号可以由一个测频控制信号发生器产生,即TESTCTL,它的设计要,TESTCTL的计数使能信号CNT_EN能产生一个1秒脉宽的周期信号,并对频率计的每一计数器CNT10的ENA使能端进行同步控制。
当CNT_EN高电平时,允许计数;低电平时停止计数,并保持其所计的脉冲数。
在停止计数期间,首先需要产生一个锁存信号LOAD,在该信号上升沿时,将计数器在前1秒钟的计数值锁存进各锁存器REG4B中,并由外部的7段译码器译出,显示计数值。
设置锁存器的好处是,显示的数据稳定,不会由于周期性的清零信号而不断闪烁。
锁存信号之后,必须有一清零信号RST_CNT对计数器进行清零,为下1秒钟的计数操作作准备。
每一个计数器CNT10有4位输出(0000~1001分别表示十进制中的0~9),因此需要用四片CNT10。
四片CNT10应串接起来,当前一片CNT10产生进位信号后,由CARRY_OUT输出跳变高电平,引入下一片CNT10(也即输入时钟信号CLK)。
四位十进制计数器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT10 IS
PORT (CLK,RST,EN : IN STD_LOGIC;
CQ : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
COUT : OUT STD_LOGIC );
END CNT10;
ARCHITECTURE behav OF CNT10 IS
BEGIN
PROCESS(CLK, RST, EN)
VARIABLE CQI : STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
IF RST = '1' THEN CQI := (OTHERS =>'0') ; --计数器异步复位
ELSIF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿
IF EN = '1' THEN --检测是否允许计数(同步使能)
IF CQI < 9 THEN CQI := CQI + 1; --允许计数, 检测是否小于9 ELSE CQI := (OTHERS =>'0'); --大于9,计数值清零
END IF;
END IF;
END IF;
IF CQI = 9 THEN COUT <= '1'; --计数大于9,输出进位信号 ELSE COUT <= '0';
END IF;
CQ <= CQI; --将计数值向端口输出
END PROCESS;
END behav;
四位寄存器
LIBRARY IEEE; --4位锁存器
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY REG4B IS
PORT ( LK : IN STD_LOGIC;
DIN : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
DOUT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) );
END REG4B;
ARCHITECTURE behav OF REG4B IS
BEGIN
PROCESS(LK, DIN)
BEGIN
IF LK'EVENT AND LK = '1' THEN DOUT <= DIN;
END IF;
END PROCESS;
END behav;
测频器
LIBRARY IEEE; --测频控制电路
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.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 behav OF FTCTRL IS
SIGNAL Div2CLK : STD_LOGIC;
BEGIN
PROCESS( CLKK )
BEGIN
IF CLKK'EVENT AND CLKK = '1' THEN -- 1Hz时钟2分频
Div2CLK <= NOT Div2CLK;
END IF;
END PROCESS;
PROCESS (CLKK, Div2CLK)
BEGIN
IF CLKK='0' AND Div2CLK='0' THEN RST_CNT<='1';-- 产生计数器清零信号 ELSE RST_CNT <= '0'; END IF;
END PROCESS;
Load <= NOT Div2CLK; CNT_EN <= Div2CLK;
END behav;
实验记录:
1、仿真分析(目标芯片型号,待测信号频率FIN=132*CLK,XX为末两位学号)测频控制器工作时序波形:
4位频率计工作时序波形:(功能仿真分析)
4位频率计工作时序波形:(时序仿真分析)
编译结果8位频率计
8位频率计工作时序波形:(功能仿真分析)8位频率计工作时序波形:(时序仿真分析)
编译、综合和适配频率计顶层设计文件,完全通过,设计到目前为止正确无误。
小结:通过实验完成设计4位十进制频率计,学习较复杂的数字系统设计方法;深入学习数字系统设计的方法与步骤;用VHDL硬件描述语言进行模块电路的设计。
熟悉4位十进制频率计的工作原理以及各个模块的功能。