一,实验结果分析
实验一:Quartus II 原理图输入法设计
(2) 实验名称:设计实现全加器
实验任务要求:用实验内容(1)中生成的半加器模块和逻辑门设计实现一个全加器,仿真并验证其功能,并下载到实验板测试,要求用拨码开关设定输入信号,发光二极管显示输出信号。 原理图:
仿真波形图:
仿真波形图分析:输入a,b 代表加数与被加数,输入c 代表低位向本位
的进位。输出s 代表本位和,输出co 代表向高位的进位。
可得真值表为:
实验三:用VHDL 设计与实现时序逻辑电路
(3) 实验名称:连接8421计数器,分频器和数码管译码器
实验任务要求:用VHDL 语言设计实现一个带异步复位的8421码十
进制计数器,分频器的分频系数为25k ,并用数码管显示数字。
VHDL 代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;
entity div is end;
port(clk1 : in std_logic;
clk_out : out std_logic);
architecture d of div is begin end;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY count10 IS PORT(
clk2,clear2:IN STD_LOGIC;
q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END count10;
ARCHITECTURE count OF count10 IS
SIGNAL q_temp:STD_LOGIC_VECTOR(3 DOWNTO 0);
process(clk1) begin
if (clk1'event and clk1='1') then end if;
if cnt=12499999 then else end if;
cnt
clk_tmp
signal cnt : integer range 0 to 12499999; signal clk_tmp : std_logic;
end process; clk_out
BEGIN
PROCESS(clk2,clear2) BEGIN
IF clear2='1' THEN q_temp
q_temp
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY seg7 IS
PORT(a:IN STD_LOGIC_VECTOR(3 DOWNTO 0); b: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); cat1:OUT STD_LOGIC_VECTOR(5 DOWNTO 0) ); END seg7;
ARCHITECTURE show OF seg7 IS BEGIN
PROCESS(a) BEGIN
CASE a IS
WHEN"0000"=>bbbbbbbbbbB
END show;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity jishuqi8421 is
port(clk,clear:IN STD_LOGIC;
cout:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); cat:OUT STD_LOGIC_VECTOR(5 DOWNTO 0) );
end jishuqi8421;
architecture ji of jishuqi8421 is component div25m port(clk1 : in std_logic;
clk_out : out std_logic);
end component; component count10 PORT(
clk2,clear2:IN STD_LOGIC;
q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); end component; component seg7
PORT(a:IN STD_LOGIC_VECTOR(3 DOWNTO 0); b: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); cat1:OUT STD_LOGIC_VECTOR(5 DOWNTO 0) ); end component;
signal c:std_logic;
signal d:std_logic_vector(3 downto 0); begin
u1:div port map(clk1=>clk,clk_out=>c);
u2:count10 port map(clk2=>c,clear2=>clear,q=>d); u3:seg7 port map(a=>d,b=>cout,cat1=>cat); end ji;
仿真波形图:
(由于实际使用的50000000分频不方便仿真,仿真时使用12分频)
仿真波形图分析:
每隔12个时钟信号计数器的值会增加1,直到计数器的值为9时,再次返回0计数。
端口说明及连接图:
输入端口:clk :输入时钟信号。 clear:输入复位信号。 输出端口:cat[5]-cat[0]:控制哪个数码管亮。
cout[6]-cout[0]:控制数码管的哪一部分亮。
实验四:用VHDL 实现相关电路
(1) 实验名称:用VHDL 语言设计并实现六个数码管串行扫描电路
实验任务要求:要求同时显示0,1,2,3,4,5这6个不同的数字图形
到6个数码管上,仿真验证其功能,并下载到实验板测试。
VHDL 代码:
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
entity shumakongzhi is port(clk_in: in std_logic; cat:out std_logic_vector(5 downto 0); a_out:out std_logic_vector(6 downto 0));
end shumakongzhi;
architecture a of shumakongzhi is
signal tmp:std_logic_vector(6 downto 0); signal cnt:integer range 0 to 599; signal cat_tmp:std_logic_vector(5 downto 0) ; begin
process(clk_in) begin
if(clk_in'event and clk_in='1') then if cnt=99 then cat_tmp
elsif cnt=199 then cat_tmp
case cat_tmp is when"011111"=>tmptmptmptmptmptmp
when others=>tmp
仿真波形图:
仿真波形图分析:cat[i]为0时,第i 个数码管亮。仿真时使
cat[5]-cat[0]依次为0且每次只有一个为0。cat[5]为0时显示0,cat[4]为0时显示1,cat[3]为0时显示2,cat[2]为0时显示3,
cat[1]为0时显示4,cat[1]为0时显示5。当扫描频率足够大时,就可以看到六个数码显示管同时显示,从左到右依次为012345。
端口说明及连接图:
输入:clk_in:输入时钟信号。
输出:cat[5]-cat[0]:控制哪个数码管亮。 a_out[6]-a_out[0]:控制数码管的哪一部分亮。
(2) 实验名称:用VHDL 语言设计并实现六个数码管滚动显示电路
实验任务要求:向左滚动,用全灭的数码管填充右边直至全部变灭,然后再依次从右边一个一个地点亮。状态为:0012345->12345X->2345XX-> 345XXX->45XXXX->5XXXXX->XXXXXX->XXXXX0->XXXX01->XXX012->XX0123-> X01234->012345。
VHDL 代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY shumasaomiao3 IS
PORT(CLK:IN STD_LOGIC;
SG:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
BT:OUT STD_LOGIC_VECTOR(5 DOWNTO 0));
END shumasaomiao3;
ARCHITECTURE ACE OF shumasaomiao3 IS
component fen2k
port(clk_in:in std_logic;
clk_out:out std_logic);
end component;
SIGNAL CNT6:INTEGER RANGE 0 TO 11;
SIGNAL A:INTEGER RANGE 0 TO 11;
SIGNAL COUNT:INTEGER RANGE 0 TO 4999 := 0;
SIGNAl FLAG:INTEGER RANGE 0 TO 12 := 0;
SIGNAl FLAG_A:INTEGER RANGE 0 TO 11;
SIGNAL clk_tmp:STD_LOGIC;
BEGIN
u1:fen2k port map(clk_in=>CLK,clk_out=>clk_tmp);
P1:process(CNT6)
BEGIN
CASE CNT6 IS
WHEN 0 => BT
WHEN 1 => BT
WHEN 2 => BT
WHEN 3 => BT
WHEN 4 => BT
WHEN 5 => BT
WHEN 6 => BT
WHEN 7 => BT
WHEN 8 => BT
WHEN 9 => BT
WHEN 10 => BT
WHEN 11 => BT
WHEN OTHERS => NULL;
END CASE ;
END PROCESS P1;
P2:process(clk_tmp)
BEGIN
IF clk_tmp'EVENT AND clk_tmp= '1' THEN
if CNT6= 11 then
CNT6
else
CNT6
end if;
IF (FLAG = 12) THEN
FLAG
END IF;
IF COUNT =4999 THEN
COUNT
FLAG
ELSE
COUNT
END IF;
END IF;
END PROCESS P2;
P3:process(A,FLAG,FLAG_A)
BEGIN
FLAG_A
CASE FLAG_A IS
WHEN 0=> SG
WHEN 1=> SG
WHEN 2=> SG
WHEN 3=> SG
WHEN 4=> SG
WHEN 5=> SG
WHEN 6=> SG
WHEN 7=> SG
WHEN 8=> SG
WHEN 9=> SG
WHEN 10=> SG
WHEN 11=> SG
WHEN OTHERS =>NULL ;
END CASE ;
END PROCESS P3;
END ACE;
仿真波形图:
仿真波形图的分析: 由波形可见,随着大计数周期的增加,依次产生0012345-12345X-2345XX-345XXX-45XXXX-5XXXXX-XXXXXX-XXXXX0-
XXXX01-XXX012-XX0123-X01234-012345,这样便实现了循环移位。
端口说明及连接图:
输入:clk:输入时钟信号。
输出:BT[5]-BT[0]: 控制哪个数码管亮。
SG[6]-SG[0]: 控制数码管的哪一部分亮。
二,故障及问题分析:
1. 代码反复报错,其逻辑语句在分析后并未出错,可能是文件头出错或分号忘写,注意检查自己VHDL 语言的规范性。
2. 仿真波形不出现,可能是文件名错误;时钟周期设置错误;文件未编译;clear 有效电平设计错误。若问题无法解决,则考虑自己的电路设计逻辑是否出错。
3. 电路下载到实验板后不能正常工作,首先检查仿真波形,检查实验板的时钟状态,检查程序无误后,检查管脚连接是否出错。
4. 出现冒险:尝试消除,有时候无法消除。
三,总结和结论:
1. 实验前应测试实验板所需部件能否正常工作,保证实验的顺利进行。
2. 上课前做好预习,上课时认真听讲,不遗漏老师的建议,课后及时复习掌握。
3. 课前查阅相关资料,对实验的惯例和常识有更多的了解。方便自己根据实验需要来进行模块的搭建或程序的编写。
4. 应规范VHDL 语言的使用习惯,变量名清晰明了,程序层次分明,一目了然,尽量避免冒险的出现,写程序时细心细致,避免出现低级错误,根据软件下方错误提示进行查错。
5. 进一步掌握Quartus II,做好仿真,并学会分析仿真结果的正确性,实验前应先明确步骤,查好资料,确定思路,加以实现。
6. 在电路出现问题时,要耐心细心的去寻找,去排查,去测试,查阅书籍,尝试解决。若遇到自己无法解决的问题,及时与同学讨论或询问老师。
7. 收获:通过本次实验,对于数字电路与逻辑设计实验有了初步的了解,与课本上的内容对照,加深了对知识的理解,提高了自己的动手能力。
一,实验结果分析
实验一:Quartus II 原理图输入法设计
(2) 实验名称:设计实现全加器
实验任务要求:用实验内容(1)中生成的半加器模块和逻辑门设计实现一个全加器,仿真并验证其功能,并下载到实验板测试,要求用拨码开关设定输入信号,发光二极管显示输出信号。 原理图:
仿真波形图:
仿真波形图分析:输入a,b 代表加数与被加数,输入c 代表低位向本位
的进位。输出s 代表本位和,输出co 代表向高位的进位。
可得真值表为:
实验三:用VHDL 设计与实现时序逻辑电路
(3) 实验名称:连接8421计数器,分频器和数码管译码器
实验任务要求:用VHDL 语言设计实现一个带异步复位的8421码十
进制计数器,分频器的分频系数为25k ,并用数码管显示数字。
VHDL 代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;
entity div is end;
port(clk1 : in std_logic;
clk_out : out std_logic);
architecture d of div is begin end;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY count10 IS PORT(
clk2,clear2:IN STD_LOGIC;
q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END count10;
ARCHITECTURE count OF count10 IS
SIGNAL q_temp:STD_LOGIC_VECTOR(3 DOWNTO 0);
process(clk1) begin
if (clk1'event and clk1='1') then end if;
if cnt=12499999 then else end if;
cnt
clk_tmp
signal cnt : integer range 0 to 12499999; signal clk_tmp : std_logic;
end process; clk_out
BEGIN
PROCESS(clk2,clear2) BEGIN
IF clear2='1' THEN q_temp
q_temp
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY seg7 IS
PORT(a:IN STD_LOGIC_VECTOR(3 DOWNTO 0); b: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); cat1:OUT STD_LOGIC_VECTOR(5 DOWNTO 0) ); END seg7;
ARCHITECTURE show OF seg7 IS BEGIN
PROCESS(a) BEGIN
CASE a IS
WHEN"0000"=>bbbbbbbbbbB
END show;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity jishuqi8421 is
port(clk,clear:IN STD_LOGIC;
cout:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); cat:OUT STD_LOGIC_VECTOR(5 DOWNTO 0) );
end jishuqi8421;
architecture ji of jishuqi8421 is component div25m port(clk1 : in std_logic;
clk_out : out std_logic);
end component; component count10 PORT(
clk2,clear2:IN STD_LOGIC;
q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); end component; component seg7
PORT(a:IN STD_LOGIC_VECTOR(3 DOWNTO 0); b: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); cat1:OUT STD_LOGIC_VECTOR(5 DOWNTO 0) ); end component;
signal c:std_logic;
signal d:std_logic_vector(3 downto 0); begin
u1:div port map(clk1=>clk,clk_out=>c);
u2:count10 port map(clk2=>c,clear2=>clear,q=>d); u3:seg7 port map(a=>d,b=>cout,cat1=>cat); end ji;
仿真波形图:
(由于实际使用的50000000分频不方便仿真,仿真时使用12分频)
仿真波形图分析:
每隔12个时钟信号计数器的值会增加1,直到计数器的值为9时,再次返回0计数。
端口说明及连接图:
输入端口:clk :输入时钟信号。 clear:输入复位信号。 输出端口:cat[5]-cat[0]:控制哪个数码管亮。
cout[6]-cout[0]:控制数码管的哪一部分亮。
实验四:用VHDL 实现相关电路
(1) 实验名称:用VHDL 语言设计并实现六个数码管串行扫描电路
实验任务要求:要求同时显示0,1,2,3,4,5这6个不同的数字图形
到6个数码管上,仿真验证其功能,并下载到实验板测试。
VHDL 代码:
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
entity shumakongzhi is port(clk_in: in std_logic; cat:out std_logic_vector(5 downto 0); a_out:out std_logic_vector(6 downto 0));
end shumakongzhi;
architecture a of shumakongzhi is
signal tmp:std_logic_vector(6 downto 0); signal cnt:integer range 0 to 599; signal cat_tmp:std_logic_vector(5 downto 0) ; begin
process(clk_in) begin
if(clk_in'event and clk_in='1') then if cnt=99 then cat_tmp
elsif cnt=199 then cat_tmp
case cat_tmp is when"011111"=>tmptmptmptmptmptmp
when others=>tmp
仿真波形图:
仿真波形图分析:cat[i]为0时,第i 个数码管亮。仿真时使
cat[5]-cat[0]依次为0且每次只有一个为0。cat[5]为0时显示0,cat[4]为0时显示1,cat[3]为0时显示2,cat[2]为0时显示3,
cat[1]为0时显示4,cat[1]为0时显示5。当扫描频率足够大时,就可以看到六个数码显示管同时显示,从左到右依次为012345。
端口说明及连接图:
输入:clk_in:输入时钟信号。
输出:cat[5]-cat[0]:控制哪个数码管亮。 a_out[6]-a_out[0]:控制数码管的哪一部分亮。
(2) 实验名称:用VHDL 语言设计并实现六个数码管滚动显示电路
实验任务要求:向左滚动,用全灭的数码管填充右边直至全部变灭,然后再依次从右边一个一个地点亮。状态为:0012345->12345X->2345XX-> 345XXX->45XXXX->5XXXXX->XXXXXX->XXXXX0->XXXX01->XXX012->XX0123-> X01234->012345。
VHDL 代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY shumasaomiao3 IS
PORT(CLK:IN STD_LOGIC;
SG:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
BT:OUT STD_LOGIC_VECTOR(5 DOWNTO 0));
END shumasaomiao3;
ARCHITECTURE ACE OF shumasaomiao3 IS
component fen2k
port(clk_in:in std_logic;
clk_out:out std_logic);
end component;
SIGNAL CNT6:INTEGER RANGE 0 TO 11;
SIGNAL A:INTEGER RANGE 0 TO 11;
SIGNAL COUNT:INTEGER RANGE 0 TO 4999 := 0;
SIGNAl FLAG:INTEGER RANGE 0 TO 12 := 0;
SIGNAl FLAG_A:INTEGER RANGE 0 TO 11;
SIGNAL clk_tmp:STD_LOGIC;
BEGIN
u1:fen2k port map(clk_in=>CLK,clk_out=>clk_tmp);
P1:process(CNT6)
BEGIN
CASE CNT6 IS
WHEN 0 => BT
WHEN 1 => BT
WHEN 2 => BT
WHEN 3 => BT
WHEN 4 => BT
WHEN 5 => BT
WHEN 6 => BT
WHEN 7 => BT
WHEN 8 => BT
WHEN 9 => BT
WHEN 10 => BT
WHEN 11 => BT
WHEN OTHERS => NULL;
END CASE ;
END PROCESS P1;
P2:process(clk_tmp)
BEGIN
IF clk_tmp'EVENT AND clk_tmp= '1' THEN
if CNT6= 11 then
CNT6
else
CNT6
end if;
IF (FLAG = 12) THEN
FLAG
END IF;
IF COUNT =4999 THEN
COUNT
FLAG
ELSE
COUNT
END IF;
END IF;
END PROCESS P2;
P3:process(A,FLAG,FLAG_A)
BEGIN
FLAG_A
CASE FLAG_A IS
WHEN 0=> SG
WHEN 1=> SG
WHEN 2=> SG
WHEN 3=> SG
WHEN 4=> SG
WHEN 5=> SG
WHEN 6=> SG
WHEN 7=> SG
WHEN 8=> SG
WHEN 9=> SG
WHEN 10=> SG
WHEN 11=> SG
WHEN OTHERS =>NULL ;
END CASE ;
END PROCESS P3;
END ACE;
仿真波形图:
仿真波形图的分析: 由波形可见,随着大计数周期的增加,依次产生0012345-12345X-2345XX-345XXX-45XXXX-5XXXXX-XXXXXX-XXXXX0-
XXXX01-XXX012-XX0123-X01234-012345,这样便实现了循环移位。
端口说明及连接图:
输入:clk:输入时钟信号。
输出:BT[5]-BT[0]: 控制哪个数码管亮。
SG[6]-SG[0]: 控制数码管的哪一部分亮。
二,故障及问题分析:
1. 代码反复报错,其逻辑语句在分析后并未出错,可能是文件头出错或分号忘写,注意检查自己VHDL 语言的规范性。
2. 仿真波形不出现,可能是文件名错误;时钟周期设置错误;文件未编译;clear 有效电平设计错误。若问题无法解决,则考虑自己的电路设计逻辑是否出错。
3. 电路下载到实验板后不能正常工作,首先检查仿真波形,检查实验板的时钟状态,检查程序无误后,检查管脚连接是否出错。
4. 出现冒险:尝试消除,有时候无法消除。
三,总结和结论:
1. 实验前应测试实验板所需部件能否正常工作,保证实验的顺利进行。
2. 上课前做好预习,上课时认真听讲,不遗漏老师的建议,课后及时复习掌握。
3. 课前查阅相关资料,对实验的惯例和常识有更多的了解。方便自己根据实验需要来进行模块的搭建或程序的编写。
4. 应规范VHDL 语言的使用习惯,变量名清晰明了,程序层次分明,一目了然,尽量避免冒险的出现,写程序时细心细致,避免出现低级错误,根据软件下方错误提示进行查错。
5. 进一步掌握Quartus II,做好仿真,并学会分析仿真结果的正确性,实验前应先明确步骤,查好资料,确定思路,加以实现。
6. 在电路出现问题时,要耐心细心的去寻找,去排查,去测试,查阅书籍,尝试解决。若遇到自己无法解决的问题,及时与同学讨论或询问老师。
7. 收获:通过本次实验,对于数字电路与逻辑设计实验有了初步的了解,与课本上的内容对照,加深了对知识的理解,提高了自己的动手能力。