微机接口技术实验报告.docx
《微机接口技术实验报告.docx》由会员分享,可在线阅读,更多相关《微机接口技术实验报告.docx(21页珍藏版)》请在冰豆网上搜索。
微机接口技术实验报告
微机接口技术实验报告
实验三:
IO地址译码器编程
实验四:
简易中断优先权分析器编程
系别:
计算机科学与技术
完成时间:
2012-5-29
实验三IO地址译码器编程
一、实验内容
使用一片74LS00(4X二输入与非门),一片74LS30(八输入与非门)和一片74LS138(3-8译码器)设计一个固定地址译码器:
使用10位地址线(A0–A9);
译码器地址段的CS信号:
280H—287H,288H—28FH,290H—297H,298H—29FH2A0H—2A7H,2A8H—2AFH,2B0H—2B7H,2B8H—2BFH;
控制信号AEN,IOR,IOW(三个信号均为低电平有效)参与译码,可实现对指定单元的读写。
二、实验要求
所有地址段的CS信号都必须通过仿真测试验证;
验证控制信号AEN,IOW,IOR的作用。
三、实验分析
1、IO地址译码
地址译码是指通过CPU发出的地址码来识别和确认与之交换信息的端口。
译码电路的具体功能是,将CPU发出的地址码经过译码产生选择I/O接口的片选信号。
只有当I/O端口所在的I/O接口与译码电路相连接的片选信号
有效时,该接口电路上的I/O端口才能被CPU访问,从而实现CPU和I/O设备之间的信息交换。
PC机I/O端口地址译码器的设计遵循以下两个设计原则:
第一,正确识别I/O端口操作周期。
由于PC机中I/O端口操作和DMA操作使用相同的地址线、数据线和读/写控制信号。
区别这两种操作的信号是AEN。
在DMA操作周期时,AEN有效,为高电平;而在I/O端口操作时,AEN无效,为低电平。
第二,减少译码电路器件的延时。
在系统中,
或者
信号的有效仅比端口地址有效落后半个时钟周期。
如果译码电路过长将导致输出无效信号等等后果,这种情况下可采用的方法是减少译码电路门级数或者高速门电路。
固定式端口地址译码器可以采用集成译码器辅以门电路译码来获得多个端口地址。
最常用的3-8译码器74LS138,它有A,B,C共三个输入端和
共8个输出端,其输出端为低电平有效。
3-8译码器的芯片引脚图和真值表如图1和表1.
图1中A,B和C为输入端,
和
、
为控制端,其他的Y为输出端。
真值表中,三个输入端共有8种组合,每一种情况对应于一个输出端为低电平,此外,还有三个控制端,只有G1为高电平,另两个控制信号为低电平时有效。
图13-8译码器
C
B
A
输出
100
100
100
100
100
100
100
100
000
001
010
011
100
101
110
111
仅
为0
仅
为0
仅
为0
仅
为0
仅
为0
仅
为0
仅
为0
仅
为0
其他状态
X
X
X
全检出1
表13-8译码器真值表
2、固定地址译码器
由74LS00和74LS30、74LS138组成的固定地址译码器的电路如图2所示。
输出信号cs(0to7)由输入端信号A3-A5和控制信号控制,其他的4个输入信号A6-A9全为低时整个电路有效。
当AEN为低时,整个电路可以进行片选,对应的输入信号(A3-5)与输出信号为000-11111110,001-11111101,010-********,011-11110111,100-11101111,101-11011111,110-10111111,111-01111111。
读信号为上升脉冲时有效,可进行译码。
当AEN为高时,整个电路不可以进行译码,输出信号均为111111111。
图2固定地址译码器
由上述逻辑电路,可以推导出以下逻辑表达式:
=
即
=
+
·
。
因此,只有当片选信号AEN为低时可以进行译码。
四、实验步骤与截图
1、ISE新建工程
(1)启动ISE13.1软件;
(2)新建工程,路径为file->newproject,在弹出的窗口中输入要新建工程的名字和地址,各个参数设置如下:
family(AutomotiveSpartan3)
device(XA3S200)
package(PQG208)
speed(-4Q)
SynthesisTool(XST)
Simulator(Isim)
在PreferredLanguage中选择VHDL一栏,点击next可以查看工程信息,建立完毕;
(3)给工程添加新的文件。
右键单击工程,然后添加需要添加的文件,这里应该只需添加基本的文件和测试文件即可,或者先建立文件,再将代码修改在基本文件中即可;
(4)在Synthesize中选择check进行编译,出现绿色对勾即可;
(5)添加测试文件。
路径为project->newsource,选择VHDLTest文件,然后编写测试文件;
(6)双击process窗口的SimulatorBehavior可以查看仿真图形。
2、实验截图。
实验主要截图三张,分别为第一次实验时控制信号en循环结束不置0(如图3)与置0(如图4)的仿真图形,以及当片选信号AEN为高时的仿真图形(如图5)。
图3循环置0后的仿真图形
图4循环不置0后的仿真图形
批注,上述截图好像出错了,应该是在上升沿阶段是没有其他的cs信号的,截图失误。
正确的截图应该如下。
图5片选信号为低时仿真图形
五、实验代码
1、VHDL基本文件
----------------------------------------------------------------------------------
--Company:
--Engineer:
--
--CreateDate:
13:
21:
5804/17/2012
--DesignName:
--ModuleName:
ad-ad_Behavioral
--ProjectName:
--TargetDevices:
--Toolversions:
--Description:
--
--Dependencies:
--
--Revision:
--Revision0.01-FileCreated
--AdditionalComments:
--
----------------------------------------------------------------------------------
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
----Uncommentthefollowinglibrarydeclarationifinstantiating
----anyXilinxprimitivesinthiscode.
--libraryUNISIM;
--useUNISIM.VComponents.all;
entityadis
Port(addr:
inSTD_LOGIC_VECTOR(3to9);
aen,iow,ior:
inSTD_LOGIC;
cs:
outSTD_LOGIC_VECTOR(7downto0));
endad;
architecturead_Behavioralofadis
signalen:
std_logic;
signalout_temp:
std_logic_vector(7downto0);
begin
out_temp(7downto0)<=
"11111110"whenaddr(3to5)="000"else
"11111101"whenaddr(3to5)="100"else
"11111011"whenaddr(3to5)="010"else
"11110111"whenaddr(3to5)="110"else
"11101111"whenaddr(3to5)="001"else
"11011111"whenaddr(3to5)="101"else
"10111111"whenaddr(3to5)="011"else
"01111111"whenaddr(3to5)="111";
process(addr,aen,iow,ior)
begin
en<=not((notaddr(6))andaddr(7)and(notaddr(8))andaddr(9)and(notaen)and(not(iowandior)));
foriin7downto0loop
cs(i)<=out_temp(i)oren;
endloop;
en<='0';
endprocess;
endarchitecturead_Behavioral;
2、test文件主体代码
aen<=0;
addr<=”0000101”;
ior<=0;
wait1ps;
ior<=1;
iow<=0;
wait10ps;
addr<=”0010101”;
ior<=0;
wait1ps;
ior<=1;
iow<=0;
wait10ps;
addr<=”0100101”;
ior<=0;
wait1ps;
ior<=1;
iow<=0;
wait10ps;
//依次设置其他的仿真信号,程序本来的时钟频率应该删除,为了保证ior有一个上升沿脉冲因此设置了一个1ps的脉冲信号
实验四简易中断优先权分析器编程
一、实验内容及要求
用VHDL语言设计一个简易中断优先权分析器。
1)参考教材8259A优先权分析器逻辑框图.
2)不考虑IMR屏蔽功能,8路中断直接进入优先权分析器.
3)ISR的内容以3位二进制编码,从外部输入比较器
4)不考虑多重中断.既假定每次只有一个中断发生.
要求仿真验证优先权分析器的实际效果。
二、实验分析
1、中断
CPU在正常运行程序时,由于内部/外部事件或程序本身的原因等中断正在运行的程序,转到为中断事件服务的程序中去执行,而在服务完毕后再返回执行源程序,这一过程称为中断。
现代微机的中断有外部硬件中断、非屏蔽中断、软件中断和内部中断与异常四种类型。
系统对于中断按其优先级的高低依次提供服务。
每个中断和异常都指定了一个类型号代表不同的优先级,类型0代表最高优先级的中断,类型255代表最低优先级的中断。
优先级的重要性在于,如果已经启动了某些优先级的中断服务程序,那么只要更高优先级的中断请求才允许打断该服务程序的运行。
低优先级的中断请求将等待,直到当前中断服务程序结束。
出于这个原因,用户通常将不能经常被打断的任务指定较高优先级,而可以被打断的则指定较低优先级。
IMR是中断屏蔽寄存器,它对中断请求IR起屏蔽作用,这里忽略它的影响。
ISR是中断服务寄存器,在中断响应之后,第一个获准中断请求的中断级在相应的ISR中置1。
ISR用来存放正在被服务的中断,包括尚未服务完而被优先级更高的中断打断的中断。
2、中断优先权分析器
8路中断直接进入优先权分析器,设定ISR值,如果进入优先权分析器的中断级别比ISR高,则将结果INT置为1,否则将INT置为0。
例如,8路中断为0001100,ISR设置为011,显然不能发生中断响应,即INT的值为0;如果8路中断为00000010,那么优先级比ISR高,就会发生中断响应,同等优先级不能发生中断响应。
参考教材的8259中断系统,可以编程实现中断优先权分析器。
三、实验截图
四、实验代码
1、主体源代码
----------------------------------------------------------------------------------
--Company:
--Engineer:
--
--CreateDate:
20:
37:
3005/22/2012
--DesignName:
--ModuleName:
MY8259A-Behavioral
--ProjectName:
--TargetDevices:
--Toolversions:
--Description:
--
--Dependencies:
--
--Revision:
--Revision0.01-FileCreated
--AdditionalComments:
--
----------------------------------------------------------------------------------
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
--Uncommentthefollowinglibrarydeclarationifusing
--arithmeticfunctionswithSignedorUnsignedvalues
--useIEEE.NUMERIC_STD.ALL;
--Uncommentthefollowinglibrarydeclarationifinstantiating
--anyXilinxprimitivesinthiscode.
--libraryUNISIM;
--useUNISIM.VComponents.all;
entityMY8259Ais
Port(IR0:
inSTD_LOGIC;
IR1:
inSTD_LOGIC;
IR2:
inSTD_LOGIC;
IR3:
inSTD_LOGIC;
IR4:
inSTD_LOGIC;
IR5:
inSTD_LOGIC;
IR6:
inSTD_LOGIC;
IR7:
inSTD_LOGIC;
ISR:
inSTD_LOGIC_VECTOR(2downto0);
INT:
outSTD_LOGIC);
endMY8259A;
architectureBehavioralofMY8259Ais
SIGNALBIG,MORE1:
STD_LOGIC;
begin
PROCESS(IR0,IR1,IR2,IR3,IR4,IR5,IR6,IR7)
VARIABLEA:
STD_LOGIC_VECTOR(2downto0);
BEGIN
IF(IR0='1')then
A:
="000";MORE1<='1';
ELSIF(IR1='1')then
A:
="001";MORE1<='1';
ELSIF(IR2='1')then
A:
="010";MORE1<='1';
ELSIF(IR3='1')then
A:
="011";MORE1<='1';
ELSIF(IR4='1')then
A:
="100";MORE1<='1';
ELSIF(IR5='1')then
A:
="101";MORE1<='1';
ELSIF(IR6='1')then
A:
="110";MORE1<='1';
ELSIF(IR7='1')then
A:
="111";MORE1<='1';
ELSE
A:
="111";MORE1<='0';
ENDIF;
IF(ABIG<='1';
ELSE
BIG<='0';
ENDIF;
endPROCESS;
INT<=BIGANDMORE1;
endBehavioral;
2、Test代码
--------------------------------------------------------------------------------
--Company:
--Engineer:
--
--CreateDate:
21:
24:
5505/22/2012
--DesignName:
--ModuleName:
E:
/PROJ2/test.vhd
--ProjectName:
PROJ2
--TargetDevice:
--Toolversions:
--Description:
--
--VHDLTestBenchCreatedbyISEformodule:
MY8259A
--
--Dependencies:
--
--Revision:
--Revision0.01-FileCreated
--AdditionalComments:
--
--Notes:
--Thistestbenchhasbeenautomaticallygeneratedusingtypesstd_logicand
--std_logic_vectorfortheportsoftheunitundertest.Xilinxrecommends
--thatthesetypesalwaysbeusedforthetop-levelI/Oofadesigninorder
--toguaranteethatthetestbenchwillbindcorrectlytothepost-implementation
--simulationmodel.
--------------------------------------------------------------------------------
LIBRARYieee;
USEieee.std_logic_1164.ALL;
--Uncommentthefollowinglibrarydeclarationifusing
--arithmeticfunctionswithSignedorUnsignedvalues
--USEieee.numeric_std.ALL;
ENTITYtestIS
ENDtest;
ARCHITECTUREbehaviorOFtestIS
--ComponentDeclarationfortheUnitUnderTest(UUT)
COMPONENTMY8259A
PORT(
IR0:
INstd_logic;
IR1:
INstd_logic;
IR2:
INstd_logic;
IR3:
INstd_logic;
IR4:
INstd_logic;
IR5:
INstd_logic;
IR6:
INstd_logic;
IR7:
INstd_logic;
ISR:
INstd_logic_vector(2downto0);
INT:
OUTstd_logic
);
ENDCOMPONENT;
--Inputs
signalIR0:
std_logic:
='0';
signalIR1:
std_logic:
='0';
signalIR2:
std_logic:
='0';
signalIR3:
std_logic:
='0';
signalIR4:
std_logic:
='0';
signalIR5:
std_logic:
='0';
signalIR6:
std_logic:
='0';
signalIR7:
std_logic:
='0';
signalISR:
std_logic_vector(2downto0):
=(others=>'0');
--Outputs
signalINT:
std_logic;
--Noclocksdetectedinportlist.Replacebelowwith
--appropriateportname
BEGIN
--InstantiatetheUnitUnderTest(UUT)
uut:
MY8259APORTMAP(
IR0=>IR0,
IR1=>IR1,
IR2=>IR2,
IR3=>IR3,
IR4=>IR4,
IR5=>IR5,
IR6=>IR6,
IR7=>IR7,
ISR=>ISR,
INT=>INT
);
--Stimulusprocess
stim_proc:
process
begin
--holdresetstatefor100ns.
--insertstimulushere
waitfor10ns;
IR0<='0';
IR1<='0';
IR2<='0';
IR3<='0';
IR4<='0';
IR5<='1';
IR6<='0';
IR7<='0';
ISR<="100";
waitfor10ns;
IR0<='1';
IR1<='0';
IR2<='1';
IR3<='0';
IR4<='1';
IR5<='1';
IR6<='0';
IR7<='0';
ISR<="111";
waitfor10ns;
IR0<='0';
IR1<='0';
IR2<='0';
IR3<='0';
IR4<='1';
IR5<='1';
IR6<='0';
IR7<='0';
ISR<="000";
waitfor10ns;
IR0<='0';
IR