基于SOPC的LED循环流水灯控制设计说明.docx

上传人:b****6 文档编号:7579112 上传时间:2023-01-25 格式:DOCX 页数:12 大小:189.84KB
下载 相关 举报
基于SOPC的LED循环流水灯控制设计说明.docx_第1页
第1页 / 共12页
基于SOPC的LED循环流水灯控制设计说明.docx_第2页
第2页 / 共12页
基于SOPC的LED循环流水灯控制设计说明.docx_第3页
第3页 / 共12页
基于SOPC的LED循环流水灯控制设计说明.docx_第4页
第4页 / 共12页
基于SOPC的LED循环流水灯控制设计说明.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

基于SOPC的LED循环流水灯控制设计说明.docx

《基于SOPC的LED循环流水灯控制设计说明.docx》由会员分享,可在线阅读,更多相关《基于SOPC的LED循环流水灯控制设计说明.docx(12页珍藏版)》请在冰豆网上搜索。

基于SOPC的LED循环流水灯控制设计说明.docx

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

课程报告

 

设计课题:

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

姓名:

XXX

专业:

集成电路设计与集成系统

学号:

1115103004

日期

2014年11月18日

指导教师:

XXX

 

华侨大学信息科学与工程学院电子工程系

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

 

1.设计的任务与要求

1.将8只LED灯编号,奇数号亮1秒,灭2秒,偶数号亮3秒,灭3秒。

2.用数码管显示每个灯的亮灭时间。

3.循环点亮。

 

2.系统设计

整体硬件电路框图

整体电路设计由一个锁相环,SOPC搭建的CPU模块组成,由DE2部时钟50MHZ输入控制,输出接LED[7..0]8个LED灯,HEX0-HEX78个数码管,用程序编程控制,来实现LED循环流水灯数码管计时功能的实现。

 

三.单元电路设计

锁相环设计模块(PLL)

SOPC设计模块

在DE2平台上建立SOPC系统的硬件,这个系统包括一个NIosII/s嵌入式处理器、存储器、一个JTAGUART及一个定时器,一个ID模块和IO模块。

另外,我们将加入一个自定义组件,实现对DE2平台上七段数码管的控制。

SOPC模块硬件电路图

 

四:

仿真结果

 

5.软件设计

程序详见附录

 

六.系统测试:

实验仪器用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"

intmain(void)

{

alt_u8led=0x01;

alt_u32count;

volatileinti;//i用来控制循环的次数

volatileintj;//j用来控制每次循环时间为1S

while

(1)

{

led=0x01;

*(unsignedint*)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;

*(unsignedint*)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;

*(unsignedint*)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;

*(unsignedint*)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;

*(unsignedint*)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;

*(unsignedint*)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;

*(unsignedint*)PIO_LED_BASE=led;//点亮第四个LED灯

for(i=3,j=1000000,count=0x00003000;i>0;i--)//用数码管控制亮的时间3S

{

IOWR(SEG7_LUT_8_0_BASE,0,count);

usleep(j);

count=count-0x00001000;

}

IOWR(SEG7_LUT_8_0_BASE,0,count);

led=0x00;

*(unsignedint*)PIO_LED_BASE=led;//熄灭第四个LED灯

for(i=3,j=1000000,count=0x00003000;i>0;i--)//用数码管控制熄灭的时间3S

{

IOWR(SEG7_LUT_8_0_BASE,0,count);

usleep(j);

count=count-0x00001000;

}

IOWR(SEG7_LUT_8_0_BASE,0,count);

led=0x10;

*(unsignedint*)PIO_LED_BASE=led;//点亮第五个LED灯

for(i=1,j=1000000,count=0x00010000;i>0;i--)//用数码管控制亮的时间1S

{

IOWR(SEG7_LUT_8_0_BASE,0,count);

usleep(j);

count=count-0x00010000;

}

IOWR(SEG7_LUT_8_0_BASE,0,count);

led=0x00;

*(unsignedint*)PIO_LED_BASE=led;//熄灭第五个LED灯

for(i=2,j=1000000,count=0x00020000;i>0;i--)//用数码管控制熄灭的时间2S

{

IOWR(SEG7_LUT_8_0_BASE,0,count);

usleep(j);

count=count-0x00010000;

}

IOWR(SEG7_LUT_8_0_BASE,0,count);

led=0x20;

*(unsignedint*)PIO_LED_BASE=led;//点亮第六个LED灯

for(i=3,j=1000000,count=0x00300000;i>0;i--)//用数码管控制亮的时间3S

{

IOWR(SEG7_LUT_8_0_BASE,0,count);

usleep(j);

count=count-0x00100000;

}

IOWR(SEG7_LUT_8_0_BASE,0,count);

led=0x00;

*(unsignedint*)PIO_LED_BASE=led;//熄灭第六个LED灯

for(i=3,j=1000000,count=0x00300000;i>0;i--)//用数码管控制熄灭的时间3S

{

IOWR(SEG7_LUT_8_0_BASE,0,count);

usleep(j);

count=count-0x00100000;

}

IOWR(SEG7_LUT_8_0_BASE,0,count);

led=0x40;

*(unsignedint*)PIO_LED_BASE=led;//点亮第七个LED灯

for(i=1,j=1000000,count=0x01000000;i>0;i--)//用数码管控制亮的时间1S

{

IOWR(SEG7_LUT_8_0_BASE,0,count);

usleep(j);

count=count-0x01000000;

}

IOWR(SEG7_LUT_8_0_BASE,0,count);

led=0x00;

*(unsignedint*)PIO_LED_BASE=led;//熄灭第七个LED灯

//for(i=0;i<2000000;i++);

for(i=2,j=1000000,count=0x02000000;i>0;i--)//用数码管控制熄灭的时间2S

{

IOWR(SEG7_LUT_8_0_BASE,0,count);

usleep(j);

count=count-0x01000000;

}

IOWR(SEG7_LUT_8_0_BASE,0,count);

led=0x80;

*(unsignedint*)PIO_LED_BASE=led;//点亮第八个LED灯

//for(i=0;i<3000000;i++);

for(i=3,j=1000000,count=0x30000000;i>0;i--)//用数码管控制亮的时间3S

{

IOWR(SEG7_LUT_8_0_BASE,0,count);

usleep(j);

count=count-0x10000000;

}

IOWR(SEG7_LUT_8_0_BASE,0,count);

led=0x00;

*(unsignedint*)PIO_LED_BASE=led;//熄灭第八个LED灯

//for(i=0;i<3000000;i++);

for(i=3,j=1000000,count=0x30000000;i>0;i--)//用数码管控制熄灭的时间3S

{

IOWR(SEG7_LUT_8_0_BASE,0,count);

usleep(j);

count=count-0x10000000;

}

IOWR(SEG7_LUT_8_0_BASE,0,count);

}

return0;

}

 

