您的当前位置:首页正文

FPGA实训报告

2024-04-11 来源:好走旅游网


1.FPGA硬件系统设计

1.1 功能要求

利用所给器件:一个8位拨码开关(见图1-1),排针40×1,芯片DAC0832×1, 芯片LM358×1,一个电位器构成硬件电路,实现与FPGA相连,输出正弦波,三角波,锯齿波,方波。

(图1-1)

1.2 FPGA硬件系统组成(见图1-2)

(图1-2)

FPGA框架结构由三部分组成:

可编程输入/输出模块I/OB (I/O Block)—— I/OB:位于芯片内部四周,主要由逻辑门、触发器和控制单元组成。在内部逻辑阵列与外部芯片封装引脚之间提供一个可编程接口。

可配置逻辑模块CLB (Configurable Logic Block)——CLB:是FPGA的核心阵列,用于

1

构造用户指定的逻辑功能,不同生产厂商的FPGA器件其不同之处主要在核心阵列。每个CLB主要由查找表LUT(Look Up Table)、触发器、数据选择器和控制单元组成。

可编程内部连线PI (Programmable Interconnect) ——PI:位于CLB之间,用于传递信息。编程后形成连线网络,提供CLB之间、CLB与I/OB之间的连线。

1.3 FPGA最小系统简介(见图1-3)

(图1-3)

晶振AS接口复位电源计算机下载电缆接口FPGA / CPLD芯片JTAG接口输出接口输入接口

1.3.1 FPGA最小系统板(见图1-4)

(图1-4)

1.3.2 下载接口

Alter提供常用的编程连接电缆有4种: (1)Byte Blaster配置电缆 (2)Byte Blaster MV配置电缆

(3)Master Blaster/USB配置电缆(USB – Blaster) (4)Bit Blaster配置电缆

2

串口连接时编程电缆选择:可以选择Bit Blaster或Master Blaster配置电缆; 并口连接时编程电缆选择:可以选择Byte Blaster或Byte Blaster MV配置电缆; USB连接时编程电缆选择:选择Master Blaster配置电缆。

Byte Blaster MV配置:下载电缆通过PC机并口将编程数据配置到FPGA中,与PC机并口相连的是25针插头,与PCB板相连的是10针插头。提供APS方式和JTAG方式两种下载方式,APS方式用于Cyclone、APEXⅡ、APEX20K、APE X l K、Mercury、Excalibur、FLEXl0K、FLEX8000和FLEX6000等器件的配置;JTAG方式用于编程或配置含有JTAG接口的芯片。

本次实验验选择APS口(如图1-5)

(图1-5)

1.4 FPGA外围电路设计

1.4.1 拨码开关电路设计(如图1-6)

(图1-6)

3

共有8个开关,K1,K2控制波形(正弦波,三角波,锯齿波,方波),K3~K8控制频率变换。

本实验中开关一端与FPGA相连,另一端与电源相连,但是这样做不安全,会影响FPGA,因而在开关与电源之间接一个电阻,实验中用了一个330*8的排阻,电源脚(1)接+3.3V。每个开关流过电流为3.3 ÷330=10mA 。

1.4.2 DAC0832电路设计

1.4.2.1 DAC0832芯片简介

DAC0832是采用CMOS/Si-Cr工艺实现的8位D/A转换器,转换周期为1μs。 该芯片包含8位输入寄存器、8位DAC寄存器、8位D/A转换器。DAC0832中有两级锁存器,第一级即输入寄存器,第二级即DAC寄存器,可以工作在双缓冲方式下。

1.4.2.2 DAC0832芯片框图与引脚图

(如图1-7)

(图1-7)

引脚特性:

1.D7~D0:8位数据输入端

2.ILE:输入寄存器锁存允许信号

4

3.CS#:芯片选择信号

4.WR1#:输入寄存器写信号 5.XFER#:数据传送信号 6.WR2#:DAC寄存器写信号 7.VREF:基准电压,-10V~+10V 8.Rfb:反馈信号输入端 9.IOUT1:电流输出1端 10.IOUT2:电流输出2端 11.VCC:电源 12.AGND:模拟地 13.DGND:数字地

1.4.2.2 DAC0832的三种工作方式

