基于vhdl的频率计设计

  • 格式:docx
  • 大小:18.13 KB
  • 文档页数:8

基于vhdl的频率计设计

课程论文(设计)题目基于quartus的频率计的设计院系电子与信息工程学院

专业电子与通信工程

学生姓名

学号

指导教师

二O一四年元月三日

一、频率计的说明 (3)

二、顶层原理图 (4)

三、底层模块设计 (4)

3.1十进制加法计数器CNT10 (4)

3.2十二进制加法计数器CNT12 (5)

3.3控制模块CODE (6)

3.4锁存器LOCK (7)

四、底层模块的仿真 (7)

4.1LOCK模块的仿真结果 (7)

4.2CNT12的仿真结果 (8)

4.3CNT10模块的仿真结果 (8)

4.4CODE模块的仿真结果 (8)

五、频率计顶层原理图的输入 (9)

六、频率计仿真结果 (9)

总结 (10)

一、频率计的说明

频率就是周期性信号在单位时间(1S )内的变化次数。频率计的作用就是测量输入信号的频率,我设计的频率计的原理是若在一定1S

的时间间隔内测得这个周期性信号的重复变化次数为N ,则其频率可表示为:f=N 。如下图1.1所示,通过定义闸门信号为1s 后,通过统计下该时间内有多少次脉冲即可得到相应的频率。

图1.1系统测量频率的原理

系统的框图如下图1.2所示,首先由时基电路产生基准信号,通过控制电路产生出1s 的闸门信号,闸门电路把1s 内截取的检测信号传递给计数器,通过计数器计数就可以得到需要测量的频率。锁存器的作用就是为了保存当前的频率交给显示电路显示。

计数器

锁存器

显示电路

闸门电路

计数脉冲

控制电路

锁存信号

清零信号闸门信号

时基

电路被测信号

图1.2系统原理框图

二、顶层原理图

如下图2.1所示,系统顶层原理图包括CNT12、CODE 、CNT10、LOCK 、CODE 模块。其中CNT10和CNT12分别为10和12进制计数器,CODE 则为控制模块输出清零、锁存、和闸门信号,LOCK 则为锁存模块,负责将采集的频率数值锁存起来方便显示,CODE 模块则是将二进制转换成十进制的模块。

系统中的clk1为为我们为测试时候的输入闸门信号,通过CNT12信号后模拟1s 的闸门的信号,系统输出的端口为4个QQ[3..0],这样方便系统仿真,也可以减少系统的复杂程度。

CNT10CLK CLR

CS ]0QQ[3..CO CNT10CLK CLR

CS

]0QQ[3..CO CNT10CLK CLR CS ]0QQ[3..CO CNT10CLK CLR CS

]

0QQ[3..CO

LOCK

]

0DD[3..]

0QQ[3..LOCK

]

0DD[3..]

0QQ[3..LOCK

]

0DD[3..]0QQ[3..LOCK

]

0DD[3..]

0QQ[3..CODE LOCK

CLR

CS ]0DD[/doc/2fac7e3a6c85ec3a87c2c5d0.html T12

CLK

]

0QQ[3..CLK CLK CLK CLK (被测信号))

(8Hz CLK1 f CLKIN

DECODER

]

0AK[3..g a

~]0LED1[6..]0LED2[6..]0LED3[6..]0LED4[6..DECODER

DECODER

DECODER

]

0AK[3..] 0AK[3..]

0AK[3..g a ~g

a ~g a ~

三、底层模块设计

3.1十进制加法计数器CNT10

library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;

entity cnt10 is

port(clk:in std_logic;

clr:in std_logic;

cs :in std_logic;

qq :buffer std_logic_vector(3 downto 0);

co :out std_logic);

end cnt10;

architecture one of cnt10 is

begin

process(clk,clr,cs)

begin

if (clr='1') then

qq<="0000";

elsif (clk'event and clk='1') then

if (cs='1') then

if (qq=9) then

qq<="0000";

else

qq<=qq+1;

end if;

end if;

end if;

end process; process(qq)

begin

if (qq=9) then

co<='0';

else

co<='1';

end if;

end process;

end;

3.2十二进制加法计数器CNT12

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity cnt12 is

port(clk: in std_logic;

qq : buffer std_logic_vector(3 downto 0)); end cnt12;

architecture one of cnt12 is

begin

begin

if (clk'event and clk='1') then

if (qq=11) then

qq<="0000";

else

qq<=qq+1;

end if;

end if;

end process;

end one;

3.3控制模块CODE

library ieee; use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity code is

port(

dd : in std_logic_vector(3 downto 0);

cs : out std_logic;

clr : out std_logic;

lock: out std_logic

);

end code;

architecture one of code is

begin

process(dd)

begin

if (dd=0) then

clr<='1';

else

clr<='0';

end if;

if (dd=11) then

lock<='1';

else

lock<='0';

end if;

if ( (dd > 0 ) and (dd < 9 )) then

cs<='1';

else

cs<='0';

end if;

end one; 3.4锁存器LOCK

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity lock is

port(

clk: in std_logic;

dd : in std_logic_vector(3 downto 0);

qq : out std_logic_vector(3 downto 0)

);

end lock;

architecture one of lock is

begin

process(clk,dd)

begin

if (clk'event and clk='1') then

qq<=dd;

end if;

end process;

end one;

四、底层模块的仿真

4.1LOCK模块的仿真结果

4.2CNT12的仿真结果

4.3CNT10模块的仿真结果

4.4CODE模块的仿真结果

五、频率计顶层原理图的输入和硬件电路

六、频率计仿真结果

通过仿真图可以通过aa、bb、cc、dd读出此时的频率为140hz,由于1s的

闸门信号仿真起来会很慢,所以我们使用很小的一个闸门信号以方便仿真,相应的频率显示可能会有些偏差。

总结

通过这次EDA的系统设计,我重拾了专科期间学习的知识,同时也把软件从原来的maxplus2升级到了quartus2。一开始我不太情愿使用quartus2,因为很多的功能都不太会使用,遇到了很多的问题,后来通过查阅资料和同学讨论等途径硬着头皮解决了些问题,最终也是在quartus里实现了频率计的系统,在这里要真心地向我们的指导老师刘老师感谢,在他的课堂上我学到了很多,对我以后的硬件和数字处理有太大的帮助,真心的感谢您。