1.添加自定义组件七段数码管控制器

SEG7_LUT.V是一个查找表,完成七段码显示的译码。

当输入iDIG在0x0~0xF之间变化时,输出oSEG的七段码也发生相应的变化,并在数码管上显示iDIG的值。

代码1SEG7_LUT.V

moduleSEG7_LUT(oSEG,iDIG);

input[3:

0]iDIG;

output[6:

0]oSEG;

reg[6:

0]oSEG;

always(iDIG)

begin

case(iDIG)

4'h1:

oSEG=7'b1111001;

4'h2:

oSEG=7'b0100100;

4'h3:

oSEG=7'b0110000;

4'h4:

oSEG=7'b0011001;

4'h5:

oSEG=7'b0010010;

4'h6:

oSEG=7'b0000010;

4'h7:

oSEG=7'b1111000;

4'h8:

oSEG=7'b0000000;

4'h9:

oSEG=7'b0011000;

4'ha:

oSEG=7'b0001000;

4'hb:

oSEG=7'b0000011;

4'hc:

oSEG=7'b1000110;

4'hd:

oSEG=7'b0100001;

4'he:

oSEG=7'b0000110;

4'hf:

oSEG=7'b0001110;

4'h0:

oSEG=7'b1000000;

endcase

end

endmodule

SEG7_LUT_8.V,对SEG7_LUT.V进行了8次例化,分别对应于七段数码管HEX0~HEX7。

代码2SEG7_LUT_8.V

moduleSEG7_LUT_8(oSEG0,oSEG1,oSEG2,oSEG3,oSEG4,oSEG5,oSEG6,oSEG7,

iDIG,iWR,iCLK,iRST_N);

input[31:

0]iDIG;

inputiWR,iCLK,iRST_N;

output[6:

0]oSEG0,oSEG1,oSEG2,oSEG3,oSEG4,oSEG5,oSEG6,oSEG7;

reg[31:

0]rDIG;

always(posedgeiCLKornegedgeiRST_N)

begin

if(!

iRST_N)

rDIG<=0;

else

begin

if(iWR)

rDIG<=iDIG;

end

end

SEG7_LUTu0(oSEG0,rDIG[3:

0]);

SEG7_LUTu1(oSEG1,rDIG[7:

4]);

SEG7_LUTu2(oSEG2,rDIG[11:

8]);

SEG7_LUTu3(oSEG3,rDIG[15:

12]);

SEG7_LUTu4(oSEG4,rDIG[19:

16]);

SEG7_LUTu5(oSEG5,rDIG[23:

20]);

SEG7_LUTu6(oSEG6,rDIG[27:

24]);

SEG7_LUTu7(oSEG7,rDIG[31:

28]);

endmodule

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1