基于FPGA的脉冲信号发生器与数字频率计设计 - 图文

更新时间:2024-05-16 08:50:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于FPGA的脉冲信号发生器与数字频率计设计

摘要:简单介绍了基于FPGA的脉冲信号发生器的设计。通过对系统进行结构分析,采用层次化的设计方法,给出了脉冲信号发生器与数字频率计的VHDL代码,利用Quartus II对其进行了仿真,并在硬件电路上得以实现其逻辑功能。

关键词:FPGA;Quartus II;脉冲信号发生器

Design of pulse generator and cymometer based on FPGA

Gaoyuanli、Cenjianfeng、Wanghonggang(Department of electronic and information engineering,NCIAE,langfang,hebei)

Abstract:This paper introduces the design of the pulse generator and cymometer based on FPGA.By analyzing the system structuer,provides the program of signal generator with VHDL using the hierarchical design method and gives the simulation results of Quartus II. Key words: FPGA;Quartus II;pulse generator

引言:

信号发生器是一种常用的信号源,广泛应用于通信、雷达、测控、电子对抗以及现代化仪器仪表等领域,是一种为电子测量工作提供符合严格技术要求的电信号设备。它与示波器、万用表、频谱分析仪等仪器一样是最普通、最基本也是应用最广泛的电子仪器之一,几乎所有电参量的测量都要用到信号发生器。

随着EDA技术的高速发展,电子系统设计技术和工具发生了深刻的变化,大规模可编程逻辑器件FPGA的出现,给设计人员带来了诸多的方便。VHDL(即超高速集成电路硬件描述语言)是随着可编程逻辑器件(PLD)发展起来的一种硬件描述语言,主要用于描述数字系统的结构、行为、功能和接口,是电子设计自动化(EDA)的关键技术之一。它采用一种自上而下的设计方法,即从系统总体要求出发进行设计。本文介绍了以ALTERA公司的FPGA芯片EP2C5Q208C8N作为主芯片控制核心,设计一个简单的脉冲信号发生器,其脉冲频率、相位、占空比等均可调,并将频率值通过7段数码管进行输出。本课题采用VHDL语言设计脉冲信号发生器以及数字频率计。

1、 脉冲信号发生器系统组成

信号发生器系统组成如图1所示,由一分频模块与占空比调节模块共同组成。

设计原理:将输入的时钟作为计数器的计数脉冲,计数结果的第N位是2的N次幂分频。将对应的为数取出就能得到所需的频率。 二进制分频器的VHDL代码: library ieee;

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

entity clk_div_vhdl is generic(N:integer:=10); port(clk:in std_logic;

architecture a of clk_div_vhdl is signal count:integer range N-1 downto 0; begin

process(clk)begin

if rising_edge(clk)then

if(count=N-1)then count<=0; else count<=count+1; end if;

clk_div:out std_logic); end;

end if;

end process; process(count)begin

图1 脉冲信号发生器系统组成

在时钟的整数分频中,时钟的二进制分频最简单。对于二进制分频,可以用一个二进制加法计数器十分方便的完成

if count<(integer(N/2))then

clk_div<='0'; else clk_div<='1';

end if; end process;

end;

占空比调节模块的设计原理:首先描述一个计数器电路,然后通过计数电路的并行输出信号来控制输出时钟信号的高低电平持续时间,即可完成这种占空比调节功能。 占空比调整模块的VHDL代码: library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.numeric_std.all; use ieee.std_logic_unsigned.all;

entity duty_adjuse is

generic(m1:integer:=3;n1:integer:=10); port(clkin:in std_logic; clkout:out std_logic); end;

architecture a of duty_adjuse is signal temp:integer range n1 downto 0; begin

process(clkin,temp)begin if rising_edge(clkin)then if temp=n1-1 then temp<=0; else temp<=temp+1;

end if;

end if;

end process;

clkout<='1'when temp

'0';

end;

此脉冲信号发生器系统亦可以由FPGA内置嵌入式锁相环实现,其频率、相位、占空比均可调。与上述VHDL模块相比,具有精度高、可靠性好、操作方便、易于控制等优点,具有一定的实用价值。

图2 采用ALTERA内置嵌入式锁相环设计脉冲信号发生器模块

2、 数字频率计系统组成

数字频率计系统组成如图3所示

图3 数字频率计整体结构

该数字频率计测量频率在1MHz以内,显示4位十进制输出结果。可根据信号频率的大小自动切换量程,量程分3档,最大读数分别为9.999KHz、99.99KHz、999.9KHz。档被测信号频率大于999.9KHz时,数码管提示溢出(显示读数“F”)。

数字频率计总体结构主要包括分频模块、计数模块、锁存器、动态扫描译码显示模块。

数字频率计总体模块的VHDL代码: library ieee;

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

entity counter is port(signal_in,door_in,reset:in std_logic; alarm:out std_logic;

q3,q2,q1,q0:out std_logic_vector(3 downto 0); dangwei:out std_logic_vector(2 downto 0));

end;

architecture a of counter is

signal qout:std_logic_vector(27 downto 0); begin

p1:process(signal_in,door_in)

variable temp:std_logic_vector(27 downto 0); begin

