4.波形分析:由波形图我们可以看出,输入的时钟信号经过分频器后产生了周期为输入信号12倍的时钟信号,实现了分频器的12倍分频功能,同时clear实现的是清零功能,为高电平有效,当输入clear信号时,分频器的输出重新进行周期分频,clear信号之后经过六个周期信号进行一次反转; 接着进行上升沿有效的从0~9的8421十进制计数器,每个计数数字都对应一个七位输出来控制数码管。
四、分块实验分析 1、数码管译码器:
VHDL代码: LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY seg7_1 IS PORT(
a:IN STD_LOGIC_VECTOR(3 downto 0); b:OUT STD_LOGIC_VECTOR(6 downto 0); cat:out std_logic_vector(5 downto 0) );
end seg7_1;
ARCHITECTURE seg7_1_arch OF seg7_1 IS BEGIN
PROCESS(a) BEGIN
CASE a IS
WHEN\ WHEN\ WHEN\ WHEN\ WHEN\ WHEN\ WHEN\ WHEN\ WHEN\ WHEN\ WHEN OTHERS =>b <=\END CASE; END PROCESS; cat<=\END;
2、8421十进制计数器:
VHDL代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY jishuqi IS PORT(
clk,reset:IN STD_LOGIC;
q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END jishuqi;
ARCHITECTURE a OF jishuqi IS
SIGNAL q_temp:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN
PROCESS(clk,reset) BEGIN
IF reset='0' THEN q_temp<=\
ELSIF clk'EVENT AND clk='1' THEN IF q_temp=\q_temp<=\
ELSE q_temp<=q_temp+1; END IF; END IF;
END PROCESS; q<= q_temp; END a;
仿真波形图:
分析:因为计数器采用的是异步复位,所以复位信号的优先级更高。当复位信号
为0时,输出变为0000当复位信号为1时,每当遇到时钟上升沿,输出加1,实现计数的功能,计算循环为0000到1010(二进制表示)。
3、分频器:
VHDL 代码: LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY div_12 IS PORT(
clk :IN STD_LOGIC;
clk_out:OUT STD_LOGIC); END div_12;
ARCHITECTURE a OF div_12 IS
SIGNAL tmp:INTEGER RANGE 0 TO 5; SIGNAL clktmp:STD_LOGIC; BEGIN
PROCESS(clear,clk) BEGIN
IF clk'event AND clk='1' THEN IF tmp = 5 THEN
tmp<=0;clktmp<=NOT clktmp; ELSE
tmp <=tmp+1; END IF; END IF;
END PROCESS; clk_out<=clktmp; END a;
仿真波形:
分析:当clear=0时,将会重新计算6个时钟周期,因此输出波形中相邻两个输出为1的位置中间有12个代表半个周期的方格。
五、故障及问题分析
1.程序运行时经常出现的是编译出错,可能有以下几种情况: (1)做实验时,由于不是很清楚VHDL语言和Quartus的命名规则,命名时VHDL文件名与实体名不一致,导致文件运行不成功;或者文件夹中出现了中文名,运行也可能出错。尽量用英文来命名,不知道的英文拼写用拼音,不能出现中文。 (2)在文件编译前一定记得要保存,仿真前也要保存。
(3)每次重启之前完成的工程,进行其他操作前一定要先编译,不然可能后续操作会出现莫名其妙的bug。 2.仿真出错,可能的原因有:
(1)时间尺度设置不合适:在设置时间时,我们一般采用的微秒级的周期,若输入周期太短,经过电路的延迟后,输出波形可能与预计波形不同;
(2)仿真文件名:保存的仿真文件名一定要与工程名一致,仿真才能成功; 仿真时需注意:在实验三中进行信号的输入时,使用数组来实现比较简单;一般我们进行结果的验证时习惯用二进制结果来检查,这时我们需要在properties中将类型改为二进制;在输出信号的显示中出现毛刺是正常现象,这应属于电路的冒险。
3.下载编译出错,可能的原因有:
(1)管脚输入有误,应检验相应的管脚连接是否正确;
(2)管脚设置完成后一定要进行编译,否则管脚设置不起作用。
六、实验总结
本学期接触了数字电路与逻辑设计这门课后,发现它是一门很有意思的课
程,电路的设计很巧妙,最终的逻辑图也是通俗易懂,个人感觉没有模电的电路那么复杂,同时电路实现的功能也很强大,更贴近我们的生活,在VDHL语言的学习中,我有以下几点感触:
VHDL语言的逻辑语法类似于C++语言,也和QSL语言有某些相似之处,它跟之前做FPGA实验时我们掌握的Verilog语言也很相似,因此有了编程的基础,学起VHDL语言会更得心应手。当然,能看懂程序不一定可以写的出来,所以必要的写程序代码过程是绝对不能 忽视的。
与上学期的模电实验相比,数电实验没有那么多电路的搭建,主要是代码的编写,这样在做实验时,会顺利很多;同时实验课的内容与理论课的知识相似,这样更有助于我们队代码的编写和理解,同时也是对理论课知识的巩固,所以在实验的过程中,我们要注意将理论能与实践结合在一起,学会学以致用。 通过一个多月的实验学习,我对数电实验也产生了兴趣,在其中你会发现很多神奇的功能,代码的编写也没有C++那样复杂,它的逻辑结构很清晰,quartus软件的功能也很全,这对我们进行电路逻辑的分析及其功能的验证有很大的帮助,这让我也非常期待下学期的数电实验,在接下来的学习中,我也会不断地将理论学习与实验结合在一起,提高自己的动手操作能力。