微机原理综合实验报告_nexys4_简易数字信号发生器_HUST_华中科技大学_第1页
微机原理综合实验报告_nexys4_简易数字信号发生器_HUST_华中科技大学_第2页
微机原理综合实验报告_nexys4_简易数字信号发生器_HUST_华中科技大学_第3页
微机原理综合实验报告_nexys4_简易数字信号发生器_HUST_华中科技大学_第4页
微机原理综合实验报告_nexys4_简易数字信号发生器_HUST_华中科技大学_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、微机原理综合项目报告基于nexys4简易数字信号发生器 班 级: 通信1301班学 号: HUST 姓 名: 华中科技大学 指导老师: 左冬红 罗 杰 目录一、项目简介 .11.设计思路12.任务分配13.功能描述.1二、项目构成及概要设计21. 硬件模块构成.22. 软件实现流程.2三、项目详细设计.41.硬件的内部构成.42.硬件平台的搭建.93. 软件模块的构成及其实现13 波形产生模块.13 频率调节模块.15 幅度调节模块.16 方波占空比调节模块.16四、 项目操作说明18五、 附录19六、 心得体会及建议201、 项目简介1.设计思路 本次项目我们小组选择的是信号发生器,由于之前

2、做过D/A显示锯齿波的实验,便想到在该实验的基础上进行功能的扩充,这样思路比较清晰。首先我们想到在上次实验的基础上加上方波、三角波和正弦波这几种常见波形,实现起来也与锯齿波较为类似,只是在正弦波的显示上花了点功夫,最后决定通过MATLAB取值来实现,最后能正常显示。而几种波形的切换我们则想到了开关,通过添加开关的GPIO核来获取开关的状态,预留了三位用于波形的切换。仅仅几种波形的显示是远不够的,所以我们决定添加频率的调节和幅度的调节部分,实现时发现幅度调节容易实现但频率调节有些难度,最后从代码产生波形的原理上来分析想到通过改变取样的次数来调节频率的增减,而选择用一位开关用于切换频率增加和减小,

3、这样会节省资源。 当添加了方波后又发现其占空比也应该实现调节的功能,想到通过开发板上的按钮来实现,通过建立按钮的中断控制,来调节时间延时的增减,从而控制占空比的实现。 当实现了MATLAB取数进行正弦波的显示时,小组一位成员提出显示心形的设计想法,通过类似的思路也得到了实现。 具体的设计原理及流程后面会有详细说明。2.任务分配 小组成员、贡献比例及具体分工: 1硬件平台的搭建,软件代码的实现以及各功能的设计 2心形显示的提出和设计,正弦波MATLAB取值的实现 3项目整体框图的设计和绘制 实验报告、PPT以及视频的拍制则是由小组成员一起完成。3. 功能描述 该信号发生器工程能显示方波,锯齿波,

4、正弦波,三角波以及“爱心”形状(ch1、ch2分别显示“爱心”上下部分再拼接成完整的“爱心”)。通过开发板按钮能调节各个波形的频率、幅度和方波的占空比,通过led灯能反映开关状态,通过数码管能反映当前显示的波形序号。 Switch<2>-Switch<0>:选择波形 Switch<8>-Switch<3>:调节频率 Switch<9>:控制频率增加和减小 Switch<15>-Switch<10>:调节幅度 BTNU:增加占空比 BTND:减小占空比192、 项目构成及概要设计1. 硬件模块构成 本项目用到的硬

5、件平台包括SPI IP核与D/A芯片构成数据的传输和数模转换的功能,4个GPIO IP核分别用于开关状态的读取,按钮状态的读取,LED灯的显示,数码管的段选和位选。一个INTC IP核用于接受来自于SPI和按钮的GPIO的中断,并将中断发送给microblaze核来控制。 硬件整体框图:2. 软件实现流程 配置好各GPIO、SPI和INTC中断控制器的连接,初始化各个模块并进行设置,读取开关的状态并写入LED灯的GPIO来控制其显示获取波形选择、频率调节和幅度调节的信息根据波形选择信息来显示相应的波形并通过数码管显示波形对应的序号调节波形的频率和幅度当为方波时,可通过按钮来调节方波的占空比各种

