文档库

最新最全的文档下载
当前位置:文档库 > 四位十进制频率计

四位十进制频率计

一、设计任务与要求

1.设计4位十六进制频率计,学习较复杂的数字系统设计方法;

2.深入学习数字系统设计的方法与步骤;

3.用元件例化语句写出频率计的顶层文件;

4.用VHDL硬件描述语言进行模块电路的设计;

5.设计硬件要求:PC机,操作系统为Windows2000/XP,本课程所用系统均为max+plus II 5.1设计平台,GW48系列SOPC/EDA实验开发系统。

二、总体框图

2.1工作原理以及方案

原理工作说明:

根据频率的定义和频率测量的基本原理,测定信号的频率必须有一个脉宽为1秒的对输入信号脉冲计数允许的信号;1秒计数结束后,计数值锁入锁存器的锁存信号和为下一测频计数周期作准备的计数器清0信号。这3个信号可以由一个测频控制信号发生器产生,即图(a)中的TESTCTL,它的设计要求是,TESTCTL的计数使能信号CNT_EN 能产生一个1秒脉宽的周期信号,并对频率计的每一计数器CNT4B的ENA使能端进行同步控制。当CNT_EN高电平时,允许计数;低电平时停止计数,并保持其所计的脉冲数。在停止计数期间,首先需要产生一个锁存信号LOAD,在该信号上升沿时,将计数器在前1秒钟的计数值锁存进各锁存器REG4B中,并由外部的7段译码器译出,显示计数值。设置锁存器的好处是,显示的数据稳定,不会由于周期性的清零信号而不断闪烁。锁存信号之后,必须有一清零信号RST_CNT对计数器进行清零,为下1秒钟的计数操作作准备。其工作时序波形如图(a)。

四位十进制频率计

图(a) 频率计测频控制器TESTCTL测控时序图

2.2选择的设计方案:

1.根据频率计的工作原理,将电路划分成控制器、计数器、锁存器和LED显示几个模

块,

控制器——产生1秒脉宽的计数允许信号、锁存信号和计数器清零信号

计数器——对输入信号的脉冲数进行累计

锁存器——锁存测得的频率值

LED显示——将频率值显示在数码管上

2.根据图(a)、(b)及(1)(2)描述的4位十进制频率计的工作原理,利用max+ plusII

5.1对以上三者的程序进行文本编辑输入和仿真测试并根据图(b),写出频率计的顶

层文件,并给出其测频时序波形,及其分析。

3.频率计设计硬件验证。编译、综合和适配频率计顶层设计文件,并编程下载进入目

标器件中。本实验目标器件是EP1K30TC144-3,实验电路选择模式0,4个数码管(数码4-1:PIO31-PIO16)显示测频输出;待测频率输入FIN由clock0输入,频率

可选4Hz、256HZ . . .或更高;1HZ测频控制信号F1HZ可由clock2输入(用电路帽选选1Hz)。

2.3、总体框图

四位十进制频率计

三、选择器件

1.装有Quartus II软件的微型计算机。计算机的硬件尽可能高,至少可以实现

Quartus II软件的使用。

2.硬件实现的芯片为PFGA/CPLD,芯片管脚的数量要保证足够设计的程序所要

使用的数量,并且使其所有管脚都有可分配的管脚,可以实现Quartus II上综

合、适配的程序下载后可以顺利实现。

四、功能模块

(1)、十六进制计数

四位十进制频率计

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY CNT4B IS

