实验二 模可变计数器DOC.docx
- 文档编号:12608973
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:23
- 大小:479.83KB
实验二 模可变计数器DOC.docx
《实验二 模可变计数器DOC.docx》由会员分享,可在线阅读,更多相关《实验二 模可变计数器DOC.docx(23页珍藏版)》请在冰点文库上搜索。
实验二模可变计数器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
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这们技术,在实际操作中慢慢
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验二 模可变计数器DOC 实验 可变 计数器 DOC