嵌入式系统试验

研究生专业实验教学

实验报告书

实验课程名称: 实验指导教师: 学 院: 专业及类别: 学 号: 姓 名: 实验日期: 成 绩:

嵌入式系统专业实验

重庆大学研究生院制

实验名称:FPGA SOPC 实验 实验时间:2016.5.5 2016.5.12 一、 实验目的

1、学习 Quartus II、SOPC Builder、Nios II IDE 的基本操作; 2、初步了解 SOPC 的开发流程,基本掌握 Nios II 软核的定制流程; 3、掌握 Nios II 软件的开发流程;掌握软件的基本调试方法。

二、 实验仪器设备

硬件: PC 机,FPGA 实验开发平台;

软件: Quartus II 9.1,SOPC Builder9.1,Nios II IDE 9.1。

三、 实验原理

实验利用Quartus 软件内嵌的SOPC Builder 工具来构造实验硬件,在Nios II 软件编译

工具中开发程序来控制实验箱中的LED 灯实现闪烁的效果。 1、验证实验:

建立可用于控制 LED 闪烁的简单 Nios II 处理器系统,具体包括: (1) 在 Quartus II 中建立一个工程;

(2) 使用 SOPC Builder 建立并生成一个简单的基于 Nios II 的硬件系统; (3) 在 Quartus II 工程中编译基于 Nios II 的硬件系统并生成配置文件.sof ; (4) 在 Nios II IDE 中建立对应硬件系统的用户 C/C++工程, 编写一简单用户程序, 在 Nios II IDE 中编译程序生成可执行文件.elf ;

(5) 将配置文件.sof 和可执行文件.elf 都下载到 FPGA 进行调试运行。 2、设计实验:

用按键控制 8 个 LED 灯的闪烁状态,灯的状态如下: 灯分为左右两部分交替闪烁。

灯分为奇数号和偶数号灯两部分交替闪烁。 循环从左至右间隔(两盏灯一组) 跑动显示;

从中间开始向两侧依次点亮,从两侧向中间依次点亮。

四、 实验内容

1 .文件夹的建立

在计算机上创建文件夹,要求用英文或数字命名,不能用中文命名。 2 .文本文件的建立

1) 单击“开始”→“程序”→Altera →QuartusII 9.1SP2。

2) 点击菜单栏 File →New Project Wizard,弹出对话框式。点击Next>按钮继续,修改,而后点击 Next>继续,出现提示D 盘nios2目录下面没有led 这个目录,询问是否要创建它,选择是(y),让QuartusII 创建这个目录。点击”Next ”。

3) 向导开始询问是否有现成的文件需要加到当前新建的工程中点击Next>继续,在图(6)中选择试验箱的芯片Cyclone ⅣE 系列的EP4CE40F23I7 ,点击Next>,最后点击Finish 完成新建项目(注:在项目文件中找到led.qsf 文件修改器件的电压值为1.2V ) 3 .NIOSII 软核 建立

1) 在Quartus 下,向工程中添加文件,先建立一个 Block Diagram / Schematic File,点 击菜单栏中的 File->New,打开新建文件对话框,我们选中 Block Diagram /Schematic File,然后点击OK按钮。

2) 接下来我们该启动 SOPC Buider 来创建NIOSII 软核了,点击Tools-> SOPC Builder会出现对话框在在最上层的Create New System 对话框中的System Name:中输入软核的名字,在本示例中,输入helloled 做为软件核的名字, 点击OK按钮确认。

3) 窗口左上角的Clock Settings 显示clk_0 为外部时钟,频率为50Mhz ,这是我们当前所用到的软核时钟。 (注:外部时钟频率可以修改,此实验最好按板上晶振改为25Mhz ) 4) 接下来要建立 CPU ,用鼠标双击窗口左侧框中的 Processors->NIOS II Processor弹出如窗口, 先选择软核的类型, Quartus 一共提供了三种类型可供选择, Nios II/e 占用资源最少600-800LEs ,功能也最简单,速度最慢。Nios II/s 占资源比前者多一些,功能也多了,速度也快一些,Nios II/f 占资源最多,功能也最多,速度就快。选择的时候要根据你的需求和你的芯片资源来决定, 在本实验中,我们选择 Nios II /s,能够满足需要。在窗口下半部分的这些选项可以先不用管Reset Vector 是复位后启动时的Memory 类型和偏移量Exception Vector 是异常情况时的Memory 类型和偏移量。现在还不能配置,需要 RAM 设置好以后才能修改这里,点击 Next ,需要设置 JTAG Debug Module ,即JTAG 调试时所要用到的功能模块,我们选择Level1, 只使用最简单的功能。 点击 Next> 继续,最后点击 Finish 完成,出现cpu_0,就是刚才创建的cpu 。

5) 接下面我们要添加片内RAM 选择左边目录树下的Memories and Memory

Controllers->On-Chip ->On-Chip Memory (RAM or ROM) 双击 On-Chip Memory (RAM or ROM) ,我们将RAM 的大小改为20K , 其他不做修改, 然后直接点击 Finish 完成,回到SOPC Builder 主窗口。主窗口上又加了一个 Onchip_memory2_0 的Module 。

6) 接下来建立一个SystemID(这个版本中不是必需的) ,System ID 就是一种标示符,类似校验和的这么个东西,在你下载程序之前或者重启之后,都会对它进行检验,以防止错误发生。在左边窗口的Peripherals->Debug and performance ->System ID Peripheral ,双击System ID Peripheral 会弹出对话框此窗口警告:System ID 组件的名字必需为sysid 才能使用, 点击Finish 完成添加, 在SPOC builder 主窗口中选中SystemID 组件,然后击点鼠标右键,弹下一个菜单,选择 Rename ,对sysid_0 组件进行重命名, 将此文本框中的 sysid_0 改为sysid 。 照此方法, 我们把所有组件后面的_0 全部去掉。

7) 接下来创建 JTAG UART(调试时需要打字符串用才需要,如果单纯控制LED 可以不要),首先 JTAG UART 是实现PC 和NiosII 系统间的串行通信接口,它用于字符的输入输出,在NiosII 的开发调试过程中扮演了重要的角色,接下来我们开始建立它的模块。选择sopc builder 主窗口左边Interface Protocols->Serial->JTAG UART 双击JTAG UART ,不做修改, 点击 Next> , 下一步点击 finish 完成。 回到SOPCBuilder 主窗口,更改组件名jtag_uart_0 为jtag_uart 。

8) 接下来回去对CPU进行设定,在主窗口中双击CPU组件进入CPU设定对话框,如下把 Reset Vector 右边的Memory:改为onchip_memory2 ,offset 会设为0x0把Exception Vector 右边的Memory 改为onchip_memory2 , offset 会设为0x20,点击窗口右下角的finish 完成。 9) 接下来要添加一个PIO 模块(Parallel I/O),点击窗口左侧的 Peripherals ->Microcontroller Peripherals -> PIO(Parallel I/O),其中Width 表示要建立的PIO 宽度是多少,我们的板上有8个LED ,选择宽度为8,Direction 复选框中表示要建立的PIO 的方向, 分别表示Bidirectional(tristate) ports(双向三态口) , Input ports only (仅仅作为输入口) ,Both input and output ports (作为输入和输出口) ,Output ports only (仅仅作为输出口) ,在本实验中将要实现的是点亮LED ,所以这个新建的PIO 采用Output ports only(仅输出口) 方式,点击 Next 继续, 不需要选择,点Next 继续,直接点击 Finish, 完成PIO 模块的创建回到主窗口中我们为了方便识别,将pio_0改名为pio_led。

10) 执行System 菜单上的Auto-Assign Base Addresses 自动分配一下地址。最后就能进行编译了,点击 SOPC Builder 主窗口左上角的System Generation 选项卡. 我们点击最下面的Generate 按键,弹出对话框会提示你是否保存改变,点Save, 保存一下。开始编译,程序编好了,查看下最后的输出,最后一行显示 Info:System generation was successful ,产生成功点击 Exit 退出,会回到Quartus II 主界面。

