本栏目将会介绍Alteral的SOPC系列,整个过程不会沿袭教材,那样就成了抄教材了,而是将课程笔记汇总,并且把一些我实验过程中犯过的错误记录下来。
更新时间比较缓慢。
资源: 锆石A4开发板
小梅哥AC620开发板
----
- 介绍
SOPC是基于FPGA的SOC系统 - 建立基于NIOS II处理器系统来控制一个LED灯闪烁
- 创建工程
-
打开QSYS
nios的3种性能
经济型,标准型,快速型
硬件乘法器的类型默认使用嵌入式的硬件乘法
exception vector(异常向量)
出现异常后,从哪一个地址开始运行。
MMU and MPU
要在nios跑linux系统才勾选,
细节在以后的应用中再不断补充 -
搭建系统
我们建立好上面的系统。
指令总线就是加减乘除
数据总线就是数字。所以对于存储的设备,我们会进行加减乘除等运算。但是对于输出管脚等非存储设备,我们只用将CPU的数据送达即可,不需要将指令送达。指令在存储类设备or cpu中完成。
我们的pio需要导出,控制着我们的led亮or灭
地址,我们可以自动分配。如果我们要清醒ROM从0开始分配,用小锁锁住即可,再进行自动分配。
另外设置好nios里面的复位向量(指向ROM)和异常向量(指向RAM)
注意nios时钟要与实际的时钟一致
将HDL example拷贝到quartus顶层文件当中。
并记得把我们的qsys系统纳入我们的FPGA工程。
我们现在把PIO改为控制4个灯
注意只有在generate过后,才会生成正确的HDL模板
注意我们添加的QSYS系统是.qip
管脚分配,可在assignment edtor里面把之前的管脚名字删除,然后重新分配管脚
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
int main(void)
{
alt_u8 led = 0;
alt_u32 i;
while(1)
{
led = 0X0;
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_0_BASE,0XF);//此寄存器控制PIO的方向
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, led);//点亮LED灯
i = 0;
while(i<500000) //延时功能,非精确延时,数值太小将无法看到灯的闪烁效果
{
i++;
}
led = 0XF;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, led);//熄灭LED灯
i = 0;
while(i<500000) //延时功能,非精确延时,数值太小将无法看到灯的闪烁效果
{
i++;
}
}
return 0;
}
另外记得一旦quartus编译过后,一定要重新生成bsp
一定要先保存,再编译,eclipse不会自动保存
下面是测试结果