验 数电实验 4
一. . 实验目的
熟悉用仿真法研究数字电路实验的过程,实现一个彩灯控制电路。
熟练使用 VHDL 语言
二. . 实验设备
1.Quartus 开发环境
2.ED0 开发板
三. . 实验内容
1、彩灯控制电路要求控制 4 个彩灯 ;
2、两个控制信号:
K 1 K 0 = 00 灯全灭
01 右移,循环显示
10 左移,循环显示
11 灯全亮
3.彩灯正常工作的同时,四个七段数码管循环显示第一个同学的学号后四位一秒,第二个同学的学号后四位一秒,全黑一秒。
四. . 实验原理
1.彩灯控制电路的程序如下:
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_ARITH.ALL;
USE IEEE.std_logic_UNSIGNED.ALL;
ENTITY led IS
port(
clk:in std_logic;
data_in:IN STD_LOGIC_VECTOR(1 DOWNTO 0);
data_out:out std_logic_vector(3 downto 0);
data_out1,data_out2,data_out3,data_out4:out std_logic_vector(6 downto 0));
END led;
ARCHITECTURE control OF led IS
CONSTANT m : INTEGER:= 25000000;
BEGIN
PROCESS(data_in,clk)
VARIABLE cout : INTEGER:=0;
VARIABLE i : INTEGER:=0;
BEGIN
IF clk"EVENT AND clk="1" THEN
cout:=cout+1; --计数器+1
i:=i+1; --计数器+1
if data_in="00" then
data_out<="0000"; --quan bu bu liang
elsif data_in="01" then--you yi xun huan xian shi
IF cout<=m THEN data_out<="1000";
ELSIF cout<=m*2 THEN data_out<="0100"; --shift right
ELSIF cout<=m*3 THEN data_out<="0010"; --shift right
ELSIF cout<=m*4-1 THEN data_out<="0001"; --shift right
ELSE cout:=0; --计数器清零
END IF;
elsif data_in="10" then--zuo yi xun huan xian shi
IF cout<=m THEN data_out<="0001"; --shift left
ELSIF cout<=m*2 THEN data_out<="0010";--shift left
ELSIF cout<=m*3 THEN data_out<="0100"; --shift left
ELSIF cout<=m*4-1 THEN data_out<="1000"; --shift left
ELSE cout:=0; --计数器清零
END IF;
elsif data_in="11" then--quan bu liang
data_out<="1111";
end if;
IF i<=m THEN data_out1<="0100100";data_out2<="1111001";data_out3<="1111000";data_out4<="1000000" ;--shift left
ELSIF i<=m*2 THEN data_out1<="0100100";data_out2<="1111001";data_out3<="1111000";data_out4<="1111001" ;--shift left
ELSIF i<=m*3 THEN data_out1<="1111111";data_out2<="1111111";data_out3<="1111111";data_out4<="1111111"; --shift left
ELSE i:=0; --计数器清零
END IF;
END IF;
end process;
end control;
注:学号输出为 2170 和 2171
五. . 实验结果
在 quters 中输入我们自己写好的代码如下,然后进行编译;
由于要进行人眼可见级别的计时器的仿真所需要设置的总仿真时间过长,计算机无法完成,所以修改 m=2;进行在计算机上的仿真模拟验证,结果如下:
可以看到程序很好的实现了,右移,全亮,全灭以及左移的预期功能;
将程序中的 m 值重新改回 25000000;
编译完成后对针脚进行配置;
针脚配置完成后对程序进行重新编译;
重编译完成后将程序下载到开发板进行验证,验证无误后通过了老师的验收;
六. . 故障排除& & 实验心得
本次实验之前我在课下自行认真的学习了 VHDL 语言以及 quartus的使用方法,所以这次的实验可以说是十分的顺利(至少相对于前面几次是这样的),实验之前我就早早的准备好了基本要求的四种控制彩灯亮灭方式的 VHDL 代码并且在电脑中通过调整分频器的参数进行了仿真模拟并且确保结果无误.然后在老师给出了课上测试的题目要求之后,很快的对程序进行了修改以及补充,最后很幸运的成为了班里第一个完成任务的小组.不过由于对七段译码器的对应显示不够熟悉然后也没有想到使用模块化设计的方法,所以个人后来反思觉得使用的时间还是可以再减少的.可以使用之前设计好的七段译码器直接生成一个译码模块,然后前面的主程序只要输出学号对应的二进制数就可以了,这样可以解省很多分析七段译码器显示的时间.不过这次
实验还是使我的动手能力有了很大的提高,对VHDL以及QUARTUS的使用方法有了更加深入的了解.