11) 在这一步中需要分配管脚,回到 Quartus 界面以后,在Block1.bdf 界面里在空白处双击左

键,会出现对话框(注意上图的红框内)展开左边的Project ,下面有个helloled ,这个helloled, 就是刚才建立的NIOSII 软核, quartusii 中把它用了一个方块symbol 来表示,点击左下角的OK按钮在 Block1.bdf 界面中,有个小方框阴影跟随着鼠标移动,鼠标点击,把它放在Block1.bdf 界面中放好,在 NIOS 软核helloled 上点击右键后点击Generate Pins for symbol ports ,这一步作用就是生成管脚,通过命名以后给信号分配真正的fpga io 口引脚。然后双击out_port_from_the_pio_led[7..0]端口符号,弹出窗口中修改引脚名,改为 led[7..0],所示确认后,点击按钮编译工程,在弹出窗口中保存bdf 文件为led 。编译完成后,如果提示所示错误,则需要修改工程文件夹下

led.qsf

文件中“set_global_assignment

-nameNOMINAL_CORE_SUPPLY_VOLTAGE 1.0V ”1.0V 修改为1.2V ,再次进行编译。编译成功后点击Assignments->Pins绑定引脚。

12) 接下来要对工程进行配置在 quartus9.1sp2 主窗口中, 鼠标右键点击 led , 选择 setting 。进入 Setting 后,点击 Device 下面的 Device and pin Option,出现 Device and Pin

Options 对话框,选择 Configuration 选项卡在 Configuration device 下面的 Useconfiguration device 中选择 EPCS4 改好后,点击确认,再点击OK按钮返回 quartus9.1sp2 主界面 Save all 按钮,保存下所有的改动。执行菜单 Processing -> Start Compilation ,开始进行编译,最后 Quartus 显示一共用掉了 5%的逻辑单元,用掉了 18%的片上内存, 接下来要将生成好的*.sof 或*.pof 下载到 FPGA 中, 至此, NIOS 的硬件逻辑部分已经编译完成并下载了,接下来要进行 nios 的软件部分了。

4 .NIOSII 软件LED 跑马灯 编写

1)打开 Nios II 软件,开始—>程序—>Altera—>Nios II EDS 9.1—>Nios II 9.1 Software Build Tools for Eclipse。

2)新建 Nios II Application,New —>Nios II Application and BSP from Template。选择先前生成的 SOPC 文件,并输入工程名,选择工程模板 Hello World Small。然后点击“Finish ” 。左侧窗口中点击“hello_world_small.c” ,可以看到程序。

4)双击 led8.c ,写入程序,并保存。然后编译工程,在窗口的右下角可以看到编译进程。如果编译无错,则进行下载。

5)下载运行。首先在实验箱上把之前绑定的 FPGA 引脚连接到 LED 对应的引脚,仿真器通过排线连接到实验箱上“JTAG ”处,另一接口通过 USB 线连接到电脑。在 Quartus 软件中下载先前生成的目标文件,Tools->Programmer。在弹出窗口中点击“确定” 。若窗口出现“No Hardware ” ,则需设置下载方式。若有硬件连接,则不需要再设置。点击 “Start ”下载,弹出窗口,注意请勿点击“Cancel ”。

6) 运行 Nios 应用程序。首先点击工程“led8” ,点击右键,选择 Run As –>Nios II Hardware 若出现无目标连接,则需要刷新目标连接。点击“Target Connection”,在窗口中点击“Refresh Connection ”,然后点击“Run ”运行程序。若不出现无目标连接,则会自动运行程序。 设计性实验步骤一致。

五、 实验数据

