实验二
计数器的设计
一、实验内容
1.结合教材中的介绍熟悉Quartus Ⅱ软件的使用及设计流程; 2.计数器设计原理; 3.对应的VHDL 代码源程序。
二、实验目的
1.掌握文本输入设计方法;
2.熟悉QuartusⅡ软件的使用及设计流程; 3.掌握计数器原理,能进行计数器的设计。
三、实验器材
PC机一台、EDA教学实验系统一台、导线若干
四、实验要求
1、用文本输入法编写一个计数器代码,用波形编辑工具生成一个计数器的测试向量,完成计数器的时序仿真。
2、至少两种方案实现。
3、分析实验数据。 4.个人总结及感想。
五、实验原理与内容
1、原理:
将时钟信号作为计数器的信号,当RST = \'1\'时,计数器异步复位。当RST=‘0’时并到时钟上升沿时,由使能端EN控制计数,高电平开始计数。并通过逻辑运算,实现计数进位并清零。
2.实验方案:【本实验选择方案1】
方案1:增加一个同步使能控制端口,利用它来控制计数器是否计数。设置中间变量,采用顺序描述语句IF来实现功能。
方案2:设置两个变量,根据算术原理,当个位数(变量1)大于9时,向十位(变量2)进位实现功能。
六、实验步骤
1、用文本输入法设计一个计数器;
1》 建立项目:启动QuartusII,选择菜单File——New progect wizard,输入项目名与实体名一致。
2》 编译:选择菜单File—New,新建VHDL File文件,输入程序代码并保存。
2、利用步骤一得到的计数器使用图形输入法实现波形时序仿真;
1》打开波形编辑器:选择File--New---Vector Waveform File。 2》 导入全部引脚 : 选择View---Utility Windows---Node Finder选择Pins:all。选择Edit——End time设置50us。
3》仿真:手动绘制输入波形向量。并设置为时序仿真。进行仿真
七、实验报告
1、实验源程序:
方案一代码:
--------------------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ---------- ENTITY count100 IS
PORT (CLK,RST,EN : IN STD_LOGIC;
CQ : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
COUT : OUT STD_LOGIC );
END count100; ---------- ARCHITECTURE behav OF count100 IS BEGIN
PROCESS(CLK, RST, EN)
VARIABLE CQI : STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
IF RST = \'1\' THEN
CQI := (OTHERS =>\'0\') ; --计数器异步复位
ELSIF CLK\'EVENT AND CLK=\'1\' THEN
--检测时钟上升沿
IF EN = \'1\' THEN
--检测是否允许计数(同步使能)
IF CQI
CQI := CQI + 1;
--允许计数, 检测是否小99
ELSE CQI := (OTHERS =>\'0\');
--大于99,计数值清零
END IF;
END IF;
END IF;
IF CQI = 99 THEN COUT
--计数大于99,输出进位信号
ELSE
COUT
END IF;
CQ
--将计数值向端口输出
END PROCESS; END behav;
方案二代码:
--------------------
library ieee; use ieee.std_logic_1164.all; --------------------- entity counter100 is
port (clk,reset:in std_logic;
cout1,cout2:out std_logic_vector(6 downto 0)); end counter100; --------------------- architecture counter of counter100 is begin
proce (clk,reset)
variable temp1: integer range 0 to 10; ----temp1为个位
variable temp2: integer range 0 to 10; ----temp2为十位
begin ------------------------- ------counter100:-----
if (reset=\'1\') then
temp1 := 0;
temp2 := 0;
elsif (clk\'event and clk = \'1\') then
temp1 := temp1+1;
if (temp1=10) then
temp1 := 0;
--------个位等于10时进位
temp2 := temp2+1;
if (temp2=10) then
--------十位等于10时计数100
temp2 := 0;
end if;
end if;
end if;
end proce;
end counter; -------------------- 2.仿真图:
功能仿真:
Add0CQI[7..0]PREDA[7..0]8\' h01 --B[7..0]OUT[7..0]Q1\' h0 --ENACLRADDER9\' h063 --A[8..0]B[8..0]OUTEqual0COUTLeThan0EQUALCQ[7..0]A[7..0]8\' h63 --B[7..0]OUTCQI~[7..0]SELLESS_THAN8\' h00 --DATAADATABOUT0MUX21RSTCLKEN
3、分析实验结果: 由波形图可知: 当复位信号 RST=‘1’时计数值立即清零.当使能信号EN=‘0’无效时,输出cq保持当前状态.只有在复位信号RST=‘0’且使能信号EN=‘1’有效时,计数器正常工作.当计数值CQ为9时,COUT输出一个高电平。可见实验达到了理想情况 基本符合逻辑结果,部分由于时间延迟会发生冲突乱码现象。
4、心得体会:
本次计数器实验为含异步清0和同步时钟使能的加法模100的功能。要想完成实验,需要了解以下东西:
1.熟悉计数器的工作原理和实现方法,这对编写程序代码有用。方案2就是根据算术原理而来。
2.实验前后分别对实验原理仔细理解,加上对实验波形的分析,会加深对实验程序的分析与吸收。
3.通过本次实验,重温了顺序描述语句,加深了其顺序执行的作用。 4.本次实验还可以采用一下来实现:
对时钟信号上升沿和下降沿连续计数