期末sopc课题设计之 电梯
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
elseif(SW6==1)
{
CURRENTFLOOR_3_DOWNTO_2();
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X01);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(SW_PIO_BASE,0);
}
voidinitpio(void)
{
void* edge_capture_ptr = (void*)&edge_capture;
IOWR_ALTERA_AVALON_PIO_DIRECTION(LED_PIO_BASE,0xff);
if(time<5)
{time=time+1;
display();
}
else
{position=position+1,time=0;}
display();
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X01);
CURRENTFLOOR=3;
}
voidSW_interrupts(void* context,alt_u32 id)
2位7段码分别是HEX0和HEX1。
HEX0:表示当前电梯所在的楼层;
HEX1:表示电梯上升的时间(假设电梯上升1层所用的时间为5秒)。
4个LEDG灯分别是LEDG0~LEDG3。
LEDG0:表示电梯门打开
LEDG1:表示电梯门关闭
LEDG2:表示电梯上升
LEDG3:表示电梯下降
三.实验原理
SOPC的硬件模块包括:
一.设计目的
本课程的授课对象是电子信息工程专业本科生,是电子类专业的一门重要的实践课程,是理论与实践相结合的重要环节。本课程作为《SOPC技术与应用》的后续实践课程,有助于增强学生对SOPC技术的理解,掌握SOPC设计方法及调试能力,为今后从事现代电路设计与调试工作打下扎实的基础。
二.设计内容
我这次实验设计的题目是:电梯控制器设计
}
voiபைடு நூலகம்CURRENTFLOOR_3_DOWNTO_2()
{
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X08);
position=3;
display();
if(time<5)
{time=time+1;
display();
}
else
{position=position-1,time=0;}
position=2;
display();
if(time<5)
{time=time+1;
display();
}
else
{position=position-1,time=0;}
display();
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X01);
CURRENTFLOOR=1;
display();
CURRENTFLOOR=2;
}
voidCURRENTFLOOR_1_UPTO_2()
{
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X08);
position=1;
display();
if(time<5)
{time=time+1;
display();
{
if(CURRENTFLOOR==1)
{
CURRENTFLOOR_1_UPTO_2();
CURRENTFLOOR_2_UPTO_3();
}
elseif(CURRENTFLOOR==2)
{
CURRENTFLOOR_2_UPTO_3();
}
elseif(CURRENTFLOOR==3)
{
position=3;
IOWR_ALTERA_AVALON_PIO_DIRECTION(SW_PIO_BASE,0x00);
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(SW_PIO_BASE,0xff);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(SW_PIO_BASE,0x00);
alt_irq_register(SW_PIO_IRQ,edge_capture_ptr,SW_interrupts);
}
intmain (void)
{
initpio();
while(1)
{
switch(edge_capture)
{
case0x00:break;
case0x01:
if(SW1==1)
alt_u8 num[7] = {0,0,0,0,0,0,0,0,};
alt_u8 position=1,time=0;
alt_u32 SEG=0x00000000;
alt_u8 SW0,SW1,SW2,SW3,SW4,SW5,SW6,SW7;
alt_u8 ledgoff=0;
alt_u8 CURRENTFLOOR=1;
volatileintedge_capture=0;
voidsw_interrupts(void* context,alt_u32 id)
{
volatileint* edge_capture_ptr = (volatileint*)context;
*edge_capture_ptr= IORD_ALTERA_AVALON_PIO_EDGE_CAP(SW_PIO_BASE);
}
elseif(SW7==1)
{
CURRENTFLOOR_1_UPTO_2();
CURRENTFLOOR_2_UPTO_3();
}
break;
}
case0x02:
if(SW2|SW3==1)
{ SW2=0,SW3=0;
if(CURRENTFLOOR==1)
{
CURRENTFLOOR_1_UPTO_2();
8个开关SW从右到左为:SW0~SW7;功能在不同模式下定义不同:
SW0:复位电梯工作状态,即楼层设置为1楼,而且状态为等待;
SW1:1楼电梯入口处请求“上”的按钮;
SW2,SW3:2楼电梯入口处请求“上”和“下”的按钮;
SW4:3楼电梯入口处请求“下”的按钮;
SW5~SW7:分部是电梯内部的输入按钮“1”,“2”和“3”。
{
CURRENTFLOOR_3_DOWNTO_2();
CURRENTFLOOR_2_DOWNTO_1();
}
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X02);
if(SW6==1)
{
CURRENTFLOOR_1_UPTO_2();
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X01);
display();
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X01);
}
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X02);
}
if(SW5==1)
{
SW5=0;
CURRENTFLOOR_3_DOWNTO_2();
CURRENTFLOOR_2_DOWNTO_1();
控制电路应能记忆所有楼层请求信号,并按方向优先控制规则依次响应:运行过程中先响应最早的请求,再响应后续的请求。如果无请求则停留当前层。如果有两个同时请求信号,则判断请求信号离当前层的距离,距离近的请求先响应,再响应较远的请求。每个请求信号保留至执行后清除。
输入输出界面:
输入:8个开关SW
输出:2位7段码,4个LEDG灯
//---------------------
voiddisplay()
{
num[0]=position;
num[1]=time;
SEG=(num[6]%10)*0x10000000+(num[5]%10)*0x01000000+(num[4]/10)*0x00100000+(num[4]%10)*0x00010000+(num[3]%10)*0x00001000+(num[2]%10)*0x00000100+(num[1]%10)*0x00000010+(num[0]%10)*0x00000001;
设计一个三层楼自动电梯控制器,电梯内有三个输入按钮响应用户的上下楼层请求,并有七段数码管显示电梯当前所在楼层位置;在每层电梯入口处设有请求按钮开关,指示用户的上或下的请求。由LED灯显示电梯的上下运动情况和关门信息。电梯工作过程共有6种状态:等待、上升、下降、开门、关门和停止状态。一般情况下,电梯工作起始点是第一层,起始状态是等待状态,启动条件是收到上升请求。电梯每上升或下降一层的时间假定为5秒,可通过7段数码管显示电梯的运行时间。
(2)判断命令模块
电梯共有3个内部按钮和4个不同楼层的外部上下请求按钮。电梯在运行过程中需要判断外部按钮的信息以便及时做出响应。当判断到相应的按钮信息时,程序需要根据当前不同的状态和当前所在的楼层做出不同的动作。当有多个请求信号时,则根据先后原则依次执行,所以命令模块还需要有命令储存功能。
四.实验过程
}
elseif(CURRENTFLOOR==2)
{ IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X01);
position=2;
display();
}
elseif(CURRENTFLOOR==3)
{
CURRENTFLOOR_3_DOWNTO_2();
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X01);
#include"altera_avalon_pio_regs.h"
#include"alt_types.h"
#include"sys/alt_irq.h"
#include"sys/alt_alarm.h"
voiddisplay();
staticalt_alarm alarm;
volatileintedge_capture=0;
{
volatileint* edge_capture_ptr = (volatileint*)context;
*edge_capture_ptr= IORD_ALTERA_AVALON_PIO_EDGE_CAP(SW_PIO_BASE);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(SW_PIO_BASE,0);
}
else
{position=position+1,time=0;}
display();
CURRENTFLOOR=2;
}
voidCURRENTFLOOR_2_UPTO_3()
{
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X08);
position=2;
display();
IOWR_ALTERA_AVALON_PIO_DATA(SEG7_LUT_8_0_BASE, SEG);
}
//---------------------
voidCURRENTFLOOR_2_DOWNTO_1()
{
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X08);
处理器:Nios II
存储器:SDRAM
PIO:LEDG、KEY、SW
显示:7段码
定时器:Timer(20ms)
调试口:JTAG UART
软件模块包括以下几部分:
(1)电梯状态模块
电梯工作过程共有6种状态:等待、上升、下降、开门、关门和停止状态。一般情况下,电梯工作起始点是第一层,起始状态是等待状态。电梯的状态会根据外部按钮所发出指令而改变。不同的状态也会通过相应的LED灯或7段数码管显示出来。
1硬件电路图
2.程序流程图
no
yes
n=1n=2n=3
SW6=1SW7=1
SW=1的子程序
n=1n=2n=3
SW2=1的子程序
n=1n=2n=3
SW3=1D的子程序
n=3n=2n=1
SW5=1SW6=1
SW4=1的子程序
3.程序代码
#include<stdio.h>
#include"system.h"
{
SW1=0;
if(CURRENTFLOOR==1)
{IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X01);
position=1;
display();}
elseif(CURRENTFLOOR==2)
{
CURRENTFLOOR_2_DOWNTO_1();
}
elseif(CURRENTFLOOR==3)
}
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X02);
if(SW5==1)
{
CURRENTFLOOR_2_DOWNTO_1();
}
elseif(SW7==1)
{
CURRENTFLOOR_2_UPTO_3();
}
break;
}
case0x03:
if(SW4==1)
elseif(SW6==1)
{
CURRENTFLOOR_3_DOWNTO_2();
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X01);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(SW_PIO_BASE,0);
}
voidinitpio(void)
{
void* edge_capture_ptr = (void*)&edge_capture;
IOWR_ALTERA_AVALON_PIO_DIRECTION(LED_PIO_BASE,0xff);
if(time<5)
{time=time+1;
display();
}
else
{position=position+1,time=0;}
display();
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X01);
CURRENTFLOOR=3;
}
voidSW_interrupts(void* context,alt_u32 id)
2位7段码分别是HEX0和HEX1。
HEX0:表示当前电梯所在的楼层;
HEX1:表示电梯上升的时间(假设电梯上升1层所用的时间为5秒)。
4个LEDG灯分别是LEDG0~LEDG3。
LEDG0:表示电梯门打开
LEDG1:表示电梯门关闭
LEDG2:表示电梯上升
LEDG3:表示电梯下降
三.实验原理
SOPC的硬件模块包括:
一.设计目的
本课程的授课对象是电子信息工程专业本科生,是电子类专业的一门重要的实践课程,是理论与实践相结合的重要环节。本课程作为《SOPC技术与应用》的后续实践课程,有助于增强学生对SOPC技术的理解,掌握SOPC设计方法及调试能力,为今后从事现代电路设计与调试工作打下扎实的基础。
二.设计内容
我这次实验设计的题目是:电梯控制器设计
}
voiபைடு நூலகம்CURRENTFLOOR_3_DOWNTO_2()
{
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X08);
position=3;
display();
if(time<5)
{time=time+1;
display();
}
else
{position=position-1,time=0;}
position=2;
display();
if(time<5)
{time=time+1;
display();
}
else
{position=position-1,time=0;}
display();
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X01);
CURRENTFLOOR=1;
display();
CURRENTFLOOR=2;
}
voidCURRENTFLOOR_1_UPTO_2()
{
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X08);
position=1;
display();
if(time<5)
{time=time+1;
display();
{
if(CURRENTFLOOR==1)
{
CURRENTFLOOR_1_UPTO_2();
CURRENTFLOOR_2_UPTO_3();
}
elseif(CURRENTFLOOR==2)
{
CURRENTFLOOR_2_UPTO_3();
}
elseif(CURRENTFLOOR==3)
{
position=3;
IOWR_ALTERA_AVALON_PIO_DIRECTION(SW_PIO_BASE,0x00);
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(SW_PIO_BASE,0xff);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(SW_PIO_BASE,0x00);
alt_irq_register(SW_PIO_IRQ,edge_capture_ptr,SW_interrupts);
}
intmain (void)
{
initpio();
while(1)
{
switch(edge_capture)
{
case0x00:break;
case0x01:
if(SW1==1)
alt_u8 num[7] = {0,0,0,0,0,0,0,0,};
alt_u8 position=1,time=0;
alt_u32 SEG=0x00000000;
alt_u8 SW0,SW1,SW2,SW3,SW4,SW5,SW6,SW7;
alt_u8 ledgoff=0;
alt_u8 CURRENTFLOOR=1;
volatileintedge_capture=0;
voidsw_interrupts(void* context,alt_u32 id)
{
volatileint* edge_capture_ptr = (volatileint*)context;
*edge_capture_ptr= IORD_ALTERA_AVALON_PIO_EDGE_CAP(SW_PIO_BASE);
}
elseif(SW7==1)
{
CURRENTFLOOR_1_UPTO_2();
CURRENTFLOOR_2_UPTO_3();
}
break;
}
case0x02:
if(SW2|SW3==1)
{ SW2=0,SW3=0;
if(CURRENTFLOOR==1)
{
CURRENTFLOOR_1_UPTO_2();
8个开关SW从右到左为:SW0~SW7;功能在不同模式下定义不同:
SW0:复位电梯工作状态,即楼层设置为1楼,而且状态为等待;
SW1:1楼电梯入口处请求“上”的按钮;
SW2,SW3:2楼电梯入口处请求“上”和“下”的按钮;
SW4:3楼电梯入口处请求“下”的按钮;
SW5~SW7:分部是电梯内部的输入按钮“1”,“2”和“3”。
{
CURRENTFLOOR_3_DOWNTO_2();
CURRENTFLOOR_2_DOWNTO_1();
}
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X02);
if(SW6==1)
{
CURRENTFLOOR_1_UPTO_2();
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X01);
display();
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X01);
}
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X02);
}
if(SW5==1)
{
SW5=0;
CURRENTFLOOR_3_DOWNTO_2();
CURRENTFLOOR_2_DOWNTO_1();
控制电路应能记忆所有楼层请求信号,并按方向优先控制规则依次响应:运行过程中先响应最早的请求,再响应后续的请求。如果无请求则停留当前层。如果有两个同时请求信号,则判断请求信号离当前层的距离,距离近的请求先响应,再响应较远的请求。每个请求信号保留至执行后清除。
输入输出界面:
输入:8个开关SW
输出:2位7段码,4个LEDG灯
//---------------------
voiddisplay()
{
num[0]=position;
num[1]=time;
SEG=(num[6]%10)*0x10000000+(num[5]%10)*0x01000000+(num[4]/10)*0x00100000+(num[4]%10)*0x00010000+(num[3]%10)*0x00001000+(num[2]%10)*0x00000100+(num[1]%10)*0x00000010+(num[0]%10)*0x00000001;
设计一个三层楼自动电梯控制器,电梯内有三个输入按钮响应用户的上下楼层请求,并有七段数码管显示电梯当前所在楼层位置;在每层电梯入口处设有请求按钮开关,指示用户的上或下的请求。由LED灯显示电梯的上下运动情况和关门信息。电梯工作过程共有6种状态:等待、上升、下降、开门、关门和停止状态。一般情况下,电梯工作起始点是第一层,起始状态是等待状态,启动条件是收到上升请求。电梯每上升或下降一层的时间假定为5秒,可通过7段数码管显示电梯的运行时间。
(2)判断命令模块
电梯共有3个内部按钮和4个不同楼层的外部上下请求按钮。电梯在运行过程中需要判断外部按钮的信息以便及时做出响应。当判断到相应的按钮信息时,程序需要根据当前不同的状态和当前所在的楼层做出不同的动作。当有多个请求信号时,则根据先后原则依次执行,所以命令模块还需要有命令储存功能。
四.实验过程
}
elseif(CURRENTFLOOR==2)
{ IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X01);
position=2;
display();
}
elseif(CURRENTFLOOR==3)
{
CURRENTFLOOR_3_DOWNTO_2();
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X01);
#include"altera_avalon_pio_regs.h"
#include"alt_types.h"
#include"sys/alt_irq.h"
#include"sys/alt_alarm.h"
voiddisplay();
staticalt_alarm alarm;
volatileintedge_capture=0;
{
volatileint* edge_capture_ptr = (volatileint*)context;
*edge_capture_ptr= IORD_ALTERA_AVALON_PIO_EDGE_CAP(SW_PIO_BASE);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(SW_PIO_BASE,0);
}
else
{position=position+1,time=0;}
display();
CURRENTFLOOR=2;
}
voidCURRENTFLOOR_2_UPTO_3()
{
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X08);
position=2;
display();
IOWR_ALTERA_AVALON_PIO_DATA(SEG7_LUT_8_0_BASE, SEG);
}
//---------------------
voidCURRENTFLOOR_2_DOWNTO_1()
{
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X08);
处理器:Nios II
存储器:SDRAM
PIO:LEDG、KEY、SW
显示:7段码
定时器:Timer(20ms)
调试口:JTAG UART
软件模块包括以下几部分:
(1)电梯状态模块
电梯工作过程共有6种状态:等待、上升、下降、开门、关门和停止状态。一般情况下,电梯工作起始点是第一层,起始状态是等待状态。电梯的状态会根据外部按钮所发出指令而改变。不同的状态也会通过相应的LED灯或7段数码管显示出来。
1硬件电路图
2.程序流程图
no
yes
n=1n=2n=3
SW6=1SW7=1
SW=1的子程序
n=1n=2n=3
SW2=1的子程序
n=1n=2n=3
SW3=1D的子程序
n=3n=2n=1
SW5=1SW6=1
SW4=1的子程序
3.程序代码
#include<stdio.h>
#include"system.h"
{
SW1=0;
if(CURRENTFLOOR==1)
{IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X01);
position=1;
display();}
elseif(CURRENTFLOOR==2)
{
CURRENTFLOOR_2_DOWNTO_1();
}
elseif(CURRENTFLOOR==3)
}
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0X02);
if(SW5==1)
{
CURRENTFLOOR_2_DOWNTO_1();
}
elseif(SW7==1)
{
CURRENTFLOOR_2_UPTO_3();
}
break;
}
case0x03:
if(SW4==1)