/*

* "Small Hello World" example. *

* This example prints 'Hello from Nios II' to the STDOUT stream. It runs on * the Nios II 'standard', 'full_featured', 'fast', and 'low_cost' example * designs. It requires a STDOUT device in your system's hardware. *

* The purpose of this example is to demonstrate the smallest possible Hello * World application, using the Nios II HAL library. The memory footprint * of this hosted application is ~332 bytes by default using the standard * reference design. For a more fully featured Hello World application * example, see the example titled "Hello World". *

* The memory footprint of this example has been reduced by making the * following changes to the normal "Hello World" example.

* Check in the Nios II Software Developers Manual for a more complete * description.

*

* In the SW Application project (small_hello_world): *

* - In the C/C++ Build page *

* - Set the Optimization Level to -Os *

* In System Library project (small_hello_world_syslib): * - In the C/C++ Build page *

* - Set the Optimization Level to -Os *

* - Define the preprocessor option ALT_NO_INSTRUCTION_EMULATION

* This removes software exception handling, which means that you cannot * run code compiled for Nios II cpu with a hardware multiplier on a core * without a the multiply unit. Check the Nios II Software Developers * Manual for more details. *

* - In the System Library page:

* - Set Periodic system timer and Timestamp timer to none * This prevents the automatic inclusion of the timer driver. *

* - Set Max file descriptors to 4

* This reduces the size of the file handle pool. *

* - Check Main function does not exit * - Uncheck Clean exit (flush buffers)

* This removes the unneeded call to exit when main returns, since it * won't. *

* - Check Don't use C++

* This builds without the C++ support code. *

* - Check Small C library

* This uses a reduced functionality C library, which lacks * support for buffering, file IO, floating point and getch(), etc. * Check the Nios II Software Developers Manual for a complete list. *

* - Check Reduced device drivers

* This uses reduced functionality drivers if they're available. For the * standard design this means you get polled UART and JTAG UART drivers, * no support for the LCD driver and you lose the ability to program * CFI compliant flash devices. *

* - Check Access device drivers directly

* This bypasses the device file system to access device drivers directly. * This eliminates the space required for the device file system services. * It also provides a HAL version of libc services that access the drivers * directly, further reducing space. Only a limited number of libc * functions are available in this configuration. *

* - Use ALT versions of stdio routines: *

* Function Description

* =============== ===================================== * alt_printf Only supports %s, %x, and %c (

#include "system.h"

#include "altera_avalon_pio_regs.h" #include "alt_types.h"

//int main (void) __attribute__ ((weak, alias ("alt_main"))); int alt_main (void) //如果编译不过,把此处改为int main (void)试试 {

led=0x0f;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

while (1) {

keyvalue=IORD_ALTERA_AVALON_PIO_DATA(PIO_INPUTS_BASE); switch(keyvalue&0x07) { int j;

case 0x0:

alt_u8 led = 0x00; alt_u8 led1 = 0x10; alt_u8 led2 = 0x08; alt_u8 keyvalue=0; volatile int i,k=0,j=0;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

break;

case 0x1:

led=0x55;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

break;

case 0x2:

led=0x03;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

}

led=led

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

break;

case 0x3:

led=led1|led2;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i>1; led=led1|led2;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i>1; led=led1|led2;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);

i=0;while (i>1;

led=led1|led2;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);

i=0;while (i

if(led==0x81)

{ led1=led1>>1;led2=led2

led=led1|led2;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);

i=0;while (i>1;led2=led2

led=led1|led2;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,

led);

i=0;while

(i

i++;

led1=led1>>1;led2=led2

led=led1|led2;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);

i=0;while (i

led1=led1>>1;led2=led2

led=led1|led2;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);

i=0;while (i

case 0x4:

j=0;

while(j

{ led=0x18;IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);

i=0;while (i

led=0x24;IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

led=0x42;IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

led=0x81; IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

led=0x42;IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

led=0x24;IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);

i=0;while (i

led=0x18;IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

j++;}

j=0; while(j

led=0x03;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);

led=led

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

}

for(k=0;k

i=0;while (i

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

j++;} j=0; while(j

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

j++;} } } return 0;

}

break;

六、 数据处理及结果分析

验证性实验实验了跑马灯的功能。

设计性实验实现了用按键控制 8 个 LED 灯的闪烁状态,灯的状态如下: 灯分为左右两部分交替闪烁。

灯分为奇数号和偶数号灯两部分交替闪烁。 循环从左至右间隔(两盏灯一组) 跑动显示;

从中间开始向两侧依次点亮,从两侧向中间依次点亮。 当判断开关状态为00时,LED 为左右两部分交替闪烁。

当判断开关状态为01时,LED 为奇数号和偶数号两部分交替闪烁。

当判断开关状态为10时,LED 为循环从左至右间隔(两盏灯一组) 跑动显示(程序段led=led*2为LED 亮灯右移)。

当判断开关状态为11时,LED 为从中间开始向两侧依次点亮,从两侧向中间依次点亮。

七、实验小结

1、熟悉了Quartus II、SOPC Builder、Nios II IDE 的基本操作; 2、了解了 SOPC 的开发流程,基本掌握 Nios II 软核的定制流程; 3、掌握 了Nios II 软件的开发流程和软件的基本调试方法。

实验名称:Linux 操作系统实验 实验时间:2016.5.19 一、 实验目的

熟悉Linux 开发环境,学会基于S3C2410 的Linux 开发环境的配置和使用。使用Linux

的arm-linux-gcc 编译,使用基于NFS 方式的下载调试,了解嵌入式开发的基本过程。

二、 实验仪器设备

硬件:ARM9 嵌入式实验平台、PC 机。

软件:PC 机操作系统Ubuntu LINUX 9.0+MINICOM +ARM-LINUX 开发环境。

三、 实验原理

实验利用Linux 操作系统,做字符显示。

四、 实验内容

1 、验证实验

(1) 硬件连接

确保 ARM9 实验系统电源未开启下, 用镊子轻轻地将拨码开关 S100 的第二个拨到 ON (朝上) 。在 CON400 处插入 SMC 卡(金属面朝下) 。实验系统 CON500 处插入网线,网线另一端连接到电脑。232 串口线连接到 UART0 处,另一端连接到电脑。连接电源。 电源适配器插头连接到 220V , 另一端连接到实验箱上 CON800 处。实验箱上电源开关 S800 拨到“1”。

(2) 电脑开机,选择“Ubuntu ”,启动到 Linux 操作系统下。

(3) 点击桌面上方的 places->Home Folder ,进入 cxsys 目录,双击 workdir ,在该目录下新建“myhello.c 文件”,创建方法:在该窗口空白处点击鼠标右键,选择“Create->Document->Empty File ”,然后命名该文件“myhello.c ”,如下图所示。双击打开该文件,用 C 语言编辑,实现打印输出“Hello ,自己的学号 名字”。

(4) 打开终端,在桌面左上角点击 Application->Accessories->Terminal。输入 minicom 命令,然后回车,运行。

(5) 在实验平台 dev/shm 目录下创建 nfs 目录。 按“Ctrl+c”, 然后回车。 输入 cd dev/shm,进入 shm 目录下。在该目录下创建 nfs 目录,输入 mkdir nfs 。输入 ls 目录查看命令,可以看到上一步骤创建的 nfs 目录。

(6) 输入挂接(mount)命令:mount -t nfs -o nolock 192.168.1.2:/home/cxsys/NFS_SHARE /dev/shm/nfs, 把 nfs 目录挂接到 PC 机上 home/administrator/NFS_SHARE 目录。 (7) 查看挂接是否成功。可以先拷贝自己步骤(3)新建的 myhello.c 文件到 PC 机上 home/cxsys/NFS_SHARE 目录下, 输入: cd nfs 进入 nfs 目录, 然后回车, 再输入 ls 命令,如果看到所列文件和 PC 机上 home/cxsys/NFS_SHARE 目录下的 myhello.c 文件, 说明挂起成功。显示 nfs 目录下的文件,可以看到。

(8) 另外再打开终端窗口,输入 cd workdir/,进入 workdir 目录。

(9) 设置交叉编译的环境变量, 指定编译工具的路径 export PATH=/home/cxsys/YF 2410/2.95.3/bin:$PATH。

(10) 输入 arm-linux-gcc -o myhello myhello.c,编译 myhello.c 的文件,生成可执行文件。

(11) 在 cxsys/workdir 目录下把生成的可执行文件 hello 复制到 cxsys/NFS_SHARE 下。 (12) 查看可执行文件 hello 在实验平台上的运行结果,切换到最开始打开的终端窗口,输入./hello。 2 、设计性实验

(1) 输入 ls /dev/test/命令,查看设备驱动。可以看到字符设备驱动名称为 0raw,该驱

动在初始化时存入 10 个数据,供应用程序使用。

(2) 输入~$ gedit ~/workdir/Char_dev.c,查看并阅读底层驱动程序 Char_dev.c,~为

/home/administrator/。

(3) 编辑应用程序 yourtest.c,输入设计的代码。 (4) 交叉编译应用程序.

(5) 把编译生成的目标文件拷贝到 nfs_share 里。 (6) 运行程序,输出数据。

五、 实验数据 #include

int main(int argc, char **argv) {

printf("hello! \n"); }

六、 数据处理及结果分析

验证性实验中,输出“hello ”

七、 实验小结

熟悉了Linux 开发环境,学会了基于S3C2410 的Linux 开发环境的配置和使用。并使用Linux 的arm-linux-gcc 编译,使用基于NFS 方式的下载调试,掌握了嵌入式开发的基本过程。

实验名称:DSP 控制步进电机实验 实验时间:2016.5.26

一、实验小结

1、 学习 DSP 外部中断的使用;掌握 DSP 中断向量表的划分。

2、了解汇编和 C 混合编程以及 IO 空间操作等基本 DSP 编程技巧。

二、实验仪器设备

PC 机一台,SZDSPF 型开发实验平台一套

三、实验原理

1、 中断向量表

实验使用的DSP 为TMS320VC5416,DSP 的中断向量表如表3.1所示。

2、 按键与显示

本实验采用CPLD (EPM7128)给DSP 扩展了一个I/O口(地址为C000h ),来完成DSP 对I/O口的访问。对数码管的操作,DSP 通过IO 方式对数码管送数据,高8位D8~D15数据为数码管的位码,低8位D7~D0数据为数码管的段码。 同时,CPLD (EPM7128)给DSP 扩展了一个I/O口(地址为C001h ),来完成DSP 对读所按键键值。

实验采用键盘中断,当有键(任意一个键)按下时,给DSP 一个中断信号(INT2),DSP 通过I/O端口(地址为C001h )读键值,读取键值后由数码管显示出来。其中“键1”对应数据D8位,“键2”对应数据D9位„„“键8”对应数据D15位。数码管模块原理图如下:SM1和SM2为两个四位一体的8段共阴数码管,右边为位码的第一位。

3、步进电机工作原理

步进电机驱动原理是通过对每相线圈中的电流的顺序切换来使电机作步进式旋转。切换是通过单片机输出脉冲信号来实现的。 所以调节脉冲信号的频率便可以改变步进电机的转速,改变各相脉冲的先后顺序,可以改变电机的旋转方向。步进电机的转速应由慢到快逐步加速。 电机驱动方式可以采用双四拍(AB→BC →CD →DA →AB) 方式,也可以采用单四拍(A→B →C →D →

A) 方式,或单、双八拍(A→AB →B →BC →C →CD →D →DA →A) 方式。各种工作方式的时序图如下: (高电平有效)

实验可通过 DSP 的 I/O 方式来控制电机的运转,CPLD(EPM7128)给 DSP 扩展了一个I/O 口。在来完成对步进电机的控制。DSP 的 I/O 方式下,将 DSP 的经过电平转换的四位数据线 D5~D2 送往步进电机模块的锁存器,信号再经过隔离和驱动后对四相(A 、B 、C 、D )步进电机控制。DSP 对步进电机控制的 I/O 访问地址为 C004h。

四、实验内容

1、验证性实验

(1)硬件连接:

①“设置模块”SW1 中“A ”和“C ”将设置为“1”;

②DSP 仿真器的 USB 接口连接 USB 线到 PC 机,JTAG 接口连接到实验箱 SZ-5416模块上 SZ-JTAG 接口。

③将实验箱上的电源模块开关“MS2”、“MS4”按下,打开机箱电源(在机箱右侧船型开关)。

(2) (注意:必须先做步骤(1) ) 参考附录 2“CCS 的使用参考步骤”,在 CCS 下,建立工程文件,把验证性实验的所有源程序(cmd 文件与 c 程序文件)加载到该工程中,编译、链接,链接后生成 OUT 文件,把该目标文件通过 JTAG 下载到实验箱中,全速运行程序,依次按键 1-8,观察数码管的显示。

2、设计性实验

在 CCS 下建立一工程文件调试自己编写程序(或者直接修改验证实验 C 程序)并运行、下载目标文件到实验箱中,验证设计程序。

附录2:

一、建立工程

1. 新建一个工程,Project->New。

2. 在所示窗口中点击 Location ,选择建立工程的存放文件夹,在 Project 中输入工程名。

3. 新建文件 File->New->Source File。

4. 保存文件 File->Save,若是 C 程序,文件以.c 保存,若是汇编程序文件以.asm 保存。

5. 添加文件到工程(如下图所示) ,单击工程,点击鼠标右键,选择 Add files„„。 (cmd 文件通过同样的方式添加) 。

6. 在弹出的窗口中, 选择所要添加文件的类型 (若是 cmd 文件, “文件类型”选择“linker Command File (*.cmd)” ) 。

7. 编译/执行程序

(1) 选择 Project->Rebuid All 或工具栏的相应按钮。

(2) 编译成功后,选择 File->Load Program,选择编译生成的可执行程序*.out。

(3) 选择 Debug->Run 或工具栏中的相应图标。

五、实验数据

#pragma CODE_SECTION(vect,"vect")

unsigned int *pmem=0;

#define IMR *(pmem+0x0000)

#define IFR *(pmem+0x0001)

#define PMST *(pmem+0x001d)

#define SWCR *(pmem+0x002b)

#define SWWSR *(pmem+0x0028)

#define CLKMD *(pmem+0x0058)

ioport unsigned portc001; //键盘地址 ioport unsigned portc000; //数码显示地址 ioport unsigned portc004;

int key=1,n=0;

//数据线的高8位是位码,低8位是段码 void cpu_init() /*初始化DSP*/

