eda课程设计EDA课程设计实验报告.docx
- 文档编号:6667778
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:17
- 大小:147.05KB
eda课程设计EDA课程设计实验报告.docx
《eda课程设计EDA课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《eda课程设计EDA课程设计实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
eda课程设计EDA课程设计实验报告
装
订
线
EDA课程设计实验报告
学院信息工程学院
专业通信工程
学号
姓名
任课教师
2013年10月30日
一、FPGA简介
随着基于FPGA的EDA技术的发展和应用领域的扩大与深入,EDA技术在电子信息、通信、自动控制及计算机等领域的重要性日益突出。
作为一个学通信工程专业的学生,我们必须不断地去了解更多的新产品信息,这就更加要求我们对EDA有个全面的认识。
信号发生器在我们的日常中有很重要的应用,用VHDL语言去实现设计将会使我们对本学科知识可以更好地掌握。
本设计是一个基于VHDL的采用自顶向下设计方法实现的信号发生器,该设计方法具有外围电路简单,程序修改灵活和调试容易等特点,并通过计算机仿真证明了设计的正确性。
二、题目分析
要求设计一个函数发生器,该函数发生器能够产生递增斜波、递减斜波、方波、三角波、正弦波、及阶梯波,并且可以通过选择开关选择相应的波形输出;系统具有复位的功能;通过按键确定输出的波形及确定是否输出波形。
FPGA是整个系统的核心,构成系统控制器,波形数据生成器,加法器,运算/译码等功能。
通过以上分析设计要求完成的功能,确定函数发生器可由递增斜波产生模块、递减斜波产生模块、三角波产生模块、阶梯波产生模块、正弦波产生模块、方波产生模块和输出波形选择模块组成,以及按键复位控制和时钟输入。
由此可确定系统的总体原理框图为:
波形发生模块
时钟
clk
复位
reset
波形输出选择模块
三、方案选择
1、波形函数发生方案对比选择
波形函数发生是本设计的最重要的部分,实现函数发生的途径也有很多,因此必须选择一种易于实现且精度高的方案,以此来提高本设计的实用性。
本信号发生器利用在系统编程技术和FPGA芯片产生。
用VHDL语言编写程序,调试成功后下载至实验装置的芯片上,再利用外接D/A转换电路实现以上设计功能。
此种方案完全可以生成设计要求的6种波形,而且通过软件仿真可以直观的观测的输出的波形参数,方便调试和更改波形参数,外围电路简单,减少器件损耗,精度高。
2、波形函数输出控制方式选择
利用VHDL语言写出数据选择器,然后每种函数发生器的输出和数据选择器输入相连接,通过控制开关选择对应的波形输出。
方案二完全可以得到方案一的设计要求,而且只需一个D/A转换器就可以。
电路不需要外部搭建,节约成本且控制简单方便。
在实验课时候已经完成8选1数据选择器的设计制作,因此本次设计可以直接调用。
此方案设计简便、节约制作元件和成本、控制简便等优点,因此作为波形函数输出控制方式。
四、系统细化框图
通过以上各个模块的分析最终确定函数信号发生器系统的最终整体的原理框图为:
波形选择模块
递增斜波模块
递减斜波模块
三角波模块
阶梯波模块
正弦波模块
方波模块
时钟
clk
复位
reset
波形选择开关
D/A转换器
系统时钟输入后,通过复位开关选择是否产生波形,当各个模块产生相应的信号波形后,通过波形选择模块波形选择开关选泽输出不同的波形,再通过D/A转换器转换,就可以把数字信号(由FPGA输出)变成了相应模拟的信号波形。
整个系统设计的核心就是FPGA部分。
五、各模块程序设计及仿真
根据自上而下的思路进行项目设计。
明确每个模块的功能以后,开始编写各个模块的程序。
1、递增斜波模块
递增斜波icrs的VHDL程序如附录所示,其中clk是输入时钟端口,reset为输入复位端口,q为八位二进制输出端口。
图1递增斜波模块仿真图
程序设计的当复位信号为0时,输出为0,无对应的波形产生。
当复位信号为1时,每当检测到时钟上升沿时,计数器值加1,当增加到最大后清零。
计数值增加呈现线性关系,因此输出的波形是递增的斜波。
从仿真波形图也能看出这种变化规律。
模块程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYicrsIS
PORT(clk,reset:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDicrs;
ARCHITECTUREbehaveOFicrsIS
BEGIN
PROCESS(clk,reset)
VARIABLEtmp:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
IFreset='0'THEN
tmp:
="00000000";--复位信号清零
ELSIFclk'EVENTANDclk='1'THEN
IFtmp="11111111"THEN
tmp:
="00000000";--递增到最大值清零
ELSE
tmp:
=tmp+1;--递增运算
ENDIF;
ENDIF;
q<=tmp;
ENDPROCESS;
ENDbehave;
2、递减斜波模块
递减斜波dcrs的VHDL程序如附录所示,其中clk是输入时钟端口,reset为输入复位端口,q为八位二进制输出端口。
图2递减斜波模块仿真图
程序设计的是复位信号为0时输出为0,无对应的波形产生。
当复位信号为1时,当每当检测到时钟上升沿时,计数值减1,当减到0后赋值到最大。
计数值减少呈现线性关系,因此输出的波形是递减的斜波。
从仿真波形图也能看出这种变化规律。
模块程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYdcrsIS
PORT(clk,reset:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDdcrs;
ARCHITECTUREbehaveOFdcrsIS
BEGIN
PROCESS(clk,reset)
VARIABLEtmp:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
IFreset='0'THEN
tmp:
="11111111";--复位信号置最大值
ELSIFclk'EVENTANDclk='1'THEN--检测时钟上升沿
IFtmp="00000000"THEN
tmp:
="11111111";--递减到0置最大值
ELSE
tmp:
=tmp-1;--递减运算
ENDIF;
ENDIF;
q<=tmp;
ENDPROCESS;
ENDbehave;
3、三角波模块
三角波波delat的VHDL程序如附录所示,其中clk是输入时钟端口,reset为输入复位端口,q为八位二进制输出端口。
三角波波形是对称的,每边呈线形变化,所以可以根据数据做简单运算,就可以得到三角波。
图3三角波模块仿真图
程序设计的是reset复位信号为0时输出为0,无对应的波形产生。
当复位信号为1时,当每当检测到时钟上升沿时,当计数的数据不是最大值时,数值做递增运算,当增大到最大时,然后再做递减运算,因此输出的波形便呈现出三角波的形状。
从仿真波形图也能看出这种变化规律。
模块程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYdeltaIS
PORT(clk,reset:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
enddelta;
ARCHITECTUREbehaveOFdeltaIS
BEGIN
PROCESS(clk,reset)
VARIABLEtmp:
STD_LOGIC_VECTOR(7DOWNTO0);
VARIABLEa:
STD_LOGIC;
BEGIN
IFreset='0'THEN
tmp:
="00000000";--复位信号为0,置最小值
ELSIFclk'EVENTANDclk='1'THEN--检测时钟上升沿
IFa='0'THEN
IFtmp="11111110"THEN
tmp:
="11111111";--置最大值
a:
='1';
ELSE--不是最大值时递增
tmp:
=tmp+1;--递增运算
ENDIF;
ELSE
IFtmp="00000001"THEN
tmp:
="00000000";--置最小值
a:
='0';
ELSE--a为1时,执行递减运算
tmp:
=tmp-1;--递减运算
ENDIF;
ENDIF;
ENDIF;
q<=tmp;
ENDPROCESS;
ENDbehave;
4、阶梯波模块
阶梯波ladder的VHDL程序如附录所示,其中clk是输入时钟端口,reset为输入复位端口,q为八位二进制输出端口。
阶梯波设计的是数据的递增是以一定的阶梯常数向上增加,所以输出的波形呈现是成阶梯状的,而不是,完全呈现是直线增长。
模块程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYladderIS
PORT(clk,reset:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDladder;
ARCHITECTUREbehaveOFladderIS
BEGIN
PROCESS(clk,reset)
VARIABLEtmp:
STD_LOGIC_VECTOR(7DOWNTO0);--定义内部变量
VARIABLEa:
STD_LOGIC;
BEGIN
IFreset='0'THEN
tmp:
="00000000";--复位信号为0,置最小值
ELSIFclk'EVENTANDclk='1'THEN--检测时钟上升沿
IFa='0'THEN--判断a数值,计数。
IFtmp="11111111"THEN
tmp:
="00000000";--计数到最大清零
a:
='1';
ELSE
tmp:
=tmp+16;--阶梯常数为16,可修改
a:
='1';
ENDIF;
ELSE
a:
='0';--循环计数
ENDIF;
ENDIF;
q<=tmp;
ENDPROCESS;
ENDbehave;
5、正弦波模块
正弦波模块由三个部分组成:
6位地址发生器、正弦信号数据ROM和原理图顶层设计文件。
结构图如下图所示:
8位波形数据输出
上图所示的信号发生结构中图中,顶层文件sin.bdf在FPGA中实现,包含两个部分:
ROM的地址信号发生器,由6位计数器担任;一个正弦数据ROM,由LPM_ROM模块构成,6位地址线,8位数据线,一个周期含有64个8位数据。
LPM_ROM底层是FPGA中的EAB、ESB或M4K等模块。
地址发生器的时钟CLK的输入频率F0与每周期的波形数据点数以及D/A输出频率F的关系是:
F=F0/64。
正弦波产生原理:
通过循环不断地从波形数据ROM文件中依次读取正弦波一个周期在时域上64个采样点的波形数据送入波形DAC,从而产生正弦波。
正弦波的频率取决于读取数据的速度。
图5-1正弦波模块仿真图
图5-2顶层文件原理图sin.bdf
波形数据ROM文件sin_rom.vhd如下:
LIBRARYieee;
USEieee.std_logic_1164.all;
LIBRARYaltera_mf;
USEaltera_mf.all;--使用宏功能库中的所有元件
ENTITYsin_romIS
PORT
(
address:
INSTD_LOGIC_VECTOR(5DOWNTO0);
inclock:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);
ENDsin_rom;
ARCHITECTURESYNOFsin_romIS
SIGNALsub_wire0:
STD_LOGIC_VECTOR(7DOWNTO0);
COMPONENTaltsyncram--例化altsyncram元件,调用了LPM模块altsyncram
GENERIC(--参数传递语句
address_aclr_a:
STRING;
init_file:
STRING;
intended_device_family:
STRING;--类属参量数据类型定义
lpm_hint:
STRING;
lpm_type:
STRING;
numwords_a:
NATURAL;
operation_mode:
STRING;
outdata_aclr_a:
STRING;
outdata_reg_a:
STRING;
widthad_a:
NATURAL;
width_a:
NATURAL;
width_byteena_a:
NATURAL
);
PORT(
clock0:
INSTD_LOGIC;---altsyncram元件接口声明
address_a:
INSTD_LOGIC_VECTOR(5DOWNTO0);
q_a:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);
ENDCOMPONENT;
BEGIN
q<=sub_wire0(7DOWNTO0);
altsyncram_component:
altsyncram
GENERICMAP(
address_aclr_a=>"NONE",
init_file=>"sin_data.mif",
intended_device_family=>"Cyclone",--参数传递映射
lpm_hint=>"ENABLE_RUNTIME_MOD=NO",
lpm_type=>"altsyncram",
numwords_a=>64,--数据数量64
operation_mode=>"ROM",--LPM模式ROM
outdata_aclr_a=>"NONE",--无异步地址清零
outdata_reg_a=>"UNREGISTERED",--输出无锁存
widthad_a=>6,--地址线宽度6
width_a=>8,--数据线宽度8
width_byteena_a=>1
)
PORTMAP(
clock0=>inclock,
address_a=>address,
q_a=>sub_wire0
);
ENDSYN;
6位地址信号发生器cnt.vhd如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycntis--定义计数器的实体
port(clk:
instd_logic;
clr:
instd_logic;
q:
outstd_logic_vector(5downto0));--6位输出地址线
endcnt;
architecturebhvofcntis
begin
process(clk,clr)
variablecqi:
std_logic_vector(5downto0);--定义内部变量
begin
ifclr='0'thencqi:
=(others=>'0');--计数器异步复位
elsifclk'eventandclk='1'then–检测时钟上升沿
cqi:
=cqi+1;--计数
endif;
q<=cqi;--赋值,输出
endprocess;
endbhv;
ENDSYN;
6、方波模块
方波模块的square的VHDL程序描述如下:
其中clk为输入时钟端口,clr为输入复位端口,q为整数输出端口。
图6方波模块仿真图
方波模块的设计是当内部计数cnt达到64时,根据输出标志a的数值输出对应的数值,当a=0输出0,也即是方波周期中的低电平,当a=1,输出255,也即是方波周期中的高电平。
连续的输出便成了观测到的方波波形。
模块程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYsquareIS
PORT(clk,clr:
INSTD_LOGIC;
q:
OUTINTEGERRANGE0TO255);
ENDsquare;
ARCHITECTUREbehaveOFsquareIS
SIGNALa:
BIT;
BEGIN
PROCESS(clk,clr)
VARIABLEcnt:
INTEGER;--定义内部整数变量
BEGIN
IFclr='0'THEN
a<='0';
ELSIFclk'EVENTANDclk='1'THEN--检测时钟上升沿
IFcnt<63THEN--计数64个点
cnt:
=cnt+1;--计数
ELSE
cnt:
=0;--当计数的值大于64时,清零。
a<=NOTa;--对内部a变量取反,a变化已启动进程ENDPROCESS;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(clk,a)
BEGIN
IFclk'EVENTANDclk='1'THEN
IFa='1'THEN
q<=255;--a=1,--输出一个波形周期内的高电平
ELSE
q<=0;--a=0,--输出一个波形周期的低电平。
ENDIF;
ENDIF;
ENDPROCESS;
ENDbehave;
7、输出波形选择模块
波形选择模块是一个设计位6选1的数据选择器,其中sel为波形数据选择端口,d0~d5为8位二进制输入端口,q为8位二进制输出端口。
该模块可以根据外部开关的状态选择相应的波形输出。
其选择VHDL程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYch61aIS
PORT(sel:
INSTD_LOGIC_VECTOR(2DOWNTO0);
d0,d1,d2,d3,d4,d5:
INSTD_LOGIC_VECTOR(7DOWNTO0);
q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDch61a;
ARCHITECTUREbehaveOFch61aIS
BEGIN
PROCESS(sel)
BEGIN
CASEselIS
WHEN"000"=>q<=d0;--递增波形输出
WHEN"001"=>q<=d1;--递减波形输出
WHEN"010"=>q<=d2;--三角波形输出
WHEN"011"=>q<=d3;--阶梯波形输出
WHEN"100"=>q<=d4;--正弦波形输出
WHEN"101"=>q<=d5;--方波输出
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
ENDbehave;
WHENOTHERS=>NULL;
六、系统联调测试分析
通过以上各个模块的细化和分析,最终在Quartus‖中完成了整个系统的联合调试,并通过嵌入式逻辑分析的方法回读输出信号的波形符合设计的要求。
调试整个系统了原理图如下图所示:
1.调试的结果如下:
(复位信号reset高电平,低电平为不输出)
(1)第一次sel选择值设为0,输出为递增波,从图中可以看出,输出的波形成线性递增,结果正确。
(2)第二次sel选择值设为1,输出为递减波,从图中可以看出,输出的波形成线性递减,结果正确。
(3)第三次sel的值设为2,输出为三角波,其仿真波形如下图所示,输出波形线性增大到最大后,再线性减小。
(4)第四次sel的值设为3,其输出的波形是阶梯波,其仿真波形见下图,波形递增常数为16,结果正确。
(5)第五次sel的值设为4,其输出的波形是正弦波,从图中可以看出,输出的数据的变化规律是正弦规律。
(6)第六次sel的值设为5,其输出的波形是方波,从图中仿真的结果可以看出,输出的波形变化规律是按方波规律周期性变化的。
(7)当设置为其他值时无波形输出
七、设计结论
本设计以函数信号发生器的功能为设计对象,运用EDA技术的设计方法,进行各种波形的输入设计、设计处理和器件编程。
在VHDL语言的编写中按照语言描述规范,实现了几种波形的软件设计和具体逻辑元件结构的硬件映射。
结合FPGA的开发集成环境Quartus2软件,产生了函数信号发生器的各种信号,同时完成了时序和功能仿真。
实验表明采用该方法能准确的产生三角波、阶梯波、正弦波等设计产生的波形,实现了信号发生器的功能。
本设计的函数信号发生器在设计上由于设计时考虑的不够全面虽然完成了函数信号的产生,但不够完善。
要做成完整实用的信号源还应考虑设计包含的功能有:
(1)用键盘输入编辑生成上述6种波形(同周期)的线性组合波形;
(2)具有波形存储功能;
(3)输出波形的频率范围可调,频率步进;
(4)输出波形幅度可调,步进调整;
(5)具有显示输出波形的类型、重复频率(周期)和幅度的功能;
(6)用键盘或其他输入装置产生任意波形;
(7)波形占空比可调等。
八、心得体会
一个学期的EDA学习,使我获益良多。
在这期间学习了EDA的基本知识、常用的EDA的工具Quartus2的使用方法、对大规模可编程器件的结构和工作原理也有了一定的了解;掌握了原理图和VHDL输入的基本设计方法;对VHDL语言的语法结构、编程结构也都有了一定的掌握;结合实验课学会了编程下载和硬件测试等内容;对Quartus2软件的嵌入式逻辑分析仪的使用和宏功能模块的调用也掌握了一些基本的操作;配合着实验课初步学会了自顶向下的设计方法,明白了如何用这种方法去实现一个系统的设计。
但这些内容掌握的程度还不深入,要想能够融会贯通必须用更多的时间去深入学习。
这些内容的学习,增强了
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- eda 课程设计 实验 报告