基于SOPC的LED循环流水灯控制设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程报告
设计课题: 基于SOPC 的LED 循环流水灯控制设计
姓名: XXX
专业: 集成电路设计与集成系统
学号: 1115103004
日期 2014 年 11月 18 日
指导教师: XXX 华侨大学信息科学与工程学院电子工程系
基于SOPC的LED循环流水灯控制设计
一.设计的任务与要求
1. 将8 只LED 灯编号,奇数号亮1 秒,灭2 秒,偶数号亮3 秒,灭3 秒。
2. 用数码管显示每个灯的亮灭时间。
3. 循环点亮。
二.系统设计
整体硬件电路框图
整体电路设计由一个锁相环,SOPC搭建的CPU模块组成,由DE2内部时钟50MHZ输入控制,输出接LED[7..0]8个LED灯,HEX0-HEX7 8个数码管,用程序编程控制,来实现LED循环流水灯数码管计时功能的实现。
三.单元电路设计
锁相环设计模块(PLL)
SOPC设计模块
在DE2 平台上建立SOPC系统的硬件,这个系统包括一个NIos II/s 嵌入式处理器、存储器、一个JTAG UART 及一个定时器,一个ID 模块和IO模块。另外,我们将加入一个自定义组件,实现对DE2 平台上七段数码管的控制。
SOPC模块硬件电路图
四:仿真结果
五.软件设计
程序详见附录
六.系统测试:
实验仪器用DE2板验证,芯片型号为EP2C35F672C6,将计算机软件与DE2板相连。用8只LED灯实现循环点亮,并在8只数码管显示每只LED灯的亮灭时间。
七.结论:
从DE2板实验结果可以看出,该实验现象满足设计的任务与要求,即:
1. 将8 只LED 灯编号,奇数号亮1 秒,灭2 秒,偶数号亮3 秒,灭3 秒。
2. 用数码管显示每个灯的亮灭时间。
3. 循环点亮。
满足了该设计的1,2,3点要求,唯一不足的地方是在用数码管显示每个灯的亮灭时间时,我是用usleep()函数来延迟的,时间精度方面可能比不上用定时计数器来的准确,可以做进一步改进。
附录:
软件程序:
#include "system.h"
#include "alt_types.h"
#include "unistd.h"
#include "io.h"
int main (void)
{
alt_u8 led=0x01;
alt_u32 count;
volatile int i; //i用来控制循环的次数
volatile int j; //j用来控制每次循环时间为1S
while(1)
{
led=0x01;
*(unsigned int *)PIO_LED_BASE = led; //点亮第一个LED灯
for(i=1,j=1000000,count=0x00000001;i>0;i--) //用数码管控制亮的时间1S
{
IOWR(SEG7_LUT_8_0_BASE,0,count); //第一个数码管显示count值1
usleep(j); //j=1000000,延时1秒
count=count-0x00000001; //count值减1
}
IOWR(SEG7_LUT_8_0_BASE,0,count); //第一个数码管显示count值0
led=0x00;
*(unsigned int *)PIO_LED_BASE = led; //熄灭第一个LED灯
for(i=2,j=1000000,count=0x00000002;i>0;i--) //用数码管控制熄灭的时间2S
{
IOWR(SEG7_LUT_8_0_BASE,0,count);
usleep(j);
count=count-0x00000001;
}
IOWR(SEG7_LUT_8_0_BASE,0,count);
led=0x02;
*(unsigned int *)PIO_LED_BASE = led;//点亮第二个LED灯
for(i=3,j=1000000,count=0x00000030;i>0;i--) //用数码管控制亮的时间3S {
IOWR(SEG7_LUT_8_0_BASE,0,count);
usleep(j);
count=count-0x00000010;
}
IOWR(SEG7_LUT_8_0_BASE,0,count);
led=0x00;
*(unsigned int *)PIO_LED_BASE = led;//熄灭第二个LED灯
for(i=3,j=1000000,count=0x00000030;i>0;i--)//用数码管控制熄灭的时间3S {
IOWR(SEG7_LUT_8_0_BASE,0,count);
usleep(j);
count=count-0x00000010;
}
IOWR(SEG7_LUT_8_0_BASE,0,count);
led=0x04;
*(unsigned int *)PIO_LED_BASE = led;//点亮第三个LED灯
for(i=1,j=1000000,count=0x00000100;i>0;i--) //用数码管控制亮的时间1S {
IOWR(SEG7_LUT_8_0_BASE,0,count);
usleep(j);
count=count-0x00000100;
}
IOWR(SEG7_LUT_8_0_BASE,0,count);
led=0x00;
*(unsigned int *)PIO_LED_BASE = led;//熄灭第三个LED灯
for(i=2,j=1000000,count=0x00000200;i>0;i--)//用数码管控制熄灭的时间2S {
IOWR(SEG7_LUT_8_0_BASE,0,count);
usleep(j);
count=count-0x00000100;
}
IOWR(SEG7_LUT_8_0_BASE,0,count);
led=0x08;