if reset='1'then

temp:=\elsif(rising_edge(signal_in))then if(door_in='1')then if temp(3 downto 0)+\ temp:=temp+\

else

temp:=temp+1; end if;

if temp(7 downto 4)>\

temp:=temp+\

end if;

if temp(11 downto 8)>\

temp:=temp+\ end if;

if temp(15 downto 12)>\

temp:=temp+\ end if;

if temp(19 downto 16)>\

temp:=temp+\ end if;

if temp(23 downto 20)>\

temp:=temp+\ end if;

if temp(27 downto 24)>\

temp:=temp+\ end if;

else temp:=\

end if;

end if; qout<=temp; end process p1;

p2:process(qout,door_in)

variable a3,a2,a1,a0:std_logic_vector(3 downto 0); variable adangwei:std_logic_vector(2 downto 0); begin

if(qout(27 downto 24)/=\alarm<='1'; a3:=\a2:=\a1:=\a0:=\adangwei:=\

elsif(qout(23 downto 20)/=\alarm<='0';

a3:=qout(23 downto 20); a2:=qout(19 downto 16); a1:=qout(15 downto 12); a0:=qout(11 downto 8); adangwei:=\

elsif(qout(19 downto 16)/=\alarm<='0';

a3:=qout(19 downto 16); a2:=qout(15 downto 12);

a1:=qout(11 downto 8); a0:=qout(7 downto 4); adangwei:=\else alarm<='0';

a3:=qout(15 downto 12); a2:=qout(11 downto 8); a1:=qout(7 downto 4); a0:=qout(3 downto 0); adangwei:=\end if;

if (falling_edge(door_in))then q3<=a3; q2<=a2; q1<=a1; q0<=a0;

dangwei<=adangwei; end if;

end process p2; end;

BCD译码模块的VHDL代码: library ieee;

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

entity decoder_bcd_led_seg is port(bcd_in:in std_logic_vector(3 downto 0);

led_seg_out:out std_logic_vector(6 downto 0));

end;

architecture a of decoder_bcd_led_seg is begin

process(bcd_in) begin case bcd_in is--最高位接数码管g,最低位接数码管a。【低电平点亮】

when\输入bcd码0000,将其翻译成0向数码管输出。 when\输入bcd码0001,将其翻译成1向数码管输出。 when\输入bcd码0010,将其翻译成2向数码管输出。 when\输入bcd码0011,将其翻译成3向数码管输出。 when\输入bcd码0100,将其翻译成4向数码管输出。

when\输入bcd码0101,将其翻译成5向数码管输出。

when\输入bcd码0110,将其翻译成6向数码管输出。 when\输入bcd码0111,将其翻译成7向数码管输出。 when\输入bcd码1000,将其翻译成8向数码管输出。 when others=>led_seg_out<=\输入bcd码其他,将其翻译成9向数码管输出。

end case;

end process; end;

动态扫描模块的VHDL代码: library ieee;

use ieee.std_logic_1164.all; entity decoder3_8_led_driver_dig is port(counter_in:in std_logic_vector(2 downto 0); led_dig_out:out std_logic_vector(7 downto 0));

end;

architecture a of decoder3_8_led_driver_dig is begin

process(counter_in) begin case counter_in is

when\初始状态从千万位开始扫描

when\数码管段码dig、位码seg都是低电平点亮

when\ when\ when\ when\ when\

when\一直扫描到个位,完成一次扫描

end case;

end process; end;

小数点译码控制显示模块VHDL代码: library ieee;

use ieee.std_logic_1164.all;

entity decoder_radix_point_control is port(M8_counter_in:in std_logic_vector(2 downto 0); radix_point_control_in:in std_logic_vector(2 downto 0);

radix_point_out:out std_logic);

end;

architecture a of decoder_radix_point_control is begin

process(radix_point_control_in,M8_counter_in) begin case (M8_counter_in)&(radix_point_control_in) is

when\【M8计数器输出

000时,扫描千万位的数码管】控制千万位小数点的亮或灭,0为亮,1为灭

when\【M8计数器输出001时,扫描百万位的数码管】控制百万位小数点的亮或灭,0为亮,1为灭 when\ when\ when\ when\ when\

when\控制个位小数点的亮或灭,0为亮,1为灭

when others=>radix_point_out<='1';

end case;

end process; end;

library ieee;

use ieee.std_logic_1164.all; entity decoder3_8_led_driver_dig is port(counter_in:in std_logic_vector(2 downto 0); led_dig_out:out std_logic_vector(7 downto 0));

end;

3.硬件仿真结果

经过下载运行,该系统模块能够完成事先设计的逻辑功能。图示为产生两路1KHz占空比分别是30%和70%的脉冲信号。频率值在数码管上显示为1.000KHz。

4.参考文献

[1]《EDA技术实用教程——VHDL版》潘松、黄继业,科学出版社,2010.

[2]《FPGA应用开发与典型实例》姚远、李辰,人民邮电出版社,2010.

[3]《基于ALTERA FPGA/CPLD的电子系统设计及工程实践》李学海,人民邮电出版社,2009.

本文来源:https://www.bwwdw.com/article/d3k7.html

Top