专用集成电路试验指导书

更新时间:2024-05-07 12:59:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验一 EDA软件实验

实验性质:验证性 实验级别:必做 开课单位:信息与通信工程学院通信工程系 学时:4学时 一、实验目的:

1、了解Xilinx ISE 6.2软件的功能。

2、掌握Xilinx ISE 6.2的VHDL输入方法。

3、掌握Xilinx ISE 6.2的原理图文件输入和元件库的调用方法。 4、掌握Xilinx ISE 6.2软件元件的生成方法和调用方法。 5、掌握Xilinx ISE 6.2编译、功能仿真和时序仿真。

6、掌握Xilinx ISE 6.2原理图设计、管脚分配、综合与实现、数据流下载方法。 7、了解所编电路器件资源的消耗情况。 二、实验器材:

计算机、Quartus II软件或xilinx ISE 三、实验内容:

1、 本实验以三线八线译码器(LS74138)为例,在Xilinx ISE 6.2软件平台上完成设计电路的VHDL

文本输入、语法检查、编译、仿真、管脚分配和编程下载等操作。下载芯片选择Xilinx公司的CoolRunner II系列XC2C256-7PQ208作为目标仿真芯片。

2、 用1中所设计的的三线八线译码器(LS74138)生成一个LS74138元件,在Xilinx ISE 6.2软

件原理图设计平台上完成LS74138元件的调用,用原理图的方法设计三线八线译码器(LS74138),实现编译,仿真,管脚分配和编程下载等操作。 四、实验步骤:

4.1 Xilinx ISE 6.2环境

1、三线八线译码器(74LS138)VHDL电路设计

(1)、三线八线译码器(74LS138)的VHDL源程序的输入

打开Xilinx ISE 6.2编程环境软件Project Navigator,执行“file”菜单中的【New Project】命令,为三线八线译码器(74LS138)建立设计项目。项目名称【Project Name】为 “Shiyan”,工程建立路径为“C:\\Xilinx\\bin\\Shiyan”,其中“顶层模块类型(Top-Level Module Type)”为硬件描述语言(HDL),如图1所示。

1

图1

点击【下一步】,弹出【Select the Device and Design Flow for the Project】对话框,在该对话框内进行硬件芯片选择与工程设计工具配置过程。各标签具体含义如下:

? 【Device Family】:定义所选芯片器件族 ? 【Device】:定义器件名 ? 【Package】:定义器件封装形式 ? 【Speed Grade】:定义芯片工作速度等级 ? 【Top-Level Module Type】:定义顶层模块类型 ? 【Synthesis Tool】:定义综合工具 ? 【Simulator】:定义仿真测试工具

? 【Generated Simulation Language】:定义硬件描述语言

针对本试验所用开发板我们选择 “CoolRunner2 CPLDs”系列的 “XC2C256-7PQ208”器件作为目标芯片进行仿真,如图2所示。

图2

完成具体选择后点击【下一步】弹出如图3所示对话框,在该对话框内创建文件资源。

图3

打开【New Source】标签,弹出如图4所示对话框,在左侧方框中包含了用户可以创建的文件

2

类型,包括以下内容:

? 【Schematic】:原理图类型文件 ? 【State Diagram】:状态图类型文件 ? 【Test Bench Waveform】:波形类型测试文件 ? 【User Document】:用户类型文件 ? 【Verilog Module】:Verilog类型文件

? 【Verilog Test Fixture】:Verilog语言描述类型测试文件 ? 【VHDL Library】:VHDL库文件 ? 【VHDL Module】:VHDL类型模块文件 ? 【VHDL Package】:VHDL类型文件封装库

? 【VHDL Test Bench】:VHDL语言描述类型测试文件

图4

在【File】 标签下对话框内写入用户自定义的文件名称,标签【Locatior】下显示了新定义文件的创建路径,选中标签【Add to proje】前的对号标记,将新创建的文74ls138添加到工程 “Shiyan”中。点击【下一步】,弹出如图5所示对话框,在此对话框中输入三线八线译码器(74LS138)的的端口信息。

图5

3

点击【下一步】弹出【New Source Information】对话框,在该对话框内显示了新建文件的属性及信息,如图6所示。

图6

点击【完成】返回资源创建对话框,其中显示了新建文件“LS74138.vhdl”,如图7。

图7

点击【下一步】弹出工程信息对话框【New Project Information】,该对话框给出了所设计的工程信息,如图8所示。

图8

点击【完成】标签结束新建工程过程。进入Xilinx ISE文本编辑方式,在文本框中编辑输入8位加法器的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

4

-- provided for instantiating Xilinx primitive components. --library UNISIM;

--use UNISIM.VComponents.all;

entity ls74138 is

Port ( g1 : in std_logic; g2 : in std_logic;

inp : in std_logic_vector(2 downto 0); y : out std_logic_vector(7 downto 0)); end ls74138;

architecture Behavioral of ls74138 is begin

process(g1,g2,inp) begin

if((g1 and g2)='1') then case inp is

when \ when \ when \ when \ when \ when \ when \ when \ when others=>y<=\ end case; else

y<=\ end if; end process; end Behavioral;

在VHDL源程序中,G1和G2为两个使能控制信号,INP为命令码输入信号,Y为8位译码输出信号。

5

(2)、设计文件存盘与语法检查

图13 图14

完成程序代码输入后单击高亮“ls74138-behavioral(LS74138.vhdl)”标签(图13),此时工具窗口将显示 “Process for Source(ls74138-behavioral)”。用鼠标右键点击Process窗口中【Check Syntax】标签,点击运行选项,进行程序语法检查,当显示一绿色对号标志时即表示程序中不存在语法问题,如图14所示。

(3)、仿真文件设计

为了验证所设计电路功能,需要输入测试文件对电路程序功能进行测试。在【Process】菜单中选择【New Source】选项,即可弹出如图5所示对话框,选择【VHDL Test Bench】添加测试向量文件,并将文件添加到LS74138模块中,如图15所示

图15 图16

运行行为仿真选项卡,Xilinx ISE自动调用ModelSim SE 6.1c仿真平台作为仿真工具。运行ModelSim SE 6.1c菜单【Simulate】->【Run】->【Restart】,将仿真时间点置零。在【transcript】窗口中输入仿真时间

。在波形【Wave】窗口内使用

按钮实现仿真图的“放

大”“缩小”“全局”功能。图17即为电路仿真结果,由图中时序及逻辑关系可知该三线八线译码器行为仿真正常。

6

图17

测试向量参考程序如下:

LIBRARY ieee;

USE ieee.std_logic_1164.ALL; USE ieee.numeric_std.ALL;

ENTITY ls74138_tb_74138_vhd_tb IS END ls74138_tb_74138_vhd_tb;

ARCHITECTURE behavior OF ls74138_tb_74138_vhd_tb IS

COMPONENT ls74138 PORT(

G1 : IN std_logic; G2 : IN std_logic;

INP : IN std_logic_vector( 2 downto 0); Y : OUT std_logic_vector(7 downto 0) );

END COMPONENT;

SIGNAL G1 : std_logic; SIGNAL G2 : std_logic;

SIGNAL INP : std_logic_vector( 2 downto 0); SIGNAL Y : std_logic_vector(7 downto 0);

BEGIN

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;

7

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<=\ wait for 20 us; INP<=\ wait for 10 us; INP<=\ wait for 10 us; INP<=\ wait for 10 us; INP<=\ wait for 10 us; INP<=\ wait for 10 us; INP<=\ wait for 10 us; INP<=\ wait;

end PROCESS u3;

-- *** End Test Bench - User Defined Section *** END behavior ; (4)芯片管脚定义

如前所述添加用户定义限制文件,运行【Assign Package Pins】选项卡,Xilinx ISE将弹出管脚分配窗口,在如图19,输入各个端口管脚位置并保存,完成芯片管脚定义。

8

图18 图19

(5)编译与综合

图20 图21

运行【Process for Source】中的【Implement Design】(图20),ISE将自动完成编译并调用内嵌的综合工具XST完成综合过程,运行结果如图21所示。

编译通过后即自动生成了电路烧录下载文件(*.jed)以及资源消耗报告,通过该报告即可了解所设计电路的资源消耗情况。

图22

由图22可知,在三线八线译码器(74LS138)的设计中使用了8个宏单元,9个乘积项,8个寄存器单元,13个用户引脚及5个功能输入块。

9

(5)、编程下载

本试验用并行电缆将开发实验平台与计算机接在一起。确认下载电缆连接无误后执行Xilinx ISE的【iMPACT】命令,将三线八线译码器(74LS138)设计文件下载到目标芯片XC2C256-7PQ208中,硬件验证所设计电路功能。

2、元件的生成、调用和仿真

1、新建原理图文件,命名为 “Sch_LS74138”并添加到工程“Shiyan”中,如图23。点击【下一步】完成原理图文件的创建。在弹出的原理图编辑框内选择【Symbols】标签,在其目录列表内显示了所有可用电路器件,其中包括了我们所设计的LS74138(图24)。

图23 图24

双击“ls74138”将其放置到原理图编辑区内。点击为器件添加外围端口,如图25所示。

图25

将原理图文件保存后返回【Xilinx Project Navigator】平台,此时已经将程序所设计的器件

10

“LS74138”配置给了原理图文件“sch_ls74138”,其余电路仿真、管脚配置、编译、综合以及电路下载等过程与文本设计方式一致,在此不在重复说明。 五、预习与思考:

思考:比较VHDL语言和原理图的设计方法,这两种设计各有哪些优缺点。

11

实验二 组合逻辑电路的VHDL语言实现

实验性质:验证性 实验级别:必做 开课单位:信息与通信工程学院通信工程系 学时:2学时 一、实验目的:

1、掌握VHDL语言设计基本单元及其构成

2、掌握用VHDL语言设计基本的组合逻辑电路的方法。 3、掌握VHDL语言的主要描述语句。 二、实验器材:

计算机、Quartus II软件或Xilinx ISE 三、实验内容:

1、本实验以1位全加器为例,在Xilinx ISE软件平台上完成设计电路的VHDL文本输入,编辑,编

译,仿真,管脚分配和编程下载等操作。下载芯片选择Xilinx公司的CoolRunner II系列XC2C256-7PQ208作为目标仿真芯片。

2、用实验内容1所设计的全加器的VHDL文件生成一个adder的元件,在Xilinx ISE软件原理图设

计平台上完成adder元件的调用,用原理图的方法设计一个8位二进制加法器,实现编译,仿真,管脚分配和编程下载等操作。 3、或优先编码器、多路选择器等其它电路。 四、实验步骤:

(一)、用VHDL语言实现八位加法器的设计并实现功能仿真。

全加器是带进位位信号的加法器,起逻辑表达式为:Sum?dataA?dataB?carryin 。它的真值表如表1所示,其中dataA和dataB为加数与被加数,carryin是输入的进位位信号,而Sum是和数,carryout是输出进位位信号。参考真值表,实现八位全加器的功能。

表1

输入 输出 carryin 0 0 0

dataA 0 0 1 dataB 0 1 0 12

Sum 0 1 1 carryout 0 0 0

0 1 1 1 1 1 0 0 1 1 1 0 1 0 1 0 1 0 0 1 1 0 1 1 1 一)1位加法器的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;

测试向量参考程序如下:

-- VHDL Test Bench Created from source file adder.vhd -- 21:00:50 03/18/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

13

-- simulation model. LIBRARY ieee;

USE ieee.std_logic_1164.ALL; USE ieee.numeric_std.ALL; ENTITY adder_adder_vhd_tb IS END adder_adder_vhd_tb;

ARCHITECTURE behavior OF adder_adder_vhd_tb IS

COMPONENT adder PORT(

a : IN std_logic; b : IN std_logic;

cin : IN std_logic; sum : OUT std_logic; cout : OUT std_logic );

END COMPONENT; SIGNAL a : std_logic; SIGNAL b : std_logic; SIGNAL cin : std_logic; SIGNAL sum : std_logic; SIGNAL cout : std_logic;

BEGIN

uut: adder PORT MAP( );

a => a, b => b, cin => cin, sum => sum, cout => cout

u1: PROCESS

14

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';

15

wait for 10 us; input<=\ wait for 10 us; END PROCESS tb;

-- *** End Test Bench - User Defined Section ***

END behavior; 仿真图如下:

(三)、用VHDL语言实现四选一选择器的设计并实现功能仿真。

选择器常用于信号的切换,四选一选择器可以用于4路信号的切换。其真值表如下所示:

表3 四选一真值表

选择输入 b 0 0 0 0 1 1 1 1 a 0 0 1 1 0 0 1 1 数据输入 Input0 0 1 x x x x x x Input1 x x 0 1 x x x x Input2 x x x x 0 1 x x Input3 x x x x x x 0 1 数据输出 y 0 1 0 1 0 1 0 1 用VHDL语言实现四选一选择器的设计并实现功能仿真。 参考程序如下:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux4 IS

PORT (input:IN STD_LOGIC_VECTOR (3 DOWNTO 0); a,b:IN STD_LOGIC;

21

y:OUT STD_LOGIC); END mux4;

ARCHITECTURE rt1 OF mux4 IS

SIGNAL se1:STD_LOGIC_VECTOR (1 DOWNTO 0); BEGIN

se1<=b&a;

PROCESS (input,se1) BEGIN

IF(se1=\ y<=input(0); ELSIF(se1=\ y<=input(1); ELSIF(se1=\ y<=input(2); ELSE

y<=input(3); END IF; END PROCESS; END rt1;

测试向量参考程序如下:

-- VHDL Test Bench Created from source file mux4.vhd -- 16:22:02 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 mux4_mux4_vhd_tb IS END mux4_mux4_vhd_tb;

ARCHITECTURE behavior OF mux4_mux4_vhd_tb IS

COMPONENT mux4 PORT(

input : IN std_logic_vector(3 downto 0); a : IN std_logic;

22

b : IN std_logic; y : OUT std_logic );

END COMPONENT;

SIGNAL input : std_logic_vector(3 downto 0); SIGNAL a : std_logic; SIGNAL b : std_logic; SIGNAL y : std_logic;

BEGIN

uut: mux4 PORT MAP( );

input => input, a => a, b => b, y => y

-- *** Test Bench - User Defined Section *** u1: PROCESS BEGIN a<='0';

wait for 30 us; a<='1'; wait for 30 us; a<='0'; wait for 10 us; a<='1'; wait;

END PROCESS u1; u2: process begin b<='0';

wait for 20 us;

23

b<='1'; wait for 40 us; b<='0'; wait for 10 us; b<='1'; wait for 10 us; b<='0'; wait;

end process u2;

u3: process begin

input<=\

wait for 20 us; input<=\ wait for 20 us; input<=\ wait for 40 us; input<=\ wait ;

end process u3;

-- *** End Test Bench - User Defined Section *** END behavior; 仿真结果如下图:

六、预习与思考

预习:在实验前编好实验程序,做实验时验证。

24

实验三 时序逻辑电路的VHDL语言实验

实验性质:验证性 实验级别:必做 开课单位:信息与通信工程学院通信工程系 学时:2学时 一、实验目的:

1、掌握用VHDL语言设计基本的时序逻辑电路及仿真。 2、掌握VHDL顺序语句和并行语句的异同

3、掌握触发器同步复位和异步复位的实现方式。 4、掌握软件时钟的加入方法。 5、掌握信号和变量的主要区别。 二、实验器材:

计算机、Quartus II软件或xilinx ISE 三、实验内容:

1、设计带使能的递增计数器

2、在步骤1的基础上设计一带使能的同步(异步)复位的递增(递减)计数器 3、在步骤1的基础上设计同步(异步)清零的同步(异步)复位的递增(递减)计数器 四、实验步骤:

1、设计带使能的递增计数器。

2、在步骤1的基础上设计一带使能的同步复位的递增计数器并实现时序仿真。 3、在步骤1的基础上用信号设计一带使能的同步复位的递增计数器并实现时序仿真。

4、用变量设计一带使能的同步复位的可增可减计数器并实现时序仿真,比较信号和变量的不同。 5、在步骤1的基础上设计异步清零的异步清零的递增(递减)计数器,和步骤二中同步设计比较,清零信号和时钟信号位置不同时仿真结果有何不同,同时理解VHDL语言顺序语句和并行语句的区别。

6、测试向量设计 参考程序: 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));

25

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 := \ ELSE

IF(ld = '0') THEN cnt := d; ELSE

IF(enable = '1') THEN cnt := cnt + \ 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. --

26

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,

27

);

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;

28

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<=\ wait;

end process u5;

29

-- *** End Test Bench - User Defined Section *** END behavior; 仿真图图下:

六、预习与思考:

思考:VHDL语言中信号和变量有什么区别?

30

实验四 VHDL层次化设计方法实验

实验性质:验证性 实验级别:必做 开课单位:信息与通信工程学院通信工程系 学时:2学时 一、实验目的:

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位异步计数器的设计。 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.

31

--library UNISIM;

--use UNISIM.VComponents.all;

entity dff is port (

d,clk,clear: in std_logic; q,q_n: out std_logic ); end dff;

architecture Behavioral of dff is begin

process(clk,clear) begin

if (clear='0') then q<='0';

