实验课程:EDA 实验
实验地点:第五实验室 实验时间:2012/11/12 班级:通信103班 学号: 102193 姓名:杨险峰
100进制计数器
一、实验目的:
1、设计一个100进制计数器;
2、掌握ISE 软件的综合与设计实现流程;
3、掌握采用ISE 软件进行FPGA 开发的过程以及试验箱的使用方法;
4、了解对设计电路进行功耗分析的方法;
5、了解ISE 软件设计报告中电路资源利用率情况分析;
6、掌握使用VHDL 创建测试文件的方法。
二、实验步骤:
1、启动ISE 集成开发环境,新建一个工程;
2、为工程添加设计源文件;
3、对源文件进行语法检查,并改正错误之处;
4、对设计进行时序仿真,分析设计的正确性;
5、锁定引脚,完成设计实现过程,并在试验箱上连线,利用iMPACT 进行程序下载;
6、在试验箱上验证计数器的功能,观察并记录实验结果;
7、打开report 文件查看资源利用率的情况;
三、实验原理:
输入时钟信号,输出接七段数码管的段码,数码管原理图如下:
四、实验代码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;
entity counter100 is
port(clk1,clk2:in std_logic;
y:out std_logic_vector(6 downto 0);
Y0 Y1 Y2 Y3 Y4
Y5 Y6 EN
clr en clk Vcc
swgw:out std_logic_vector(1 downto 0)); end counter100;
architecture Behavioral of counter100 is
signal xy:std_logic_vector(1 downto 0);
signal gw:std_logic_vector(3 downto 0) :="0000"; signal sw:std_logic_vector(3 downto 0);
signal w:std_logic_vector(3 downto 0);
signal led:std_logic_vector(6 downto 0);
begin
swgw<=xy;
y<=led;
process(clk1)
begin
if(clk1='1') then
xy<="01";
else
xy<="10";
end if;
end process;
process(clk2)
begin
if(clk2' event and clk2='1') then
if(gw="1001") then
gw<="0000";
else
gw<=gw+'1';
end if;
end if;
end process;
process(clk2)
begin
if(clk2' event and clk2='1') then
if(gw="1001") then
if(sw="1001") then
sw<="0000";
else
sw<=sw+'1';
end if;
end if;
end if;
end process;
process(xy)
begin
if(xy="01") then
w<=gw;
else
w<=sw;
end if;
end process;
with w select
led<="0000110" when "0001", --1
"1011011" when "0010", --2
"1001111" when "0011", --3
"1100110" when "0100", --4
"1101101" when "0101", --5
"1111101" when "0110", --6
"0000111" when "0111", --7
"1111111" when "1000", --8
"1101111" when "1001", --9
"0111111" when others; --0
end Behavioral;
所加激励:
五、实验记录及分析:
仿真激励:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;
ENTITY counter_tbw IS
END counter_tbw;
ARCHITECTURE behavior OF counter_tbw IS
-- Component Declaration for the Unit Under Test (UUT) COMPONENT counter100
PORT(
clk1 : IN std_logic;
clk2 : IN std_logic;
y : OUT std_logic_vector(6 downto 0);
swgw : OUT std_logic_vector(1 downto 0)
);
END COMPONENT;
--Inputs
signal clk1 : std_logic := '1';
signal clk2 : std_logic := '1';
--Outputs
signal y : std_logic_vector(6 downto 0);
signal swgw : std_logic_vector(1 downto 0); BEGIN
-- Instantiate the Unit Under Test (UUT)
uut: counter100 PORT MAP (
clk1 => clk1,
clk2 => clk2,
y => y,
swgw => swgw
);
-- Stimulus process
stim_proc:--process
--begin
clk1<= not clk1 after 20 ns;
clk2<= not clk2 after 30 ns;
-- insert stimulus here
--end process;
END;
设计元件:
基准波形:
UCF文件:
NET "y[0]" LOC = B4;
NET "y[1]" LOC = A4;
NET "y[2]" LOC = D5;
NET "y[3]" LOC = C5;
NET "y[4]" LOC = A6;
NET "y[5]" LOC = B6;
NET "y[6]" LOC = E7;
NET "clk1" LOC = F7;
NET "clk2" LOC = D7;
NET "swgw[0]" LOC = C7;
NET "swgw[1]" LOC = F8;
NET "clk2" CLOCK_DEDICATED_ROUTE = FALSE;
表1:可编程器件、拨码开关的关系:
VHDL端口名称FPGA引脚号拨码开关序号Clk1 F7 时钟信号
Clk2 D7 时钟信号
Swgw[0]
C7 数码管段码1 Swgw[1]
F8 数码管段码2 y (6)
E7 接数码管对应短脚
y (5)
B6 y (4)
A6 y (3)
C5 y (2)
D5 y (1)
A4 y (0) B4
六、心得体会:
实验代码是其他同学写好的,在认真了读懂其含义后,完成了实验。
这样写的实验代码的程序比教材上给出的60进制计数器的方法要清晰和方便,能够直接利用数码管的显示观察计数器,更加直观。
这次实验过程,我们最开始没能理解如何“同时”显示多个数码管,并企图用数电课老师给的方法设计电路,频频有误。
后借鉴代码才明白多个数码管显示时并不是同时亮,而是通过clk 控制,使人眼观察为同时显示。
之前未给定个位的初始值,在仿真过程y 的输出信号总是不变化。
后给定初始值“0000”后,能实现仿真。
通过实验我更直观也更容易地明白了老师传授的相关知识。