基于SOPC的LED循环流水灯控制设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档