(毕业论文 字数: 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; |