(如图1-8)

双缓冲 单缓冲 直通

(图1-8)

本实验DAC0832的工作方式为直通。

1.4.2.3 FPGA与DAC0832接口电路原理图

(如图1-9)

5

(图1-9)

分析: D7~D0:与FPGA对应接口相连;CS# 、WR1#、WR2#、 XFER#、AGND、DGND相连接地,构成直通工作方式;VREF、VCC、ILE接+5V;IOUT1,IOUT2分别接运放负端,正端;Rfb加一电位器与运放输出相连,作为输出。

DAC0832是电流型输出器件,因此需要加一个运放,实验中用到LM358。

1.4.3 LM358电路介绍

1.4.3.1

LM358芯片简介

LM358 内部包括有两个独立的、高增益、内部频率补偿的双运算放大器,适合于电源电压范围很宽的单电源使用,也适用于双电源工作模式,在推荐的工作条件下,电源电流与电源电压无关。它的使用范围包括传感放大器、直流增益模块和其他所有可用单电源供电的使用运算放大器的场合。

1.4.3.2 LM358芯片引脚图(如图1-10)

(图1-10)

6

1.4.3.3 LM358的工作方式

LM358内部有2个运算放大器,因此可以使用单运放,也可以使用双运放,本实验中采用单运放。

1.5

硬件电路调试及结果分析

结果如图(1-11)

(图1-11)

分析:设计了一个正弦波,但是调试后发现有非常大的毛刺,之后检查发现时由于相位控制字未锁定造成,后已解决。

2.基于DDS技术的信号发生器设计

2.1 功能要求

利用频率合成技术,使某一(或多个)基准频率,通过一定的变换与处理后,形成一系列等间隔的离散频谱;根据特定公式取点,在QuartusⅡ软件进行仿真,经过USB – Blaster在APS口下载到FPGA板上,再与硬件连接,在示波器观察波形及其参数的过程。

2.2 整体设计

如图(2-1)

7

(图2-1)

2.3 DDS技术的基本原理 2.3.1频率合成技术

频率合成技术:利用频率合成的方法,使某一(或多个)基准频率,通过一定的变换与处理后,形成一系列等间隔的离散频谱。

2.3.2 DDS技术简介

直接数字频率合成器(DDS)是一种基于全数字技术,从相位概念出发直接合成所需波形的一种频率合成技术,它是目前最为典型、应用最广泛的一种频率合成技术。

它工作频率范围很宽;极短的频率转换时间;极高的频率分辨力;有任意波形输出能力;数字调制性能好等优点。

2.3.3 DDS基本结构

如图(2-2)

(图2-2)

8

2.4 程序设计

2.4.1 正弦波产生程序设计及仿真

(1) 程序的功能:实现正弦波输出

(2) 编程方式

用c语言编程,导出1024 个点,形成.mif文件,正弦波的公式为 k1N2B2S outsinB k 1 BAfBB  ,其中 k 1 ksinN k 1   A sin(  1    )  A  22C程序为:#include

#include main( ) {int i; float s;

for(i=0;i<1024;i++)

{s=sin(atan(1)*8*i/1024);

printf(\"%d : %d; \\n\

}

}

(3) 结构图或实体图

如图(2-3)

(图2-3)

9

(4) 仿真波形及分析

如图(2-4)

(图2-4)此图为每个点的数据

具体波形图如图(2-5)

(图2-5)

2.4.2 三角波产生程序设计及仿真 (1) 程序的功能:实现三角波输出 (2) 结构图或实体图

如图(2-6)

10

(图2-6)

(3) 仿真波形及分析

如图(2-7)

此图为每个点的数据(图2-7)

具体波形图如图(2-8)

(图2-8)

2.4.3 锯齿波产生程序设计及仿真 (1) 程序的功能:实现锯齿波输出 (2) 结构图或实体图

如图(2-9)

11

(图2-9)

(3) 仿真波形及分析

如图(2-10)

此图为每个点的数据(图2-10)

具体波形图如图(2-11)

(图2-11)

2.4.4 方波产生程序设计及仿真

(1) 程序的功能:实现方波输出

(2) 编程方式

mif文件手动输入,0,-1……………输入

(3) 结构图或实体图

