作者 文档精品
创建于2010-04-27 12:53:00
修改者文档精品
修改于2022-05-24 12:26:00
字数3302
文档摘要:EDA作业二--LED彩灯一、实验任务让8个LED实现彩灯的功能,并进行波形仿真。通过这个实验,进一步掌握采用计数与判断的方式来实现分频的VHDL的编程方法以及移位运算符的使用。二、实验环境软件实验环境为Quartus II 8.1开发软件。三、实验原理彩灯,就是让LED以一定的规律显示不同的亮灭的组合。本彩灯的设计采用了4种的亮灭方式。每来一个时钟脉冲CLK,计数器就加1。每当判断
EDA作业二--LED彩灯 一、实验任务 让8个LED实现彩灯的功能,并进行波形仿真。通过这个实验,进一步掌握采用计数与判断的方式来实现分频的VHDL的编程方法以及移位运算符的使用。 二、实验环境 软件实验环境为Quartus II 8.1开发软件。 三、实验原理 彩灯,就是让LED以一定的规律显示不同的亮灭的组合。本彩灯的设计采用了4种的亮灭方式。每来一个时钟脉冲CLK,计数器就加1。每当判断计数器中的数值达到25000000时,就会按一定方式点亮8个led。FPGA输出数据就应该首先是10000000,隔1秒钟变成11000000……一直变化到111111,这样,依次点亮所有的灯,就形成了流水灯。而当8个灯都点亮时,要一个操作使得所有的灯恢复为初始状态,即:灯都不亮。然后,再一次流水即可。如果是右移位,就出现向右流水的现象;反之,向左流水。 同流水灯原理:00方式为流水灯依次亮灭方式,01方式为两边向中间点亮方式。10方式为连续两个灯同时按照流水灯亮灭,11方式为中间向两边点亮方式。 本实验程序定义了彩灯的端口部分,结构部分(控制部分),进程部分。(分频部分本实验未使用到,所以在注释部分给出) 四、实验步骤 1、建立新工程项目: 打开Quartus II软件,进入集成开发环境,点击File→New project wizard建立一个工程项目caideng。 2、建立文本编辑文件: 点击File→New在该项目下新建VHDL源程序文件caideng.v,输入试验程序中的源程序代码保存后选择工具栏中的按钮启动编译,若在编译中发现错误,则找出并更正错误,直到编译成功为止。 3、编译工程项目: 在Quartus II主页面下,选择Processing—Start Compilation或点击工具栏上的按钮启动编译,直到出现“Full Compilation Report”对话框,点击OK即可。 4、波形仿真: 建立波形文件caideng.vwf 选择相应节点,进行功能仿真,仿真图如下。 五、实验现象: 分别设置selmode 为00,01,10,11,得到如下的波形仿真图 00方式仿真图 01方式仿真图 10方式仿真图 11 方式仿真图 六、实验程序 LIBRARY IEEE; USE IEEE.std_logic_1164.ALL; USE IEEE.std_logic_ARITH.ALL; USE IEEE.std_logic_UNSIGNED.ALL; ENTITY CaiDeng IS port ( CLK:IN std_logic; RST:in std_logic; SelMode:in std_logic_vector(1 downto 0);--彩灯花样控制 Light:out std_logic_vector(7 downto 0) ); END CaiDeng; ARCHITECTURE control OF CaiDeng IS SIGNAL clk1ms:std_logic:='0'; SIGNAL cnt1:std_logic_vector(3 downto 0):=“0000“; SIGNAL cnt2:std_logic_vector(1 downto 0):=“00“; SIGNAL cnt3:std_logic_vector(3 downto 0):=“0000“; SIGNAL cnt4:std_logic_vector(1 downto 0):=“00“; BEGIN P1:PROCESS(clk) BEGIN if(clk'EVENT AND clk='1')then if selmode=“00“ then --第一种彩灯花样的程序 if cnt1=“1111“ then cnt1<=“0000“; else cnt1<= cnt1+1; end if; case cnt1 is when “0000“=>light<=“10000000“; when “0001“=>light<=“11000000“; when “0010“=>light<=“11100000“; when “0011“=>light<=“11110000“; when “0100“=>light<=“11111000“; when “0101“=>light<=“11111100“; when “0110“=>light<=“11111110“; when “0111“=>light<=“11111111“; when “1000“=>light<=“11111110“; when “1001“=>light<=“11111100“; when “1010“=>light<=“11111000“; when “1011“=>light<=“11110000“; when “1100“=>light<=“11100000“; when “1101“=>light<=“11000000“; when “1110“=>light<=“10000000“; when others=>light<=“00000000“; end case; elsif selmode=“01“ then -- 第二种彩灯花样的程序 if cnt2=“11“ then cnt2<=“00“; else cnt2<= cnt2+1; end if; case cnt2 is when “00“=>light<=“10000001“; when “01“=>light<=“11000011“; when “10“=>light<=“11100111“; when “11“=>light<=“11111111“; when others=>light<=“00000000“; end case; elsif selmode=“10“ then --第三种彩灯花样的程序 if cnt3=“1111“ then cnt3<=“0000“; else cnt3<=cnt3+1; end if; case cnt3 is when “0000“=>light<=“11000000“; when “0001“=>light<=“01100000“; when “0010“=>light<=“00110000“; when “0011“=>light<=“00011000“; when “0100“=>light<=“00001100“; when “0101“=>light<=“00000110“; when “0110“=>light<=“00000011“; when “0111“=>light<=“00000110“; when “1000“=>light<=“00001100“; when “1001“=>light<=“00011000“; when “1010“=>light<=“00110000“; when “1011“=>light<=“01100000“; when “1100“=>light<=“11000000“; when others=>light<=“00000000“; end case; elsif selmode=“11“ then -- 第四种彩灯花样的程序 if cnt4=“11“ then cnt4<=“00“; else cnt4<= cnt4+1; end if; case cnt4 is when “00“=>light<=“00011000“; when “01“=>light<=“00111100“; when “10“=>light<=“01111110“; when “11“=>light<=“11111111“; when others=>light<=“00000000“; end case; end if; end if; END PROCESS P1; --P2:PROCESS(clk) --分频进程 --variable cnt:integer range 0 to 1000; --BEGIN --IF(RST='0')then --cnt:=0; --ELSIF(clk'EVENT AND clk='1')then --if cnt<999 then --cnt:=cnt+1; --clk1ms<='0'; --else --cnt:=0; --end if; --end PROCESS P2; end control; 本文档由香当网(https://www.xiangdang.net)用户上传