基于SOPC的LED循环流水灯控制设计.docx
《基于SOPC的LED循环流水灯控制设计.docx》由会员分享,可在线阅读,更多相关《基于SOPC的LED循环流水灯控制设计.docx(14页珍藏版)》请在冰豆网上搜索。
基于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
(注:
文档可能无法思考全面,请浏览后下载,供参考。
可复制、编制,期待你的好评与关注)