实验一Qaurtus的使用
一、实验目的
了解Qaurtus的功能及使用方法,掌握CPLD/FPGA的开发步骤。
二、实验要求
利用图形输入法设计一个3-8译码器,并完成编译、仿真、编程下载、硬件测试等过程。
三、实验原理与方案
Qaurtus是完全集成化的可编程逻辑设计环境,可以完成设计输入、编译、仿真、编程下载等一系列过程。
在Qaurtus中可采用原理图输入法进行设计,即先为工程建立一个文件夹,然后在原理图输入窗口调入所用元件,连线后得到正确的设计原理图,然后再进行编译、排错、仿真、下载等操作。
在建立文件夹时注意名字不能使用中文,且不可含有空格。在调用元件时要用到三个元件库,位于\Qaurtus2\max2lib路径下。其中prim库为基本逻辑元件库,包含基本门电路、输入输出符号等;mf为宏功能元件库,主要包含74系列门电路等;mega_lpm为参数可变的兆功能元件库,含有计数器等逻辑部件。
在编译时要先将设计文件设置成“工程”(set project to current file),还要选择目标器件,本实验中使用的器件为ACEX系列的ACEX-EP1K10TC100-3。Qaurtus 的编译器(compiler)包含了一般EDA流程中的多个功能部分,编译器窗口中各功能模块的含义如下:
compiler netlist extractor:是编译器网表文件提取器,能将输入的原理图文件或HDL文件转换成网表文件,并检查其中可能的错误。该模块还负责连接顶层设计中的多层次设计文件,另外还包含一个内置的、用于接受外部标准网表文件的阅读器。
Database builder:是基本编译文件建立器,能将含有任何设计层次的设计网表文件转换成一个单一层次的网表文件,以便进行逻辑综合。
Logic synthesizer :是逻辑综合器,对设计项目进行逻辑化简、逻辑优化和检查逻辑错误。综合后输出的网表文件表达了设计项目中底层逻辑元件最基本的连接方式和逻辑关系。逻辑综合器的工作方式和优化方案可以通过一些选项来实现,具体方法请查阅相关书籍。
Partitioner:是逻辑分割器,如果选定的目标器件资源太小,容纳不下设计项目,该分割器则自动将设计项目进行分割,使得它们能够在多个器件中实现。
Fitter:是适配器,或者说是结构综合器或布局布线器,它将逻辑综合所得的网表文件,即底层逻辑元件的基本连接关系,在选定的目标器件中具体实现。对于布局布线器的策略和优化方式也可以通过设置一些选项来改变和实现。
Timing snf extractor:是时序仿真网表文件提取器,该功能块从适配器输出的文件中提取时序仿真网表文件,以对设计项目进行仿真测试用。对于大的设计项目,一般先进行功能仿真,方法是在compiler 窗口下选择processing项中的
function snf extractor 选项。仿真网表文件(snf)是仿真时的必需文件,除此以外在仿真前还要设计一个仿真通道文件(scf),用以确定要观察的输入输出信号。设计仿真通道文件要在file 菜单的new选项中选择waveform editor file。
Assembler:是装配器,能将适配器输出的文件,根据不同的目标器件、不同的配置ROM产生多种格式的编程/配置文件,如用于CPLD或配置ROM用的POF编程文件,用于对FPGA直接配置的SOF文件,用于单片机对FPGA配置的Hex文件等。
编译通过的设计项目是否能完成预期的逻辑功能,可以通过仿真来验证,主要步骤如下:
(1)建立仿真通道文件(SCF)。
(2)输入信号节点。
(3)设置仿真参数。一般首先选择菜单option\snap to grid 取消前面的“√”,以便能任意设置输入电平或设置输入时钟信号的周期。
(4)设定仿真时间。
(5)设置输入信号波形。
(6)保存波形文件。
(7)运行仿真器。选择主菜单Qaurtus\simulator,单击start按钮。
(8)观察波形。
(9)延时精确测量。若要精确测量电路的输入与输出的延时,可选择主菜单Qaurtus\timing analyzer。
在仿真通过后,可以对器件进行编程和硬件测试。在编程前要完成目标芯片的引脚锁定,并重新编译。引脚锁定的方法是选择菜单assign\pin\location/chip。编程时要用下载电缆线把计算机并行口(打印口)与目标板(实验板)连接起来,选择主菜单Qaurtus\programmer,再选择菜单options\hardware setup,选择byteblaster(mv)编程方式。在编程器窗口中单击configure按钮,如果没有故障会出现配置完成的信息提示,表明编程(配置)完毕,之后就可以进行硬件测试了。
本实验的电路方案可参考下图:
四、实验内容、步骤与结果
1、建立文件夹:E:\2005045101XX。
2、启动Qaurtus,打开图形编辑器输入设计并存盘。
3、项目编译
1)将设计文件设成项目。
2)选择目标器件:ACEX-EP1K10TC100-3。
3)参数设置:取默认值。
4)编译。
4、时序仿真
1)建立波形文件:*.SCF。
2)参数设置。
3)打开仿真窗口并”START”。
4)查看仿真结果
请记录仿真波形,并添加到实验报告中。
5、器件编程
1)连好电缆,锁定引脚并重新编译。
2)打开“PROGRAMER”窗口。
3)选择编程/配置目标文件(*.POF/SOF)。
4)点击“PROGRAM”或”CONFIGURE”。
6、硬件测试。
请说明测试方法并记录测试结果,在实验报告中写出。
五、实验结果分析与结论
1、Qaurtus的基本功能和一般操作步骤。
2、原理图文件的建立方法。
3、仿真的方法。
4、其它。
实验二
内容参考课本P291的(实验3)
实验三
实验三VHDL的并行语句
一、实验目的
掌握VHDL中并行语句的特点、功能和使用方法;进一步熟悉Quartus II的使用方法。
二、实验要求
用选择信号赋值语句或条件信号赋值语句设计一个2线-4线译码器,并完成设计输入、编译、仿真等过程。
三、实验原理与方案
VHDL的基本描述语句分成顺序语句和并行语句两大类。顺序语句只能包含在进程中,并行语句直接出现在结构体中。在结构体中的并行语句的执行是同步的,与书写顺序无关。
选择信号赋值语句和条件信号赋值语句属于并行语句,它们的格式如下:选择信号赋值语句:
WITH 选择表达式SELECT
赋值目标信号<=表达式1 WHEN 选择值1,
表达式2 WHEN 选择值2,
…
表达式n WHEN 选择值n;
选择信号赋值语句不能在进程中应用,但其功能与进程中的CASE语句相似。选择信号语句中也有敏感量,即关键词WITH后的选择表达式,每当选择表达式的值发生变化时,就将自动对各子句的选择值进行测试对比,并将满足条件的子句对应的表达式的值赋给目标信号。选择信号赋值语句对各子句中选择值的测试具有同期性,因此,不允许有条件重叠或条件覆盖不全的情况。
条件信号赋值语句:
赋值目标信号<=表达式1 WHEN 赋值条件1 ELSE
表达式2 WHEN 赋值条件2 ELSE
…
表达式n ;
在结构体中的条件信号赋值语句的功能类似进程中的IF语句,在执行条件信号语句时,每一赋值条件是按书写的先后关系逐项测定的,一旦发现赋值条件为真,立即将对应的表达式的值赋给目标信号。由此可知,条件信号语句的赋值条件允许有重叠现象,这与CASE语句有很大的不同。
注意选择信号赋值语句的每一子句结尾都是逗号,最后一句是分号;而条件赋值语句每一子句的结尾没有任何标点,只有最后一句有分号。
2线-4线译码器是2个输入、4个输出的组合电路,假设输入信号为b、a,输出信号为y0-y3,则其真值表如表3-1所示:
下面是使用选择信号赋值语句的示例程序,可供实验参考。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY decode24 IS
PORT ( a,b:in std_logic;
y:out std_logic_vector( 0 TO 3));
END decode24;
ARCHITECTURE rtl OF decode24 IS
SIGNAL indata:std_logic_vector(1 DOWNTO 0);
BEGIN
indata<=b&a;
WITH indata SELECT
y<= ”0111” WHEN “00”,
”1011” WHEN “01”,
”1101” WHEN “10”,
”1110” WHEN “11”,
”XXXX” WHEN OTHERS;
END rtl;
四、实验内容、步骤与结果
(一)使用选择信号赋值语句实现实验要求
1、建立文件夹:E:\2005045101XX。
2、启动Quartus II,打开文本编辑器输入设计并存盘。
3、项目编译
1)将设计文件设成项目。
2)选择目标器件:ACEX-EP1K10TC100-3。
3)参数设置:取默认值。
4)编译。
4、时序仿真
1)建立波形文件:*.SCF。
2)参数设置。
3)打开仿真窗口并”START”。
4)查看仿真结果
请记录仿真波形,并添加到实验报告中。
5、器件编程
1)锁定引脚并重新编译。
2)打开“PROGRAMER”窗口。
3) 选择编程/配置目标文件(*.POF/SOF)。
4)点击“PROGRAM”或”CONFIGURE”。
6、硬件测试
请说明测试方法并记录测试结果,在实验报告中写出。(二)使用条件信号赋值语句实现实验要求
步骤同上。
五、实验结果分析与实验结论
1、根据仿真及硬件测试结果说明实验是否达到了要求。
2、并行语句的特点。
3、选择信号赋值语句和条件信号赋值语句的异同。
4、其它。
实验四数字系统的层次化设计
一、实验目的
了解并掌握Quartus II环境下数字系统的层次化设计方法。
二、实验要求
采用层次化的设计方法,设计一个十进制计数器-译码器电路,使计数器的输出用数码管显示,并完成设计输入、编译、仿真、硬件测试等过程;
三、实验原理与方案
当设计一个结构较为复杂的系统时,通常采用层次化的设计方法。层次化设计是分层次、分模块进行设计描述。描述器件总功能的模块放在最上层,称为顶层设计;描述器件的某一部分功能的模块放在下层,称为底层设计。根据图形和硬件描述语言的特点,一般在顶层中用电路图说明各模块的连接和I/O关系,在底层用VHDL语言描述模块的逻辑功能。本实验中的电路结构可参考下图:
如果顶层文件采用原理图方式,则需要在底层设计时创建各模块元件的图形符号,供顶层设计时调用。方法是在底层设计编译仿真无误后,选择菜单file\create default symbol。
顶层设计也可以采用文本方式,一般采用结构化描述方式,元件例化语句是结构化描述的典型语句。
下面的程序可供实验中参考:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY counter10 IS
PORT(clk,:IN STD_LOGIC;
q:BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0));
END counter10;
ARCHITECTURE rtl OF counter10 IS
BEGIN
PROCESS(clk,)
BEGIN
IF (clk’EVENT AND clk=’1’) THEN
IF Q=”1001” THEN
Q<=”0000”
ELSE
Q<=q+1;
END IF;
END IF;
END PROCESS;
END rtl;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY SEG7 IS
PORT(in_data,:IN STD_LOGIC_VECTOR(3 DOWN 0);
out_data:OUT STD_LOGIC_VECTOR(0 TO 6)); END SEG7;
ARCHITECTURE ouview OF SEG7 IS
BEGIN
PROCESS(in_data)
BEGIN
CASE in_data IS
WHEN “0000”=>out_data<=”1111110”;
WHEN “0001”=>out_data<=”0110000”;
WHEN “0010”=>out_data<=”1101101”;
WHEN “0011”=>out_data<=”1111001”;
WHEN “0100”=>out_data<=”0110011”;
WHEN “0101”=>out_data<=”1011011”;
WHEN “0110”=>out_data<=”1011111”;
WHEN “0111”=>out_data<=”1110000”;
WHEN “1000”=>out_data<=”1111111”;
WHEN “1001”=>out_data<=”1111011”;
WHEN others =>out_data<=”0110001”;
END CASE;
END PROCESS;
END ouview;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY counter_seg IS
PORT(clk:IN STD_LOGIC;
out_seg:OUT STD_LOGIC_VECTOR(0 TO 6)); END counter_seg;
ARCHITECTURE structure OF counter_seg IS COMPONENT counter10 IS
PORT(clk:IN STD_LOGIC;
q:BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0));
END COMPONENT;
COMPONENT SEG7 IS
PORT(in_data:IN STD_LOGIC_VECTOR(3 DOWN 0);
out_data:OUT STD_LOGIC_VECTOR(0 TO 6));
END COMPONENT;
SIGNAL out_q: STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
u0:counter10 PORT MAP(clk,out_q);
u1:SEG7 PORT MAP(out_q,out_seg);
END structure;
四、实验内容、步骤与结果
1、用VHDL完成底层电路的设计
1)用VHDL设计十进制计数器并保存默认符号(*.SYM);
2)用VHDL设计七段译码器并保存默认符号;
2、用图形输入法连接前面设计得到的两个默认符号,并添加输入输出端口等符号,完成顶层电路的设计(在实验报告中给出设计出的电路图);
3、项目编译
1)将设计文件设成项目。
2)选择目标器件:ACEX-EP1K10TC100-3。
3)参数设置:取默认值。
4)编译。
4、时序仿真
1)建立波形文件:*.SCF。
2)参数设置。
3)打开仿真窗口并”START”。
4)查看仿真结果
请记录仿真波形,并添加到实验报告中。
5、器件编程
1)锁定引脚并重新编译。
2)打开“PROGRAMER”窗口。
3) 选择编程/配置目标文件(*.POF/SOF)。
4)点击“PROGRAM”或”CONFIGURE”。
6、硬件测试
请说明测试方法并记录测试结果,在实验报告中写出。
五、实验结果分析与实验结论
1、设计的电路是否实现了要求的功能。
2、层次化设计的方法。
3、其它。
实验五七段译码器的设计
一、实验目的
掌握CASE语句的功能和应用方法,进一步熟悉VHDL的程序设计方法及FPGA的编程方法。
二、实验要求
1、设计一个对1位BCD码译码的七段译码器,并完成设计输入、编译、仿真、硬件测试等过程;
2、修改设计,使得当译码器输入非法BCD码时显示器显示“E”;
3、修改设计,实现1位十六进制代码到七段码的译码电路。
三、实验原理与方案
1位BCD码由4位二进制代码构成,有效的代码范围为0000-1001。七段码是用于控制七段LED数码显示器的代码,包含7(8)位二进制代码。十进制字符、BCD码、七段码的对应关系如下表所示:
表6-1 BCD码对应的七段码表
七段译码器就是将输入的BCD码翻译成对应的七段码的电路,为纯组合电路。由于输入输出之间有明确的对应关系,所以可以采用CASE语句设计。使用CASE语句时要注意语句中的条件表达式的值必须列举穷尽,但不能重复,如果无法穷举表达式的值,则要用OTHERS来表达。CASE语句为顺序语句,要包含在进程中。本实验可参考如下程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY view IS
PORT(in_data:IN STD_LOGIC_VECTOR(3 TO 0);
out_data:OUT STD_LOGIC;
END view_1;
ARCHITECTURE ouview OF view IS
BEGIN
PROCESS
BEGIN
CASE in_data IS
WHEN “0000”=>out_data<=”1111110”;
WHEN “0001”=>out_data<=”0110000”;
WHEN “0010”=>out_data<=”1101101”;
WHEN “0011”=>out_data<=”1111001”;
WHEN “0100”=>out_data<=”0110011”;
WHEN “0101”=>out_data<=”1011011”;
WHEN “0110”=>out_data<=”1011111”;
WHEN “0111”=>out_data<=”1110000”;
WHEN “1000”=>out_data<=”1111111”;
WHEN “1001”=>out_data<=”1111011”;
END PROCESS;
END hst;
在进行硬件测试时,可以利用实验箱中的拨动开关提供BCD码输入,利用8位数码管中的任何1位观察显示结果。8位数码管为共阴极类型,连线时只要将电路的a-g输出端连接到数码管的对应的接线端,再将数码管的位选端SEL0-SEL2接固定的电平即可。
四、实验内容、步骤与结果
1、建立文件夹:E:\2005045101XX。
2、启动Qaurtus,打开文本编辑器输入设计并存盘。
3、项目编译
1)将设计文件设成项目。
2)选择目标器件:ACEX-EP1K10TC100-3。
3)参数设置:取默认值。
4)编译。
4、时序仿真
1)建立波形文件:*.SCF。
2)参数设置。
3)打开仿真窗口并”START”。
4)查看仿真结果
请记录仿真波形,并添加到实验报告中。
五、实验结果分析与实验结论
1、所设计的电路是否实现了要求的功能;
2、CASE语句的功能和使用方法;
3、其它。
实验六
1、下面程序是n输入与门的VHDL描述,试补充完整。
__________ ieee;
use _____________________.all;
entity andn is
________ (n : integer:=N); -- 类属参数声明(注:仿真时N应该为一个具体的整数值)port ( a : in std_logic_vector( ______ downto 0);
c : out std_logic);
end;
________________ behav of ________ is -- 结构体声明
begin
process (____)
_____________ int : std_logic; -- 变量声明
begin
int := ____ _; -- 变量赋初值
for I in a'length – 1 downto 0 loop -- 循环判断(注:a'length表示取端口a的长度) if a(i) = '0' then
int := '0';
end if;
end loop;
c <= ________; -- 输出判断结果
end process;
end behav;
2、设计一数据选择器MUX,其系统模块图和功能表如下图所示。试描述该数据选择器MUX的结构体。
SEL COUT
00
01
10
11
OTHERS
A or B
A xor B
A nor B
A and B
“XX”
a)用if语句、b)case语句语句编程。
Library ieee;
Use ieee.std_logic_1164.all;
Entity mymux is
Port ( sel : in std_logic_vector(1 downto 0); -- 选择信号输入Ain, Bin : in std_logic_vector(1 downto 0); -- 数据输入
Cout : out std_logic_vector(1 downto 0) );
End mymux;