您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > FPGA入门系列实验教程——流水灯
入门系列实验教程——LED流水灯1.实验任务让实验板上的8个LED实现流水灯的功能。通过这个实验,进一步掌握采用计数与判断的方式来实现分频的VHDL的编程方法以及移位运算符的使用。2.实验环境硬件实验环境为艾米电子工作室型号EP2C8Q208C8增强版开发套件。软件实验环境为QuartusII8.1开发软件。3.实验原理流水灯,顾名思义就是让LED象水一样的点亮。如果把流水做慢动作播放,可以想象到其实就是移动,即:把水块不断地向同一方向移动,而原来的水块保持不动,就形成了流水。同样,如果使得最左边的灯先亮;然后,通过移位,在其右侧的灯,由左向右依次点亮,而已经亮的灯又不灭,便形成了向右的流水灯。初始状态时,8个灯都不亮。每来一个时钟脉冲CLK,计数器就加1。每当判断出计数器中的数值达到25000000时,就会点亮一个灯,并进行移位。FPGA输出的数据就应该首先是10000000,隔1秒钟变成11000000……一直变化到11111111,这样,依次点亮所有的灯,就形成了流水灯。而当8个灯都点亮时,需要一个操作使得所有的灯恢复为初始状态,即:灯都不亮。然后,再一次流水即可。如果是右移位,就出现向右流水的现象;反之,向左流水。4.实验程序libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityLEDisport(clk:instd_logic;//设置时钟输入dout:outstd_logic_vector(7downto0));//8位端口输出endLED;architecturebehaveofLEDissignalp:std_logic_vector(31downto0);//信号变量signalt:std_logic_vector(8downto0);begin(clk)beginif(clk'eventandclk='1')then//判断上升沿信号p=p+1;if(p=25000000)thent(8downto1)=t(7downto0);//将低8位移至高8位t(0)='1';//最地位置1p=00000000000000000000000000000000;endif;if(t(8)='1')thent=000000000;endif;endif;endprocess;dout=t(7downto0);//将低8位赋给输出端口endbehave;代码分析:先定义一个二进制32位的信号变量P和一个9位的信号变量t,时钟每产生一个上升沿的时钟跳变,P自动加1。当P加到25000000时将t的低8位移到t的高8位,同时将t的最地位置1,P复位置0,P又将从0开始计数。当t的最高位变为1时将t复位置0从头开始。在程序执行过程中始终将t的低8位赋值给数据输出端dout。5.实验步骤(1)建立新工程项目:打开QuartusII软件,进入集成开发环境,点击File→Newprojectwizard建立一个工程项目ledwater。(2)建立文本编辑文件:点击File→New在该项目下新建VHDL源程序文件ledwater.v,输入试验程序中的源程序代码保存后选择工具栏中的按钮启动编译,若在编译中发现错误,则找出并更正错误,直到编译成功为止。(3)选择器件型号及引脚的其他设置:选择所用的FPGA器件→EP2C8Q208C8,以及进行一些配置。选择配置器件EPCS4,设置不需要使用的IO功能为Asinputs,tri-stated。点击两次ok,回到主界面。(4)配置FPGA引脚:在QuartusII软件主页面下,选择Assignments→Pins或选择工具栏上按钮,配置dout[0]---dout[7]以及clk的引脚。上述配置引脚的方法适合引脚比较少的项目,对于引脚比较多的工程项目,分配起来就比较麻烦了,下面介绍一种方便快捷的引脚分配方法。a.首先建立一个TCLScript文件:点File→New选择DesignFiles选项卡里面的TclScriptFile,如下图所示:点击ok,输入下面的代码:#Pin_Setup.tcl#Setuppinsettingset_global_assignment-nameRESERVE_ALL_UNUSED_PINSASINPUTTRI-STATEDset_global_assignment-nameENABLE_INIT_DONE_OUTPUTONset_location_assignmentPIN_23-toclkset_location_assignmentPIN_75-todout[0]set_location_assignmentPIN_76-todout[1]set_location_assignmentPIN_89-todout[2]set_location_assignmentPIN_94-todout[3]set_location_assignmentPIN_92-todout[4]set_location_assignmentPIN_97-todout[5]set_location_assignmentPIN_102-todout[6]set_location_assignmentPIN_101-todout[7]比较简单的代码,简单的讲解一下,第一行和第二行是注释,第四行的意思是设置不用的引脚为三态输入,第五行的意思是打开INIT_DONE输出。后面的几行分别是锁定clk和8个led的引脚。c.在QuartusII主界面中选择File→SaveAs保存这个文档,软件会自动把它加到项目里面。d.在QuartusII主界面中选择点Tools-TCLScripts...,出现下图所示这个界面:选中你刚才建好的Tcl文件,点击Run。f.你可以选择Assignments→Pins或选择工具栏上按钮确认一下是否正确分配了,分配的情况如下图:怎么样这种方法是不是比以前的方法快多了!这个文件你可以适当修改用于别的项目,如果引脚一样也可以直接在别的项目中加入这个文件然后执行,可以省很多事情。(5)编译工程项目:在QuartusII主页面下,选择Processing—StartCompilation或点击工具栏上的按钮启动编译,直到出现“FullCompilationReport”对话框,点击OK即可。(6)波形仿真:由于本次试验比较简单,波形仿真将在后面实验详细讲解。(7)下载设计程序到目标FPGA6.实验现象经过前两个实验的训练,第三个实验应该很轻松地就做完了吧!看到实验板上LED实验了流水灯的功能,你是否掌握了移位运算符的使用,你可以试着自己编写其他花样的流水灯,比如左流水或其他花样的流水灯,这就要看你的想象力了。
本文标题:FPGA入门系列实验教程——流水灯
链接地址:https://www.777doc.com/doc-5359470 .html