如图(2-12)

12

(图2-12)

(4) 仿真波形及分析

如图(2-13)

此图为每个点的数据(图2-13)

具体波形图如图(2-14)

(图2-14)

2.4.5 顶层程序设计及仿真

(1) 程序的功能

拨动开关1,2 ,输出四种不同波形,分别为正弦波(K1=0,K2=0),三角波(K1=0,K2=1),锯齿波(K1=1,K2=0),方波(K1=1,K2=1);剩下六个开关控制频率,频率范围为50Hz~3000 Hz,每个开关控制50 Hz频率。

13

(2) 结构图或实体图 如图(2-15)

(图2-15)

(3) VHDL程序及注释 DDS顶层设计

LIBRARY IEEE; --DDS顶层设计 USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY DDS_VHDL IS PORT ( CLK : IN STD_LOGIC;

sel : IN STD_LOGIC_VECTOR(1 DOWNTO 0);

FWORD : IN STD_LOGIC_VECTOR(7 DOWNTO 0); --频率控制字

14

PWORD : IN STD_LOGIC_VECTOR(7 DOWNTO 0); --相位控制字 FOUT : OUT STD_LOGIC_VECTOR(9 DOWNTO 0) ); END;

ARCHITECTURE one OF DDS_VHDL IS COMPONENT fenpin

PORT ( clk : IN STD_LOGIC; clk1 : OUT STD_LOGIC ); END COMPONENT;

COMPONENT REG10B PORT ( LOAD : IN STD_LOGIC;

DIN : IN STD_LOGIC_VECTOR(9 DOWNTO 0); DOUT : OUT STD_LOGIC_VECTOR(9 DOWNTO 0) ); END COMPONENT;

COMPONENT ADDER10B

PORT ( A : IN STD_LOGIC_VECTOR(9 DOWNTO 0); B : IN STD_LOGIC_VECTOR(9 DOWNTO 0);

S : OUT STD_LOGIC_VECTOR(9 DOWNTO 0) ); END COMPONENT; COMPONENT myrom1

PORT ( address : IN STD_LOGIC_VECTOR(9 DOWNTO 0); clock : IN STD_LOGIC ;

q : OUT STD_LOGIC_VECTOR(9 DOWNTO 0) ); END COMPONENT;

COMPONENT fangbo

PORT ( clock:IN std_logic;--复位信号reset, 时钟信号clk address:in std_logic_vector(9 DOWNTO 0); q:OUT std_logic_vector(9 DOWNTO 0) ); END COMPONENT; COMPONENT juchibo

PORT ( clock:IN std_logic;--复位信号reset, 时钟信号clk address:in std_logic_vector(9 DOWNTO 0); q:OUT std_logic_vector(9 DOWNTO 0)) ; END COMPONENT; COMPONENT sanjiaobo

PORT ( clock:IN std_logic;--复位信号reset, 时钟信号clk address:in std_logic_vector(9 DOWNTO 0); q:OUT std_logic_vector(9 DOWNTO 0)) ; END COMPONENT; COMPONENT chiose

PORT ( c1,c2,c3,c4:IN std_logic_vector(9 DOWNTO 0);--复位信号reset, 时钟信号clk cho:in std_logic_vector(1 DOWNTO 0);

15

q:OUT std_logic_vector(9 DOWNTO 0) );

END COMPONENT; COMPONENT xuanpin

PORT (clk : IN STD_LOGIC; clk1: OUT STD_LOGIC;

f1 : in STD_LOGIC_VECTOR(7 DOWNTO 0) );

END COMPONENT; COMPONENT sudu

PORT ( clk : IN STD_LOGIC;

out1 : OUT STD_LOGIC_VECTOR(9 DOWNTO 0) );

END COMPONENT;

