您的当前位置:首页正文

EDA实验报告-实验3计数器电路设计

2022-02-14 来源:欧得旅游网
暨南大学本科实验报告专用纸

课程名称 EDA实验 成绩评定 实验项目名称 计数器电路设计 指导教师 郭江陵 实验项目编号 03 实验项目类型 验证 实验地点 B305 学院 电气信息学院 系 专业 物联网工程 组号: A6

一、实验前准备

本实验例子使用独立扩展下载板EP1K10_30_50_100QC208(芯片为EP1K100QC208)。EDAPRO/240H实验仪主板的VCCINT跳线器右跳设定为; EDAPRO/240H实验仪主板的VCCIO跳线器组中“”应短接,其余VCCIO均断开;独立扩展下载板“EP1K10_30_50_100QC208”的VCCINT跳线器组设定为;独立扩展下载板“EP1K10_30_50_100QC208”的VCCIO跳线器组设定为。请参考前面第二章中关于“电源模块”的说明。

二、实验目的

1、了解各种进制计数器设计方法

2、了解同步计数器、异步计数器的设计方法

3、通过任意编码计数器体会语言编程设计电路的便利

三、实验原理

时序电路应用中计数器的使用十分普遍,如分频电路、状态机都能看到它的踪迹。计数器有加法计数器、可逆计数器、减法计数器、同步计数器等。利用MAXPLUSII已建的库74161、74390分别实现8位二进制同步计数器和8位二——十进制异步计数器。输出显示模块用VHDL实现。

四、实验内容

1、用74161构成8位二进制同步计数器(程序为T3-1);

2、用74390构成8位二——十进制异步计数器(程序为T3-2);

3、用VHDL语言及原理图输入方式实现如下编码7进制计数器(程序为T3-3): 0,2,5,3,4,6,1

五、实验要求

学习使用Altera内建库所封装的器件与自设计功能相结合的方式设计电路,学习计数器电路的设计。

六、设计框图

首先要熟悉传统数字电路中同步、异步计数器的工作与设计。在MAX+PLUS II中使用内建的74XX库选择逻辑器件构成计数器电路,并且结合使用VHDL语言设计转换模块与接口模块,最后将74XX模块与自设计模块结合起来形成完整的计数器电路。并借用前面设计的数码管显示模块显示计数结果。

◆ 74161构成8位二进制同步计数器(程序为T3-1)

◆ 时钟源1 触发信号 时钟源2 七、原理图

计数器1 进位 数据总线开关 LED数码管显示 计数器2 ◆ 8位二进制同步计数器原理图 (程序为T3-1)

OUTPUTDA[7..0]4位二路开关 低4位计数器 DA[7..0]VCCXSH8_4D_IN[7..0]SELD_OUT[3..0]CNT4DA[0]CLKCLRENQAQBQCQDRCORESETCKCNTINPUTVCCINPUTVCCinst4xdeledd_in[3..0]abcdefginst3OUTPUTOUTPUTOUTPUTOUTPUTOUTPUTOUTPUTOUTPUTDA[1]DA[2]DA[3]abcdefginst字形码转换 高4位计数器 CNT4DA[4]CLKCLRENQAQBQCQDRCOinst8CKDSPDA[5]DA[6]DA[7]VCCTFFTPRNQOUTPUTSEL0INPUTVCCCLRNinst2模块说明: 采用了两个74161计数器,一个用来作为低位计数,另一个作为高位计数器。数据总线开关(4位二路开关)模块用于将计数器输出的数据分路切换为LED数码管显示所需要的数据格式。字形码转换模块调用前面实验所设计的模块。

八、实验电路连线

与使用操作

A:为独立扩展下载板上第86脚,应接“数码管段位引线”接线组“KPL_AH”的A B:为独立扩展下载板上第87脚,应接“数码管段位引线”接线组“KPL_AH”的B C:为独立扩展下载板上第88脚,应接“数码管段位引线”接线组“KPL_AH”的C D:为独立扩展下载板上第89脚,应接“数码管段位引线”接线组“KPL_AH”的D

E:为独立扩展下载板上第90脚,应接“数码管段位引线”接线组“KPL_AH”的E F:为独立扩展下载板上第92脚,应接“数码管段位引线”接线组“KPL_AH”的F G:为独立扩展下载板上第93脚,应接“数码管段位引线”接线组“KPL_AH”的G SEL0:为独立扩展下载板上第69脚,为数码管的位选扫描信号,接信号接线组“DS1-8A(T)”的SS0引线插孔。SS1、SS2接地(即在电源引线插孔组GND孔处)。

