SOPC实验报告不含综合实验要点.docx
- 文档编号:15128567
- 上传时间:2023-07-01
- 格式:DOCX
- 页数:28
- 大小:974.95KB
SOPC实验报告不含综合实验要点.docx
《SOPC实验报告不含综合实验要点.docx》由会员分享,可在线阅读,更多相关《SOPC实验报告不含综合实验要点.docx(28页珍藏版)》请在冰点文库上搜索。
SOPC实验报告不含综合实验要点
#SOPC系统搭建
实验步骤:
一、系统模块设计
2、建立Quartus工程
设定工程目录、工程名、选择器件等;
建立一个与工程名相同的顶层图形设计文件;
将两个相关文件夹拷到工程目录下;
3、进入SOPCBuilder,搭建Nios2系统模块
确定FPGA芯片型号和和系统工作频率;
添加Nios2处理器并配置;
添加JTAGUART调试模块;
添加SDRAM控制器;
添加Timecore并配置;
添加UART并配置;
添加PIOCore,配置为4位输出,控制台上的4个LED灯;
添加CH452_controller——IPcore;
添加自主IPcore(PWM);
选择自动分配地址和中断号;
设定CPU启动地址和异常处理地址;
Generate生成Nios2模块;
4、在Quartus顶层图形设计文件中
添加(insertsymbol)Nios2系统模块;
添加alt_pll并配置;
添加Timer_out辅助电路;
添加(insertsymbol)input、output、bidir引脚并连线;
设定未用引脚状态为三态,编译工程;
进行引脚分配(如下所示);
再次编译;
下载.sof文件
下为引脚分配示意图:
系统搭建完毕后的硬件核截图:
实验小结:
系统搭建其实是本次实验中最难倒我们的部分,主要是在搭建过程中我们组与老师的进度脱节,以至于出现了不切实际的设计部分而我们又不自知。
这带来的后果则是我们在做后续的实验中频频遭遇问题而难以从代码和设置上解决,这个影响甚至持续到UART实验部分。
好在我们在最后完全修正了系统的设置问题也检查了引脚的正确性,最终使用了正确的系统完成了后续的实验。
#基本实验
#include
#include
#include
intmain()
{
printf("1307310813073113\n");
while
(1){
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0);
usleep(1000000);
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0xf);
usleep(1000000);
}
return0;
}
实验小结:
基本实验其实没什么好说的,毕竟是为后续的实验熟悉编译环境而设置的实验,本身并没有什么难度。
有意思的是尽管我们的系统在搭建之初是存在很大问题的,但是基本实验却凭借有缺陷的设计无障碍地完成了,这点知道撰写报告时我才发现。
相比个中原因可能是基本实验涉及硬件核功能部分不多。
#键盘控制部分
实验代码:
#include
#include
#include"alt_types.h"
#include
#include
#include
voiddisp_init();
voidwe_ch452_comand(alt_u16data);
voidch452_init();
voiddelay(alt_u32delay_data);
voidclose_disp_key();
voidopen_disp_key();
voidKeyDownISR();
voiddisp_init()
{
we_ch452_comand(CH452_DIG0|3);
we_ch452_comand(CH452_DIG1|1);
we_ch452_comand(CH452_DIG2|8);
we_ch452_comand(CH452_DIG3|0);
we_ch452_comand(CH452_DIG4|1);
we_ch452_comand(CH452_DIG5|3);
we_ch452_comand(CH452_DIG6|7);
we_ch452_comand(CH452_DIG7|0);
}
voidclose_disp_key()
{
we_ch452_comand(CH452_SYSOFF);
}
voidopen_disp_key()
{
we_ch452_comand(CH452_SYSON2);
}
voiddelay(alt_u32delay_data)
{
usleep(delay_data);
}
voidwe_ch452_comand(alt_u16data)
{
alt_u16temp=IORD_ALTERA_AVALON_CH452_STATUS(CH452_BASE);
while((temp&0x0001)==1)
{
temp=IORD_ALTERA_AVALON_CH452_STATUS(CH452_BASE);
}
IOWR_ALTERA_AVALON_CH452_INSTRACTION(CH452_BASE,data);
delay(1000);//waitch452ok
}
alt_u8keyvalue=0,flag=0;
voidKeyDownISR(void*context,alt_u32id)
{
keyvalue=IORD_ALTERA_AVALON_CH452_KEY_DATA(CH452_BASE);
flag=1;
}
voidch452_init()
{
we_ch452_comand(CH452_SYSON2);//opendisp&key
we_ch452_comand(CH452_BCD);//BCDdispmode
IOWR_ALTERA_AVALON_CH452_IRQ_MASK(CH452_BASE,1);//enablekeyirq
alt_irq_register(CH452_IRQ,NULL,KeyDownISR);
}
intmain()
{
printf("HellofromNiosII!
\n");
ch452_init();
disp_init();
while
(1)
{
if(flag==1)
{printf("reg0=%lx\n",keyvalue);
flag=0;
}
close_disp_key();
delay(10000);
open_disp_key();
delay(10000);
}
return0;
}
实验小结:
实验的重点在于读懂新的ch452的操作语句使用方法,所幸老师在这方面的讲解十分详细,我们很快通过老师的指导和对于实验流程及代码的理解便完成了键盘控制显示实验。
主要也是指导书内容十分详尽,以至于我们的实验也没遇到什么大问题。
#UART
一、实验步骤:
1.建立软件工程---UART,并与硬件系统绑定
2.选择“helloworld”模板,设系统库属性,添加#include
3.run程序,调试信息窗内应显示“HellofromNiosII!
”
4.复制粘贴相关文件夹下的测试例程,解析代码结构与功能
5.修改程序,使调试信息窗内显示出和实验学生相关的信息,
“UARTtestfrom1307311307310813073113!
”
6.修改程序,alt_u8tx_buffer[10]=“waitdata\n”;为
alt_u8tx_buffer[?
?
]=“1307310813073113waitdata\n”;形式
7.builder工程,出现error则修改程序直到正确。
8.PC上运行“串口助手”,完成相应设置
9.运行SOPC程序,观察IDE和“串口助手”显示内容,分析实验现象
10.通过“串口助手”分别发送A123#、#,观察IDE和“串口助手”显示内容,分析实验现象
二、程序清单
#include
#include
#include
#include
#include
#include
//中断接收,查询发送
alt_u16aaa=0;
alt_u8i=0,j=0,k=0;
alt_u8flag=0,err_cmd=0;
alt_u8tx_buffer[20]="1307310813waitdata\n";
alt_u8tx_err_buffer[22]="1307310813commanderr\n";
alt_u8rx_buffer[20];
alt_u8rx_data;
voidrx_uart_interrupt_server(void*context,alt_u32id)
{
rx_data=IORD_ALTERA_AVALON_UART_RXDATA(RS232_BASE);
if((rx_data=='#')&(j!
=0)){flag=1;j=0;}
elseif((rx_data=='#')&(j==0)){err_cmd=1;}
else{rx_buffer[j]=rx_data;j++;}
}
voidclr_rxbuffer()
{
for(k=0;k<=19;k++)
{rx_buffer[k]=0;}
}
voidinit_uart()
{
alt_irq_register(RS232_IRQ,NULL,rx_uart_interrupt_server);
IOWR_ALTERA_AVALON_UART_CONTROL(RS232_BASE,ALTERA_AVALON_UART_CONTROL_RRDY_MSK);
}
voidsend_wait_data()
{
for(i=0;i<=19;i++)
{aaa=IORD_ALTERA_AVALON_UART_STATUS(RS232_BASE);
while((aaa&ALTERA_AVALON_UART_STATUS_TRDY_MSK)==0)
{aaa=IORD_ALTERA_AVALON_UART_STATUS(RS232_BASE);}
IOWR_ALTERA_AVALON_UART_TXDATA(RS232_BASE,tx_buffer[i]);
}
}
voidsend_err_data()
{
for(i=0;i<=21;i++)
{aaa=IORD_ALTERA_AVALON_UART_STATUS(RS232_BASE);
while((aaa&ALTERA_AVALON_UART_STATUS_TRDY_MSK)==0)
{aaa=IORD_ALTERA_AVALON_UART_STATUS(RS232_BASE);}
IOWR_ALTERA_AVALON_UART_TXDATA(RS232_BASE,tx_err_buffer[i]);
}
}
intmain()
{
init_uart();
clr_rxbuffer();
printf("uart_txHellofrom1307310813\n");
while
(1)
{
send_wait_data();
usleep(3000000);
if(flag==1)
{for(k=0;k<=19;k++)
{printf("%x",rx_buffer[k]);}
flag=0;
printf("rxdata\n");
clr_rxbuffer();
}
if(err_cmd==1)
{
err_cmd=0;printf("errorrxdata\n");
send_err_data();
}
}
return0;
}
流程图:
N
Y
N
Y
Y
N
测试结果与分析:
在串口助手的信息框中不断显1307310813waitdata
在输入了0后程序显示了errordata;
在输入了学号后程序显示了学号各位的BCD码;
在实验过程中出现了硬件连接以及代码没有错误,但是在串口助手上总是无法显示程序中编写的信息的问题,经检查是由于在引脚分配的过程中,输入与输出引脚分配顺序发生了颠倒,导致数据无法正确输出,将输入输出引脚进行修正之后,在串口助手上即可正确的显示提前编写的信息。
小结:
在实验过程中多次检查了程序中的错误,然而试验中的问题并没有出现在软件方面,而是在硬件上引脚的分配出现了问题,导致在这项实验上浪费了很多时间,这也从侧面证明了sopc技术试验中,每一个细节的重要性。
#Timer
一、实验步骤:
1.建立软件工程---Timer,并与硬件系统绑定
2.选择“helloworld”模板,设系统库属性,添加#include
3.运行程序,调试信息窗内应显示“HellofromNiosII!
”
4.复制粘贴相关文件夹下的测试例程,解析代码结构与功能
5.修改程序,使调试信息窗内显示出和时钟相关的信息,
“0:
0:
1
0:
0:
2”
6.builder工程,出现error则修改程序直到正确。
7.运行程序,观察调试信息窗内显示内容,分析实验现象。
2、程序清单
#include
#include
#include
#include
#include
#include
alt_u8tm_sec,tm_min,tm_hour;
alt_u8flag=0;
voidtimer_interrupt_server(void*context,alt_u32id)
{
tm_sec++;
if(tm_sec==60)
{
tm_sec=0;
tm_min++;
}
if(tm_min==60)
{
tm_min=0;
tm_hour++;
}
if(tm_hour==24)
{
tm_hour=0;
}
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE,0);
flag=1;
}
voidinit_timer()
{
alt_irq_register(TIMER_IRQ,NULL,timer_interrupt_server);
IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_BASE,ALTERA_AVALON_TIMER_CONTROL_ITO_MSK+ALTERA_AVALON_TIMER_CONTROL_CONT_MSK+ALTERA_AVALON_TIMER_CONTROL_START_MSK);
}
intmain()
{
init_timer();
printf("HellofromNiosII!
\n");
while
(1)
{
if(flag==1)
{printf("%d:
%d:
%d\n",tm_hour,tm_min,tm_sec);
flag=0;
}
}
return0;
}
测试流程图:
N
Y
测试结果与分析:
在运行程序后,在调试文字信息框中出现helloworld文字,并在之后随时间显示具体的计时信息。
小结:
在这部分模块的实验中,由于对代码和软件的不熟悉,出现了频繁报错的情况,之后在询问同学和老师之后这些问题逐渐迎刃而解,之后成功的完成了本次关于timer模块的实验。
#PWM
1、实验步骤
1.建立软件工程---PWMtest,并与硬件系统绑定
2.选择“helloworld”模板,设系统库属性,添加#include
3.运行程序,调试信息窗内应显示“HellofromNiosII!
”
4.复制粘贴相关文件夹下的测试例程,解析代码结构与功能
5.修改程序,使调试信息窗内显示出和实验学生相关的信息,
“PMWtestfrom1307311307310813073113!
”
6.builder工程,出现error则修改程序直到正确。
7.运行程序,观察PMW输出(LED)显示现象
8.修改程序中的周期值(减小),运行程序,观察PWM输出(LED)显示现象,并进行分析
9.修改程序,每秒产生5个占空比50%的脉冲。
运行程序,观察,分析实验现象。
2、实验代码清单
#include
#include
#include
#include
#include
alt_u32cycle=0xfff;
alt_u32i=0;
intmain()
{
printf("HellofromNiosII!
\n");
IOWR(PWM_LED_BASE,2,1);
IOWR(PWM_LED_BASE,0,cycle);
while
(1)
{
for(i=1;i<=cycle;i++)
{
IOWR(PWM_LED_BASE,1,i);
usleep(1000);
}
}
return0;
}
测试流程图:
Y
测试结果与分析:
通过修改实验参数,使LED灯以设定的周期进行渐暗至明亮的变化。
小结:
在本次试验中,对于周期的设置出现了一些问题,导致实验现象并不明显,之后根据实验指导书对参数进行修改之后,实验现象就如实验要求在固定周期内LED灯产生一个由明亮到突然变暗的过程。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SOPC 实验 报告 综合 要点