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文件,正弦波的公式为 k1N2B2S outsinB k 1 BAfBB ,其中 k 1 ksinN k 1 A sin( 1 ) A 22C程序为:#include #include 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 因篇幅问题不能全部显示,请点此查看更多更全内容