{

asm(" ssbx intm");

asm(" ssbx xf "); //总清零 PMST=0xe8;

SWWSR=0x7fff;

SWCR=0x0001;

IMR=0x010c;

IFR=0xffff;

CLKMD=0x1000;

asm(" rsbx xf "); //打开数据口 asm(" rsbx intm");

}

void delay10ms()

{ int i,j,k;

for (i=0;i

for (j=0;j

void main()

{

cpu_init();

while(1)

{

if(key==1)

{ portc004=0x30;

delay10ms(); portc004=0x18; delay10ms(); portc004=0x0c; delay10ms(); portc004=0x06; delay10ms(); portc004=0x03; delay10ms(); }

if(key==2)

{

portc004=0x30; delay10ms(); portc004=0x03; delay10ms(); portc004=0x06; delay10ms(); portc004=0x0c; delay10ms();

portc004=0x18; delay10ms(); }

if(key==3)

{

while(n

{

delay10ms();

n++;

}

}

}

}

interrupt void keyint0() //键盘测试 {

int a;

a=portc001;

a=a&0xff00;

if(a!=0xff00)

{

delay10ms();

a=portc001;

a=a&0xff00;

switch(a)

{

case 0xfe00: portc000=0x013f; key=1;

asm(" nop");

break;

case 0xfd00: portc000=0x0206; key=2;

asm(" nop");

break;

case 0xfb00: portc000=0x045b; key=3;

asm(" nop");

break;

}

}

}

void vect()

{

asm(" .ref _c_int00"); asm(" .ref _keyint0");

asm(" b _c_int00"); /* reset */ asm(" nop");

asm(" nop");

asm(" rete"); /* nmi */ asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete"); //

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete "); /* int0 */ asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete"); /* int1 */ asm(" nop");

asm(" nop");

asm(" nop");

asm(" b _keyint0"); /* int2 */ asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop"); /* tint0 */ asm(" nop");

asm(" nop");

asm(" rete"); /* brint0 */

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete"); /* bxint0 */

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete"); /* dmac0 */

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete"); /* tint1 */

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop"); /* int3 */

asm(" nop");

asm(" nop");

asm(" rete"); /* hpint */

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete "); /* brint1 */

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete"); /* bxint1 */

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete"); /* dmac4 */

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete"); /* dmac5 */

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

}

六、数据处理及结果分析

验证性实验:

每按下一个键,八段译码管会显示不同的数,分别为:

按键一显示“0”;

按键二显示“1”;

按键三显示“2”;

按键四显示“3”;

按键五显示“4”;

按键六显示“5”;

按键七显示“6”;

按键八显示“7”;

设计性实验:

按下按键一,显示“0”,同时电机停止旋转;

按下按键二,显示“1”,同时电机以较慢速度正转;

按下按键三,显示“2”,同时电机以较慢速度反转;

按下按键四,显示“3”,同时电机以较快速度正转;

按下按键五,显示“4”,同时电机以较快速度反转;

实验中,电机转速的快慢是根据不同的延时来设置,而延时的长短是根据循环参数设置的不同来设定,参数是直接进行参数调用的。

通过该次实验,掌握汇编和 C 混合编程以及 IO 空间操作等基本 DSP 编程技巧,了解了DSP 外部中断的使用;掌握 DSP 中断向量表的划分。

七、实验小结

1、掌握DSP 外部中断的使用;了解了DSP 中断向量表的划分。

2、学习了汇编和 C 混合编程以及 IO 空间操作等基本 DSP 编程技巧。

研究生专业实验教学

实验报告书

实验课程名称: 实验指导教师: 学 院: 专业及类别: 学 号: 姓 名: 实验日期: 成 绩:

嵌入式系统专业实验

重庆大学研究生院制

实验名称:FPGA SOPC 实验 实验时间:2016.5.5 2016.5.12 一、 实验目的

1、学习 Quartus II、SOPC Builder、Nios II IDE 的基本操作; 2、初步了解 SOPC 的开发流程,基本掌握 Nios II 软核的定制流程; 3、掌握 Nios II 软件的开发流程;掌握软件的基本调试方法。

二、 实验仪器设备

硬件: PC 机,FPGA 实验开发平台;

软件: Quartus II 9.1,SOPC Builder9.1,Nios II IDE 9.1。

三、 实验原理

实验利用Quartus 软件内嵌的SOPC Builder 工具来构造实验硬件,在Nios II 软件编译

工具中开发程序来控制实验箱中的LED 灯实现闪烁的效果。 1、验证实验:

建立可用于控制 LED 闪烁的简单 Nios II 处理器系统,具体包括: (1) 在 Quartus II 中建立一个工程;

(2) 使用 SOPC Builder 建立并生成一个简单的基于 Nios II 的硬件系统; (3) 在 Quartus II 工程中编译基于 Nios II 的硬件系统并生成配置文件.sof ; (4) 在 Nios II IDE 中建立对应硬件系统的用户 C/C++工程, 编写一简单用户程序, 在 Nios II IDE 中编译程序生成可执行文件.elf ;

(5) 将配置文件.sof 和可执行文件.elf 都下载到 FPGA 进行调试运行。 2、设计实验:

用按键控制 8 个 LED 灯的闪烁状态,灯的状态如下: 灯分为左右两部分交替闪烁。

灯分为奇数号和偶数号灯两部分交替闪烁。 循环从左至右间隔(两盏灯一组) 跑动显示;

从中间开始向两侧依次点亮,从两侧向中间依次点亮。

四、 实验内容

1 .文件夹的建立

在计算机上创建文件夹,要求用英文或数字命名,不能用中文命名。 2 .文本文件的建立

1) 单击“开始”→“程序”→Altera →QuartusII 9.1SP2。

2) 点击菜单栏 File →New Project Wizard,弹出对话框式。点击Next>按钮继续,修改,而后点击 Next>继续,出现提示D 盘nios2目录下面没有led 这个目录,询问是否要创建它,选择是(y),让QuartusII 创建这个目录。点击”Next ”。