elsif(clk'event and clk='1') then q<=d; q_n<=not d; end if; end process; end Behavioral;

D触发器测试向量程序如下:

Test Bench Created from source file dff.vhd -- 21:40:17 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. --

32

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;

33

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';

34

wait for 70us; clear<='0'; wait for 20us; clear<='1'; wait ;

end process u3;

-- *** End Test Bench - User Defined Section *** END behavior; 程序仿真如下图:

新建原理图文件,调用步骤1所生成的D触发器元件,在原理图中实现8位异步计数器: 原理图连接好如下图:

35

end Behavioral;

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; ENTITY rplcont IS

PORT(clk,clr:in std_logic;

count:out std_logic_vector(7 downto 0)); END rplcont;

ARCHITECTURE rtl OF rplcont IS

signal count_in_bar:std_logic_vector(8 downto 0); component dffr

port(clk,clr,d:in std_logic; q,qb:out std_logic); end component;

begin

count_in_bar(0)<=clk;

gen1:for i in 0 to 7 generate

u:dffr port map(clk=>count_in_bar(i), clr=>clr,d=>count_in_bar(i+1),

q=>count(i),qb=>count_in_bar(i+1)); end generate; end rtl;

(三) 测试向量设计

五、实验结果(仿真结果)与分析

36

实验五 综合实验

实验性质:综合性 实验级别:必做 开课单位:信息与通信工程学院通信工程系 学时:2学时 一、实验目的:

1、学习用VHDL语言实现比较大型的电路的方法。 2、继续巩固cpld技术层次化设计方法。

二、实验器材:

计算机、Quartus II软件或xilinx ISE 三、实验内容:

设计一数字时钟,要求具有时,分,秒,计数显示功能,以24小时循环计时;具有清零,调节小时,分钟功能;具有整点报时功能。 四、实验步骤:

1、根据电路特点,可在教师指导下用层次设计的概念,将此任务分成若干模块,规定每一模块的功能和各模块之间的接口。让几个学生分作和调试其中之一,然后再将各模块合起来联试。以培养学生之间的合作精神,同时加深层次化设计概念。

2、了解软件的元件管理深层含义,以及模块元件之间的连接概念,对于不同目录下的同一设计,如何融合。 3、模块说明:

各种进制的计数及时钟控制模块(10进制、6进制、24进制) 扫描分时显示,译码模块 各模块都用VHDL语言编写 参考程序

1、 秒模块 LIBRARY ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; ENTITY second IS PORT(

clk, reset,setmin : IN STD_LOGIC; enmin : OUT STD_LOGIC;

daout: out std_logic_vector (6 downto 0)); END entity second;

ARCHITECTURE fun OF second IS

SIGNAL count: STD_LOGIC_VECTOR( 6 downto 0);

37

BEGIN

daout <= count;

process ( clk , reset , setmin) begin

-- enmin<=k;

if (reset='0') then

count <= \ elsif (setmin='0') then enmin <= clk;

elsif (clk 'event and clk='1') then

if (count(3 downto 0)=\ if (count <16#60#) then

if (count=\ enmin<='1';

count<=\ ELSE

count<=count+7; end if; else

count<=\ end if;

elsif (count < 16#60#) then count <= count+1;

enmin<='0' after 100 ns; else

count<=\ end if; end if; end process; END fun;

分钟模块和小时模块参考秒模块。 2、 设定时间 LIBRARY ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; ENTITY seltime IS PORT(

clk1, reset: IN STD_LOGIC;

sec,min : IN STD_LOGIC_VECTOR(6 downto 0); hour : in std_logic_vector (5 downto 0);

daout : OUT STD_LOGIC_vector (3 downto 0); sel : out std_logic_vector ( 2 downto 0)); END seltime;

ARCHITECTURE fun OF seltime IS

SIGNAL count: STD_LOGIC_vector ( 2 downto 0);

38

BEGIN

sel <= count;

process ( clk1,reset) begin

if (reset ='0') then count <= \

elsif (clk1 'event and clk1='1') then if ( count >= \ count <= \ else

count <= count + 1; end if; end if; case count is

when \ when \

daout(2 downto 0) <= sec (6 downto 4); when \ when \

daout(2 downto 0) <= min (6 downto 4); when \ when others => daout(3 downto 2) <= \

daout(1 downto 0) <= hour(5 downto 4); end case; end process; end fun; 3、 显示模块 LIBRARY ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; ENTITY alert IS PORT(

clk : IN STD_LOGIC;

dain : IN STD_LOGIC_VECTOR(6 DOWNTO 0); speak: OUT STD_LOGIC;

lamp : OUT STD_LOGIC_VECTOR(2 DOWNTO 0)); END alert ;

ARCHITECTURE fun OF alert IS

signal count : std_logic_vector( 1 downto 0); signal count1: std_logic_vector( 1 downto 0);

BEGIN

speaker:process (clk) begin

speak <= count1(1);

if (clk 'event and clk= '1') then

39

if (dain = \

if (count1>=\ count1<=\ else

count1 <= count1 + 1; end if; end if; end if;

end process speaker; lamper:process(clk) begin

if (rising_edge(clk))then if (count <= \ if (count =\ lamp <= \

elsif (count = \ lamp <= \ elsif(count=\ lamp <= \ end if;

count <= count + 1; else

count <= \ end if; end if; end process lamper; END fun ;

(三) 测试向量设计

五、实验结果(仿真结果)与分析

40

本文来源:https://www.bwwdw.com/article/41xg.html

Top