《东南大学信息学院计算结构POC实验报告.docx》由会员分享,可在线阅读,更多相关《东南大学信息学院计算结构POC实验报告.docx(12页珍藏版)》请在三一办公上搜索。
1、东南大学信息学院计算结构POC实验报告POC实验报告目录 目录 . 1-1 1 实验目的 . 1-1 2 实验任务 . 2-1 3 架构说明 . 3-2 4 仿真信号设计与结果分析 . 4-3 4.1 打印机模块 . 4-3 4.1.1 仿真信号说明与设计 . 4-3 4.1.2 仿真结果与分析 . 4-3 4.2 POC模块 . 4-3 4.2.1 仿真信号说明与设计 . 4-3 4.2.2 仿真结果与分析 . 4-4 4.3 整体模块 . 4-4 5 总结与补充 . 5-4 5.1 查询模式 . 5-5 5.2 中断模式 . 5-5 6 附录. 6-6 1 实验目的 本实验的目的是设计一块
2、简易的POC,从而连接系统总线和打印机。通过本次实验,可以初步了解输入输出、存储模块的设计,为接下来CPU的设计奠定良好的基础。 2 实验任务 利用ISE和VHDL语言设计出POC模块和打印机模块,并且通过仿真测试并验证其主要功能的实现。 仿真主要以中断响应工作模式为主。而查询模式也需要了解,这部分分析内容都将放在总结环节。 2-1 3 架构说明 整体由POC、Printer两个模块组成,整体的输入端口有: CS:片选,实际情况为地址总线13 A:寄存器选取; D_bus:数据总线; CLK:时间信号; R_W:读取/写入控制,0为读取,1为写入; 输出端口为: IRQ:中断请求信号,低电平有
3、效; CNT:计数器,用于模拟打印机的忙碌情况。 3-2 4 仿真信号设计与结果分析 4.1 打印机模块 4.1.1 仿真信号说明与设计 RDY:输出信号,当Printer处于空闲状态时为1,工作状态为0; TR:输入信号,表示准备传输数据,设置为保持一个时钟周期; PD:输入信号,表示当前准备打印的数据; CLK:时钟信号,虽然设计图上没有,但为了模拟打印机工作采用了计数器,相应的也暂时引入了时钟信号。 CNT:输出信号,用以模拟打印机的过程,输出用以更直观的表示。 4.1.2 仿真结果与分析 初始状态时打印机显然不处于工作状态,因而RDY信号保持为1; 当PD数据填充完毕后,TR脉冲信号到
4、来; TR脉冲上升沿到来的同时,RDY信号置为0,表示正在忙碌; 此时打印机开始打印,表示为cnt计数,当计数完毕后RDY信号重新为1。 4.2 POC模块 4.2.1 仿真信号说明与设计 RDY:输入信号,用以判断打印机是否空闲 CS:输入信号,表示片选,实际使用时为CPU是否选中该芯片 A:输入信号,地址线的后3位,表示实际选择哪个寄存器,本次设计001为选取数据寄存器,010为选取状态寄存器。 CLK:时钟信号。 CNT:输出信号,用以模拟打印机的过程,输出用以更直观的表示。 4-3 4.2.2 仿真结果与分析 初始状态时,POC未被选中,打印机处于空闲状态,因此SR7被置为1,又由于默
5、认工作在中断方式,因此在时钟上升沿之时便发出IRQ中断请求; 发送请求后,CPU选中芯片,将数据总线的数据准备好,之后选中数据寄存器,并将POC的读写状态设置为写; 经过一个时钟周期后tr脉冲输出表示数据准备传送,并且数据输出口准备好数据,打印机也回到忙碌状态。 4.3 整体模块 输入信号和POC模块大致相同,因此直接进行结果分析。 首先,IRQ信号产生,CPU选中POC芯片,随后选中数据寄存器并写入数据,之后经过几个时钟后,打印机开始工作,计数器开始计数。而CPU又去处理其他的工作。 当打印机打印结束时,IRQ信号再度发出,等待CPU响应与再度传送数据。由于CPU当前也许正在进行不可中断的原
6、子性操作,所以等待响应后再传送数据、再度打印是必要的。 由此仿真了整个工作流程。由于更复杂的仿真过程需要CPU的设计与介入,在此无法展示,我将在下文做相关文字补充。 5 总结与补充 通过仿真,我们对POC的工作方式和细节有了进一步的了解。然而,由于本次实验没有对CPU的特殊要求和说明,导致无法通过仿真的方式清晰的体现出中断方式和查询方式的具体区别。所有本应CPU输出、处理、反馈的信号都由人手工输入代替。因此,下面将对两种工作模式结合CPU作进一步阐述与补充。 5-4 5.1 查询模式 首先,CPU收到有关程序的请求,准备通过I/O接口联系POC模块,试图打印有关内容。CPU访问POC的相关状态
7、寄存器,查看POC目前是否处于空闲状态。如果是,那就准备打印,否则,CPU处于轮询的状态。该进程内的每一个指令周期,CPU都在查询POC是否空闲,并不做其他的事情,直到POC处于空闲,并允许传输数据为止。 当CPU了解POC已准备就绪时,CPU便将有关内容分块传输到POC的数据缓存中。由于实际文件数据量较大,CPU将持续处于“轮询传输轮询传输”直到文件打印完毕为之。 对于已经传输到POC的数据段,POC并不能立刻将其提交给打印机,因为当前打印机可能处于忙碌状态。当打印机用完当前数据后,RDY信号为高电平,POC再将本段数据提交给打印机继续操作。 通过POC的TR信号和PD数据输出传送给打印机,
8、再通过RDY信号判断当前打印机是否用完目前的数据。如果用完了,就将SR7置为空闲状态,以方便CPU提供新数据,否则SR7处于忙碌状态。 至此,整个查询模式的工作方式描述完毕。 5.2 中断模式 首先,CPU在某个时间点将POC的SR0置为1,即命令POC工作在中断模式。之后的前小部分和查询模式相同,CPU收到有关程序的请求,准备通过I/O接口联系POC模块,试图打印有关内容。CPU访问POC的相关状态寄存器,查看POC目前是否处于空闲状态,如果是,那就准备打印。 如果POC忙碌,CPU则继续忙其他的工作。由于POC事先已被CPU设置为中断模式,一旦POC处于空闲态,则会向CPU发出中断请求。此
9、时,CPU会通过查中断向量表得知,是POC模块发出的请求,处理完当前的原子性操作或更高级的中断请求后,则响应POC中断,选中POC芯片进行有关操作。 由于实际文件数据量较大,CPU仍然会分块传输数据。此时CPU传完数据后继续忙其他工作,直到下一个中断来临。整个工作将持续处于“中断传输中断传输”直到文件打印完毕为之。 具体的POC处理和前文类似,不再多言。 最后需要额外指出的是,对于多文档打印,打印队列由更高一层的操作系统控制,无关物理底层的实现,因此可不用在此讨论。 5.3 结论 本项仿真设计完成了任务的基本要求,实现了POC和Printer的设计,并且通过了测试,达到了预期的效果。 5-5
10、6 附录 /*top.vhd*/ - library IEEE; use IEEE.STD_LOGIC_1164.ALL; - Uncomment the following library declaration if using library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity top is Port ( CS : in STD_LOGIC; A : in STD_LOGIC_VECTOR (2 downto 0); D_bus : in STD_LOGIC_VECTOR (7 downto 0):=00000000; R_W : in S
11、TD_LOGIC; CLK : in STD_LOGIC; IRQ : out STD_LOGIC:=1; CNT: out STD_LOGIC_VECTOR (3 downto 0) ); end top; architecture Behavioral of top is component poc Port ( CS : in STD_LOGIC; A : in STD_LOGIC_VECTOR (2 downto 0); D_bus : in STD_LOGIC_VECTOR (7 downto 0):=00000000; R_W : in STD_LOGIC; CLK : in ST
12、D_LOGIC; IRQ : out STD_LOGIC:=1; D_out : out STD_LOGIC_VECTOR (7 downto 0); TR : out STD_LOGIC; RDY : in STD_LOGIC; SR_Test : out STD_LOGIC_VECTOR(7 downto 0); end component ; component printer Port ( RDY : out STD_LOGIC; TR : in STD_LOGIC; PD : in STD_LOGIC_VECTOR (7 downto 0); CNT: out STD_LOGIC_V
13、ECTOR (3 downto 0) ; CLK : in STD_LOGIC); end component ; 6-6 signal m_D_out:STD_LOGIC_VECTOR (7 downto 0); signal m_TR:STD_LOGIC; signal m_RDY:STD_LOGIC; begin poc_inst :poc port map( 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 :printer
14、 port map( RDY=m_RDY, TR =m_TR, PD=m_D_out, CNT=CNT, CLK =CLK ); end Behavioral; /*top.vhd结束*/ /*poc.vhd*/ library IEEE; use IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; entity poc is Port ( CS : in STD_LOGIC; A : in STD_LOGIC_VECTOR (2 downto 0); D_bus : in STD_LOGIC_VECTOR (7 downto 0
15、):=00000000; R_W : in STD_LOGIC; CLK : in STD_LOGIC; IRQ : out STD_LOGIC:=1; D_out : out STD_LOGIC_VECTOR (7 downto 0); TR : out STD_LOGIC; RDY : in STD_LOGIC; 6-7 SR_Test : out STD_LOGIC_VECTOR(7 downto 0); end poc; architecture Behavioral of poc is signal SR: STD_LOGIC_VECTOR (7 downto 0) := 00000
16、001; -默认中断工作状态 signal BR: STD_LOGIC_VECTOR (7 downto 0) := 00000000; signal DataInReady:STD_LOGIC :=0; signal m_work:STD_LOGIC :=0; signal m_cnt:STD_LOGIC :=0; signal m_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 and SR(7)=1) then
17、 IRQ=0; -IRQ低电平表示中断 else IRQ=1; end if; - end if; -end if; end process; process(RDY,m_hasRDY) begin end process; 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; end if; if(rising_edge(CLK) then - if(CS=1) then if(m_hasRDY=1) then m_has
18、RDY=0; SR(7)=1; 6-8 m_cnt=0; m_work=1; end if; if(m_work=1) then if(m_cnt=0) then m_cnt=1; else SR(7)=0; end if; 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; end if; else - if(A=001) then -010为SR - D_bus=BR; - elsif (A=010
19、) then - D_bus=SR; - end if; end if; end if; end if; - if(rising_edge(CLK) then if(DataInReady=1) then DataInReady=0; TR=1; D_out=BR; else TR=0; end if; - end if; end if; end process; 6-9 end Behavioral; /*poc.vhd结束*/ /*printer.vhd*/ library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARIT
20、H.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity printer is Port ( RDY : out STD_LOGIC:=0; TR : in STD_LOGIC; PD : in STD_LOGIC_VECTOR (7 downto 0); CNT: out STD_LOGIC_VECTOR (3 downto 0) ; CLK : in STD_LOGIC); end printer; architecture Behavioral of printer is signal m_cnt: STD_LOGIC_VECTOR (3 downto
21、 0) := 0000; signal bWork:STD_LOGIC :=0; begin RDY=not bWork; CNT=m_cnt; process(CLK,TR,bWork,m_cnt) begin if(rising_edge(TR) then bWork=1; end if; 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; end if; end if; end if; end process; end Behavioral; 6-10 /*printer.vhd结束*/ 6-11