RESET:为独立扩展下载板上第68脚,应接“多功能复用按键F1-F12”信号接线组“F1_12(T)”的 F9~F12的任意一个插孔

CKCNT:为独立扩展下载板上第70脚,应接时钟信号源接线组“CLOCK(T)”的“FRQ(18~21)”引线插孔

CKDSP:为独立扩展下载板上第79脚即GCLK1,应接时钟信号接线组“CLOCK(T)”的“FRQ(11)”引线插孔

备注:程序T3-1、T3-2、T3-3的插线均相同,其中T3-3中CLK与T3-1的CKCNT定义引脚相同。 使用操作:

◆ 8位二进制同步计数器使用操作demo3top:

程序下载以后,在“动态键盘显示模块”的二个数码管上显示计数值,范围为00~FFH的二位十六进制数,并循环递增计数。 九、波形仿真分析

4为2路开关选择器模块仿真结果

输入信号:sel:高低四位选择控制为,高电平选低四位,低电平选高四位 D_IN :输入8位数

输出信号:D_out: 根据选择输出高四位或低四位数

波形分析结果 如上图在两个timebar之间,sel为高电平输出了D_IN的低四位数,在两个timebar两边sel为低电平,输出了D_IN的高四位,结果正确。

字行码转换模块仿真结果如下图

输入信号: D_IN : 要显示的4位2进制数 输出信号: a,b,c,d,e,f,g : 输出数码管段选 波形结果分析 在上图timebar处,输入的4位2进制数是5输出的段码是”1101101”,即共阴

数码管对应的数值为5。仿真结果正确。

◆ 8位二进制同步计数器仿真结果demo3top:

输入信号:

RESET:清零信号,低电平下重新开始计数。 CKDSP:动态显示数码管扫描频率设定。 CKCNT:计数时钟信号。 中间信号量: DA[7..0]:用于显示计数模块输出的中间计数结果。

输出信号: A~G:数码管7个段位,用于显示计数结果。 波形结果分析:

如图所示,当计数器DA[7..0]输出为“16”时,第2个timebar处对应的数码管的段码为”1111101”,即共阴数码管显示对应的值为6,第3个timebar处对应数码管的段码值为“0000110”,即共阴数码管显示对应的值为1,且在DA = 16 0x时sel的值在’0’ 和 ‘1’之间

不断变化,表明这个时间段选中二个数码管,并显示为“16”。其他状态下计数时钟产生的显示结果值类同。另外 第一个timebar 体现了同步计数功能,当CKCNT为上升沿时计数器加1。第4个timebar体现异步复位功能,当RESET为0时立刻复位重新开始计算。 结论:由上述分析所得结果,完全达到实验所需的要求。

CNT4单独进行仿真结果

输入信号: EN : 使能信号,当EN为高电平时开始计数。 CLK : 时钟信号,没一个时钟上升沿,计数加1。 CLR : 复位信号,为低电平时,计数复位。 输出信号: QA,QB, QC, QD : 计数输出4位2进制数信号,QA为第一位。 RCO : 进位信号,当计数计到16个数时产生进位,为高电平。 波形结果分析: 第一个timebar,体现了同步计数功能,当clk为上升沿时开始计数。第二个timebar体现进位输出功能,当计数计到“1111”时产生进位,RCO为高电平。第三个timebar体现异步复位功能,CLR信号为低电平时,输出立刻复位为“0000”,第四个timebar体现使能信号只有为高电平时才计数,低电平保持不变。 结论: 仿真结果正确。

对“demo3Atop”进行仿真的结果如下:

输入信号:

RESET:清零信号,低电平下重新开始计数。 CKDSP:动态显示数码管扫描频率设定。 CKCNT:计数时钟信号。 中间信号量: DA[7..0]:用于显示计数模块输出的中间计数结果。 输出信号: A~G:数码管7个段位,用于显示计数结果。 波形结果分析:

如图所示,当计数器DA[7..0]输出为“16”时,第3个timebar处对应的数码管的段码为”1111101”,即共阴数码管显示对应的值为6,第2个timebar处对应数码管的段码值为“0000110”,即共阴数码管显示对应的值为1,且在DA = 16 0x时sel的值在’0’ 和 ‘1’之间不断变化,表明这个时间段选中二个数码管,并显示为“16”。其他状态下计数时钟产生的显示结果值类同。另外 第一个timebar 体现了同步计数功能,当CKCNT为上升沿时计数器加1。第4个timebar体现异步复位功能,当RESET为0时立刻复位重新开始计算。 结论:仿真结果达到实验要求。