SIGNAL F10B: STD_LOGIC_VECTOR(9 DOWNTO 0); SIGNAL D10B: STD_LOGIC_VECTOR(9 DOWNTO 0); SIGNAL DIN10B: STD_LOGIC_VECTOR(9 DOWNTO 0); SIGNAL P10B : STD_LOGIC_VECTOR( 9 DOWNTO 0); SIGNAL LIN10B : STD_LOGIC_VECTOR( 9 DOWNTO 0); SIGNAL SIN10B : STD_LOGIC_VECTOR( 9 DOWNTO 0); SIGNAL cc1 : STD_LOGIC_VECTOR( 9 DOWNTO 0); SIGNAL cc2 : STD_LOGIC_VECTOR( 9 DOWNTO 0); SIGNAL cc3 : STD_LOGIC_VECTOR( 9 DOWNTO 0); SIGNAL cc4 : STD_LOGIC_VECTOR( 9 DOWNTO 0); SIGNAL clk11 : STD_LOGIC; SIGNAL clk12 : STD_LOGIC;

SIGNAL out11: STD_LOGIC_VECTOR( 9 DOWNTO 0); BEGIN

F10B( 9 DOWNTO 8)<=\"00\" ; F10B( 7 DOWNTO 0)<=FWORD ; P10B( 1 DOWNTO 0)<=\"00\" ; P10B( 9 DOWNTO 2)<=PWORD ;

u1 : ADDER10B PORT MAP( A=>F10B,B=>D10B, S=>DIN10B );

u2 : REG10B PORT MAP( DOUT=>D10B,DIN=> DIN10B, LOAD=>clk11 ); u3 : myrom1 PORT MAP( address=>SIN10B, q=>cc1, clock=>clk11); u4 : ADDER10B PORT MAP( A=>P10B,B=>D10B,S=>LIN10B );

u5 : REG10B PORT MAP( DOUT=>SIN10B,DIN=>LIN10B, LOAD=>clk11 ); u6 : sanjiaobo PORT MAP( address=>out11,q=>cc2, clock=>clk11 ); u7 : fangbo PORT MAP( address=>out11,q=>cc3, clock=>clk11 ); u8 : juchibo PORT MAP( address=>out11,q=>cc4, clock=>clk11 );

u9 : chiose PORT MAP( c1=>cc1,c2=>cc2,c3=>cc3,c4=>cc4,cho=>sel,q=>FOUT); u10: fenpin PORT MAP(clk=>CLK,clk1=>clk11);

u11: xuanpin PORT MAP(clk=>CLK,clk1=>clk12,f1=>FWORD);

16

u12: sudu PORT MAP(clk=>clk12,out1=>out11); END;

*附1.LIBRARY IEEE; --10位加法器模块

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY ADDER10B IS

PORT (A,B : IN STD_LOGIC_VECTOR(9 DOWNTO 0);

S : OUT STD_LOGIC_VECTOR(9 DOWNTO 0) ); END ADDER10B;

ARCHITECTURE behav OF ADDER10B IS BEGIN S <= A + B; END behav;

*附2.LIBRARY IEEE; --10位寄存器模块

USE IEEE.STD_LOGIC_1164.ALL; ENTITY REG10B IS

PORT ( Load : IN STD_LOGIC;

DIN : IN STD_LOGIC_VECTOR(9 DOWNTO 0); DOUT : OUT STD_LOGIC_VECTOR(9 DOWNTO 0) ); END REG10B;

ARCHITECTURE behav OF REG10B IS BEGIN

PROCESS(Load, DIN) BEGIN

IF Load'EVENT AND Load = '1' THEN DOUT <= DIN; END IF; END PROCESS; END behav;

*附3.LIBRARY IEEE; --32位加法器模块

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY ADDER32B IS

PORT (A,B : IN STD_LOGIC_VECTOR(31 DOWNTO 0);

S : OUT STD_LOGIC_VECTOR(31 DOWNTO 0) ); END ADDER32B;

ARCHITECTURE behav OF ADDER32B IS

17

BEGIN S <= A + B; END behav;

*附4. LIBRARY IEEE; --32位寄存器模块

USE IEEE.STD_LOGIC_1164.ALL; ENTITY REG32B IS

PORT ( Load : IN STD_LOGIC;

DIN : IN STD_LOGIC_VECTOR(31 DOWNTO 0);

DOUT : OUT STD_LOGIC_VECTOR(31 DOWNTO 0) ); END REG32B;

ARCHITECTURE behav OF REG32B IS BEGIN

PROCESS(Load, DIN) BEGIN

IF Load'EVENT AND Load = '1' THEN DOUT <= DIN; END IF; END PROCESS; END behav;

