实验二 模可变计数器DOC.docx
《实验二 模可变计数器DOC.docx》由会员分享,可在线阅读,更多相关《实验二 模可变计数器DOC.docx(20页珍藏版)》请在冰豆网上搜索。
![实验二 模可变计数器DOC.docx](https://file1.bdocx.com/fileroot1/2022-10/9/4838772f-ea20-46a5-8043-d236f0c8c0a6/4838772f-ea20-46a5-8043-d236f0c8c0a61.gif)
实验二模可变计数器DOC
南昌大学实验报告
学生姓名:
学号:
专业班级:
中兴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
IFCQIIFCQI(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…按扭,出