您现在的位置:网站首页答辩论文工学论文电子论文

基于VHDL的数字频率计

  • 简介:(毕业论文 字数: 2543页数:8)摘要:在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此频率的测量就显得更为重要.本文主要运用VHDL语言,采用自顶向下的方法,使用 MaxplusⅡ开发环境进行编辑、综合、...
    • 请与管理员联系购买资料 QQ:5739126
  • 论文简介
  • 相关论文
  • 论文下载

(毕业论文 字数: 2543页数:8)摘要:在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此频率的测量就显得更为重要.本文主要运用VHDL语言,采用自顶向下的方法,使用 MaxplusⅡ开发环境进行编辑、综合、波形仿真等,设计并实现了一个能够将(0~9999)Hz、(10~99.99)Hz、(100.0~999.9)Hz、(1.0~999)MHz这四档频率进行自动换挡,且具有小数点显示的四档频率计。

关键词:VHDL,数字频率计,模块,波形仿真,分频,原理图,元件符号

目录

 

一、 分频模块devide.vhd

二、 主控模块core.vhd

三、 寄存器模块lock

四、 4选1多路选择器模块ch.vhd

五、 产生敏感信号模块sel.vhd

六、 七段显示译码器模块dec.v

 

引言:此设计的基本思路是以core为核心模块,接收由devide模块分频得到的0.5Hz的时钟,完成在1s的时间里对被测信号进行计数,并通过选择输出数据实现自动换挡;用lock 模块在的下降沿到来时对a1、a2、a3、a4信号进行锁存;用sel模块产生数码管的片选信号;用ch模块对应于数码管的片选信号,将相应的数据送出,同时显示挡位;用七段译码器模块dec7进行译码。设计中运用了分层次设计的方法,这是数字系统设计的一种重要方法,可以对EDA设计和各种工具的使用有更加深入的理解。
一、 分频模块devide.vhd
1.其VHDL代码为:
--通过对4MHz时钟的分频得到0.5Hz的时钟,为模块CORE提供1S的闸门时间
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY devide IS
PORT(clk:IN STD_LOGIC;
q:OUT STD_LOGIC);
END devide;
ARCHITECTURE ONE of devide IS
BEGIN
PROCESS(clk)
VARIABLE cnt:INTEGER RANGE 0 TO 3999999;
VARIABLE x:STD_LOGIC;
BEGIN
IF clk'EVENT AND clk='1' THEN
IF cnt<3999999 THEN
cnt:=cnt+1;
ELSE
cnt:=0;
x:=NOT x;
END IF;
END IF;
q<=x;
END PROCESS;
END one;
2.其仿真波形图为:

3.生成的元件符号为:

此模块的功能是对4MHz的输入时钟分频,使之成为的时钟信号。其实现方法是在输入时钟的上升沿加法计数,从0计到3999999,共4M次。计完后,q输出一个与原来值相反的值,然后继续,这样就将4MHz的时钟分频为0.5Hz。上图中仿真图中没有看出q的变化是因为的仿真时间有限。
二、 主控模块core.vhd
1. VHDL代码为:
--它完成在1秒的时间里对被测信号计数的功能。并通过选择输出实现自动换档的功能
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY core IS
PORT(rd,sig,door:IN STD_LOGIC;
alm:OUT STD_LOGIC;
q3,q2,q1,q0,dang:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END core;
ARCHITECTURE one OF core IS
BEGIN
PROCESS(door,sig)
VARIABLE c0,c1,c2,c3,c4,c5,c6:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
IF sig'EVENT AND sig='1' THEN
IF door='1' THEN --在1秒内对被测信号计数
IF c0<"1001" THEN c0:=c0+1;
ELSE c0:="0000";
IF c1<"1001" THEN c1:=c1+1;
ELSE c1:="0000";
IF c2<"1001" THEN c2:=c2+1;
ELSE c2:="0000";
IF c3<"1001" THEN c3:=c3+1;
ELSE c3:="0000";
IF c4<"1001" THEN c4:=c4+1;
ELSE c4:="0000";
IF c5<"1001" THEN c5:=c5+1;
ELSE c5:="0000";
IF c6<"1001" THEN c6:=c6+1;
ELSE c6:="0000";
alm<='1'; --若超过量程则报警
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
ELSE
IF rd='0' THEN alm<='0'; --rd用于清除报警信号
END IF;
c6:="0000";c5:="0000";
c4:="0000";c3:="0000";
c2:="0000";c1:="0000";
c0:="0000";
END IF;
IF c6/="0000" THEN --c6不为0则选择四档
q3<=c6;q2<=c5;
q1<=c4;q0<=c3;
dang<="0100";
ELSIF c5/="0000" THEN --c5不为0则选择三档
q3<=c5;q2<=c4;
q1<=c3;q0<=c2;
dang<="0011";
ELSIF c4/="0000" THEN --选择二档
q3<=c4;q2<=c3;
q1<=c2;q0<=c1;
dang<="0010";
ELSE --选择一档
q3<=c3; q2<=c2;
q1<=c1;q0<=c0;
dang<="0001";
END IF;
END IF;
END PROCESS;
END one;

查看评论 已有0位网友发表了看法
  • 验证码: