FPGA实验
实验课程名称 通信系统集成电路设计
实验项目名称 Quartus II实验操作
专 业 班 级 通信一班
学 生 姓 名 刘雷杰
学 号 3009204128
指 导 教 师 陈为刚
实验一:Quartus II操作及16进制加法器
1. 实验目的
a) 熟悉熟悉EDA工具QuartusII及modelsim软件的使用方法。掌握用quartus ii或其他EDA软件对VHDL源程序进行编译、调试、修改、波形仿真。
b) 学习VHDL程序的软件及硬件的编写及仿真方法并熟练掌握VHDL程序的编写方法和注意事项。
c) 编写、调试出16进制计数器的程序,仿真出波形。
d) 在上面的基础上做出PCM9程序,并仿真出波形数据。
2. 实验器材
a) 电脑中要有Quartus II 软件
b) 电脑中要有Modelsim软件
3. 实验内容
a) 熟悉Quartus II和modelsim软件,并将两个软件进行配置,使软件可以用于为后面的软件进行调试。
b) 尽量自己编写VHDL程序,做16进制的计数器实验,包括计数器程序和测试平台。
c) 了解模块设计方法和思想,并设计并搭建测试平台。
4. 实验要求
a) 熟悉两个软件并配置好相关环境。
b) 编写实验用的VHDL程序。
c) 使用Quartus II编译,查找错误并修改到正确无误。
d) 使用Quartus II仿真,生成波形文件。
e) 保存相关文件,并
写实验报告。
5. 实验步骤及结果
a) 建立工程并加入16进制模块和测试平台。
1. 建立工程。
在菜单栏里有 fileNew Project Wizard,点击Next到这个界面。输入项目名称。后点击Finish,完成项目的创建。
2. 建立文件。
在菜单栏里有 fileNew,跳转到下面这个界面。点击选择VHDL File,这个选项后点击OK。
到环境中,写模块代码。
然后保存文件,按CTR+S。出现下面的界面,输入要保存的名字。我们这里保存为counter.vhd。
同理,同样的步骤编写测试平台的文件tb_counter.vhd。
下面是二个图。
b) 配置相应环境,并调试。
1. 在菜单栏里AssignmentsSettings,出现这个界面,修改如下图中所示。
2. 同样在ToolsOptions,会出现下面的界面,对其进行了如下的设置。点击OK进行保存设置。
最后经过几次实验编译成功了,出现了如下的对话框。
点击Ok就可以了。
c) 仿真及结果。
在菜单栏里ToolsRun EDA Smuliation ToolsEDA RLT Simulation
就会出现要进行仿真的结果如下图所示
6. 实验
a) 实验中在写完两个文件后出现了如下的错误:
Error: Top-level design entity "test_counter_16" is undefined,
从网上找到原因如下:
存的文件名和结构体名字不一致,在quartus软件中要求这样做,不然就出错。
解决方法一:改 结构体或文件保存名 使其名字一致。(这是一般的方法)
解决方法二:点击project菜单,然后再点击set as Top-level Entity(就是倒数第二行)下就行。(这是软件自带的方法)
用第一方法,问
解决。
编译成功。
b) 在进行modelsim波形输出的过程中,遇到过没有波形输出,查看了一下,认为是test bench没有设置正确,所以就会出现这种情况,把检查环境的互调配置修改为如下就正确了。
c) 实验总结:实验要认真细心,通过本实验,知道了VHDL具有极强的描述能力,能支持系统行为级、寄存器传输级和逻辑门电路级三个不同层次的设计,能够完成从上层到下层(从抽象到具体)逐层描述的结构化设计思想。要注意在程序编写过程中出现的错误提示信息,对其进行正确改正,基本上掌握EDA工具QuartusII软件的使用方法,并学会了用QuartusII软件建立项目并编写程序和调试下载的方法,基本上熟悉了VHDL程序的软件的仿真方法,也熟练掌握VHDL程序的编写方法和注意事项。
7. 附录
a) 模块程序(counter.vhd)
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity counter is
Port(
reset : in std_logic;
clock : in std_logic;
dataout : out std_logic_vector(3 downto 0)
);
end counter;
architecture Behavioral of counter is
signal inner_reg : std_logic_vector(3 downto 0);
begin
dataout <= inner_reg;
process(clock,reset)
begin
if (reset = '1') then
inner_reg <= "0000";
elsif(clock'event and clock='1') then
inner_reg <= inner_reg+"0001";
end if;
end process;
end Behavioral;
b) 测试平台(tb_counter.vhd)
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.all;
USE ieee.numeric_std.ALL;
ENTITY tb_counter IS
END tb_counter;
ARCHITECTURE behavior OF tb_counter IS
-- Component Declaration for the Unit Under Test (UUT)
COMPONENT counter
Port(
reset : in std_logic;
clock : in std_logic;
dataout : out std_logic_vector(3 downto 0)
);
END COMPONENT;
--Inputs
SIGNAL clk : std_logic := '0';
SIGNAL rst : std_logic := '0';
--Outputs
SIGNAL dataout1 : std_logic_vector(3 downto 0);
BEGIN
-- Instantiate the Unit Under Test (UUT)
uut: counter PORT MAP(
reset => rst,
clock => clk,
dataout => dataout1
);
--clkgen:
clk_gen: process
begin
clk<='0'; wait for 100 ns;
loop
clk<=not clk; wait for 6.25 ns;
end loop;
end process;
reset_gen: process
begin
rst<='1'; wait for 1200 us;
rst<='0'; wait;
end process;
END;