我们想一想,从RAM读取指令完指令之后,是不是直接可以由指令去译码得到所有部件的控制信号呢?可能比较困难,因为时钟信号是一个周期性的过程,不可能说你在取完址以后立马去译码,我们需要等待恰当的时间到来,再者就是在一个周期内我们的译码工作应该只被做一次,而总线数据上的数据可以变化多次,所以我们不难把指令直接传给控制器去产生控制信号,而需要把取址阶段得到的指令存起来,在执行阶段保持这条指令不变,才能保证在执行阶段得到的控制信号都是由期望的指令译码过来的,这也就是指令寄存器的功能。
所以指令寄存器只能在特定的时候存入数据,显然是写入需要时钟控制的,而输出应该持续地输出到控制器,故输出不需要时钟信号控制。
(1)VHDL代码:
library ieee;
use ieee.std_logic_1164.all;
entity IRJCQ is
port(CLK:in std_logic;
LDIR:in std_logic;
Fin:in std_logic_vector(7 downto 0);
OUTA,OUTB:out std_logic_vector(3 downto 0));
end entity IRJCQ;
architecture ST of IRJCQ is
signal IR:std_logic_vector(7 downto 0);
begin
process(CLK,LDIR)
begin
if((CLK'event and CLK='1') and LDIR='1')then
IR<=Fin;
end if;
OUTA<=IR(7 downto 4);
OUTB<=IR(3 downto 0);
end process;
end ST;
PS:这里看了数据通路的图以后,输出的时候把原来的指令分为了前四位和后四位,后来老师说完全没有必要
,直接当作八位的输出就可以了。
(2)
引脚说明:
输入输出端口分别为:
CLK:时钟信号,时钟上升沿到来时配合LDIR对IR进行写入数据;
LDIR:寄存器写入的使能信号,高电平有效;
Fin:数据输入端,来自RAM的读取数据;
OUTA:数据输出端,指令的高四位;
OUTB:数据输出端,指令的低四位。
(3)波形仿真:
由仿真结果可知,OUTA为输入Fin的前四位,而OUTB输入Fin的后四位,并且只有在LDIR为高电平且时钟信号沿到来时才会使输出改变,符合设计要求。