SOPC十字路口模拟交通灯控制概要.docx
《SOPC十字路口模拟交通灯控制概要.docx》由会员分享,可在线阅读,更多相关《SOPC十字路口模拟交通灯控制概要.docx(15页珍藏版)》请在冰豆网上搜索。
![SOPC十字路口模拟交通灯控制概要.docx](https://file1.bdocx.com/fileroot1/2023-1/8/f8a57360-2f09-4496-9f36-ff5261ae9c36/f8a57360-2f09-4496-9f36-ff5261ae9c361.gif)
SOPC十字路口模拟交通灯控制概要
Sopc技术与应用课程设计模拟交通灯控制系统
专业:
电子科学与技术
学号:
姓名:
指导老师:
模拟交通灯课程设计
一、实验目的:
1、进一步掌握SOPC的开发流程。
2、熟悉QuartusII软件的使用。
3、NIOSII软件的使用。
二、实验内容:
通过QuartusII、SOPCBuilder和NIOSII实现交通灯控制仿真。
以42秒为一个十字路口交通灯的一个周期。
东西为主干道,南北为从干道(主干道和从干道通行时间不一样
1.东西方向绿灯亮21秒(东西方向可以通行,然后黄灯闪烁5
秒(黄灯亮时已过线的可以继续通行,未过线的停车等待;南北方向显示红灯26秒(南北方向禁止通行。
2.南北方向显示绿灯11秒(南北方向通行,然后黄灯闪烁5秒
(黄灯亮时已过线的可以继续通行,未过线的停车等待;东西方向显示红灯16秒(东西方向禁止通行。
3.依次循环1和2。
三、实验步骤
1.在quartusII中建立工程在自己的文件目录下,建立一个自定义
文件夹,这里为1020630110(注意不能有空格或中文;
2.打开QUARTUSII,点击FILE菜单下的NEWProjectWizard;
然后输入工程存放目录,或点击工程路径右边的按钮设置工程存
放目录,在第二栏中输入工程名称,此实验为jiaotongdeng;之后点击Next,选择芯片为cyclone系列的EP1C12Q240C8;点击Finish,对话框消失,此时已经建立好了jiaotongdeng工程文件;
3.用sopcbuilder建立nios系统模块
点击QuartusII界面第一行工具栏中的SOPCBuilder工具;名称填写jiaotong,选择verilog语言后点击OK,在devicefamily中选择cyclone
4.添加元件
a.cpu选择32bit标准型,其他参数默认,改名为cpu(不能出现-;
b.添加JTAGUARTInterface,保持默认选项,Finsh,改名jtag_uart;
c.添加内部RAM:
选择memory→on-chipmemory,改名RAM;
d.加入pio:
选择other→pio设置为outputportsnoly点击finsh,重
新命名,按此方法一次添加三个1位和一个12位pio并分别重命名为:
PIO_CLOCK、PIO_LOCK、PIO_DATA、PIO_LED;
e.加入定时器Timer;
f.添加元件结束后,双左击cpu弹出对话框,两个memory选项
选择RAM;
5.指定基地址和分配中断号:
选择system下拉菜单中auto-assignbase
address或auto-assignirqs;
6.点击sopc窗口下的systemgeneration生成系统模块,待到提示成
功便可以退出SOPCBuilder
7.在quartusII中的图形编辑界面中进行管脚连接锁定工作将生成
模块以图标形式添加到BDF文件中:
于Quartus界面New→BlockDiagram/SchematicFile,于弹出画图界面双击空白弹出添加界面完成模块的输入输出接口连接,如下图:
其中D4、D3、D2、D1、GND分别电位分别为10100是为了选中交通灯的12个LED,CLK为时钟、DAT为送给数码管的数字、LOCK为数码管锁存管脚;
8.管脚锁定:
新建引脚锁定命令文件,File→New→TclScriptFile,弹出新窗口,将引脚锁定文件输入进去,通过查阅引脚文件从而对相应输入输
出对应到硬件引脚上。
内容如下:
#Setup.tcl
#Setuppinsetting
set_global_assignment-nameRESERVE_ALL_UNUSED_PINS"ASINPUTTRI-STATED"
set_global_assignment-nameENABLE_INIT_DONE_OUTPUTOFF
set_location_assignmentPIN_153-toCLK_0
set_location_assignmentPIN_161-toDAT
set_location_assignmentPIN_156-toLOCK
set_location_assignmentPIN_159-toCLK
set_location_assignmentPIN_14-toLED[1]
set_location_assignmentPIN_16-toLED[2]
set_location_assignmentPIN_18-toLED[3]
set_location_assignmentPIN_12-toLED[4]
set_location_assignmentPIN_8-toLED[5]
set_location_assignmentPIN_6-toLED[6]
set_location_assignmentPIN_4-toLED[7]
set_location_assignmentPIN_2-toLED[8]
set_location_assignmentPIN_240-toLED[9]
set_location_assignmentPIN_20-toLED[10]
set_location_assignmentPIN_23-toLED[11]
set_location_assignmentPIN_42-toLED[12]
set_location_assignmentPIN_163-toGND
set_location_assignmentPIN_44-toD4
set_location_assignmentPIN_46-toD3
set_location_assignmentPIN_48-toD2
set_location_assignmentPIN_50-toD1
写好之后点击保存,名字为Tcl_script1.tcl放到工程目录下。
然后点击Tools→TclScript选择Tcl_script1.tcl后点击RUN,如此,管脚约束与锁定就会自动加入了,如图:
有些锁定后接线图并没有显示锁定后的引脚,这时我们按如下操作使其显示:
9.编译工程:
Process→Startcompilation。
10.配置FPGA:
这里要打开实验板电源、连接USB下载线将生成的SOF文件下载到目标板上。
步骤:
Tools→Programmer目标文件夹下载,选择USB-Blaster模式,通过JTAG口对FPGA进行配置;然后点Start,进度达到100&便可将其关闭
11.软件设计部分
a.打开NIOSIIIDE,选择工作区间,如下图操作:
b.新建工程:
File→New→Project
选择C/C++Application,设置如下:
Browse选择工程里面的ptf后缀文件,选择helloworldsmall→Finish。
c.添加.c主程序文件:
选中工程右击New→NIOSII
C/C++Application,输入程序。
如下图:
d.添加.h头文件:
原理同上,并将程序输入进去。
见图:
完成程序的添加后右击工程→BuilderProjectd对工程编译。
e.选择RUN→RUN·····,系统自动检测JTAG连接电缆
f.于弹出窗口Main中选中工程,在TargetConnection选择电缆USB-Blaster→RUN,目标板上的灯就按照程序点亮。
四、程序文件
1、头文件:
#defineLED_CLK_L(IOWR(PIO_CLOCK_BASE,0,0//定义时钟低电平
/*DATPINCONTROL*/
#defineLED_DAT_H(IOWR(PIO_DATA_BASE,0,1//定义数码管数据灯高电平#defineLED_DAT_L(IOWR(PIO_DATA_BASE,0,0//定义数码管数据灯低电平
/*LOCKPINCONTROL*/
#defineLED_LOCK_H(IOWR(PIO_LOCK_BASE,0,1//定义锁存引脚高电平
#defineLED_LOCK_L(IOWR(PIO_LOCK_BASE,0,0//定义锁存引脚低电平
#defineLED_MID_LINE0x40//onlydisplayGsegment
/*theledsegmentdatacorrespondtothehardwareinterface*/
/*SHIFTWHITMSBFIRST*/
alt_u8seg_dat[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,//笔形码0至9
0x07,0x7f,0x6f/*,0x77,*/
};
/*globalareafordisplaydatastore*/
/*alt_u8display_ram[8]={0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00
};*/
/*displaythewholeramarea*/
voidled_display_dat(alt_u8*pData
{
alt_u8i,j;
LED_LOCK_L(;/*Firstlockisdisable*///数据锁存显示
for(i=0;i<8;i++
{
for(j=0;j<8;j++
{
LED_CLK_L(;/*Lowlevelputdataonline*/
if((pData[7-i]&(1<<(7-j!
=0
LED_DAT_H(;
else
LED_DAT_L(;
LED_CLK_H(;/*Onebitshiftin*/
}
}
LED_LOCK_H(;
}
/*insertdataatxofpositionpData*/
voidled_display_x(alt_u8*pData,alt_u8x,alt_u8data
{
pData[x]=data;
led_display_dat(pData;
}
#endif/*LED_SEG_H_*/
2、主程序:
#include"alt_types.h"
#include"led_seg.h"
#include"stdio.h"
#include"system.h"
#include"sys/alt_irq.h"
#include"altera_avalon_timer_regs.h"
#include"altera_avalon_pio_regs.h"
#definealt_cpu_freq50000000
intmain(void__attribute__((weak,alias("alt_main";
intalt_main(void
{
alt_u8i,j;
alt_u8led=0x0;
alt_u8seg_pos=0;
alt_u8display_ram[8]={LED_MID_LINE,LED_MID_LINE,LED_MID_LINE,
LED_MID_LINE,LED_MID_LINE,LED_MID_LINE,
LED_MID_LINE,LED_MID_LINE};
led_display_dat(display_ram;
IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_BASE,(short(alt_cpu_freq&0x0000ffff;//定时器初值设定
IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_BASE,(short((alt_cpu_freq>>16&0x0000ffff;
IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_BASE,ALTERA_AVALON_TIMER_CONTROL_START_MSK+
ALTERA_AVALON_TIMER_CONTROL_CONT_MSK;
while(1
{
for(i=0;i<2;i++//东西方向绿灯显示0--19秒
{
for(j=0;j<10;
{
if(IORD_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE
&ALTERA_AVALON_TIMER_STATUS_TO_MSK
{
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,0x30c;
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE,0x0;
display_ram[0]=seg_dat[j];
j++;
display_ram[1]=seg_dat[i];
led_display_dat(display_ram;
}
}
}
i=2;for(j=0;j<1;//东西方向绿灯显示为20秒
{if(IORD_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE
&ALTERA_AVALON_TIMER_STATUS_TO_MSK
{
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,0x30c;
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE,0x0;
display_ram[0]=seg_dat[j];
j++;
display_ram[1]=seg_dat[i];
led_display_dat(display_ram;
}
}
for(j=1;j<2;//东西方向黄灯开始闪烁5秒
{if(IORD_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE
&ALTERA_AVALON_TIMER_STATUS_TO_MSK
{
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,0x492;
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE,0x0;
display_ram[0]=seg_dat[j];
j++;
display_ram[1]=seg_dat[i];
led_display_dat(display_ram;
}
}
for(j=2;j<3;
{if(IORD_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE&ALTERA_AVALON_TIMER_STATUS_TO_MSK
{
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,0x000;
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE,0x0;
display_ram[0]=seg_dat[j];
j++;
display_ram[1]=seg_dat[i];
led_display_dat(display_ram;
}
}
for(j=3;j<4;
{if(IORD_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE
&ALTERA_AVALON_TIMER_STATUS_TO_MSK
{
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,0x492;
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE,0x0;
display_ram[0]=seg_dat[j];
j++;
display_ram[1]=seg_dat[i];
led_display_dat(display_ram;
}}
for(j=4;j<5;
{if(IORD_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE&ALTERA_AVALON_TIMER_STATUS_TO_MSK
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,0x000;
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE,0x0;
display_ram[0]=seg_dat[j];
j++;
display_ram[1]=seg_dat[i];
led_display_dat(display_ram;
}}
for(j=5;j<6;
{{if(IORD_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE
&ALTERA_AVALON_TIMER_STATUS_TO_MSK
{
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,0x492;
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE,0x0;
display_ram[0]=seg_dat[j];
j++;
display_ram[1]=seg_dat[i];
led_display_dat(display_ram;
}}}
for(i=0;i<1;i++//南北方向0--9秒绿灯亮
{
for(j=0;j<10;
{
if(IORD_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE&ALTERA_AVALON_TIMER_STATUS_TO_MSK
{
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,0x861;
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE,0x0;
display_ram[0]=seg_dat[j];
j++;
display_ram[1]=seg_dat[i];
led_display_dat(display_ram;
}
}
}
i=1;for(j=0;j<1;//继南北方向绿灯显示为10秒
{if(IORD_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE&ALTERA_AVALON_TIMER_STATUS_TO_MSK
{
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,0x861;
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE,0x0;
display_ram[0]=seg_dat[j];
j++;
display_ram[1]=seg_dat[i];
led_display_dat(display_ram;
}
}
for(j=1;j<2;//黄灯闪烁5秒
{if(IORD_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE
&ALTERA_AVALON_TIMER_STATUS_TO_MSK
{
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,0x492;
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE,0x0;
display_ram[0]=seg_dat[j];
j++;
display_ram[1]=seg_dat[i];
led_display_dat(display_ram;
}
}
for(j=2;j<3;
{if(IORD_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE&ALTERA_AVALON_TIMER_STATUS_TO_MSK
{
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,0x000;
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE,0x0;
display_ram[0]=seg_dat[j];
j++;
display_ram[1]=seg_dat[i];
led_display_dat(display_ram;
}
}
for(j=3;j<4;
{if(IORD_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE
&ALTERA_AVALON_TIMER_STATUS_TO_MSK
{
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,0x492;
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE,0x0;
display_ram[0]=seg_dat[j];
j++;
display_ram[1]=seg_dat[i];
led_display_dat(display_ram;
}}
for(j=4;j<5;
{if(IORD_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE
&ALTERA_AVALON_TIMER_STATUS_TO_MSK
{
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,0x000;
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE,0x0;
display_ram[0]=seg_dat[j];
j++;
display_ram[1]=seg_dat[i];
led_display_dat(display_ram;
}}
for(j=5;j<6;
{{if(IORD_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE
&ALTERA_AVALON_TIMER_STATUS_TO_MSK
{
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,0x492;
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE,0x0;
display_ram[0]=seg_dat[j];
j++;
display_ram[1]=seg_dat[i];
led_display_dat(display_ram;
}}}}
return0;
}
五、实验心得体会
本次试验我作为组长,深感小组间协调的重要性,刚开始因为没有协调好,所以课下的准备工作不是太充分,好在课程设计经历的时间较长,经过各成员的努力,各种问题逐渐被解开!
实验中暴露的问题有:
1.对C++看不太懂,虽然它跟C语言很相似,但是其英文表述
C语言差别