PORT (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 CNT4B;

ARCHITECTURE behav OF CNT4B IS

SIGNAL CQI : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN

P_REG: PROCESS(CLK, RST, ENA)

BEGIN

IF RST = '1' THEN CQI <= "0000";

ELSIF CLK'EVENT AND CLK = '1' THEN

IF ENA = '1' THEN CQI <= CQI + 1;

END IF;

END IF;

OUTY <= CQI ;

END PROCESS P_REG ; --进位输出

COUT<=CQI(0) AND CQI(1) AND CQI(2) AND CQI(3); END behav;

仿真图

四位十进制频率计

(2)扫描仪模块

四位十进制频率计

--seltime

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

use ieee.std_logic_arith.all;

entity seltime is

port(

clk1,reset:in std_logic;

D1,D2,D3,D4:in std_logic_vector(3 downto 0);

daout:out std_logic_vector(3 downto 0);

sel:out std_logic_vector(2 downto 0));

end seltime;

architecture fun of seltime is

signal count:std_logic_vector(2 downto 0);

begin

sel<=count;

process(clk1,reset)

begin

if(reset='0')then

count<="000";

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

if(count>="011")then

count<="000";

else

count<=count+1;

end if;

end if;

case count is

when"000"=>daout<=D1;

when"001"=>daout<=D2;

when"010"=>daout<=D3;

when"011"=>daout<=D4;

when others=>NULL;

end case;

end process;

end fun;

仿真图

四位十进制频率计

(3)、四位锁存

四位十进制频率计

library ieee;

use ieee.std_logic_1164.all;

entity reg4b is

port ( load : 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(load, din)

begin

if load'event and load = '1' then dout <= din;

end if;

end process;

end behav;

仿真图

四位十进制频率计

(4)、测频控制器

四位十进制频率计

library ieee; -

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity testctl is

port ( clkk : in std_logic;

cnt_en,rst_cnt,load : out std_logic); end testctl;

architecture behav of testctl is

signal div2clk : std_logic;

begin

process( clkk )

begin

if clkk'event and clkk = '1' then 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;

仿真图

四位十进制频率计

(5)、七段数码显示

四位十进制频率计

--deled 模块

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity deled is

port(num:in std_logic_vector(3 downto 0);

led:out std_logic_vector(6 downto 0)); end deled;

architecture fun of deled is

begin

led<="1111110"when num="0000"else

"0110000"when num="0001"else

"1101101"when num="0010"else

"1111001"when num="0011"else

"0110011"when num="0100"else

"1011011"when num="0101"else

"1011111"when num="0110"else

"1110000"when num="0111"else

"1111111"when num="1000"else

"1111011"when num="1001"else

"1110111"when num="1010"else

"0011111"when num="1011"else

"1001110"when num="1100"else

"0111101"when num="1101"else

"1001111"when num="1110"else

"1000111"when num="1111"; end fun;

仿真图

四位十进制频率计

(6)、3_8译码器模块

四位十进制频率计

--decode3-8

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity decode3_8 is

port(sel:in std_logic_vector(2 downto 0);

q:out std_logic_vector(7 downto 0)

);

end decode3_8;

architecture a of decode3_8 is

begin

q<="11111110"when sel=0 else

"11111101"when sel=1 else

"11111011"when sel=2 else

"11110111"when sel=3 else

--"11101111"when sel=4 else

-- "11011111"when sel=5 else

"11111111";

end a;

仿真图

四位十进制频率计

(7)、分频器模块

四位十进制频率计

--div_clk1

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all; entity div_clk1 is

port(clk_in:in std_logic;

div_out:out std_logic;

div_clk2:out std_logic

);

end div_clk1;

architecture a of div_clk1 is

signal fre_n:integer range 0 to 100000; signal clk_tmp:std_logic;

signal fre_n1:integer range 0 to 125; signal clk_tmp1:std_logic;

begin

div_out<=clk_tmp;

process(clk_in)

begin

if falling_edge(clk_in)then

if fre_n>=99999 then

fre_n<=0;

clk_tmp<=not clk_tmp;

else

fre_n<=fre_n+1;

end if;

end if;

end process;

div_clk2<=clk_tmp1;

process(clk_tmp)

begin

if falling_edge(clk_tmp)then

if fre_n1>=124 then

fre_n1<=0;

clk_tmp1<=not clk_tmp1;

else

fre_n1<=fre_n1+1;

end if;

end if;

end process;

end a;

仿真图

四位十进制频率计

五、总体设计电路图

5.1顶层电路原理图

四位十进制频率计

5.2总体模块仿真图

四位十进制频率计

5.3 管脚分配图

四位十进制频率计

六、参考文献

1.曹昕燕,周凤臣,聂春燕。EDA技术实验和课程设计。北京:清华大学出版社,2006。

2.潘松,黄继业。EDA技术实用教程(第三版)。北京:科学出版社,2006。

3.谭会生。EDA技术综合应用实例和分析。西安:西安电子科技大学出版社,2004。