可看到变化。
扩展实验程序:(花样流水灯) //////////////////////////////////////////////// //使用的是CPU内部内存
//NIOS II的工程路径最好不要有汉字和一些特殊字符,最好用英文
////////////////////////////////////////////////
#include \
#include \#include \
/* 流水灯花样,低电平点亮,注意调用时候用了取反操作 */ const alt_u32 LED_TBL[] = {
0x00, 0xFF, // 全部熄灭后,再全部点亮
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, // 依次逐个点亮
0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, // 依次逐个
叠加
0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, // 依次逐个递减
0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81, // 两个靠拢后分开
0x81, 0xC3, 0xE7, 0xFF, 0xFF, 0xE7, 0xC3, 0x81 // 从两边叠加后递减 };
/******************************************************************** * 名 称:main()
* 功 能:控制LED 流水显示。
********************************************************************/ int main (void) { alt_u8 i; alt_u32 j; while (1) {
for (i=0; i<42; i++) { /* 流水灯花样显示 */
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE, ~LED_TBL[i]); j = 0;
while (j<100000) //延时 j++; } } return 0; }
接下来,我们总结一下这节内容。我们来对比一下寄存器操作方式不 API 之间有什么联系和异同,上面癿程序,如果用NIOS II IDE提供的API 来写,那么如下图所示
IOWR_ALTERA_AVALON_PIO
是一个宍,在
altera_avalon_pio_regs.h 中,其定义如下(大家可以按住 ctrl
键后,用鼠标点击进入定义所在的位置)
大家可以看到,它是一个 IOWR的宏,而IOWR的具体写法我就在此不详细说了(大家感兴趣的可以去 NIOS 的源码),反正就是对硬件地址的控制。我的做法就是绕过这个大圈子,直接去控制它的寄存器。 大家可能有点纳闷,我们的结构体中定的了四个变量,但却用了 DATA 一个,在这说明一下原因,首先是 DIRECTION。返个是 IO 的方向,就是说是输入还是输出,或者是双向的。因为在我们构建PIO 模块的构成中有了一个选项,如下图所示,红圈2,我们选择了输出(Output ports only),也就是我们在底局就已经固定了它的方向,所以在软件中就还需要在定义了。还有两个变量是涉及到中断时才会用到,所以在这个程序中也没有用到。
我要提醒大家一句,我虽然提倡大家用操作寄存器方式编程,但并不希望所有的程序都按这种方式来写,比如说对 flash 的操作,我们就可以使用 API 来写,因为 flash的操作相对复杂,而利用API可以径简单得几个语句就能完成,
没必要自己来写。
扩展数码管实验
一. 添加CPU
二. 添加on_chip的ram。 三. 添加 JTAG_UART
四. 添加三个PIO口为输出口,做为
位选输出。
五. 再添加8个PIO口为输出口,作
为段选输出。 注意的地方:
PIO的命名
位选的PIO命名为SMG_BIT 段选的PIO命名为SMG_SEG 实验程序:
//程序功能显示0到9的任意字符,动态显示。
//NIOS II工程路径不能有汉字 和特殊的字符
#include \#include \