3) 向导开始询问是否有现成的文件需要加到当前新建的工程中点击Next>继续,在图(6)中选择试验箱的芯片Cyclone ⅣE 系列的EP4CE40F23I7 ,点击Next>,最后点击Finish 完成新建项目(注:在项目文件中找到led.qsf 文件修改器件的电压值为1.2V ) 3 .NIOSII 软核 建立

1) 在Quartus 下,向工程中添加文件,先建立一个 Block Diagram / Schematic File,点 击菜单栏中的 File->New,打开新建文件对话框,我们选中 Block Diagram /Schematic File,然后点击OK按钮。

2) 接下来我们该启动 SOPC Buider 来创建NIOSII 软核了,点击Tools-> SOPC Builder会出现对话框在在最上层的Create New System 对话框中的System Name:中输入软核的名字,在本示例中,输入helloled 做为软件核的名字, 点击OK按钮确认。

3) 窗口左上角的Clock Settings 显示clk_0 为外部时钟,频率为50Mhz ,这是我们当前所用到的软核时钟。 (注:外部时钟频率可以修改,此实验最好按板上晶振改为25Mhz ) 4) 接下来要建立 CPU ,用鼠标双击窗口左侧框中的 Processors->NIOS II Processor弹出如窗口, 先选择软核的类型, Quartus 一共提供了三种类型可供选择, Nios II/e 占用资源最少600-800LEs ,功能也最简单,速度最慢。Nios II/s 占资源比前者多一些,功能也多了,速度也快一些,Nios II/f 占资源最多,功能也最多,速度就快。选择的时候要根据你的需求和你的芯片资源来决定, 在本实验中,我们选择 Nios II /s,能够满足需要。在窗口下半部分的这些选项可以先不用管Reset Vector 是复位后启动时的Memory 类型和偏移量Exception Vector 是异常情况时的Memory 类型和偏移量。现在还不能配置,需要 RAM 设置好以后才能修改这里,点击 Next ,需要设置 JTAG Debug Module ,即JTAG 调试时所要用到的功能模块,我们选择Level1, 只使用最简单的功能。 点击 Next> 继续,最后点击 Finish 完成,出现cpu_0,就是刚才创建的cpu 。

5) 接下面我们要添加片内RAM 选择左边目录树下的Memories and Memory

Controllers->On-Chip ->On-Chip Memory (RAM or ROM) 双击 On-Chip Memory (RAM or ROM) ,我们将RAM 的大小改为20K , 其他不做修改, 然后直接点击 Finish 完成,回到SOPC Builder 主窗口。主窗口上又加了一个 Onchip_memory2_0 的Module 。

6) 接下来建立一个SystemID(这个版本中不是必需的) ,System ID 就是一种标示符,类似校验和的这么个东西,在你下载程序之前或者重启之后,都会对它进行检验,以防止错误发生。在左边窗口的Peripherals->Debug and performance ->System ID Peripheral ,双击System ID Peripheral 会弹出对话框此窗口警告:System ID 组件的名字必需为sysid 才能使用, 点击Finish 完成添加, 在SPOC builder 主窗口中选中SystemID 组件,然后击点鼠标右键,弹下一个菜单,选择 Rename ,对sysid_0 组件进行重命名, 将此文本框中的 sysid_0 改为sysid 。 照此方法, 我们把所有组件后面的_0 全部去掉。

7) 接下来创建 JTAG UART(调试时需要打字符串用才需要,如果单纯控制LED 可以不要),首先 JTAG UART 是实现PC 和NiosII 系统间的串行通信接口,它用于字符的输入输出,在NiosII 的开发调试过程中扮演了重要的角色,接下来我们开始建立它的模块。选择sopc builder 主窗口左边Interface Protocols->Serial->JTAG UART 双击JTAG UART ,不做修改, 点击 Next> , 下一步点击 finish 完成。 回到SOPCBuilder 主窗口,更改组件名jtag_uart_0 为jtag_uart 。

8) 接下来回去对CPU进行设定,在主窗口中双击CPU组件进入CPU设定对话框,如下把 Reset Vector 右边的Memory:改为onchip_memory2 ,offset 会设为0x0把Exception Vector 右边的Memory 改为onchip_memory2 , offset 会设为0x20,点击窗口右下角的finish 完成。 9) 接下来要添加一个PIO 模块(Parallel I/O),点击窗口左侧的 Peripherals ->Microcontroller Peripherals -> PIO(Parallel I/O),其中Width 表示要建立的PIO 宽度是多少,我们的板上有8个LED ,选择宽度为8,Direction 复选框中表示要建立的PIO 的方向, 分别表示Bidirectional(tristate) ports(双向三态口) , Input ports only (仅仅作为输入口) ,Both input and output ports (作为输入和输出口) ,Output ports only (仅仅作为输出口) ,在本实验中将要实现的是点亮LED ,所以这个新建的PIO 采用Output ports only(仅输出口) 方式,点击 Next 继续, 不需要选择,点Next 继续,直接点击 Finish, 完成PIO 模块的创建回到主窗口中我们为了方便识别,将pio_0改名为pio_led。

10) 执行System 菜单上的Auto-Assign Base Addresses 自动分配一下地址。最后就能进行编译了,点击 SOPC Builder 主窗口左上角的System Generation 选项卡. 我们点击最下面的Generate 按键,弹出对话框会提示你是否保存改变,点Save, 保存一下。开始编译,程序编好了,查看下最后的输出,最后一行显示 Info:System generation was successful ,产生成功点击 Exit 退出,会回到Quartus II 主界面。

11) 在这一步中需要分配管脚,回到 Quartus 界面以后,在Block1.bdf 界面里在空白处双击左

键,会出现对话框(注意上图的红框内)展开左边的Project ,下面有个helloled ,这个helloled, 就是刚才建立的NIOSII 软核, quartusii 中把它用了一个方块symbol 来表示,点击左下角的OK按钮在 Block1.bdf 界面中,有个小方框阴影跟随着鼠标移动,鼠标点击,把它放在Block1.bdf 界面中放好,在 NIOS 软核helloled 上点击右键后点击Generate Pins for symbol ports ,这一步作用就是生成管脚,通过命名以后给信号分配真正的fpga io 口引脚。然后双击out_port_from_the_pio_led[7..0]端口符号,弹出窗口中修改引脚名,改为 led[7..0],所示确认后,点击按钮编译工程,在弹出窗口中保存bdf 文件为led 。编译完成后,如果提示所示错误,则需要修改工程文件夹下

led.qsf

文件中“set_global_assignment

-nameNOMINAL_CORE_SUPPLY_VOLTAGE 1.0V ”1.0V 修改为1.2V ,再次进行编译。编译成功后点击Assignments->Pins绑定引脚。

12) 接下来要对工程进行配置在 quartus9.1sp2 主窗口中, 鼠标右键点击 led , 选择 setting 。进入 Setting 后,点击 Device 下面的 Device and pin Option,出现 Device and Pin

Options 对话框,选择 Configuration 选项卡在 Configuration device 下面的 Useconfiguration device 中选择 EPCS4 改好后,点击确认,再点击OK按钮返回 quartus9.1sp2 主界面 Save all 按钮,保存下所有的改动。执行菜单 Processing -> Start Compilation ,开始进行编译,最后 Quartus 显示一共用掉了 5%的逻辑单元,用掉了 18%的片上内存, 接下来要将生成好的*.sof 或*.pof 下载到 FPGA 中, 至此, NIOS 的硬件逻辑部分已经编译完成并下载了,接下来要进行 nios 的软件部分了。

4 .NIOSII 软件LED 跑马灯 编写

