实验二 模可变计数器讲解.docx

上传人:b****7 文档编号:25443855 上传时间:2023-06-08 格式:DOCX 页数:23 大小:479.84KB
下载 相关 举报
实验二 模可变计数器讲解.docx_第1页
第1页 / 共23页
实验二 模可变计数器讲解.docx_第2页
第2页 / 共23页
实验二 模可变计数器讲解.docx_第3页
第3页 / 共23页
实验二 模可变计数器讲解.docx_第4页
第4页 / 共23页
实验二 模可变计数器讲解.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

实验二 模可变计数器讲解.docx

《实验二 模可变计数器讲解.docx》由会员分享,可在线阅读,更多相关《实验二 模可变计数器讲解.docx(23页珍藏版)》请在冰豆网上搜索。

实验二 模可变计数器讲解.docx

实验二模可变计数器讲解

南昌大学实验报告

学生姓名:

学号:

专业班级:

中兴101班

实验类型:

□验证□综合■设计□创新实验日期:

2012、10、18成绩:

实验二模可变计数器的设计

一、实验目的

1.学习计数器的VHDL设计、波形仿真和硬件测试;

2.学会自己设计程序;

3.学会设计模可变计数器;

4.学习多层次设计方法。

二、实验内容与要求

1.计设置一位控制模的位M,要求M=0:

模23计数;当M=1:

模109计数。

2.计数结果用静态数码管显示,一个四位二进制表示0~9中的一个数;

3.给出此项设计的仿真波形;

4.应用实验装置验证此计数器的功能。

三、实验思路

1.按照实验要求,本实验可分为四个模块进程:

分频、模23与109计数转换、数码管控制、七段译码。

2.模可变计数器原理:

即在原有的模值计数器上加入模值转换功能

3.计数器的数码管显示

需注意十位和百位的进位即:

当个位数的数值为9的下一个脉冲来时转换为,同时向十位进一,转换的算法为:

9(1001)+7(0111)=0(0000),并进一位;

当数值为99时,用同样的方法转换:

153(10011001B,数码管显示99)+103(01100111B)=100(000100000000);

4.要求分别实现模23和模109的计数,因此我分别用buffer变量GW、SW、BW代表个位、十位、百位。

还有一个控制模的位M,当M为0时实现模23计数,只用到GW和SW分别为个位和十位计数;当M为1时实现模109计数,用GW、SW、BW分别为个位十位和百位计数。

由于端口不能参与运算,因些在结构体中定义了se10、sel1、sel2三个buffer变量,分别用来对应SEL(0)、SEL

(1)、SEL

(2);在程序的最后用端口接收信号。

5.进程敏感信号为RSTENM三个,当RST为低电平,EN为高电平时则计数,否则不计数。

6.位选信号的设置:

用整形变量CNT8分别使不同的位选信号对应不同的输入,而得到不同输出。

对应关系:

表一位选信号

Sel2sel1sel0

000

001

010

011

D

Q7

Q6

Q5

Q4

sel2sel1sel0

100

101

110

111

D

Q3

Q2

Q1

Q0

7.模23与模109计数转换思路框图:

图一思维框图

四.实现方法一:

原理图输入法设计(自己独立完成)

1.建立文件夹

建立自己的文件夹(目录),如c:

\myeda,进入Windows操作系统

●QuartusII不能识别中文,文件及文件夹名不能用中文。

2.原理图设计输入

打开QuartusII,选菜单File→New,选择“DeviceDesignFile->BlockDiagram->SchematicFile”项。

点击“OK”,在主界面中将打开“BlockEditor”窗口。

(1)分频器模块:

(实体名为CLKDIV)

--时间:

2012年9月28号

--版本:

7.0

--功能:

分频器(100分频)

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYCLKDIVIS—定义实体名为CLKDIV

PORT(CLK:

INSTD_LOGIC;--输入信号为自带时钟

CLK_DIV:

OUTSTD_LOGIC);--输出信号为分频后的时钟信号

ENDCLKDIV;

ARCHITECTURERT1OFCLKDIVIS

SIGNALDATA:

INTEGERRANGE0TO100;--实现100分频

SIGNALCLK_TEMP:

STD_LOGIC;

BEGIN

PROCESS(CLK)

BEGIN

IFRISING_EDGE(CLK)THEN

IF(DATA=100)THEN

DATA<=0;

CLK_TEMP<=NOTCLK_TEMP;

ELSE

DATA<=DATA+1;

ENDIF;

ENDIF;

CLK_DIV<=CLK_TEMP;

ENDPROCESS;

ENDRT1;

(2)计数模块:

(实体名为COUNT)

--时间:

2012年9月28号

--版本:

7.0

--功能:

模可变计数器

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYcountIS

PORT(CLK,RST,EN,M:

INSTD_LOGIC;--输入变量为CLK、复位信号:

RST、使能端信号:

EN、--以及模变转换信号:

M

CQ1,CQ2,CQ3:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);--输出信号为计数的个、十、百位

COUT:

OUTSTD_LOGIC);--count为进位位

ENDENTITYcount;

ARCHITECTUREoneOFcountIS

SIGNALmodel:

INTEGER;

BEGIN

PROCESS(CLK,RST,EN,M,model)

VARIABLECQI:

STD_LOGIC_VECTOR(11DOWNTO0);

BEGIN

IFM='0'THENmodel<=34;

ELSIFM='1'THENmodel<=264;

ELSEmodel<=0;

ENDIF;

IFRST='1'THENCQI:

=(OTHERS=>'0');

ELSIFCLK'EVENTANDCLK='1'THEN

IFEN='1'THEN

IFCQI

IFCQI(7DOWNTO0)=153THENCQI:

=CQI+103;

ELSIFCQI(3DOWNTO0)=9THENCQI:

=CQI+7;

ELSECQI:

=CQI+1;

ENDIF;

ELSECQI:

=(OTHERS=>'0');

ENDIF;

ENDIF;

ENDIF;

IFCQI=modelTHENCOUT<='1';

ELSECOUT<='0';

ENDIF;

CQ1<=CQI(3DOWNTO0);

CQ2<=CQI(7DOWNTO4);

CQ3<=CQI(11DOWNTO8);

ENDPROCESS;

ENDARCHITECTUREone;

(3)数码管显示模块:

(实体名为scan_led)

--时间:

2012年9月28号

--版本:

7.0

--功能:

数码管显示

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYscan_ledIS

PORT(clk:

INSTD_LOGIC;

data1,data2,data3

:

INSTD_LOGIC_VECTOR(3DOWNTO0);

scan:

OUTSTD_LOGIC_VECTOR(6DOWNTO0);--输出数码管的7位显示

choose:

OUTSTD_LOGIC_VECTOR(2DOWNTO0));--数码管位选信号

ENDENTITY;

ARCHITECTUREoneOFscan_ledIS

SIGNALcout8:

STD_LOGIC_VECTOR(2DOWNTO0);

SIGNALA:

STD_LOGIC_VECTOR(3DOWNTO0);

BEGIN

P1:

PROCESS(cout8)—数码管动态扫描

BEGIN

CASEcout8IS

WHEN"000"=>choose<="000";A<="0000";

WHEN"001"=>choose<="001";A<="0000";

WHEN"010"=>choose<="010";A<="0000";

WHEN"011"=>choose<="011";A<="0000";

WHEN"100"=>choose<="100";A<="0000";

WHEN"101"=>choose<="101";A<=data3;

WHEN"110"=>choose<="110";A<=data2;

WHEN"111"=>choose<="111";A<=data1;

WHENOTHERS=>NULL;

ENDCASE;

ENDPROCESSP1;

P2:

PROCESS(clk)

BEGIN

IFclk'EVENTANDclk='1'THENcout8<=cout8+1;

ENDIF;

ENDPROCESSP2;

P3:

PROCESS(A)—数码管译码

BEGIN

CASEAIS

WHEN"0000"=>scan<="0111111";--0

WHEN"0001"=>scan<="0000110";--1

WHEN"0010"=>scan<="1011011";--2

WHEN"0011"=>scan<="1001111";--3

WHEN"0100"=>scan<="1100110";--4

WHEN"0101"=>scan<="1101101";--5

WHEN"0110"=>scan<="1111101";--6

WHEN"0111"=>scan<="0000111";--7

WHEN"1000"=>scan<="1111111";--8

WHEN"1001"=>scan<="1101111";--9

WHEN"1010"=>scan<="1110111";--A

WHEN"1011"=>scan<="1111100";--B

WHEN"1100"=>scan<="0111001";--C

WHEN"1101"=>scan<="1011110";--D

WHEN"1110"=>scan<="1111001";--E

WHEN"1111"=>scan<="1110001";--F

WHENOTHERS=>NULL;

ENDCASE;

ENDPROCESSP3;

END;

2.包装元件入库。

编译通过后,单击File→CreateDefaultSymbol,当前文件变成了一个包装好的自己的单一元件(分频器:

CLKDIV;计数器:

COUNT;译码器:

scan_led),并被放置在工程路径指定的目录中以备后用。

3.保存各个模块的原理图

单击File→Saveas…按扭,出现对话框,选择自己的目录(如c:

\myeda),合适名称保存刚才输入的原理图,原理图的扩展名为.bdf。

如图3所示。

图二各个模块的原理图

4.设置工程文件(Project)

以mokebian为工程名命名

5.选择目标器件

6.放置元件

7.添加连线

将以上各器件连接成实验原理图如下:

 

图三原理图设计

8.编译(Compiler)

单击→QuartusIICompiler,跳出Compiler窗口,此编译器的功能包括网表文件的提取、设计文件的排错、逻辑综合、逻辑分配、适配(结构综合)、时序仿真文件提取和编程下载文件装配等。

单击Start,开始编译!

如果发现有错,排除错误后再次编译。

7.仿真,测试项目的正确性(仅对计数模块进行仿真测试)

1)建立新的波形激励文件

2)在波形编辑器窗口添加节点

3)通过Edit->EndTime来设定仿真结束时间

4)在CLOCK窗口中设置clk的时钟周期为1s

5)点击save保存

6)通过Tools下的SimulatorTools项进行仿真,然后观察输出波形。

仿真波形如下:

M=0,模23计数。

COUNT进位。

M=1,模109计数。

COUNT进位。

在跳变时有些许延迟

M从1跳到0,切换到23计数

M从0跳到1,切换到109计数

RST=0,恢复计数

RST=1,清零

8.观察分析波形

9.时序分析

五、实现方法二:

VHDL文本输入法设计

--模可变计数器

--程序来源:

大部分由自己设计,部分程序摘自书上模10计数器设计,课本113页

--2012年10月18日

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;--设计库和程序包名,其中将标准逻辑矢量

--数据。

Unsigned.all的用处是允许当遇到+号时,调用+号的算符重载函数。

ENTITYmokebianIS

PORT(CLK,M,EN,RST:

INSTD_LOGIC;--定义端口

sel0,sel1,sel2:

bufferSTD_LOGIC;

SG:

OUTSTD_LOGIC_VECTOR(7DOWNTO0);--端口类型为标准逻辑矢量数据,数码管八段

CLK1:

bufferSTD_LOGIC;

GW,SW,BW:

bufferSTD_LOGIC_VECTOR(3DOWNTO0);--计数器的个,十,百位

COUT:

OUTSTD_LOGIC;--溢出信号

SEL:

OUTSTD_LOGIC_VECTOR(7DOWNTO0)--位选信号

);

ENDmokebian;

ARCHITECTUREbehavOFmokebianIS

SIGNALCNT:

STD_LOGIC_VECTOR(7DOWNTO0);--数码管分频计数

SIGNALJ:

STD_LOGIC_VECTOR(11DOWNTO0);--12位BCD计数值

SIGNALCNT8:

STD_LOGIC_VECTOR(2DOWNTO0);--数码管选择

SIGNALA:

STD_LOGIC_VECTOR(3DOWNTO0);--数码管显示值0

SIGNALMODEL:

STD_LOGIC_VECTOR(11DOWNTO0);--模长信号

BEGIN

--进程P1分出的频率用来数码管的位选扫描

P1:

PROCESS(CLK)

BEGIN

IFCLK'EVENTANDCLK='1'THENCNT<=CNT+1;

IFCNT=100THENCLK1<='1';--100分频

ELSECLK1<='0';

ENDIF;

ENDIF;

ENDPROCESS;

--模23与模109的转换

P2:

PROCESS(EN,RST,M,CLK1)

BEGIN

CASEMIS

WHEN'0'=>MODEL<="000000100010";--23

WHEN'1'=>MODEL<="000100001000";--109

ENDCASE;

GW<=J(3downto0);

SW<=J(7downto4);

BW<=J(11downto8);

IFRST='1'THENJ<=(others=>'0');

ELSIFCLK1'EVENTANDCLK1='1'THEN

IFEN='1'THEN

IFJ

IFGW=9THEN--个位为9时加7调整

J<=J+7;

IFSW=9THEN--十位为9时加103调整

J<=J+103;

ENDIF;

ELSEJ<=J+1;

ENDIF;

ELSEJ<=(others=>'0');

ENDIF;

ENDIF;

ENDIF;

ENDPROCESS;

--数码管控制

P3:

PROCESS(CLK)

BEGIN

IFCLK'EVENTANDCLK='1'THEN

IFCNT8<"010"THENCNT8<=CNT8+1;

ELSECNT8<=(OTHERS=>'0');

ENDIF;

ENDIF;

SEL(0)<=sel0;

SEL

(1)<=sel1;

SEL

(2)<=sel2;

CASECNT8IS--个、十、百分别送数码管动态显示

WHEN"000"=>sel2<='0';sel1<='1';sel0<='0';A<=GW;

WHEN"001"=>sel2<='0';sel1<='0';sel0<='1';A<=SW;

WHEN"010"=>sel2<='0';sel1<='0';sel0<='0';A<=BW;

WHENOTHERS=>NULL;

ENDCASE;

ENDPROCESS;

--七段译码

P4:

PROCESS(A)

