EDA VHDL 实验2计数器100[小编推荐]_4位二进制计数器实验
EDA VHDL 实验2计数器100[小编推荐]由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“4位二进制计数器实验”。
实验二
计数器的设计
一、实验内容
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.本次实验还可以采用一下来实现:
对时钟信号上升沿和下降沿连续计数