eda实习报告.docx
《eda实习报告.docx》由会员分享,可在线阅读,更多相关《eda实习报告.docx(25页珍藏版)》请在冰豆网上搜索。
eda实习报告
EDA实习报告
题目
学生姓名:
班号:
学号:
1206
指导老师:
中国地质大学(武汉)机械与电子信息学院
2011年12月
实验一、3/8译码器和半加器的实现
一、实验步骤
学习Quartus2软件的用法:
1、在WINDOWS界面双击Quartus2图标进入Quartus2环境;
2、单击file菜单下的NewProjectWizard:
Introduction按照向导里面的介绍新建一个工程并把它保存到自己的路径下面。
3、单击file菜单下的New,选择VHDLFile,后单击OK,就能创建一个后缀为.vhd(*.bdf)的文件。
4、输入完成后检查并保存,编译。
5、改错并重新编译;
6、建立仿真波形文件并进行仿真。
7、选择器件及分配引脚,重新编译;根据引脚分配在试验箱上进行连线,使用LED进行显示;
8、程序下载,观察实验结果并记录。
2、源程序
1、3/8译码器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYDECODE38IS
PORT(A:
INSTD_LOGIC_VECTOR(2DOWNTO0);
DECODE38:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
END;
ARCHITECTUREoneOFDECODE38IS
BEGIN
PROCESS(A)
BEGIN
CASEAIS
WHEN"000"=>DECODE38<="10000000";
WHEN"001"=>DECODE38<="01000000";
WHEN"010"=>DECODE38<="00100000";
WHEN"011"=>DECODE38<="00010000";
WHEN"100"=>DECODE38<="00001000";
WHEN"101"=>DECODE38<="00000100";
WHEN"110"=>DECODE38<="00000010";
WHEN"111"=>DECODE38<="00000001";
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
END;
2、半加器
半加器是通过画出它的电路图来实现的,电路图为:
三、仿真波形
1、3/8译码器
2、半加器
4、心得体会
通过这个实验我初步了解了Quartus2软件的用法,并能够用它编译程序、仿真及下载到试验箱上。
在画波形图时,由于时间没有设置好,所以使波形有些时延,但大体还是可以的。
在本次试验中,我感觉自己获益匪浅,在设计3/8译码器时,由于粗心打错了一些字母,导致在检查过程中出现了错误,所以在以后写程序时我会更加注意下,尽量减少这类错误的发生。
半加器的设计是通过画电路图实现的,这个在实验时没有出现错误,做完这个后,我还将半加器保存到库里面,从而画出了全加器的电路图,并下载到试验箱上面,也没有出现错误。
总的来说,我学会了运用这个软件来实现3/8译码器和半加器。
实验二、BCD七段显示译码器实验
1、BCD七段显示译码器
2、源程序
1、BCD七段显示译码器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYDECL7SIS
PORT(A:
INSTD_LOGIC_VECTOR(3DOWNTO0);
DECL7S:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
END;
ARCHITECTUREoneOFDECL7SIS
BEGIN
PROCESS(A)
BEGIN
CASEAIS
WHEN"0000"=>DECL7S<="1111110";
WHEN"0001"=>DECL7S<="0110000";
WHEN"0010"=>DECL7S<="1101101";
WHEN"0011"=>DECL7S<="1111001";
WHEN"0100"=>DECL7S<="0110011";
WHEN"0101"=>DECL7S<="1011011";
WHEN"0110"=>DECL7S<="1011111";
WHEN"0111"=>DECL7S<="1110000";
WHEN"1000"=>DECL7S<="1111111";
WHEN"1001"=>DECL7S<="1111011";
WHEN"1010"=>DECL7S<="1110111";
WHEN"1011"=>DECL7S<="0011111";
WHEN"1100"=>DECL7S<="1001110";
WHEN"1101"=>DECL7S<="0111101";
WHEN"1110"=>DECL7S<="1001111";
WHEN"1111"=>DECL7S<="1000111";
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
END;
仿真波形:
2、动态七段译码显示器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYSHENGRIIS
PORT(CLK:
INSTD_LOGIC;
SG:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
BT:
BUFFERintegerrange7downto0);
ENDENTITYSHENGRI;
ARCHITECTUREoneOFSHENGRIIS
BEGIN
PROCESS(CLK)
BEGIN
IFCLK'EVENTANDCLK='1'THENBT<=BT+1;
ENDIF;
CASEBTIS
WHEN0=>SG<="0110000";
WHEN1=>SG<="1110011";
WHEN2=>SG<="1111111";
WHEN3=>SG<="1110011";
WHEN4=>SG<="1111110";
WHEN5=>SG<="1111001";
WHEN6=>SG<="1111110";
WHEN7=>SG<="1110011";
ENDCASE;
ENDPROCESS;
END;
3、心得体会
经过第一次实验的锻炼,第二次实验做的顺利了好多。
在写程序过程中,也没有出现打错字的错误了,同时速度也比上次提高了好多。
这次是做BCD七段显示译码器的实验,程序比第一次实验麻烦了一点,用了一些when...else语句,不过这是静态显示的。
做完这个以后,还做了动态七段译码显示器实验,写程序时把显示器部分的显示设置成为自己的生日。
在下载程序时出现了问题,一直不能下载好,后来换了一条下载线才好。
不过这次试验也是顺利做了出来,收获很大。
实验三、电子时钟
一、电子时钟实验心得
这次实验分成了几个模块,感觉比较的难。
首先是电子钟的实体部分,用元件例化语句连接起来。
有key_debounce、div_freq、control、counter、ring、display等。
首先是消抖部分,这个模块我一直不是很清楚,没有搞懂,所以程序在这个部分没能写好,在实验时消抖效果也不好,扳动开关后有可能状态没什么变化。
接下来是分频部分,我原先是给了它一个1024Hz的脉冲,然后再给其他几个部分进行分频,即:
clk_time<=Q(9);-----1Hz
ringtone2<=Q(11);----0.25Hz
clk_change<=Q(8);----2Hz
ringtone1<=Q(9);----1Hz
clk_key<=Q
(2);----128Hz
clk_control<=Q
(2);-----128Hz
clk_dis<=Q(0);----512Hz
接下来是控制模块,利用setup来改变状态,同时将计时的小时和分钟、闹钟的小时和分钟分别用不同的状态控制,利用setup和ajust来调整。
接着是计时模块,计时的分钟小时秒都分别进行考虑,具体在程序中体现出来。
再就是响铃部分,响铃分为整点报时和闹钟响铃两个部分,分别用不同的状态进行控制。
然后就是显示管扫描部分。
这个实验我做了好久,在实验课上没能做好,在课下也花了好多时间,有些地方总是出现错误,所以再改了好久,也和同学商量了好多才能够做出来,但消抖部分仍然存在很大的问题,而且是在考试过后才验收的,不过收获还是很大。
二、源程序
1、代码
LIBRARYieee;
USEieee.std_logic_1164.all;
USEieee.std_logic_unsigned.all;
ENTITYdigital_clock1IS
PORT
(setup_k:
INSTD_LOGIC;
adjust_k:
INSTD_LOGIC;
clk:
INSTD_LOGIC;
clr:
INSTD_LOGIC;
LEDout:
OUTSTD_LOGIC_VECTOR(6downto0);
SCAN:
OUTSTD_LOGIC_VECTOR(2downto0);
mode:
bufferstd_logic_vector(3downto0);
ringtone:
OUTSTD_LOGIC);
endentitydigital_clock1;
architecturebehofdigital_clock1is
componentkey_debounce
PORT(
clk_key:
INSTD_LOGIC;
setup_k:
INSTD_LOGIc;
adjust_k:
INSTD_LOGIC;
k_setup,k_adjust:
OUTSTD_LOGIC);
ENDcomponent;
componentdiv_freq
PORT
(clk:
INSTD_LOGIC;
clr:
INSTD_LOGIC;
clk_key:
OUTSTD_LOGIC;
clk_control:
OUTSTD_LOGIC;
clk_time:
OUTSTD_LOGIC;
clk_change:
OUTSTD_LOGIC;
ringtone1:
OUTSTD_LOGIC;
ringtone2:
OUTSTD_LOGIC;
clk_dis:
OUTSTD_LOGIC);
ENDcomponent;
componentcontrol
port(k_adjust:
instd_logic;
k_setup:
instd_logic;
clr:
instd_logic;
clk_control:
instd_logic;
mode:
outstd_logic_vector(3downto0));
endcomponent;
componentcounter
port(
clk_time,clk_change,clr:
instd_logic;
mode:
instd_logic_vector(3downto0);
h1,h0:
outstd_logic_vector(3downto0);
min1,min0:
outstd_logic_vector(3downto0);
sec1,sec0:
outstd_logic_vector(3downto0));
endcomponent;
componentring
port(
h1,h0,min1,min0,sec1,sec0:
instd_logic_vector(3downto0);
clk_change:
instd_logic;
mode:
instd_logic_vector(3downto0);
ringtone1:
inSTD_LOGIC;
ringtone2:
inSTD_LOGIC;
ringtone:
outstd_logic;
a_h1,a_h0,a_min1,a_min0:
outstd_logic_vector(3downto0));
endcomponent;
componentdisplay
port(
c_h1,c_h0,c_min1,c_min0,c_sec1,c_sec0:
instd_logic_vector(3downto0);
a_h1,a_h0,a_min1,a_min0:
instd_logic_vector(3downto0);
clk_dis:
instd_logic;
mode:
instd_logic_vector(3downto0);
sel:
outstd_logic_vector(2downto0);
y:
outstd_logic_vector(6downto0)
);
endcomponent;
signalclk_change,k_setup,k_adjust,clk_control,clk_time,clk_key,ringtone1,ringtone2,clk_dis:
std_logic;
signalc_h1,c_h0,c_min1,c_min0,c_sec1,c_sec0:
std_logic_vector(3downto0);
signala_h1,a_h0,a_min1,a_min0:
std_logic_vector(3downto0);
begin
u1:
key_debounceportmap(clk_key,setup_k,adjust_k,k_setup,k_adjust);
u2:
controlportmap(k_adjust,k_setup,clr,clk_control,mode);
u3:
div_freqportmap(clk,clr,clk_key,clk_control,clk_time,clk_change,ringtone1,ringtone2,clk_dis);
u4:
counterportmap(clk_time,clk_change,clr,mode,c_h1,c_h0,c_min1,c_min0,c_sec1,c_sec0);
u5:
ringportmap(c_h1,c_h0,c_min1,c_min0,c_sec1,c_sec0,clk_change,mode,ringtone1,ringtone2,ringtone,a_h1,a_h0,a_min1,a_min0);
u6:
displayportmap(c_h1,c_h0,c_min1,c_min0,c_sec1,c_sec0,a_h1,a_h0,a_min1,a_min0,clk_dis,mode,SCAN,LEDout);
endarchitecturebeh;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_Arith.ALL;
USEIEEE.STD_LOGIC_Unsigned.ALL;
ENTITYkey_debounceIS
PORT(
clk_key:
INSTD_LOGIC;
setup_k:
INSTD_LOGIc;
adjust_k:
INSTD_LOGIC;
k_setup,k_adjust:
OUTSTD_LOGIC);
ENDkey_debounce;
ARCHITECTUREoneOFkey_debounceIS
SIGNALdout1,dout2,dout3,dout4,dout5,dout6:
STD_LOGIC;
BEGIN
k_setup<=dout1ORdout2ORdout3;
k_adjust<=dout4ORdout5ORdout6;
PROCESS(clk_key)
BEGIN
IFRISING_EDGE(clk_key)THEN
dout1<=setup_k;dout2<=dout1;dout3<=dout2;
dout4<=adjust_k;dout5<=dout4;dout6<=dout5;
ENDIF;
ENDPROCESS;
ENDone;
LIBRARYieee;
USEieee.std_logic_1164.all;
USEieee.std_logic_unsigned.all;
ENTITYdiv_freqIS
PORT
(
clk:
INSTD_LOGIC;
clr:
INSTD_LOGIC;
clk_key:
OUTSTD_LOGIC;
clk_control:
OUTSTD_LOGIC;
clk_time:
OUTSTD_LOGIC;
clk_change:
OUTSTD_LOGIC;
ringtone1:
OUTSTD_LOGIC;
ringtone2:
OUTSTD_LOGIC;
clk_dis:
OUTSTD_LOGIC
);
ENDdiv_freq;
ARCHITECTUREdiv_freq_architectureOFdiv_freqIS
BEGIN
process(clk,clr)
variableQ:
std_logic_vector(11downto0);
begin
ifclr='1'thenQ:
="000000000000";
elsifclk'eventandclk='1'then
ifQ="111111111111"thenQ:
="000000000000";
elseQ:
=Q+1;
endif;
endif;
clk_time<=Q(9);-----1Hz
ringtone2<=Q(11);----0.25Hz
clk_change<=Q(8);----2Hz
ringtone1<=Q(9);----1Hz
clk_key<=Q
(2);----128Hz
clk_control<=Q
(2);-----128Hz
clk_dis<=Q(0);----512Hz
endprocess;
ENDdiv_freq_architecture;
LIBRARYieee;
USEieee.std_logic_1164.all;
USEieee.std_logic_unsigned.all;
entitycontrolis
port(k_adjust:
instd_logic;
k_setup:
instd_logic;
clr:
instd_logic;
clk_control:
instd_logic;
mode:
outstd_logic_vector(3downto0)
);
endentitycontrol;
ARCHITECTUREcontrol_architectureOFcontrolIS
typestatesis(timing,changehour,changemin,setalarmh,setalarmm);
signalcurrent_state,next_state:
states;
BEGIN
reg:
process(clr,clk_control)
begin
ifclr='1'thencurrent_state<=timing;
elsifclk_control'eventandclk_control='1'thencurrent_state<=next_state;
endif;
endprocess;
com:
process(current_state,k_setup)
begin
casecurrent_stateis
whentiming=>ifk_setup='1'thennext_state<=changehour;elsenext_state<=timing;
endif;
whenchangehour=>ifk_setup='1'thennext_state<=changemin;elsenext_state<=changehour;
endif;
whenchangemin=>ifk_setup='1'thennext_state<=setalarmh;elsenext_state<=changemin;
endif;
whensetalarmh=>ifk_setup='1'thennext_state<=setalarmm;elsenext_state<=setalarmh;
endif;
whensetalarmm=>ifk_setup='1'thennext_state<=timing;elsenext_state<=setalarmm;
endif;
endcase;
endprocess;
output:
process(current_state,k_adjust)
begin
casecurrent_stateis
whentiming=>mode<="0000";
whenchangehour=>ifk_adjust='1'thenmode<="0001";elsemode<="0010";
endif;
whenchangemin=>ifk_adjust='1'thenmode<="0011";elsemode<="0100";
endif;
whensetalarmh=>ifk_adjust='1'thenmode<="0101";elsemode<="0110";
endif;
whensetalarmm=>ifk_adjust='1'thenmode<="0111";elsemode<="1000";
endif;
endcase;
endprocess;
ENDcontrol_architecture;
LIBRARYieee;
USEieee.std_logic_1164.all;
USEieee.std_logic_unsigned.all;
entitycounteris
port(
clk_time,clk_change,clr:
instd_logic;
mode:
instd_logic_vector(3downto0);
h1,h0:
outstd