6、波形的具体实现。 流程图:3、 项目详细设计1. 硬件的内部构成 SPI IP核内部框图:接口寄存器定义:SPICR寄存器各位的含义如下:SPISR寄存器各位的含义如下:SPISSR寄存器各位的含义如下: SPISSR寄存器bit0bitn-1分别对应控制SS(0n-1)的输出IPISR寄存器各位的含义如下: DA芯片DAC121S101S是12位D/A转换芯片,可以采用SPI串行接口进行数据输入,其引脚定义和结构图如下图所示:其工作原理可以描述为:串行接口模块按照一定的时序将串行数据采样送到输入移位寄存器;移位寄存器将串行数据转换为并行数据将一部分并行数据(低12位)送入12位D/A转换寄存

7、器,另一部分送入电源下拉控制逻辑。 12位D/A转换寄存器的数据同时送入D/A转换寄存器,将数字信号转换为模拟信号后,再经过输出放大电路以及电源下拉控制逻辑的控制之后输出到Vout。 其中Vout输出的模拟电压范围为0VA。其中Vout与输入数据D的关系为:Vout= VA(D/4096),D为12位输入的数字量,其取值范围为04095 DAC121S101要求每次传输16位数据,这16位串行数据的含义为:D0D11为12位DA转换的数字量, PD0PD1为电源下拉控制逻辑的输入,控制电源下拉模块的工作方式,改变输出Vout的 GPIO IP核AXI GPIO控制器包括AXI总线接口模块、中断

8、产生逻辑模块以及双通道输入/输出模块。内部框图:GPIO内部寄存器定义如下:寄存器名称偏移地址初始值含义读写操作GPIO_DATA0x00通道1数据寄存器通道1数据GPIO_TRI0x40通道1三态控制寄存器写控制通道1传输方向GPIO2_DATA0x80通道1数据寄存器通道2数据GPIO2_TRI0xC0通道1三态控制寄存器写控制通道1传输方向GPIO_TRI的各位分别控制GPIO_DATA的各位为输入或输出:当GPIO_TRI某位为0时,GPIO相应的I/O引脚配置为输出;当GPIO_TRI某位为1时,GPIO相应的I/O引脚配置为输入。GPIO内部中断相关寄存器:名称偏移地址含义读写操作

9、GIER0x11C全局中断屏蔽寄存器最高位bit31控制GPIO是否输出中断信号IrqIP IER0x128中断屏蔽寄存器控制各个通道是否允许产生中断bit0-通道1;bit1-通道2IP ISR0x120中断状态寄存器各个通道的中断请求状态,写1将清除相应位的中断状态bit0-通道1;bit1-通道2AXI INTC主要包括AXI总线接口模块,INTC从设备接口模块,中断控制器核心模块。其构成原理框图为:寄存器各位的定义如图:2. 硬件平台的搭建 添加SPI IP核,按钮、LED灯、开关和数码管的GPIO核以及中断控制器INTC核,外部连线如图: 各GPIO核、SPI IP核及INTC中断控

10、制器配置如下: 按钮的GPIO配置: 开关的GPIO配置: LED灯的GPIO配置: 数码管的GPIO配置: SPI的配置: 将SPI和按钮的GPIO作为中断源,触发INTC的中断,INTC的配置:得到各模块分配的地址,如图:配置各模块的引脚: 至此已经配置好完整的硬件平台,生成bit流文件并导出到SDK即可进行软件代码的设计。3.软件模块的构成及其实现 波形产生模块 锯齿波:while(Count<4096)value=Count;WriteBuffer0=(u8)(value);WriteBuffer1=(u8)(value>>8)&0x0f;TransferIn

