微机原理综合实验报告nexys4简易数字信号发生器HUST华中科技大学.docx
《微机原理综合实验报告nexys4简易数字信号发生器HUST华中科技大学.docx》由会员分享,可在线阅读,更多相关《微机原理综合实验报告nexys4简易数字信号发生器HUST华中科技大学.docx(24页珍藏版)》请在冰豆网上搜索。
微机原理综合实验报告nexys4简易数字信号发生器HUST华中科技大学
微机原理综合项目报告
基于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、项目简介
1.设计思路
本次项目我们小组选择的是信号发生器,由于之前做过D/A显示锯齿波的实验,便想到在该实验的基础上进行功能的扩充,这样思路比较清晰。
首先我们想到在上次实验的基础上加上方波、三角波和正弦波这几种常见波形,实现起来也与锯齿波较为类似,只是在正弦波的显示上花了点功夫,最后决定通过MATLAB取值来实现,最后能正常显示。
而几种波形的切换我们则想到了开关,通过添加开关的GPIO核来获取开关的状态,预留了三位用于波形的切换。
仅仅几种波形的显示是远不够的,所以我们决定添加频率的调节和幅度的调节部分,实现时发现幅度调节容易实现但频率调节有些难度,最后从代码产生波形的原理上来分析想到通过改变取样的次数来调节频率的增减,而选择用一位开关用于切换频率增加和减小,这样会节省资源。
当添加了方波后又发现其占空比也应该实现调节的功能,想到通过开发板上的按钮来实现,通过建立按钮的中断控制,来调节时间延时的增减,从而控制占空比的实现。
当实现了MATLAB取数进行正弦波的显示时,小组一位成员提出显示心形的设计想法,通过类似的思路也得到了实现。
具体的设计原理及流程后面会有详细说明。
2.任务分配
小组成员、贡献比例及具体分工:
1硬件平台的搭建,软件代码的实现以及各功能的设计
2心形显示的提出和设计,正弦波MATLAB取值的实现
3项目整体框图的设计和绘制
实验报告、PPT以及视频的拍制则是由小组成员一起完成。
3.功能描述
该信号发生器工程能显示方波,锯齿波,正弦波,三角波以及“爱心”形状(ch1、ch2分别显示“爱心”上下部分再拼接成完整的“爱心”)。
通过开发板按钮能调节各个波形的频率、幅度和方波的占空比,通过led灯能反映开关状态,通过数码管能反映当前显示的波形序号。
Switch<2>---Switch<0>:
选择波形
Switch<8>---Switch<3>:
调节频率
Switch<9>:
控制频率增加和减小
Switch<15>---Switch<10>:
调节幅度
BTNU:
增加占空比
BTND:
减小占空比
2、项目构成及概要设计
1.硬件模块构成
本项目用到的硬件平台包括SPIIP核与D/A芯片构成数据的传输和数模转换的功能,4个GPIOIP核分别用于开关状态的读取,按钮状态的读取,LED灯的显示,数码管的段选和位选。
一个INTCIP核用于接受来自于SPI和按钮的GPIO的中断,并将中断发送给microblaze核来控制。
硬件整体框图:
2.软件实现流程
配置好各GPIO、SPI和INTC中断控制器的连接,初始化各个模块并进行设置,读取开关的状态并写入LED灯的GPIO来控制其显示获取波形选择、频率调节和幅度调节的信息
根据波形选择信息来显示相应的波形并通过数码管显示波形对应的序号调节波形的频率和幅度当为方波时,可通过按钮来调节方波的占空比各种波形的具体实现。
流程图:
3、项目详细设计
1.硬件的内部构成
SPIIP核
内部框图:
接口寄存器定义:
SPICR寄存器各位的含义如下:
SPISR寄存器各位的含义如下:
SPISSR寄存器各位的含义如下:
•SPISSR寄存器bit0~bitn-1分别对应控制SS(0~n-1)的输出
IPISR寄存器各位的含义如下:
DA芯片
DAC121S101S是12位D/A转换芯片,可以采用SPI串行接口进行数据输入,其引脚定义和结构图如下图所示:
其工作原理可以描述为:
串行接口模块按照一定的时序将串行数据采样送到输入移位寄存器;移位寄存器将串行数据转换为并行数据将一部分并行数据(低12位)送入12位D/A转换寄存器,另一部分送入电源下拉控制逻辑。
12位D/A转换寄存器的数据同时送入D/A转换寄存器,将数字信号转换为模拟信号后,再经过输出放大电路以及电源下拉控制逻辑的控制之后输出到Vout。
其中Vout输出的模拟电压范围为0—VA。
其中Vout与输入数据D的关系为:
Vout=VA(D/4096),D为12位输入的数字量,其取值范围为0~4095
DAC121S101要求每次传输16位数据,这16位串行数据的含义为:
D0~D11为12位DA转换的数字量,
PD0~PD1为电源下拉控制逻辑的输入,控制电源下拉模块的工作方式,改变输出Vout的
GPIOIP核
AXIGPIO控制器包括AXI总线接口模块、中断产生逻辑模块以及双通道输入/输出模块。
内部框图:
GPIO内部寄存器定义如下:
寄存器名称
偏移地址
初始值
含义
读写操作
GPIO_DATA
0x0
0
通道1数据寄存器
通道1数据
GPIO_TRI
0x4
0
通道1三态控制寄存器
写控制通道1传输方向
GPIO2_DATA
0x8
0
通道1数据寄存器
通道2数据
GPIO2_TRI
0xC
0
通道1三态控制寄存器
写控制通道1传输方向
GPIO_TRI的各位分别控制GPIO_DATA的各位为输入或输出:
当GPIO_TRI某位为0时,GPIO相应的I/O引脚配置为输出;当GPIO_TRI某位为1时,GPIO相应的I/O引脚配置为输入。
GPIO内部中断相关寄存器:
名称
偏移地址
含义
读写操作
GIER
0x11C
全局中断屏蔽寄存器
最高位bit31控制GPIO是否输出中断信号Irq
IPIER
0x128
中断屏蔽寄存器
控制各个通道是否允许产生中断
bit0-通道1;bit1-通道2
IPISR
0x120
中断状态寄存器
各个通道的中断请求状态,写1将清除相应位的中断状态
bit0-通道1;bit1-通道2
AXIINTC
主要包括AXI总线接口模块,INTC从设备接口模块,中断控制器核心模块。
其构成原理框图为:
寄存器各位的定义如图:
2.硬件平台的搭建
添加SPIIP核,按钮、LED灯、开关和数码管的GPIO核以及中断控制器INTC核,外部连线如图:
各GPIO核、SPIIP核及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组数据,依次传输得到正弦波。
MATLAB取值的具体实现见附录。
心形:
心形的实现与正弦波的实现类似,同样是通过MATLAB取值,分别得到心形的上下部分,通过示波器两个通道拼接得到完整的心形。
具体实现见附录。
频率的调节模块
本项目通过开关的switch<8>--switch<3>这6位实现频率的调节,而switch<9>则实现频率增加和减小的选择。
具体频率的调节如下,以锯齿波为例:
while(Count<4096)
{
for(i=0;i<=defre;i++)
{
value=Count/(mag+1);
WriteBuffer[0]=(u8)(value);
WriteBuffer[1]=(u8)(value>>8)&0x0f;
TransferInProgress=TRUE;
XSpi_Transfer(&SpiInstance,WriteBuffer,(void*)0,2);
while(TransferInProgress);
}
Count=Count+1+infre;
}
分析:
增加频率是通过Count每次增加的幅度来改变,Count每次增加的幅度越大,取样的周期就越短,频率就会增加。
减小频率则是通过重复传输同一个数来实现时间的延时,这样增加了周期,减小了频率。
除了方波,其余波形的频率增减均是通过上述方式得到的。
方波:
for(i=0;i<5000*(1+defre)/(1+infre);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*(1+defre)/(1+infre);i++)
{
value=0;
WriteBuffer[0]=(u8)(value);
WriteBuffer[1]=(u8)(value>>8)&0x0f;
TransferInProgress=TRUE;
XSpi_Transfer(&SpiInstance,WriteBuffer,(void*)0,2);
while(TransferInProgress);
}
分析:
通过改变延时的时间得到频率的变化。
当增加频率时,循环次数减少,周期减少,频率增加;当减小频率时,循环次数增加,周期增加,频率减小。
幅度的调节模块
本项目中幅度的调节采用的都是相同的方式,由于D/A新芯片支持的最大电压为3.3V,采用的初始电压也为3.3V,故只能减小电压幅度。
以锯齿波为例:
while(Count<4096)
{
for(i=0;i<=defre;i++)
{
value=Count/(mag+1);
WriteBuffer[0]=(u8)(value);
WriteBuffer[1]=(u8)(value>>8)&0x0f;
TransferInProgress=TRUE;
XSpi_Transfer(&SpiInstance,WriteBuffer,(void*)0,2);
while(TransferInProgress);
}
Count=Count+1+infre;
}
分析:
只需将要传输的值除以电压的衰减值便可实现电压幅度的改变。
方波占空比的调节模块
通过按钮来实现占空比的调节,由于按钮需要产生中断来进行控制,需要添加按钮的中断控制及处理程序,并在硬件平台上配置好。
将开发板上的BTNU和BTND分别用于占空比的增加和减小,通过以下代码实现:
if(state1==0x1)
{
blank++;
state1=0;
}
elseif(state1==0x8)
{
blank--;
state1=0;
}
for(i=0;i<5000*(1+defre)/(1+infre)+100*blank;i++)
{
value=4095/(mag+1);
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*(1+defre)/(1+infre)-100*blank;i++)
{
value=0;
WriteBuffer[0]=(u8)(value);
WriteBuffer[1]=(u8)(value>>8)&0x0f;
TransferInProgress=TRUE;
XSpi_Transfer(&SpiInstance,WriteBuffer,(void*)0,2);
while(TransferInProgress);
}
分析:
首先定义一个静态的全局变量blank用于改变占空比,当中断是由BTNU产生时,blank会增加,且每按一次按钮其值均会增加一次,同理当中断是由BTND产生时,blank会减小,且每按一次按钮其值均会减小一次,由于blank为静态全局变量,其每次改变的值均会保留,故增加占空比和减小占空比可随意进行,且都是通过增加某项的延时时间和减小另一项的延时时间来实现的。
4、项目操作说明
将代码下载到开发板中,数码管会显示当前波形的序号,通过开关控制波形的一系列操作。
switch<2>-----swich<0>控制波形的切换,三个开关构成的二进制数值记为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>用于减小频率,记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>:
调节幅度
BTNU:
增加占空比
BTND:
减小占空比
5、附录
正弦波MATLAB具体实现如下:
i=0:
(2*pi/4000):
2*pi;//取4000组数据
x=sin(i);
y=(x+1)*2048;//进行量化
z=int16(y);//将数据化为整数
dlmwrite(“sin.txt”,z)//将数据以逗号隔开并保存为sin.txt文件
心形函数图:
取值部分可参照上述正弦波的方法得到。
6、心得体会及建议
通过一个学期的微机原理的实验操作,不仅提高了自己的实验操作能力,更是把课堂上学习到的理论知识运用到实践中的绝佳机会,真正体会到了边学边用,学以致用。
说实话这学期的实验课真的很难,除了第一堂实验课,但是正是在每一次实验中,我们慢慢熟悉了Xilinx的实验平台,把以前学到的C语言和硬件语言 VerilogHDL 用到了每一次的实验中,加强了自己的软件编程能力,更是直接体会到了软件控制硬件的魅力所在,在后面每一次实现某个实验时都用到了EDK和nexys4实验板,随着对实验平台一步步熟悉,感觉自己以后无论进实验室还是去公司做项目应该会更加容易上手。
最主要的是通过这门实验课真正理解了计算机的组成原理,对计算机的各个组成部分,包括微处理器,存储器,接口,总线,DMA,外设的理解,然后从总体对整个计算机体系结构的认知,无论是理论上还是实践中都从当初的略微懂一点上升到了专业的层次,不过还是在微机的层次,如果感兴趣还应该继续学习,总的来说微机原理的实验偏难,不过正是这样才能提高学生的水平。
综合项目我们选的是简易信号发生器,从选题到实现功能再到制作PPT,拍视频,做项目报告,再到验收,一步步的实现,不仅体验到了完成一个完整项目的完整流程,掌握了其中的知识,更是对一整个学期的实验操作能力的检验,而且在团队的分工与协助中提高了团队协作能力。
然后是实验课的建议,感觉课程可以适当降低难度,综合项目的验收的各个部分应该建立完整的流程,最好提供模板,然后是建议注重数电和C语言课程,做好课程连接。