下载硬件调试结果: 顶层文件原理图:

OUTPUTDA[7..0]XSH8_4DA[7..0]VCCD_IN[7..0]SELD_OUT[3..0]74161LDNABCDENTENPCLRNinst4DA[0]DA[1]DA[2]DA[3]d_in[3..0]abcdefginst3xdeledOUTPUTOUTPUTOUTPUTOUTPUTOUTPUTOUTPUTOUTPUTQAQBQCQDRCOabcdefgRESETINPUTVCCINPUTVCCinstPIN_68CKCNTPIN_70CLKCOUNTERPIN_86PIN_87PIN_88PIN_89PIN_90PIN_92PIN_93VCC74161LDNABCDENTENPCLRNDA[4]DA[5]DA[6]DA[7]TFFVCCQAQBQCQDRCOTPRNQOUTPUTSEL0PIN_69CKDSPINPUTVCCCLKinst1COUNTERPIN_79CLRNinst2 仿真结果:

九、实验心得

通过实验,熟悉了quartus的硬件仿真步骤,熟悉了分模块仿真的作用和如何在仿真图上体现出该模块要实现的所有功能,熟悉8位二进制同步计数器使用操作。

实验三问题

1、74161计数器是什么功能的计数器,用专业的词语形容

答:4位16进制异步复位同步置数计数器 2、XSH8_4的功能

答:4位2选1多路选择器,从8位输入中选择高4位或低4位输出 3、XDELED模块功能

答:段译码模块,把输入的4位2进制数译码为数码管的段选信号。 4、TFT是什么模块作用是什么