11、Progress=TRUE;XSpi_Transfer(&SpiInstance,WriteBuffer,(void *)0,2);while(TransferInProgress); Count=Count+1;分析:value值每传输一次增加1;当value=4096时令其为0;得到一个锯齿波,循环执行便可显示出锯齿波。方波:for(i=0;i<5000;i+)value=4095;WriteBuffer0=(u8)(value);WriteBuffer1=(u8)(value>>8)&0x0f;TransferInProgress=TRUE;XSpi_T

12、ransfer(&SpiInstance,WriteBuffer,(void *)0,2);while(TransferInProgress);for(i=0;i<5000;i+)value=0;WriteBuffer0=(u8)(value);WriteBuffer1=(u8)(value>>8)&0x0f;TransferInProgress=TRUE;XSpi_Transfer(&SpiInstance,WriteBuffer,(void *)0,2);while(TransferInProgress); 分析:令value=4095即最大值,通

13、过for循环使其维持一段时间,循环执行完成后,令value=0并维持相同的时间,执行完成后重复执行上述步骤,得到完整的方波。三角波:Count=0;while(Count<4096) value=Count;WriteBuffer0=(u8)(value); WriteBuffer1=(u8)(value>>8)&0x0f;TransferInProgress=TRUE;XSpi_Transfer(&SpiInstance,WriteBuffer,(void *)0,2);while(TransferInProgress);Count=Count+1;Coun

14、t=4095;while(Count>=0)value=Count;WriteBuffer0=(u8)(value);WriteBuffer1=(u8)(value>>8)&0x0f;TransferInProgress=TRUE;XSpi_Transfer(&SpiInstance,WriteBuffer,(void *)0,2);while(TransferInProgress);Count=Count-1;分析:首先令Count=0,当其小于4096时让其每次传输后增加1,直至其值超过4096,令其为4095,并在每次传输后减1直至为0,重复执行上述计算

15、,得到三角波。正弦波:Count=0;while(Count<=4000)value=sinCount;WriteBuffer0=(u8)(value);WriteBuffer1=(u8)(value>>8)&0x0f;TransferInProgress=TRUE;XSpi_Transfer(&SpiInstance,WriteBuffer,(void *)0,2);while(TransferInProgress); Count=Count+1;分析:正弦波的产生不同于上述方法,因为正弦波不能直接通过Count的加减简单的实现,故选择通过MATLAB计算的

16、方式得到4000组数据,依次传输得到正弦波。MATLAB取值的具体实现见附录。心形:心形的实现与正弦波的实现类似,同样是通过MATLAB取值,分别得到心形的上下部分,通过示波器两个通道拼接得到完整的心形。具体实现见附录。 频率的调节模块本项目通过开关的switch<8>-switch<3>这6位实现频率的调节,而switch<9>则实现频率增加和减小的选择。具体频率的调节如下,以锯齿波为例:while(Count<4096)for(i=0;i<=defre;i+)value=Count/(mag+1);WriteBuffer0=(u8)(valu

17、e);WriteBuffer1=(u8)(value>>8)&0x0f;TransferInProgress=TRUE;XSpi_Transfer(&SpiInstance,WriteBuffer,(void *)0,2);while(TransferInProgress);Count=Count+1+infre;分析:增加频率是通过Count每次增加的幅度来改变,Count每次增加的幅度越大,取样的周期就越短,频率就会增加。减小频率则是通过重复传输同一个数来实现时间的延时,这样增加了周期,减小了频率。除了方波,其余波形的频率增减均是通过上述方式得到的。方波:for

18、(i=0;i<5000*(1+defre)/(1+infre);i+)value=4095;WriteBuffer0=(u8)(value);WriteBuffer1=(u8)(value>>8)&0x0f;TransferInProgress=TRUE;XSpi_Transfer(&SpiInstance,WriteBuffer,(void *)0,2);while(TransferInProgress);for(i=0;i<5000*(1+defre)/(1+infre);i+)value=0;WriteBuffer0=(u8)(value);Wri

