《专用集成电路》
实验报告
姓名
专业通信工程
班级
学号
指导教师
实验一开发平台软件安装与认知实验
一、实验目的
1、了解Xilinx ISE 9.2/Quartus II软件的功能。
2、掌握Xilinx ISE 9.2/Quartus II的VHDL输入方法。
3、掌握Xilinx ISE 9.2/Quartus II的原理图文件输入和元件库的调用方法。
4、掌握Xilinx ISE 9.2/Quartus II软件元件的生成方法和调用方法。
5、掌握Xilinx ISE 9.2/Quartus II编译、功能仿真和时序仿真。
6、掌握Xilinx ISE 9.2/Quartus II原理图设计、管脚分配、综合与实现、数据流下载方法。
7、了解所编电路器件资源的消耗情况。
二、实验用到的软件和器件
计算机、Quartus II软件或xilinx ISE
三、实验内容:
1、本实验以三线八线译码器(LS74138)为例,在Xilinx ISE 9.2软件平台上完成设计电路的
VHDL文本输入、语法检查、编译、仿真、管脚分配和编程下载等操作。下载芯片选择Xilinx 公司的CoolRunner II系列XC2C256-7PQ208作为目标仿真芯片。
2、用1中所设计的的三线八线译码器(LS74138)生成一个LS74138元件,在Xilinx ISE 9.2
软件原理图设计平台上完成LS74138元件的调用,用原理图的方法设计三线八线译码器(LS74138),实现编译,仿真,管脚分配和编程下载等操作。
四、实验步骤:
1、三线八线译码器(LS74138)VHDL电路设计
(1)三线八线译码器(LS74138)的VHDL源程序的输入
(2)设计文件存盘与语法检查
(3)仿真文件设计
(4)芯片管脚定义
(5)编译与综合
(6)编程下载
2、元件的生成、调用和仿真
五、实验原理
VHDL源程序
process(g1,g2,inp)
begin
if((g1 and g2)='1') then
case inp is
when "000"=>y<="00000001";
when "001"=>y<="00000010";
when "010"=>y<="00000100";
when "011"=>y<="00001000";
when "100"=>y<="00010000";
when "101"=>y<="00100000";
when "110"=>y<="01000000";
when "111"=>y<="10000000";
when others=>y<="00000000";
end case;
else
y<="00000000";
end if;
end process;
测试向量参考程序
uut: ls74138 PORT MAP(
G1 => G1,
G2 => G2,
INP => INP,
Y => Y
);
-- *** Test Bench - User Defined Section *** u1:PROCESS
BEGIN
G1<='0';
wait for 10 us;
G1<='1';
wait for 90 us;
G1<='0';
wait;
END PROCESS u1;
u2:PROCESS
BEGIN
G2<='0';
wait for 10 us;
G2<='1';
wait for 90 us;
G2<='0';
wait;
END PROCESS u2;
u3:PROCESS
BEGIN
INP<="000";
wait for 20 us;
INP<="001";
wait for 10 us;
INP<="010";
wait for 10 us;
INP<="011";
wait for 10 us;
INP<="100";
wait for 10 us;
INP<="101";
wait for 10 us;
INP<="110";
wait for 10 us;
INP<="111";
wait;
end PROCESS u3;
六、实验结果
上图中,g1和g2为两个使能控制信号,inp为命令码输入信号,y为8位译码输出信号。,当g1与g2均为高电平时,译码器正常工作,译码如上。
生成元件图
实验二组合逻辑电路的VHDL语言实现
一、实验目的:
1、掌握VHDL语言设计基本单元及其构成
2、掌握用VHDL语言设计基本的组合逻辑电路的方法。
3、掌握VHDL语言的主要描述语句。
二、实验器材:
计算机、Quartus II软件或Xilinx ISE
三、实验内容:以下三个内容选择两个完成
用VHDL语言实现八位加法器的设计并实现功能仿真。
四、实验步骤:
(一)用VHDL语言实现八位加法器的设计并实现功能仿真。
1、完成1位全加器设计,在Xilinx ISE软件平台上完成设计电路的VHDL文本输入,编辑,编译,仿真,管脚分配和编程下载
等操作。下载芯片选择Xilinx公司的CoolRunner II系列XC2C256-7PQ208作为目标仿真芯片。
2、用实验内容1所设计的全加器的VHDL文件生成一个adder的元件,在Xilinx ISE软件原理图设计平台上完成adder元件的
调用,用原理图的方法设计一个8位二进制加法器,实现编译,仿真,管脚分配和编程下载等操作。
原理:全加器是带进位信号的加法器,其逻辑表达式为:
carryin
dataB
dataA
Sum+
+
=。它的真值表如表1所
示,其中dataA和dataB为加数与被加数,carryin是输入的进位位信号,而Sum是和数,carryout是输出进位位信号。参考真值表,实现八位全加器的功能。
表1
(二)用实验内容1所设计的全加器的VHDL文件生成一个adder的元件,在Xilinx ISE软件原理图设计平台上完成adder元件的调用,用原理图的方法设计一个8位二进制加法器。
(三)用VHDL语言实现优先编码器的设计并实现功能仿真
五、实验原理
VHDL源程序
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Uncomment the following lines to use the declarations that are
-- provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;
entity adder is
Port ( a : in std_logic;
b : in std_logic;
cin : in std_logic;
sum : out std_logic;
cout : out std_logic);
end adder;
architecture Behavioral of adder is
begin
sum <= (a xor b) xor cin;
cout <= (a and b) or (cin and a) or (cin and b);
end Behavioral;
测试向量程序
uut: adder PORT MAP(
a => a,
b => b,
cin => cin,
sum => sum,
cout => cout
);
u1: PROCESS
BEGIN
a<='0';
wait for 10 us;
a<='1';
wait for 20 us;
a<='0';
wait for 10 us;
a<='1';
wait for 10 us;
a<='0';
wait for 20 us;
a<='1';
wait for 10 us;
a<='0';
wait for 10 us; a<='1';
wait;
END PROCESS u1; u2:process
begin
b<='1';
wait for 10 us;
b<='0';
wait for 10 us;
b<='1';
wait for 10 us;
b<='0';
wait for 10 us;
b<='1';
wait for 20 us;
b<='0';
wait for 10 us;
b<='1';
wait for 10 us;
b<='0';
wait for 20 us;
b<='1';
wait;
END PROCESS u2; u3: process
begin
cin<='0';
wait for 40 us;
cin<='1';
wait for 20 us;
cin<='0';
wait;
end process u3;
六、实验结果与分析
2.1原件连接图
实验三时序逻辑电路的VHDL语言实验
一、实验目的:
1、掌握用VHDL语言设计基本的时序逻辑电路及仿真。
2、掌握VHDL顺序语句和并行语句的异同
3、掌握触发器同步复位和异步复位的实现方式。
4、掌握软件时钟的加入方法。
5、掌握信号和变量的主要区别。
二、实验器材:
计算机、Quartus II软件或xilinx ISE
三、实验内容:
设计一带使能的同步复位清零的递增8位二进制计数器
设计一带使能的异步清零复位的递增8位二进制计数器
四、实验步骤:
五、实验原理
参考程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity ycounter is
port(clk,clear,ld,enable:in std_logic;
d:in std_logic_vector(7 downto 0);
qk:out std_logic_vector(7 downto 0));
end ycounter;
architecture a_ycounter of ycounter is
begin
PROCESS (clk)
VARIABLE cnt :std_logic_vector(7 downto 0);
BEGIN
IF (clk'EVENT AND clk = '1') THEN
IF(clear = '0') THEN
cnt := "00000000";
ELSE
IF(ld = '0') THEN
cnt := d;
ELSE
IF(enable = '1') THEN
cnt := cnt + "00000001";
END IF;
END IF;
END IF;
END IF;
qk <= cnt;
END PROCESS;
end a_ycounter;
测试向量
-- VHDL Test Bench Created from source file ycounter.vhd -- 16:50:55 03/24/2008
-- Notes:
-- This testbench has been automatically generated using types std_logic and
-- std_logic_vector for the ports of the unit under test. Xilinx recommends
-- that these types always be used for the top-level I/O of a design in order
-- to guarantee that the testbench will bind correctly to the post-implementation
-- simulation model.
--
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
ENTITY ycounter_a_ycounter_vhd_tb IS
END ycounter_a_ycounter_vhd_tb;
ARCHITECTURE behavior OF ycounter_a_ycounter_vhd_tb IS COMPONENT ycounter
PORT(
clk : IN std_logic;
clear : IN std_logic;
ld : IN std_logic;
enable : IN std_logic;
d : IN std_logic_vector(7 downto 0);
qk : OUT std_logic_vector(7 downto 0)
);
END COMPONENT;
constant clk_cycle: time:=20 us;
SIGNAL clk : std_logic;
SIGNAL clear : std_logic;
SIGNAL ld : std_logic;
SIGNAL enable : std_logic;
SIGNAL d : std_logic_vector(7 downto 0);
SIGNAL qk : std_logic_vector(7 downto 0);
BEGIN
uut: ycounter PORT MAP(
clk => clk,
clear => clear,
ld => ld,
enable => enable,
d => d,
qk => qk
);
-- *** Test Bench - User Defined Section *** u1 : PROCESS
BEGIN
clk<='0';
wait for clk_cycle/2;
clk<='1';
wait for clk_cycle/2;
clk<='0';
wait for clk_cycle/2;
clk<='1';
wait for clk_cycle/2;
clk<='0';
wait for clk_cycle/2;
clk<='1';
wait for clk_cycle/2;
clk<='0';
wait for clk_cycle/2;
clk<='1';
wait for clk_cycle/2;
clk<='0';
wait for clk_cycle/2;
clk<='1';
wait for clk_cycle/2;
clk<='0';
wait for clk_cycle/2;
clk<='1';
wait for clk_cycle/2;
clk<='0';
wait for clk_cycle/2;
clk<='1';
wait for clk_cycle/2;
clk<='0';
wait for clk_cycle/2;
clk<='1';
wait ;
END PROCESS u1;
u2: process
begin
clear<='0';
wait for clk_cycle;
clear<='1';
wait;
end process;
u3: process
begin
ld<='1';
wait for clk_cycle*6;
ld<='0';
wait ;
end process u3;
u4: process
begin
enable<='1';
wait ;
end process u4;
u5: process
begin
d<="00001111";
wait;
end process u5;
-- *** End Test Bench - User Defined Section *** END behavior;
六、实验结果与分析
波形仿真图
同步清零
由图可看出,同步清零时,在有效时钟即时钟上升沿来临时才清零。
由图可以看出,当异步清零端置零时,计数器立即清零。
原件图
七、预习与思考:
思考:VHDL语言中信号和变量有什么区别?
区别如下:
1)信号赋值至少要有δ延时;而变量赋值没有。
2)信号除当前值外有许多相关的信息,如历史信息和投影波形;而变量只有当前值。
3)进程对信号敏感而不对变量敏感。
4)信号可以是多个进程的全局信号;而变量只在定义他们的顺序域可见(共享变量除外)。
5)信号是硬件中连线的抽象描述,他们的功能是保存变化的数据值和连接子元件,信号在元件的端口连接元件。
变量在硬件中没有类似的对应关系,他们用于硬件特性的高层次建模所需要的计算中。
实验四 VHDL层次化设计方法实验
一、实验目的:
1、掌握用VHDL语言层次化设计的基本方法。
2、掌握GENERATE语句的用法。
二、实验器材:
计算机、Quartus II软件或xilinx ISE
三、实验内容:
设计一个8位移位寄存器。各个D触发器模块采用VHDL语言编写,分别用原理图、VHDL语言元件例化语句和生成语句的方法实现8位移位寄存器的设计。
四、实验步骤:
(一)、在原理图中调用VHDL生成的D触发器模块实现8位移位寄存器的设计
1、在xilinx ISE环境中新建vhdl文本编辑文件,设计带清零端的D触发器并编译仿真。
2、将步骤1所设计的D触发器生成一个元件。
3、新建原理图文件,调用步骤2所生成的D触发器元件,在原理图中实现8位移位寄存器。
(二)、用VHDL的COMPONENT语句调用VHDL生成的D触发器模块实现8位异步计数器设计。
1、在xilinx ISE环境中新建vhdl文本编辑文件,设计带清零端的D触发器并编译仿真。
2、在同一个程序中用COMPONENT语句实现8位移位寄存器的设计。
(三)、新建原理图文件,调用步骤1所生成的D触发器元件,在原理图中实现8位异步计数器元件例化语句调用D触发器模块实现8位移位寄存器参考源程序
(四)、测试向量设计
五、实验原理
D触发器参考源程序
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Uncomment the following lines to use the declarations that are
-- provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;
entity Dchu is
Port ( CLK : in STD_LOGIC;
D : in STD_LOGIC;
Q : out STD_LOGIC;
CLEAR : in STD_LOGIC;
Q_N : out STD_LOGIC);
end Dchu;
ARCHITECTURE BEH OF Dchu IS
SIGNAL Q1:STD_LOGIC;
BEGIN
PROCESS (CLEAR,CLK,Q1)
BEGIN
IF CLEAR='0'
THEN Q1<='0';
ELSIF CLK'EVENT AND CLK='1'
THEN Q1<=D;
END IF;
END PROCESS;
Q<=Q1;
Q_N<=not Q1;
END BEH;
D触发器测试向量程序如下:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
ENTITY dff_dff_vhd_tb IS
END dff_dff_vhd_tb;
ARCHITECTURE behavior OF dff_dff_vhd_tb IS COMPONENT dff
PORT(
d : IN std_logic;
clear: in std_logic;
clk : IN std_logic;
q : OUT std_logic;
q_n: out std_logic
);
END COMPONENT;
SIGNAL d : std_logic;
signal clear: std_logic;
SIGNAL clk : std_logic;
SIGNAL q : std_logic;
signal q_n: std_logic;
BEGIN
uut: dff PORT MAP(
d => d,
clear=>clear,
clk => clk,
q => q,
q_n=> q_n
);u1: PROCESS
BEGIN
clk<='0';
wait for 10us;
clk<='1';
wait for 10us;
clk<='0';
wait for 10us;
clk<='1';
wait for 10us;
clk<='0';
wait for 10us;
clk<='1';
wait for 10us;
clk<='0';
wait for 10us;
clk<='1';
wait for 10us;
clk<='0';
wait for 10us;
clk<='1';
wait;
end process u1;
u2: process
begin
d<='0';
wait for 30us;
d<='1';
wait for 50us;
d<='0';
wait ;
end process u2;
u3: process
begin
clear<='1';
wait for 70us;
clear<='0';
wait for 20us;
clear<='1';
wait ;
end process u3;
-- *** End Test Bench - User Defined Section *** END behavior;
六、实验结果与分析
波形仿真
由波形文件可以看出,输入信号在随着时钟信号向右移,每一个时钟信号上升沿来临时,输入波形右移一位,共移8位。
原件连接图