1)打开 Nios II 软件,开始—>程序—>Altera—>Nios II EDS 9.1—>Nios II 9.1 Software Build Tools for Eclipse。

2)新建 Nios II Application,New —>Nios II Application and BSP from Template。选择先前生成的 SOPC 文件,并输入工程名,选择工程模板 Hello World Small。然后点击“Finish ” 。左侧窗口中点击“hello_world_small.c” ,可以看到程序。

4)双击 led8.c ,写入程序,并保存。然后编译工程,在窗口的右下角可以看到编译进程。如果编译无错,则进行下载。

5)下载运行。首先在实验箱上把之前绑定的 FPGA 引脚连接到 LED 对应的引脚,仿真器通过排线连接到实验箱上“JTAG ”处,另一接口通过 USB 线连接到电脑。在 Quartus 软件中下载先前生成的目标文件,Tools->Programmer。在弹出窗口中点击“确定” 。若窗口出现“No Hardware ” ,则需设置下载方式。若有硬件连接,则不需要再设置。点击 “Start ”下载,弹出窗口,注意请勿点击“Cancel ”。

6) 运行 Nios 应用程序。首先点击工程“led8” ,点击右键,选择 Run As –>Nios II Hardware 若出现无目标连接,则需要刷新目标连接。点击“Target Connection”,在窗口中点击“Refresh Connection ”,然后点击“Run ”运行程序。若不出现无目标连接,则会自动运行程序。 设计性实验步骤一致。

五、 实验数据