答:T触发器,输入上升沿则输出翻转。 5、74161里的引脚含义以及为什么这么连接,(ABCD哪个引脚是高位,哪个引脚是低位ENT、ENP作用,ENT\\ENP\\LDN为什么接高电平VCC而第二个74161为什么接RCO为什么不把RCO进位脉冲接到时钟CLK引脚

答:LDN:控制是否输入预置数的引脚。

ABCD:预置数输入引脚。D为高位

ENT、ENP:使能端,当ENT、ENP同时为高电平时才能计数,一高一低,保持计数不变。

ENT\\ENP\\LDN接高电平VCC :保持74161计数状态,而且不允许置数。 第二个74161接RCO原因 :当低四位的计数进位时,高四位的计数器就计数加1 。不接CLK的原因是为了实现两个计数器实现同步计数功能。

6、74161里的RCO的高电平时间有没可能跨越两个CKL时钟周期,为什么 答:当第一个计数器计数到”1111”时RCO从0变成1的时候,当下一个时

钟上升沿时,RCO又变为0,它的宽度只有一个脉冲的宽度。不可能跨越2个clk 。

7、74161是在1111的时候产生进位信号还是在0000的时候产生进位信号为什么

答:在1111的时候产生进位信号,因为数字电路是有延时的,在1111时产生进位时才能保证低四位在下一个0000时高四位同时加1。 [7..0]的输入怎么是断开的输入从哪里来

答:输入从两个74161的四个引脚来,把它们的引脚输出的线的名保持一致就行。这是一种通用的标号方式,为了使线的复杂度降低,使用不能乱命名,必须与输入的一致。

9三个电路里均有T触发器,作用

答: 每一个上升沿的间隔固定了,得出来的0和1的占空比也会固定。使得数码管第1位和第二位的占用时间一样长。

10、第二个电路图芯片74390是什么芯片

答:双计数器,每个计数器又分为1位2进制计数器,3位5进制计数器,

有清零功能,没有置数功。

11、74390这么连线实现什么功能

答:实现一个异步十进制计数器功能,用一个二进制和五进制,5串2,实现进位功能 ,同样的连接了两个,形成了一个两位十进制计数器。 12、原理图3,XSB1的作用

答:这是一个有限状态机,分别有七个状态,状态顺序是0,2,5,3,4,6,1。

13、XHB1的作用

答:把输入的0123456的顺序变成了0253461。

14、XSB1与XHB1有什么区别,他们的输出会一直一致么

答:XSB1是用有限状态机来实现循环置数(0253461)功能。XHB1是把输入的01234567转化为0253461当计数到7时保持上一个的输出不变,下一个计时变为0。他们的输出不一样,因为XHB1计数到7时还保持上一个输出值不变,在下一个计数时才返回到0。它们的计数周期不一样:XSB1计数周期为7,XHB1计数周期为8。

15、CNT4应该在计数值为“F”的时候输出进位值,还是在计数值为“0”的时候

答:F时输出进位值,因为数字电路有一定延时,在F输出进位,下一个计数器会在第一个计数器变为0是同时计数加1。这是为了保持两个计数器的同步。 16、如何看出CNT4是异步CNT4的EN是否是同步使能是否体现所有功能通过仿真分析CNT4是否完美取代74161工作

答:是否异步复位:当复位信号来时,立刻复位计数值,计数清零。

同步使能:EN为高电平且clk为上升沿时才开始计数。

是否体现所有功能:看是否同步计数、异步复位、进位信号是否正确。

CNT4完美取代74161工作。

17、从硬件怎么知道发送SEL0高电平输入真的显示低四位

答:发送高电平时数码管显示低四位,发送低电平时数码管显示高四位。 附件

XSH8_4代码

library IEEE; use XSH8_4 is port (

D_IN: in STD_LOGIC_VECTOR (7 downto 0); --2选14位选择器输入信号 SEL: in STD_LOGIC;

--8位输入信号高低位选择信号

D_OUT: out STD_LOGIC_VECTOR (3 downto 0) --4为输出信号 ); end XSH8_4;

architecture XSH8_4_arch of XSH8_4 is

alias dlow : std_logic_vector(3 downto 0) is d_in(3 downto 0); --低四位 alias dhigh : std_logic_vector(3 downto 0) is d_in(7 downto 4);--高四位 begin

process(sel,D_IN) begin

case sel is

when '1' => d_out <= dlow;

--当sel为高电平时输出低四位

when '0' => d_out <= dhigh; ----当sel为低电平时输出高四位 when others => null; end case; end process; end XSH8_4_arch;

xdeled代码

library IEEE; use xdeled is port (

d_in: in STD_LOGIC_VECTOR (3 downto 0); --输入4位信号 --输出7位段选信号 a: out STD_LOGIC; b: out STD_LOGIC; c: out STD_LOGIC; d: out STD_LOGIC; e: out STD_LOGIC; f: out STD_LOGIC; g: out STD_LOGIC ); end xdeled;

architecture xdeled of xdeled is begin

process(d_in)

type data_out is array(0 to 6) of std_logic; variable outp: data_out; --段选判断信号 begin

--根据输入4位信号和段选对照表输出相应的段选信号 case d_in is

when \"0000\" => outp := \"1111110\"; when \"0001\" => outp := \"0110000\"; when \"0010\" => outp := \"1101101\"; when \"0011\" => outp := \"1111001\"; when \"0100\" => outp := \"0110011\"; when \"0101\" => outp := \"1011011\"; when \"0110\" => outp := \"1011111\"; when \"0111\" => outp := \"1110000\"; when \"1000\" => outp := \"1111111\"; when \"1001\" => outp := \"1111011\"; when \"1010\" => outp := \"1110111\"; when \"1011\" => outp := \"0011111\"; when \"1100\" => outp := \"1001110\";

when \"1101\" => outp := \"0111101\"; when \"1110\" => outp := \"1001111\"; when \"1111\" => outp := \"1000111\"; when others => null; end case;

--将段选信号赋给对应位的段选 a <= outp(0); b <= outp(1); c <= outp(2); d <= outp(3); e <= outp(4); f <= outp(5); g <= outp(6);

end process; end xdeled;

CNT4代码

LIBRARY IEEE; USE CNT4 IS

PORT(CLK,CLR,EN: IN STD_LOGIC; --CLK为时钟计数信号、CLR为复位信号、计数器EN为使能信号

ARCHITECTURE behav OF CNT4 IS BEGIN

PROCESS(CLK,CLR,EN)

VARIABLE Q : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN

IF CLR = '0' THEN

Q := (OTHERS => '0'); --计数器异步复位

ELSIF CLK'EVENT AND CLK = '1' THEN --检测时钟上升沿

IF EN= '1' THEN --检测是否允许计数或加载(同步使能) IF Q < 15 THEN Q := Q+1; ELSE

Q := (OTHERS => '0'); --大于等于15时,计数值清零

--允许计数,检测是否小于15

QA,QB,QC,QD : OUT STD_LOGIC;--计数值输出QA,QB,QC,QD输出端

--计数进位输出

RCO : OUT STD_LOGIC );

END CNT4;

END IF;

IF Q = 15 THEN --计数等于15,输出进位信号 RCO <= '1';

ELSE

RCO <= '0';

END IF;

END IF;

END IF;

QA <= Q(0); --将计数值向端口输出 QB <= Q(1); QC <= Q(2); QD <= Q(3); END PROCESS; END behav;

因篇幅问题不能全部显示,请点此查看更多更全内容