19、teBuffer1=(u8)(value>>8)&0x0f;TransferInProgress=TRUE;XSpi_Transfer(&SpiInstance,WriteBuffer,(void *)0,2);while(TransferInProgress);分析:通过改变延时的时间得到频率的变化。当增加频率时,循环次数减少,周期减少,频率增加;当减小频率时,循环次数增加,周期增加,频率减小。 幅度的调节模块本项目中幅度的调节采用的都是相同的方式,由于D/A新芯片支持的最大电压为3.3V,采用的初始电压也为3.3V,故只能减小电压幅度。以锯齿波为例:while(

20、Count<4096)for(i=0;i<=defre;i+)value=Count/(mag+1);WriteBuffer0=(u8)(value);WriteBuffer1=(u8)(value>>8)&0x0f;TransferInProgress=TRUE;XSpi_Transfer(&SpiInstance,WriteBuffer,(void *)0,2);while(TransferInProgress);Count=Count+1+infre;分析:只需将要传输的值除以电压的衰减值便可实现电压幅度的改变。 方波占空比的调节模块通过按钮来实现

21、占空比的调节,由于按钮需要产生中断来进行控制,需要添加按钮的中断控制及处理程序,并在硬件平台上配置好。将开发板上的BTNU和BTND分别用于占空比的增加和减小,通过以下代码实现:if(state1=0x1)blank+;state1=0;else if(state1=0x8)blank-;state1=0;for(i=0;i<5000*(1+defre)/(1+infre)+100*blank;i+)value=4095/(mag+1);WriteBuffer0=(u8)(value);WriteBuffer1=(u8)(value>>8)&0x0f;Transfer

22、InProgress=TRUE;XSpi_Transfer(&SpiInstance,WriteBuffer,(void *)0,2);while(TransferInProgress);for(i=0;i<5000*(1+defre)/(1+infre)-100*blank;i+)value=0;WriteBuffer0=(u8)(value);WriteBuffer1=(u8)(value>>8)&0x0f;TransferInProgress=TRUE;XSpi_Transfer(&SpiInstance,WriteBuffer,(void *)

23、0,2);while(TransferInProgress);分析:首先定义一个静态的全局变量blank用于改变占空比,当中断是由BTNU产生时,blank会增加,且每按一次按钮其值均会增加一次,同理当中断是由BTND产生时,blank会减小,且每按一次按钮其值均会减小一次,由于blank为静态全局变量,其每次改变的值均会保留,故增加占空比和减小占空比可随意进行,且都是通过增加某项的延时时间和减小另一项的延时时间来实现的。4、 项目操作说明 将代码下载到开发板中,数码管会显示当前波形的序号,通过开关控制波形的一系列操作。switch<2>-swich<0>控制波形的切换

24、,三个开关构成的二进制数值记为wave,wave=0显示锯齿波,wave=1显示方波,wave=2显示三角波,wave=3显示正弦波,wave=4和5时分别显示“心形”的上下部分。 switch<9>用于控制是增加频率还是减小频率。当switch<9>=0时,switch<8>-switch<3>用于增加频率,记switch<8>-switch<3>构成的二进制数值为infre,此时频率会变为原来的(infre+1)倍;当switch<9>=1时,switch<8>-switch<3>用

25、于减小频率,记switch<8>-switch<3>构成的二进制数值为defre,此时频率会变为原来的(defre+1)倍。 switch<15>-switch<10>用于控制电压的变化,由于DA限制的电压最大值为3.3V,而设置的初始电压为3.3V,故只能减小电压,记switch<15>-switch<10>构成的二进制数值为mag,此时电压会变为原来的1/(mag+1)。 按钮BTNU和BTND分别用于调节方波的占空比,BTNU用于增加占空比,每按一次按钮占空比会比原来增加1%,BTND用于减小占空比,每按一次按钮占空比会比原来减小1%,可随意调节占空比。 Switch<2>-Switch<0>:选择波形 Switch<8>-Switch<3>:调节频率 Switch<9>:控制频率增加和减小 Switch<15>-Switch<10>:调节幅度

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论