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
IFJIFGW=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这们技术,在实际操作中慢慢提