*附5. LIBRARY IEEE; - -分频模块

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY fenpin IS PORT(clk:IN std_logic;

clk1:OUT std_logic);--输出信号q END fenpin;

ARCHITECTURE b OF fenpin IS BEGIN

PROCESS(clk)

VARIABLE tmp:std_logic_vector(8 DOWNTO 0); VARIABLE a:std_logic; BEGIN

if clk'EVENT AND clk='1' THEN

if tmp=500 then tmp:=\"000000000\";a:=not a; else tmp:=tmp+1; end if; end if; clk1<=a;

END PROCESS; END b;

18

*附6. LIBRARY IEEE; - -选频模块

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY xuanpin IS PORT ( clk : IN STD_LOGIC; clk1: OUT STD_LOGIC;

f1 : in STD_LOGIC_VECTOR(7 DOWNTO 0) ); END;

ARCHITECTURE one OF xuanpin IS signal tmp:std_logic_vector(7 DOWNTO 0); BEGIN

PROCESS(clk)

VARIABLE clk11: std_logic; begin

if clk'event and clk='1' then

if tmp=\"11111111\" then tmp<=\"00000000\"; else tmp<=tmp+1;

if f1=\"00000001\" then clk11:=tmp(0); elsif f1=\"00000010\" then clk11:=tmp(1); elsif f1=\"00000100\" then clk11:=tmp(2); elsif f1=\"00001000\" then clk11:=tmp(3); elsif f1=\"00010000\" then clk11:=tmp(4); elsif f1=\"00100000\" then clk11:=tmp(5); elsif f1=\"01000000\" then clk11:=tmp(6); elsif f1=\"10000000\" then clk11:=tmp(7); end if; end if; end if;

clk1<=clk11; end process; end one;

*附7. LIBRARY IEEE; - -选择模块

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY chiose IS

PORT(c1,c2,c3,c4:IN std_logic_vector(9 DOWNTO 0);--复位信号reset,cho:in std_logic_vector(1 DOWNTO 0);

q:OUT std_logic_vector(9 DOWNTO 0));--输出信号q END chiose;

19

时钟信号clk

ARCHITECTURE b OF chiose IS begin

q<= c1 when cho=0 else c2 when cho=1 else c3 when cho=2 else c4 ; end b;

(4) 仿真波形及分析

1.当sel=00时,如图(2-16),为正弦波。

(图2-16)

2.当sel=01时,如图(2-17),为三角波。

(图2-17)

3.当sel=10时,如图(2-18),为锯齿波。

20

(图2-18)

4..当sel=11时,如图(2-19),为方波。

(图2-19)

2.5 硬件测试及结果分析

硬件与FPGA相连后,将相位字都接地,频率字调整好,1,2开关拨00,出现正弦波;1,2开关拨01,出现三角波;1,2开关拨10,出现锯齿波;1,2开关拨11,出现方波。调整频率字,输出波形有不同频率,频率范围50Hz~3000 Hz。

3.设计分析与总结

3.1 故障分析 故障一

(1) 现象:出现两路波形 (2) 如图(2-20)

(图2-20)

21

(3) 原因分析 编写程序时分频过小。 故障二: (1)现象:

当放大波形时,发现波是一个个断点 (2)原因分析

硬件焊接问题,焊点不好,改进之后,问题解决。

3.2功能分析

硬件与FPGA相连后,将相位字都接地,频率字调整好,1,2开关拨00,出现正弦波;1,2开关拨01,出现三角波;1,2开关拨10,出现锯齿波;1,2开关拨11,出现方波。调整频率字,输出波形有不同频率,频率范围50Hz~3000 Hz。 拓展功能:还能输出载波。 3.3 设计总结及感想

体会:

(1) (2) (3) (4)

做事情前先确认目标。分析可行的方案。

做事情要从小做起,简单做起,起点不要高,但是终点可以高 遇到问题要虚心请教,团队,同学,老师都是我们的资源。

通过此次的设计使我更加了解了FPGA的硬件特性与软件开发工具QuartusII的使用并且掌握了DDS函数信号发生器的原理。

22

因篇幅问题不能全部显示,请点此查看更多更全内容