预习报告部分
- 实验目的:通过设计十进制计数器和逻辑移位寄存器,练习VHDL语言时序逻辑的描述方法。
- 实验原理:
(1)一个具有同步清零和并行输出功能的10进制加法计数器,实体名称为“counter10”,其引脚名称和逻辑功能如下表所示。
输入 | 输出 | 功能 | ||
clk | clr | q(4位总线) | co | |
↑ | 0 | 计数值 并行输出 | 进位 输出 | 计数值清0 |
↑ | 1 | 加法计数 | ||
0,1,↓ | X | 保持 |
(2)一个具有同步清零、并行输出的7位逻辑左移移位寄存器,(高位为左,低位为右),实体名称为“L_shifter7”,其引脚名称和逻辑功能如下表所示。
输入 | 输出 | 功能 | |||
clk | clr | si | d (7位总线) | so | |
↑ | 0 | 串行 输入 | 并行输出 寄存器值 | 串行输出 寄存器最高位 | 寄存器清零 |
↑ | 1 | 寄存器左移 | |||
0,1,↓ | 1 | 寄存器保持 |
- 实验内容:
- 设计一个具有同步清零和并行输出功能的10进制加法计数器,实体名称为“counter10”。如上表所示。
- 设计一个具有同步清零、并行输出的7位逻辑左移移位寄存器,(高位为左,低位为右),实体名称为“L_shifter7”,其引脚名称和逻辑功能如上表所示。
- 实验所用设备:PC个人计算机、Windows操作系统、Quartus II集成开发环境软件、HDLE-2实验箱。
- 实验步骤:①建立工程、②编辑代码、③编译及修改错误、④建立仿真波形并仿真、⑤根据仿真结果分析设计是否正确、⑥写入HDLE-2实验箱FPGA,观察实验结果。
实验报告部分
- 实验步骤:
(1)10进制加法计数器
(2)7位逻辑左移移位寄存器
- 实验数据及结果分析:
10进制加法计数器:
7位逻辑左移移位寄存器:
通过对多组实验数据的分析,判断其符合预期结果。如图所示,并且结果符合实验预期。
- 实验结论:
实验结果表明,VHDL编写的计数器和寄存器能够实现稳定的功能。计数器能够按照预期的逻辑顺序进行计数,寄存器能够按照设计预期正确存储和传输数据。并且满足设计要求的计数范围。通过仿真验证,发现计数器和寄存器的工作与预期一致,符合实验要求。
- 总结及心得体会:
通过这次实验,我加深了对时序逻辑电路设计的理解,了解了时序逻辑电路在数字电路中的应用,掌握了使用VHDL语言进行基本时序逻辑电路设计的能力。也提高了编码和验证的技能,同时VHDL是一个强大而复杂的语言,实验过程中出现的问题和错误,也帮助了我学会了如何调试和修改VHDL代码,提高了我们的问题解决能力。我也发现自己还有很多需要学习和提高的地方,需要不断学习、实践和改进。
- 附录(实验源码)
10进制加法计数器:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity counter10 is
port(clk,clr:in std_logic;
qa,qb,qc,qd,co:out std_logic
);
end entity counter10;
architecture rtl of counter10 is
signal count_4:std_logic_vector(3 downto 0);
begin
qa<=count_4(0);
qb<=count_4(1);
qc<=count_4(2);
qd<=count_4(3);
process(clk,clr)is
begin
if(clk'event and clk='1') then
if(clr='0')then
count_4<="0000";
co<='0';
elsif(clr='1')then
if(count_4>="1001")then
count_4<="0000";
co<='1';
else
count_4<=count_4+'1';
co<='0';
end if;
end if;
end if;
end process;
end rtl;
7位逻辑左移移位寄存器:
library ieee;
use ieee.std_logic_1164.all;
entity L_shifter7 is
port(clk,clr,si : in std_logic;
d : buffer std_logic_vector(6 downto 0);
so : out std_logic );
end entity L_shifter7;
architecture rtl of L_shifter7 is
begin
process (clk) is
begin
if (clk'event)and(clk='1')then
if (clr = '0')then
d<="0000000"; so<= '0';
else
d(6 downto 1) <= d(5 downto 0);
d(0) <= si;
so <= d(5);
end if;
end if;
end process;
end rtl;