/*

* "Small Hello World" example. *

* This example prints 'Hello from Nios II' to the STDOUT stream. It runs on * the Nios II 'standard', 'full_featured', 'fast', and 'low_cost' example * designs. It requires a STDOUT device in your system's hardware. *

* The purpose of this example is to demonstrate the smallest possible Hello * World application, using the Nios II HAL library. The memory footprint * of this hosted application is ~332 bytes by default using the standard * reference design. For a more fully featured Hello World application * example, see the example titled "Hello World". *

* The memory footprint of this example has been reduced by making the * following changes to the normal "Hello World" example.

* Check in the Nios II Software Developers Manual for a more complete * description.

*

* In the SW Application project (small_hello_world): *

* - In the C/C++ Build page *

* - Set the Optimization Level to -Os *

* In System Library project (small_hello_world_syslib): * - In the C/C++ Build page *

* - Set the Optimization Level to -Os *

* - Define the preprocessor option ALT_NO_INSTRUCTION_EMULATION

* This removes software exception handling, which means that you cannot * run code compiled for Nios II cpu with a hardware multiplier on a core * without a the multiply unit. Check the Nios II Software Developers * Manual for more details. *

* - In the System Library page:

* - Set Periodic system timer and Timestamp timer to none * This prevents the automatic inclusion of the timer driver. *

* - Set Max file descriptors to 4

* This reduces the size of the file handle pool. *

* - Check Main function does not exit * - Uncheck Clean exit (flush buffers)

* This removes the unneeded call to exit when main returns, since it * won't. *

* - Check Don't use C++

* This builds without the C++ support code. *

* - Check Small C library

* This uses a reduced functionality C library, which lacks * support for buffering, file IO, floating point and getch(), etc. * Check the Nios II Software Developers Manual for a complete list. *

* - Check Reduced device drivers

* This uses reduced functionality drivers if they're available. For the * standard design this means you get polled UART and JTAG UART drivers, * no support for the LCD driver and you lose the ability to program * CFI compliant flash devices. *

* - Check Access device drivers directly

* This bypasses the device file system to access device drivers directly. * This eliminates the space required for the device file system services. * It also provides a HAL version of libc services that access the drivers * directly, further reducing space. Only a limited number of libc * functions are available in this configuration. *

* - Use ALT versions of stdio routines: *

* Function Description

* =============== ===================================== * alt_printf Only supports %s, %x, and %c (

#include "system.h"

#include "altera_avalon_pio_regs.h" #include "alt_types.h"

//int main (void) __attribute__ ((weak, alias ("alt_main"))); int alt_main (void) //如果编译不过,把此处改为int main (void)试试 {

led=0x0f;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

while (1) {

keyvalue=IORD_ALTERA_AVALON_PIO_DATA(PIO_INPUTS_BASE); switch(keyvalue&0x07) { int j;

case 0x0:

alt_u8 led = 0x00; alt_u8 led1 = 0x10; alt_u8 led2 = 0x08; alt_u8 keyvalue=0; volatile int i,k=0,j=0;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

break;

case 0x1:

led=0x55;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

break;

case 0x2:

led=0x03;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

}

led=led

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

break;

case 0x3:

led=led1|led2;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i>1; led=led1|led2;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i>1; led=led1|led2;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);

i=0;while (i>1;

led=led1|led2;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);

i=0;while (i

if(led==0x81)

{ led1=led1>>1;led2=led2

led=led1|led2;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);

i=0;while (i>1;led2=led2

led=led1|led2;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,

led);

i=0;while

(i

i++;

led1=led1>>1;led2=led2

led=led1|led2;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);

i=0;while (i

led1=led1>>1;led2=led2

led=led1|led2;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);

i=0;while (i

case 0x4:

j=0;

while(j

{ led=0x18;IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);

i=0;while (i

led=0x24;IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

led=0x42;IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

led=0x81; IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

led=0x42;IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

led=0x24;IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);

i=0;while (i

led=0x18;IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

j++;}

j=0; while(j

led=0x03;

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);

led=led

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

}

for(k=0;k

i=0;while (i

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

j++;} j=0; while(j

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); i=0;while (i

j++;} } } return 0;

}

break;

六、 数据处理及结果分析

验证性实验实验了跑马灯的功能。

设计性实验实现了用按键控制 8 个 LED 灯的闪烁状态,灯的状态如下: 灯分为左右两部分交替闪烁。

灯分为奇数号和偶数号灯两部分交替闪烁。 循环从左至右间隔(两盏灯一组) 跑动显示;

从中间开始向两侧依次点亮,从两侧向中间依次点亮。 当判断开关状态为00时,LED 为左右两部分交替闪烁。

当判断开关状态为01时,LED 为奇数号和偶数号两部分交替闪烁。

当判断开关状态为10时,LED 为循环从左至右间隔(两盏灯一组) 跑动显示(程序段led=led*2为LED 亮灯右移)。

当判断开关状态为11时,LED 为从中间开始向两侧依次点亮,从两侧向中间依次点亮。

七、实验小结

1、熟悉了Quartus II、SOPC Builder、Nios II IDE 的基本操作; 2、了解了 SOPC 的开发流程,基本掌握 Nios II 软核的定制流程; 3、掌握 了Nios II 软件的开发流程和软件的基本调试方法。

实验名称:Linux 操作系统实验 实验时间:2016.5.19 一、 实验目的

熟悉Linux 开发环境,学会基于S3C2410 的Linux 开发环境的配置和使用。使用Linux

的arm-linux-gcc 编译,使用基于NFS 方式的下载调试,了解嵌入式开发的基本过程。

二、 实验仪器设备

硬件:ARM9 嵌入式实验平台、PC 机。

软件:PC 机操作系统Ubuntu LINUX 9.0+MINICOM +ARM-LINUX 开发环境。

三、 实验原理

实验利用Linux 操作系统,做字符显示。

四、 实验内容

1 、验证实验

(1) 硬件连接

确保 ARM9 实验系统电源未开启下, 用镊子轻轻地将拨码开关 S100 的第二个拨到 ON (朝上) 。在 CON400 处插入 SMC 卡(金属面朝下) 。实验系统 CON500 处插入网线,网线另一端连接到电脑。232 串口线连接到 UART0 处,另一端连接到电脑。连接电源。 电源适配器插头连接到 220V , 另一端连接到实验箱上 CON800 处。实验箱上电源开关 S800 拨到“1”。

(2) 电脑开机,选择“Ubuntu ”,启动到 Linux 操作系统下。

(3) 点击桌面上方的 places->Home Folder ,进入 cxsys 目录,双击 workdir ,在该目录下新建“myhello.c 文件”,创建方法:在该窗口空白处点击鼠标右键,选择“Create->Document->Empty File ”,然后命名该文件“myhello.c ”,如下图所示。双击打开该文件,用 C 语言编辑,实现打印输出“Hello ,自己的学号 名字”。

(4) 打开终端,在桌面左上角点击 Application->Accessories->Terminal。输入 minicom 命令,然后回车,运行。

(5) 在实验平台 dev/shm 目录下创建 nfs 目录。 按“Ctrl+c”, 然后回车。 输入 cd dev/shm,进入 shm 目录下。在该目录下创建 nfs 目录,输入 mkdir nfs 。输入 ls 目录查看命令,可以看到上一步骤创建的 nfs 目录。

(6) 输入挂接(mount)命令:mount -t nfs -o nolock 192.168.1.2:/home/cxsys/NFS_SHARE /dev/shm/nfs, 把 nfs 目录挂接到 PC 机上 home/administrator/NFS_SHARE 目录。 (7) 查看挂接是否成功。可以先拷贝自己步骤(3)新建的 myhello.c 文件到 PC 机上 home/cxsys/NFS_SHARE 目录下, 输入: cd nfs 进入 nfs 目录, 然后回车, 再输入 ls 命令,如果看到所列文件和 PC 机上 home/cxsys/NFS_SHARE 目录下的 myhello.c 文件, 说明挂起成功。显示 nfs 目录下的文件,可以看到。

(8) 另外再打开终端窗口,输入 cd workdir/,进入 workdir 目录。

(9) 设置交叉编译的环境变量, 指定编译工具的路径 export PATH=/home/cxsys/YF 2410/2.95.3/bin:$PATH。

(10) 输入 arm-linux-gcc -o myhello myhello.c,编译 myhello.c 的文件,生成可执行文件。

(11) 在 cxsys/workdir 目录下把生成的可执行文件 hello 复制到 cxsys/NFS_SHARE 下。 (12) 查看可执行文件 hello 在实验平台上的运行结果,切换到最开始打开的终端窗口,输入./hello。 2 、设计性实验

(1) 输入 ls /dev/test/命令,查看设备驱动。可以看到字符设备驱动名称为 0raw,该驱

动在初始化时存入 10 个数据,供应用程序使用。

(2) 输入~$ gedit ~/workdir/Char_dev.c,查看并阅读底层驱动程序 Char_dev.c,~为

/home/administrator/。

(3) 编辑应用程序 yourtest.c,输入设计的代码。 (4) 交叉编译应用程序.

(5) 把编译生成的目标文件拷贝到 nfs_share 里。 (6) 运行程序,输出数据。

五、 实验数据 #include

int main(int argc, char **argv) {

printf("hello! \n"); }

六、 数据处理及结果分析

验证性实验中,输出“hello ”

七、 实验小结

熟悉了Linux 开发环境,学会了基于S3C2410 的Linux 开发环境的配置和使用。并使用Linux 的arm-linux-gcc 编译,使用基于NFS 方式的下载调试,掌握了嵌入式开发的基本过程。

实验名称:DSP 控制步进电机实验 实验时间:2016.5.26

一、实验小结

1、 学习 DSP 外部中断的使用;掌握 DSP 中断向量表的划分。

2、了解汇编和 C 混合编程以及 IO 空间操作等基本 DSP 编程技巧。

二、实验仪器设备

PC 机一台,SZDSPF 型开发实验平台一套

三、实验原理

1、 中断向量表

实验使用的DSP 为TMS320VC5416,DSP 的中断向量表如表3.1所示。

2、 按键与显示

本实验采用CPLD (EPM7128)给DSP 扩展了一个I/O口(地址为C000h ),来完成DSP 对I/O口的访问。对数码管的操作,DSP 通过IO 方式对数码管送数据,高8位D8~D15数据为数码管的位码,低8位D7~D0数据为数码管的段码。 同时,CPLD (EPM7128)给DSP 扩展了一个I/O口(地址为C001h ),来完成DSP 对读所按键键值。

实验采用键盘中断,当有键(任意一个键)按下时,给DSP 一个中断信号(INT2),DSP 通过I/O端口(地址为C001h )读键值,读取键值后由数码管显示出来。其中“键1”对应数据D8位,“键2”对应数据D9位„„“键8”对应数据D15位。数码管模块原理图如下:SM1和SM2为两个四位一体的8段共阴数码管,右边为位码的第一位。

3、步进电机工作原理

步进电机驱动原理是通过对每相线圈中的电流的顺序切换来使电机作步进式旋转。切换是通过单片机输出脉冲信号来实现的。 所以调节脉冲信号的频率便可以改变步进电机的转速,改变各相脉冲的先后顺序,可以改变电机的旋转方向。步进电机的转速应由慢到快逐步加速。 电机驱动方式可以采用双四拍(AB→BC →CD →DA →AB) 方式,也可以采用单四拍(A→B →C →D →

A) 方式,或单、双八拍(A→AB →B →BC →C →CD →D →DA →A) 方式。各种工作方式的时序图如下: (高电平有效)

实验可通过 DSP 的 I/O 方式来控制电机的运转,CPLD(EPM7128)给 DSP 扩展了一个I/O 口。在来完成对步进电机的控制。DSP 的 I/O 方式下,将 DSP 的经过电平转换的四位数据线 D5~D2 送往步进电机模块的锁存器,信号再经过隔离和驱动后对四相(A 、B 、C 、D )步进电机控制。DSP 对步进电机控制的 I/O 访问地址为 C004h。

四、实验内容

1、验证性实验

(1)硬件连接:

①“设置模块”SW1 中“A ”和“C ”将设置为“1”;

②DSP 仿真器的 USB 接口连接 USB 线到 PC 机,JTAG 接口连接到实验箱 SZ-5416模块上 SZ-JTAG 接口。

③将实验箱上的电源模块开关“MS2”、“MS4”按下,打开机箱电源(在机箱右侧船型开关)。

(2) (注意:必须先做步骤(1) ) 参考附录 2“CCS 的使用参考步骤”,在 CCS 下,建立工程文件,把验证性实验的所有源程序(cmd 文件与 c 程序文件)加载到该工程中,编译、链接,链接后生成 OUT 文件,把该目标文件通过 JTAG 下载到实验箱中,全速运行程序,依次按键 1-8,观察数码管的显示。

2、设计性实验

在 CCS 下建立一工程文件调试自己编写程序(或者直接修改验证实验 C 程序)并运行、下载目标文件到实验箱中,验证设计程序。

附录2:

一、建立工程

1. 新建一个工程,Project->New。

2. 在所示窗口中点击 Location ,选择建立工程的存放文件夹,在 Project 中输入工程名。

3. 新建文件 File->New->Source File。

4. 保存文件 File->Save,若是 C 程序,文件以.c 保存,若是汇编程序文件以.asm 保存。

5. 添加文件到工程(如下图所示) ,单击工程,点击鼠标右键,选择 Add files„„。 (cmd 文件通过同样的方式添加) 。

6. 在弹出的窗口中, 选择所要添加文件的类型 (若是 cmd 文件, “文件类型”选择“linker Command File (*.cmd)” ) 。

7. 编译/执行程序

(1) 选择 Project->Rebuid All 或工具栏的相应按钮。

(2) 编译成功后,选择 File->Load Program,选择编译生成的可执行程序*.out。

(3) 选择 Debug->Run 或工具栏中的相应图标。

五、实验数据

#pragma CODE_SECTION(vect,"vect")

unsigned int *pmem=0;

#define IMR *(pmem+0x0000)

#define IFR *(pmem+0x0001)

#define PMST *(pmem+0x001d)

#define SWCR *(pmem+0x002b)

#define SWWSR *(pmem+0x0028)

#define CLKMD *(pmem+0x0058)

ioport unsigned portc001; //键盘地址 ioport unsigned portc000; //数码显示地址 ioport unsigned portc004;

int key=1,n=0;

//数据线的高8位是位码,低8位是段码 void cpu_init() /*初始化DSP*/