BEGIN

CASEAIS

WHEN"0000"=>SG<="00111111";WHEN"0001"=>SG<="00000110";

WHEN"0010"=>SG<="01011011";WHEN"0011"=>SG<="01001111";

WHEN"0100"=>SG<="01100110";WHEN"0101"=>SG<="01101101";

WHEN"0110"=>SG<="01111101";WHEN"0111"=>SG<="00000111";

WHEN"1000"=>SG<="01111111";WHEN"1001"=>SG<="01101111";

WHENOTHERS=>NULL;

ENDCASE;

ENDPROCESS;

COUT<='1'WHENJ=MODELELSE'0';

ENDbehav;--结束结构体

六、实验步骤

1.打开quartusII,新建工程,选择元器件,再新建VHDL文件,保存为程序实体名,即mokebian。

如下图:

图4文本输入

2.然后进行编译,看是否有语法错误,如果有,则双击错误提示返回修改,直到编译成功:

如下图

图5编译通过

3.然后新建波形仿真文件,将endtime时间设置好,再将CLK,MENABLE,RST分别设置一定的值,保存为实体名,编译,如下图:

图六波形仿真文件建立

第二个时钟上升沿到来仍是0,因为此时EN为0,不允许计数

七、仿真波形分析

仿真结果如下所示:

分各种情况一一对其分析

M=0,模23计数

RST=1,清零

M=1,模109计数

(5)

两种方法仿真的结果一样

八、引脚锁定和编程下载

1.Assignments-.>device->

引脚锁定,参照下载实验板1K100的引脚号说明书,选择适当的引脚

2.引脚锁定后,保存,必须重新进行一次全程编译,编译通过后才能编程下载。

3、编程下载,用下载线将计算机并口和试验箱上的JTAG口接起来,接通电源。

选择Tools—>Programmer菜单,打开programmer窗口。

在mode中选中JTAG,将Program/Configure下的笑方框选中

4在开始编程之前,必须正确设置编程硬件。

点击“HardwareSetup”按钮,打开硬件设置口。

点击“AddHardware”打开硬件添加窗口,在“Hardwaretype”下拉框中选择“ByteBlasterMVorByteBlasterII”,“Port”下拉框中选择“LPT1”,点击OK按钮确认,关闭HardwareSetup窗口,完成硬件设置。

5、点击“Start”按钮,开始编程下载

图(14)下载成功

 

九、硬件测试结果

(1)引脚说明

开关K3,K1分别是使能控制开关和模值控制开关,K3断开时计数器停止计数,K3闭合时计数器正常工作。

K1是模值控制开关,K1断开时M=0模23计数,K1闭合时M=1模109计数。

开关K2控制RST,K2=1使得计数器复位重新开始计数.

COUT表示计数器进位,锁定在LED1灯上,当计数器完成模23或模109计数后LED灯闪一次

(2)实验现象

下载成功后,开始在实验箱上检验结果,设置CLK=1KHZ

当断开K3,即使EN=0时,可以看到数码不计数;

当K3为高电平即EN=1,而使K2为高电平,即RST=1时,可发现数码管显示为0,实现了复位

当K3为高电平,即EN=1,使K2为低电平,即RST=0时,可发现数码管开始计数,并置M为0时数码管计数到22后开始清0,实现了模23计数,而将K1切换到高电平,即使M为1时,数码管计数到108后,开始清0,实现了模109计数。

而且当数码管计数到45,我把K1置为低电平,即M为0时,个位,十位都清0,转向模23计数。

因此实验硬件测试结果与程序要实现的功能相符合。

实验成功。

十、试验心得

1.加深了自己对vhdl语言的运用,也更熟悉了实验过程中的操作。

2.相比较第一个实验,这个实验感觉比第一个难,难度主要体现在程序比第一个复杂许多,有许多需要重点注意的地方:

(1)IFM='0'THENmodel<=34;

ELSIFM='1'THENmodel<=264;

此处模值应转换为十进制计数,BCD码22即为十进制中的34,BCD码中的108即为十进制中的264

(2)IFCQI(7DOWNTO0)=153THENCQI:

=CQI+103;

ELSIFCQI(3DOWNTO0)=9THENCQI:

=CQI+7;

由于当计数到9时,BCD码为1001,而10的BCD码为00010000,并不是1010,所以当计数到9时,应加上7,计数到153时同理。

注:

若程序写为CQI(11DOWNTO0),在计数超过10后,将会变为16进位。

3.通过这次实验,我能完成简单的设计;在对模可变计数器设计过程中,花了很多时间,发现自己有很多不足,需要多看书多程序,训练自己的逻辑思维也非常重要;最后,希望在以后的学习中,多用心去学习EDA这们技术,在实际操作中慢慢提

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学案例设计

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1