东南大学信息学院计算结构POC实验报告.docx
- 文档编号:5415481
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:14
- 大小:75.95KB
东南大学信息学院计算结构POC实验报告.docx
《东南大学信息学院计算结构POC实验报告.docx》由会员分享,可在线阅读,更多相关《东南大学信息学院计算结构POC实验报告.docx(14页珍藏版)》请在冰点文库上搜索。
东南大学信息学院计算结构POC实验报告
POC实验报告
1实验目的
本实验的目的是设计一块简易的POC(并行输出控制器),从而连接系统总线和打印机。
通过本次实验,可以初步了解输入输出、存储模块的设计,为接下来CPU的设计奠定良好的基础。
2实验任务
利用ISE和VHDL语言设计出POC模块和打印机模块,并且通过仿真测试并验证其主要功能的实现。
仿真主要以中断响应工作模式为主。
而查询模式也需要了解,这部分分析内容都将放在总结环节。
3架构说明
整体由POC、Printer两个模块组成,整体的输入端口有:
CS:
片选,实际情况为地址总线13
A:
寄存器选取;
D_bus:
数据总线;
CLK:
时间信号;
R_W:
读取/写入控制,0为读取,1为写入;
输出端口为:
IRQ:
中断请求信号,低电平有效;
CNT:
计数器,用于模拟打印机的忙碌情况。
4仿真信号设计与结果分析
4.1打印机模块
4.1.1仿真信号说明与设计
RDY:
输出信号,当Printer处于空闲状态时为1,工作状态为0;
TR:
输入信号,表示准备传输数据,设置为保持一个时钟周期;
PD:
输入信号,表示当前准备打印的数据;
CLK:
时钟信号,虽然设计图上没有,但为了模拟打印机工作采用了计数器,相应的也暂时引入了时钟信号。
CNT:
输出信号,用以模拟打印机的过程,输出用以更直观的表示。
4.1.2仿真结果与分析
1初始状态时打印机显然不处于工作状态,因而RDY信号保持为1;
2当PD数据填充完毕后,TR脉冲信号到来;
3TR脉冲上升沿到来的同时,RDY信号置为0,表示正在忙碌;
4此时打印机开始打印,表示为cnt计数,当计数完毕后RDY信号重新为1。
4.2POC模块
4.2.1仿真信号说明与设计
RDY:
输入信号,用以判断打印机是否空闲
CS:
输入信号,表示片选,实际使用时为CPU是否选中该芯片(用前13根地址线)
A:
输入信号,地址线的后3位,表示实际选择哪个寄存器,本次设计001为选取数据寄存器,010为选取状态寄存器。
CLK:
时钟信号。
CNT:
输出信号,用以模拟打印机的过程,输出用以更直观的表示。
4.2.2仿真结果与分析
①初始状态时,POC未被选中,打印机处于空闲状态,因此SR7被置为1,又由于默认工作在中断方式,因此在时钟上升沿之时便发出IRQ中断请求(低电平);
②发送请求后,CPU选中芯片(即前13地址线选中CS),将数据总线的数据准备好,之后选中数据寄存器(A为001),并将POC的读写状态设置为写;
③经过一个时钟周期后tr脉冲输出表示数据准备传送,并且数据输出口准备好数据,打印机也回到忙碌状态。
4.3整体模块
输入信号和POC模块大致相同,因此直接进行结果分析。
首先,IRQ信号产生,CPU选中POC芯片,随后选中数据寄存器并写入数据,之后经过几个时钟后,打印机开始工作,计数器开始计数。
而CPU又去处理其他的工作(中断工作模式的体现)。
当打印机打印结束时,IRQ信号再度发出,等待CPU响应与再度传送数据。
由于CPU当前也许正在进行不可中断的原子性操作,所以等待响应后再传送数据、再度打印是必要的。
由此仿真了整个工作流程。
由于更复杂的仿真过程需要CPU的设计与介入,在此无法展示,我将在下文做相关文字补充。
5总结与补充
通过仿真,我们对POC的工作方式和细节有了进一步的了解。
然而,由于本次实验没有对CPU的特殊要求和说明,导致无法通过仿真的方式清晰的体现出中断方式和查询方式的具体区别。
所有本应CPU输出、处理、反馈的信号都由人手工输入代替。
因此,下面将对两种工作模式结合CPU作进一步阐述与补充。
5.1查询模式
首先,CPU收到有关程序的请求,准备通过I/O接口联系POC模块,试图打印有关内容。
CPU访问POC的相关状态寄存器(SR7),查看POC目前是否处于空闲状态。
如果是,那就准备打印,否则,CPU处于轮询的状态。
该进程内的每一个指令周期,CPU都在查询POC是否空闲,并不做其他的事情,直到POC处于空闲,并允许传输数据为止。
当CPU了解POC已准备就绪时,CPU便将有关内容分块传输到POC的数据缓存中。
由于实际文件数据量较大,CPU将持续处于“轮询—传输—轮询—传输”直到文件打印完毕为之。
对于已经传输到POC的数据段,POC并不能立刻将其提交给打印机,因为当前打印机可能处于忙碌状态。
当打印机用完当前数据(可能仅为一行)后,RDY信号为高电平,POC再将本段数据提交给打印机继续操作。
通过POC的TR信号和PD数据输出传送给打印机,再通过RDY信号判断当前打印机是否用完目前的数据。
如果用完了,就将SR7置为空闲状态,以方便CPU提供新数据,否则SR7处于忙碌状态。
至此,整个查询模式的工作方式描述完毕。
5.2中断模式
首先,CPU在某个时间点将POC的SR0置为1,即命令POC工作在中断模式。
之后的前小部分和查询模式相同,CPU收到有关程序的请求,准备通过I/O接口联系POC模块,试图打印有关内容。
CPU访问POC的相关状态寄存器(SR7),查看POC目前是否处于空闲状态,如果是,那就准备打印。
如果POC忙碌,CPU则继续忙其他的工作。
由于POC事先已被CPU设置为中断模式,一旦POC处于空闲态,则会向CPU发出中断请求。
此时,CPU会通过查中断向量表得知,是POC模块发出的请求,处理完当前的原子性操作或更高级的中断请求后,则响应POC中断,选中POC芯片进行有关操作。
由于实际文件数据量较大,CPU仍然会分块传输数据。
此时CPU传完数据后继续忙其他工作,直到下一个中断来临。
整个工作将持续处于“中断—传输—中断—传输”直到文件打印完毕为之。
具体的POC处理和前文类似,不再多言。
最后需要额外指出的是,对于多文档打印,打印队列由更高一层的操作系统控制,无关物理底层的实现,因此可不用在此讨论。
5.3结论
本项仿真设计完成了任务的基本要求,实现了POC和Printer的设计,并且通过了测试,达到了预期的效果。
6附录
/***************top.vhd****************/
----------------------------------------------------------------------------------
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
--Uncommentthefollowinglibrarydeclarationifusing
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
entitytopis
Port(CS:
inSTD_LOGIC;
A:
inSTD_LOGIC_VECTOR(2downto0);
D_bus:
inSTD_LOGIC_VECTOR(7downto0):
="00000000";
R_W:
inSTD_LOGIC;
CLK:
inSTD_LOGIC;
IRQ:
outSTD_LOGIC:
='1';
CNT:
outSTD_LOGIC_VECTOR(3downto0));
endtop;
architectureBehavioraloftopis
componentpoc
Port(
CS:
inSTD_LOGIC;
A:
inSTD_LOGIC_VECTOR(2downto0);
D_bus:
inSTD_LOGIC_VECTOR(7downto0):
="00000000";
R_W:
inSTD_LOGIC;
CLK:
inSTD_LOGIC;
IRQ:
outSTD_LOGIC:
='1';
D_out:
outSTD_LOGIC_VECTOR(7downto0);
TR:
outSTD_LOGIC;
RDY:
inSTD_LOGIC;
SR_Test:
outSTD_LOGIC_VECTOR(7downto0));
endcomponent;
componentprinter
Port(RDY:
outSTD_LOGIC;
TR:
inSTD_LOGIC;
PD:
inSTD_LOGIC_VECTOR(7downto0);
CNT:
outSTD_LOGIC_VECTOR(3downto0);
CLK:
inSTD_LOGIC);
endcomponent;
signalm_D_out:
STD_LOGIC_VECTOR(7downto0);
signalm_TR:
STD_LOGIC;
signalm_RDY:
STD_LOGIC;
begin
poc_inst:
pocportmap(
CS=>CS,
A=>A,
D_bus=>D_bus,
R_W=>R_W,
CLK=>CLK,
IRQ=>IRQ,
D_out=>m_D_out,
TR=>m_TR,
RDY=>m_RDY
);
printer_inst:
printerportmap(
RDY=>m_RDY,
TR=>m_TR,
PD=>m_D_out,
CNT=>CNT,
CLK=>CLK
);
endBehavioral;
/***************top.vhd结束****************/
/***************poc.vhd****************/
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
entitypocis
Port(CS:
inSTD_LOGIC;
A:
inSTD_LOGIC_VECTOR(2downto0);
D_bus:
inSTD_LOGIC_VECTOR(7downto0):
="00000000";
R_W:
inSTD_LOGIC;
CLK:
inSTD_LOGIC;
IRQ:
outSTD_LOGIC:
='1';
D_out:
outSTD_LOGIC_VECTOR(7downto0);
TR:
outSTD_LOGIC;
RDY:
inSTD_LOGIC;
SR_Test:
outSTD_LOGIC_VECTOR(7downto0));
endpoc;
architectureBehavioralofpocis
signalSR:
STD_LOGIC_VECTOR(7downto0):
="00000001";--默认中断工作状态
signalBR:
STD_LOGIC_VECTOR(7downto0):
="00000000";
signalDataInReady:
STD_LOGIC:
='0';
signalm_work:
STD_LOGIC:
='0';
signalm_cnt:
STD_LOGIC:
='0';
signalm_hasRDY:
STD_LOGIC:
='0';
begin
SR_Test<=SR;
process(SR,CS)
begin
--if(CS='1')then
--if(rising_edge(CLK))then
if(SR(0)='1'andSR(7)='1')then
IRQ<='0';--IRQ低电平表示中断
else
IRQ<='1';
endif;
--endif;
--endif;
endprocess;
process(RDY,m_hasRDY)
begin
endprocess;
process(R_W,D_bus,CS,SR,m_cnt,m_work,m_hasRDY,RDY,CLK,DataInReady,BR)
begin
if(rising_edge(RDY))then
m_hasRDY<='1';
endif;
if(rising_edge(CLK))then
--if(CS='1')then
if(m_hasRDY='1')then
m_hasRDY<='0';
SR(7)<='1';
m_cnt<='0';
m_work<='1';
endif;
if(m_work='1')then
if(m_cnt='0')then
m_cnt<='1';
else
SR(7)<='0';
endif;
if(CS='1')then
if(R_W='1')then--1为写数据
if(A="001")then--001为BR
BR<=D_bus;
DataInReady<='1';
m_work<='0';
elsif(A="010")then
SR<=D_bus;
endif;
else
--if(A="001")then--010为SR
--D_bus<=BR;
--elsif(A="010")then
--D_bus<=SR;
--endif;
endif;
endif;
endif;
--if(rising_edge(CLK))then
if(DataInReady='1')then
DataInReady<='0';
TR<='1';
D_out<=BR;
else
TR<='0';
endif;
--endif;
endif;
endprocess;
endBehavioral;
/***************poc.vhd结束****************/
/***************printer.vhd****************/
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entityprinteris
Port(RDY:
outSTD_LOGIC:
='0';
TR:
inSTD_LOGIC;
PD:
inSTD_LOGIC_VECTOR(7downto0);
CNT:
outSTD_LOGIC_VECTOR(3downto0);
CLK:
inSTD_LOGIC);
endprinter;
architectureBehavioralofprinteris
signalm_cnt:
STD_LOGIC_VECTOR(3downto0):
="0000";
signalbWork:
STD_LOGIC:
='0';
begin
RDY<=notbWork;
CNT<=m_cnt;
process(CLK,TR,bWork,m_cnt)
begin
if(rising_edge(TR))then
bWork<='1';
endif;
if(bWork='1')then
if(rising_edge(CLK))then
if(m_cnt="1111")then
bWork<='0';
m_cnt<="0000";
else
m_cnt<=m_cnt+1;
endif;
endif;
endif;
endprocess;
endBehavioral;
/***************printer.vhd结束****************/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 东南大学 信息 学院 计算 结构 POC 实验 报告