微机原理综合项目报告基于nexys4简易数字信号发生器班级:通信1301班学号: HUST姓名:华中科技大学指导老师: 左冬红罗杰目录一、项目简介 (1)1.设计思路 (1)2.任务分配 (1)3.功能描述 (1)二、项目构成及概要设计 (2)1. 硬件模块构成 (2)2. 软件实现流程 (2)三、项目详细设计 (4)1.硬件的内部构成 (4)2.硬件平台的搭建 (9)3.软件模块的构成及其实现 (13)波形产生模块 (13)频率调节模块 (15)幅度调节模块 (16)方波占空比调节模块 (16)四、项目操作说明 (18)五、附录 (19)六、心得体会及建议 (20)一、项目简介1.设计思路本次项目我们小组选择的是信号发生器,由于之前做过D/A显示锯齿波的实验,便想到在该实验的基础上进行功能的扩充,这样思路比较清晰。
首先我们想到在上次实验的基础上加上方波、三角波和正弦波这几种常见波形,实现起来也与锯齿波较为类似,只是在正弦波的显示上花了点功夫,最后决定通过MATLAB取值来实现,最后能正常显示。
而几种波形的切换我们则想到了开关,通过添加开关的GPIO核来获取开关的状态,预留了三位用于波形的切换。
仅仅几种波形的显示是远不够的,所以我们决定添加频率的调节和幅度的调节部分,实现时发现幅度调节容易实现但频率调节有些难度,最后从代码产生波形的原理上来分析想到通过改变取样的次数来调节频率的增减,而选择用一位开关用于切换频率增加和减小,这样会节省资源。
当添加了方波后又发现其占空比也应该实现调节的功能,想到通过开发板上的按钮来实现,通过建立按钮的中断控制,来调节时间延时的增减,从而控制占空比的实现。
当实现了MA TLAB取数进行正弦波的显示时,小组一位成员提出显示心形的设计想法,通过类似的思路也得到了实现。
具体的设计原理及流程后面会有详细说明。
2.任务分配小组成员、贡献比例及具体分工:1硬件平台的搭建,软件代码的实现以及各功能的设计2心形显示的提出和设计,正弦波MA TLAB取值的实现3项目整体框图的设计和绘制实验报告、PPT以及视频的拍制则是由小组成员一起完成。
3.功能描述该信号发生器工程能显示方波,锯齿波,正弦波,三角波以及“爱心”形状(ch1、ch2分别显示“爱心”上下部分再拼接成完整的“爱心”)。
通过开发板按钮能调节各个波形的频率、幅度和方波的占空比,通过led灯能反映开关状态,通过数码管能反映当前显示的波形序号。
Switch<2>---Switch<0>:选择波形Switch<8>---Switch<3>:调节频率Switch<9>:控制频率增加和减小Switch<15>---Switch<10>:调节幅度BTNU:增加占空比BTND:减小占空比二、项目构成及概要设计1.硬件模块构成本项目用到的硬件平台包括SPI IP核与D/A芯片构成数据的传输和数模转换的功能,4个GPIO IP核分别用于开关状态的读取,按钮状态的读取,LED灯的显示,数码管的段选和位选。
一个INTC IP核用于接受来自于SPI和按钮的GPIO的中断,并将中断发送给microblaze核来控制。
硬件整体框图:2.软件实现流程配置好各GPIO、SPI和INTC中断控制器的连接,初始化各个模块并进行设置,读取开关的状态并写入LED灯的GPIO来控制其显示获取波形选择、频率调节和幅度调节的信息根据波形选择信息来显示相应的波形并通过数码管显示波形对应的序号调节波形的频率和幅度当为方波时,可通过按钮来调节方波的占空比各种波形的具体实现。
流程图:三、项目详细设计1. 硬件的内部构成SPI IP核内部框图:接口寄存器定义:SPICR 寄存器各位的含义如下:SPISR 寄存器各位的含义如下:SPISSR 寄存器各位的含义如下:•SPISSR 寄存器bit0~bitn-1分别对应控制SS(0~n-1)的输出IPISR 寄存器各位的含义如下:1234567891031LOOPMasterCPHATx FIFOresetRx FIFO reset 手动从设备选择主设备事务禁止LSB 先传保留12345631保留Rx 空Rx 满Tx 空Tx 满MODF从设备选中DA芯片DAC121S101S是12位D/A转换芯片,可以采用SPI串行接口进行数据输入,其引脚定义和结构图如下图所示:其工作原理可以描述为:串行接口模块按照一定的时序将串行数据采样送到输入移位寄存器;移位寄存器将串行数据转换为并行数据将一部分并行数据(低12位)送入12位D/A 转换寄存器,另一部分送入电源下拉控制逻辑。
12位D/A转换寄存器的数据同时送入D/A 转换寄存器,将数字信号转换为模拟信号后,再经过输出放大电路以及电源下拉控制逻辑的控制之后输出到V out。
其中Vout输出的模拟电压范围为0—V A。
其中V out与输入数据D的关系为:V out= V A (D/4096),D为12位输入的数字量,其取值范围为0~4095DAC121S101要求每次传输16位数据,这16位串行数据的含义为:D0~D11为12位DA转换的数字量,PD0~PD1为电源下拉控制逻辑的输入,控制电源下拉模块的工作方式,改变输出V out的GPIO IP核AXI GPIO控制器包括AXI总线接口模块、中断产生逻辑模块以及双通道输入/输出模块。
内部框图:GPIO内部寄存器定义如下:GPIO_TRI的各位分别控制GPIO_DATA的各位为输入或输出:当GPIO_TRI某位为0时,GPIO相应的I/O引脚配置为输出;当GPIO_TRI某位为1时,GPIO相应的I/O引脚配置为输入。
IP ISR 0x120 中断状态寄存器各个通道的中断请求状态,写1将清除相应位的中断状态bit0-通道1;bit1-通道2AXI INTC主要包括AXI总线接口模块,INTC从设备接口模块,中断控制器核心模块。
其构成原理框图为:寄存器各位的定义如图:2.硬件平台的搭建添加SPI IP核,按钮、LED灯、开关和数码管的GPIO核以及中断控制器INTC核,外部连线如图:各GPIO核、SPI IP核及INTC中断控制器配置如下:按钮的GPIO配置:开关的GPIO配置:LED灯的GPIO配置:数码管的GPIO配置:SPI的配置:将SPI和按钮的GPIO作为中断源,触发INTC的中断,INTC的配置:得到各模块分配的地址,如图:配置各模块的引脚:至此已经配置好完整的硬件平台,生成bit流文件并导出到SDK即可进行软件代码的设计。
3.软件模块的构成及其实现波形产生模块锯齿波:while(Count<4096){value=Count;WriteBuffer[0]=(u8)(value);WriteBuffer[1]=(u8)(value>>8)&0x0f;TransferInProgress=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;WriteBuffer[0]=(u8)(value);WriteBuffer[1]=(u8)(value>>8)&0x0f;TransferInProgress=TRUE;XSpi_Transfer(&SpiInstance,WriteBuffer,(void *)0,2);while(TransferInProgress);}for(i=0;i<5000;i++){value=0;WriteBuffer[0]=(u8)(value);WriteBuffer[1]=(u8)(value>>8)&0x0f;TransferInProgress=TRUE;XSpi_Transfer(&SpiInstance,WriteBuffer,(void *)0,2);while(TransferInProgress);}分析:令value=4095即最大值,通过for循环使其维持一段时间,循环执行完成后,令value=0并维持相同的时间,执行完成后重复执行上述步骤,得到完整的方波。
三角波:Count=0;while(Count<4096)value=Count;WriteBuffer[0]=(u8)(value);WriteBuffer[1]=(u8)(value>>8)&0x0f;TransferInProgress=TRUE;XSpi_Transfer(&SpiInstance,WriteBuffer,(void *)0,2);while(TransferInProgress);Count=Count+1;}Count=4095;while(Count>=0){value=Count;WriteBuffer[0]=(u8)(value);WriteBuffer[1]=(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,重复执行上述计算,得到三角波。
正弦波:Count=0;while(Count<=4000){value=sin[Count];WriteBuffer[0]=(u8)(value);WriteBuffer[1]=(u8)(value>>8)&0x0f;TransferInProgress=TRUE;XSpi_Transfer(&SpiInstance,WriteBuffer,(void *)0,2);while(TransferInProgress);Count=Count+1;}分析:正弦波的产生不同于上述方法,因为正弦波不能直接通过Count的加减简单的实现,故选择通过MATLAB计算的方式得到4000组数据,依次传输得到正弦波。