{

asm(" ssbx intm");

asm(" ssbx xf "); //总清零 PMST=0xe8;

SWWSR=0x7fff;

SWCR=0x0001;

IMR=0x010c;

IFR=0xffff;

CLKMD=0x1000;

asm(" rsbx xf "); //打开数据口 asm(" rsbx intm");

}

void delay10ms()

{ int i,j,k;

for (i=0;i

for (j=0;j

void main()

{

cpu_init();

while(1)

{

if(key==1)

{ portc004=0x30;

delay10ms(); portc004=0x18; delay10ms(); portc004=0x0c; delay10ms(); portc004=0x06; delay10ms(); portc004=0x03; delay10ms(); }

if(key==2)

{

portc004=0x30; delay10ms(); portc004=0x03; delay10ms(); portc004=0x06; delay10ms(); portc004=0x0c; delay10ms();

portc004=0x18; delay10ms(); }

if(key==3)

{

while(n

{

delay10ms();

n++;

}

}

}

}

interrupt void keyint0() //键盘测试 {

int a;

a=portc001;

a=a&0xff00;

if(a!=0xff00)

{

delay10ms();

a=portc001;

a=a&0xff00;

switch(a)

{

case 0xfe00: portc000=0x013f; key=1;

asm(" nop");

break;

case 0xfd00: portc000=0x0206; key=2;

asm(" nop");

break;

case 0xfb00: portc000=0x045b; key=3;

asm(" nop");

break;

}

}

}

void vect()

{

asm(" .ref _c_int00"); asm(" .ref _keyint0");

asm(" b _c_int00"); /* reset */ asm(" nop");

asm(" nop");

asm(" rete"); /* nmi */ asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete"); //

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete "); /* int0 */ asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete"); /* int1 */ asm(" nop");

asm(" nop");

asm(" nop");

asm(" b _keyint0"); /* int2 */ asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop"); /* tint0 */ asm(" nop");

asm(" nop");

asm(" rete"); /* brint0 */

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete"); /* bxint0 */

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete"); /* dmac0 */

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete"); /* tint1 */

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop"); /* int3 */

asm(" nop");

asm(" nop");

asm(" rete"); /* hpint */

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete "); /* brint1 */

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete"); /* bxint1 */

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete"); /* dmac4 */

asm(" nop");

asm(" nop");

asm(" nop");

asm(" rete"); /* dmac5 */

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

}

六、数据处理及结果分析

验证性实验:

每按下一个键,八段译码管会显示不同的数,分别为:

按键一显示“0”;

按键二显示“1”;

按键三显示“2”;

按键四显示“3”;

按键五显示“4”;

按键六显示“5”;

按键七显示“6”;

按键八显示“7”;

设计性实验:

按下按键一,显示“0”,同时电机停止旋转;

按下按键二,显示“1”,同时电机以较慢速度正转;

按下按键三,显示“2”,同时电机以较慢速度反转;

按下按键四,显示“3”,同时电机以较快速度正转;

按下按键五,显示“4”,同时电机以较快速度反转;

实验中,电机转速的快慢是根据不同的延时来设置,而延时的长短是根据循环参数设置的不同来设定,参数是直接进行参数调用的。

通过该次实验,掌握汇编和 C 混合编程以及 IO 空间操作等基本 DSP 编程技巧,了解了DSP 外部中断的使用;掌握 DSP 中断向量表的划分。

七、实验小结

1、掌握DSP 外部中断的使用;了解了DSP 中断向量表的划分。

2、学习了汇编和 C 混合编程以及 IO 空间操作等基本 DSP 编程技巧。


相关内容

  • 单片机传感器参考文献
  • [1] 王青云. 基于单片机的温度测量系统[J] 2010,(05). [2] 彭立,张建洲,王少华. 自适应温度控制系统的研制[J]东北师大学报(自然科学版), 1994,(01) . [3] Jack Shandle. 即将来临的32位浪潮--ARM构架在32位微控制器领域的应用[J]单片机与嵌 ...

  • 液晶显示中央信号报警装置
  • ◆32-128路信号输入 ◆输入信号常开空接点(持续或脉冲可设置, 脉宽不小于200ms ),有源24V 信号可选 ◆信号屏蔽或开启设置 ◆液晶显示 ◆时钟显示及设置 ◆事件记录500条(含第n 路年月日时分秒发生,第n 路年月日时分秒恢复) ◆数据存储时间:装置掉电数据存储10年不丢失 ◆通讯接口 ...

  • 水电暖施工组织设计
  • 水.电.暖安装工程 施 工 组 织 设 计 潍坊三强建筑安装工程有限公司 5.14电气工程: 5.14.1施工依据: (1)根据设计提供的施工图纸. (2)"民用建筑电气施工规范"92DQ1-13标准图集. (3)建筑电气安装工程图集1-4册. (4)北京市建筑安装分项工程施工工 ...

  • 嵌入式课程设计论文
  • 武汉工程大学 课程设计(论文) 题 目 单片机实验课程设计 姓 名 学 号 指导老师 指导教师职称 讲师 年级专业班级 13级信息02班 所在学院 2015年1月14日 目录 摘要 3 前言 4 第一章 IO输入/输出---半导体温度传感器DS18B20实验 5 1.1 系统总体方针图 5 1.2 ...

  • RCS-985RE注入式发电机转子接地保护装置
  • ZL_YJBH2007.0905 RCS-985RE 注入式发电机转子接地保护装置 技术和使用说明书 南京南瑞继保电气有限公司版权所有2009 Ver 2.01 本公司保留对此说明书修改的权利,届时恕不另行通知.产品与说明书不符之处,以实际产品为准. 更多产品信息,请访问互联网:http://www ...

  • 受电弓技术资料
  • CRH动车组受电弓试验台 CRH动车组便携式受电弓检测仪 北京铁道工程机电技术研究所 二零零七年十二月 CRH动车组受电弓试验台 一. 适用范围 受电弓静态特性测试试验台是专为和谐号动车组高速车受电弓进行检修调试设计的全自动试验设备.采用工业微机系统.全套设备采用触摸屏技术和人机操作界面,实现了所见 ...

  • 关于测试接地电阻的几个问题
  • Standard&Testing 标准・检测检测技术 关于测试接地电阻的几个问题 接地电阻在家电安全标准中是指,电器的易触及金属部件与接地端子或接地触点之间的连接电阻,它是评价电器接地连续性的量化指标.接地电阻试验是电气安令检测中枪验接地端子或接地触点与接地金属部件之间的连接是否具有低电阻的 ...

  • 水电站照明设备及其附件技术规范
  • 西北水电 NORTHWEST HYDROPOWER 达岱河水电站 照明设备及其附件 技术规范 中 国 水 电 顾 问 集 团 西 北 勘 测 设 计 研 究 院 2012年12月 目 录 第1章 一般规定 ............................................... ...

  • 电气及其自动化与电子通讯工程专业的区别
  • 电气及其自动化与电子通讯工程谁更有前景些? 核心提示:. 问题补充: 这电气主要是做什么的? 回答: 还是做前者吧!现在的行业发展情况是,全国都在大搞城市基础设施建设,电气是工民建都需要的专... . 问题补充: 这电气主要是做什么的? 回答: 还是做前者吧!此刻的行业成长情况是,全国都在大搞城市基 ...

  • 本科毕设题目(单片机相关)
  • 单片机毕业设计题目,电子毕业设计题目 1. 单片机接入Internet 技术在智能小区中的应用与研究 2. 基于PIC 单片机的高压智能同步开关控制系统设计 3. 基于单片机的刚性转子现场动平衡测试系统的研制 4. 基于单片机的现场多道核能谱数据采集系统研究 5. 单片机模糊控制晶闸管直流调压系统的 ...